Spade

Mini Shell

Directory:~$ /home/lmsyaran/www/css/
Upload File

[Home] [System Details] [Kill Me]
Current File:~$ /home/lmsyaran/www/css/com_reservation.zip

PK4~�[��Uy:y:
access.xmlnu�[���<?xml version="1.0"
encoding="utf-8" ?>
<access component="com_reservation">
	<section name="component">
		<action name="core.admin" title="JACTION_ADMIN"
description="JACTION_ADMIN_COMPONENT_DESC" />
		<action name="core.options"
title="JACTION_OPTIONS"
description="JACTION_OPTIONS_COMPONENT_DESC" />
		<action name="core.manage" title="JACTION_MANAGE"
description="JACTION_MANAGE_COMPONENT_DESC" />
		<action name="core.export"
title="COM_RESERVATION_EXPORT_DATA"
description="COM_RESERVATION_EXPORT_DATA_DESC" />
		<action name="core.import"
title="COM_RESERVATION_IMPORT_DATA"
description="COM_RESERVATION_IMPORT_DATA_DESC" />
		<action name="core.batch"
title="COM_RESERVATION_USE_BATCH"
description="COM_RESERVATION_USE_BATCH_DESC" />
		<action name="core.version"
title="COM_RESERVATION_EDIT_VERSIONS"
description="COM_RESERVATION_EDIT_VERSIONS_DESC" />
		<action name="core.create" title="JACTION_CREATE"
description="JACTION_CREATE_COMPONENT_DESC" />
		<action name="core.delete" title="JACTION_DELETE"
description="JACTION_DELETE_COMPONENT_DESC" />
		<action name="core.edit" title="JACTION_EDIT"
description="JACTION_EDIT_COMPONENT_DESC" />
		<action name="core.edit.state"
title="JACTION_EDITSTATE"
description="JACTION_ACCESS_EDITSTATE_DESC" />
		<action name="core.edit.own"
title="JACTION_EDITOWN"
description="JACTION_EDITOWN_COMPONENT_DESC" />
		<action name="core.edit.created_by"
title="COM_RESERVATION_EDIT_CREATED_BY"
description="COM_RESERVATION_EDIT_CREATED_BY_DESC" />
		<action name="core.edit.created"
title="COM_RESERVATION_EDIT_CREATED_DATE"
description="COM_RESERVATION_EDIT_CREATED_DATE_DESC" />
		<action name="appointment.access"
title="COM_RESERVATION_APPOINTMENTS_ACCESS"
description="COM_RESERVATION_APPOINTMENTS_ACCESS_DESC" />
		<action name="appointment.batch"
title="COM_RESERVATION_APPOINTMENTS_BATCH_USE"
description="COM_RESERVATION_APPOINTMENTS_BATCH_USE_DESC" />
		<action name="appointment.dashboard_list"
title="COM_RESERVATION_APPOINTMENTS_DASHBOARD_LIST"
description="COM_RESERVATION_APPOINTMENTS_DASHBOARD_LIST_DESC"
/>
		<action name="appointment.version"
title="COM_RESERVATION_APPOINTMENTS_EDIT_VERSION"
description="COM_RESERVATION_APPOINTMENTS_EDIT_VERSION_DESC"
/>
		<action name="appointment.export"
title="COM_RESERVATION_APPOINTMENTS_EXPORT"
description="COM_RESERVATION_APPOINTMENTS_EXPORT_DESC" />
		<action name="appointment.import"
title="COM_RESERVATION_APPOINTMENTS_IMPORT"
description="COM_RESERVATION_APPOINTMENTS_IMPORT_DESC" />
		<action name="appointment.submenu"
title="COM_RESERVATION_APPOINTMENTS_SUBMENU"
description="COM_RESERVATION_APPOINTMENTS_SUBMENU_DESC" />
		<action name="bbbclass.access"
title="COM_RESERVATION_BBBCLASSES_ACCESS"
description="COM_RESERVATION_BBBCLASSES_ACCESS_DESC" />
		<action name="bbbclass.batch"
title="COM_RESERVATION_BBBCLASSES_BATCH_USE"
description="COM_RESERVATION_BBBCLASSES_BATCH_USE_DESC" />
		<action name="bbbclass.dashboard_list"
title="COM_RESERVATION_BBBCLASSES_DASHBOARD_LIST"
description="COM_RESERVATION_BBBCLASSES_DASHBOARD_LIST_DESC"
/>
		<action name="bbbclass.version"
title="COM_RESERVATION_BBBCLASSES_EDIT_VERSION"
description="COM_RESERVATION_BBBCLASSES_EDIT_VERSION_DESC" />
		<action name="bbbclass.export"
title="COM_RESERVATION_BBBCLASSES_EXPORT"
description="COM_RESERVATION_BBBCLASSES_EXPORT_DESC" />
		<action name="bbbclass.import"
title="COM_RESERVATION_BBBCLASSES_IMPORT"
description="COM_RESERVATION_BBBCLASSES_IMPORT_DESC" />
		<action name="bbbclass.submenu"
title="COM_RESERVATION_BBBCLASSES_SUBMENU"
description="COM_RESERVATION_BBBCLASSES_SUBMENU_DESC" />
		<action name="capital.access"
title="COM_RESERVATION_CAPITALS_ACCESS"
description="COM_RESERVATION_CAPITALS_ACCESS_DESC" />
		<action name="capital.batch"
title="COM_RESERVATION_CAPITALS_BATCH_USE"
description="COM_RESERVATION_CAPITALS_BATCH_USE_DESC" />
		<action name="capital.dashboard_list"
title="COM_RESERVATION_CAPITALS_DASHBOARD_LIST"
description="COM_RESERVATION_CAPITALS_DASHBOARD_LIST_DESC" />
		<action name="capital.version"
title="COM_RESERVATION_CAPITALS_EDIT_VERSION"
description="COM_RESERVATION_CAPITALS_EDIT_VERSION_DESC" />
		<action name="capital.export"
title="COM_RESERVATION_CAPITALS_EXPORT"
description="COM_RESERVATION_CAPITALS_EXPORT_DESC" />
		<action name="capital.import"
title="COM_RESERVATION_CAPITALS_IMPORT"
description="COM_RESERVATION_CAPITALS_IMPORT_DESC" />
		<action name="capital.submenu"
title="COM_RESERVATION_CAPITALS_SUBMENU"
description="COM_RESERVATION_CAPITALS_SUBMENU_DESC" />
		<action name="comment.access"
title="COM_RESERVATION_COMMENTS_ACCESS"
description="COM_RESERVATION_COMMENTS_ACCESS_DESC" />
		<action name="comment.batch"
title="COM_RESERVATION_COMMENTS_BATCH_USE"
description="COM_RESERVATION_COMMENTS_BATCH_USE_DESC" />
		<action name="comment.dashboard_list"
title="COM_RESERVATION_COMMENTS_DASHBOARD_LIST"
description="COM_RESERVATION_COMMENTS_DASHBOARD_LIST_DESC" />
		<action name="comment.version"
title="COM_RESERVATION_COMMENTS_EDIT_VERSION"
description="COM_RESERVATION_COMMENTS_EDIT_VERSION_DESC" />
		<action name="comment.export"
title="COM_RESERVATION_COMMENTS_EXPORT"
description="COM_RESERVATION_COMMENTS_EXPORT_DESC" />
		<action name="comment.import"
title="COM_RESERVATION_COMMENTS_IMPORT"
description="COM_RESERVATION_COMMENTS_IMPORT_DESC" />
		<action name="comment.submenu"
title="COM_RESERVATION_COMMENTS_SUBMENU"
description="COM_RESERVATION_COMMENTS_SUBMENU_DESC" />
		<action name="consultant.access"
title="COM_RESERVATION_CONSULTANTS_ACCESS"
description="COM_RESERVATION_CONSULTANTS_ACCESS_DESC" />
		<action name="consultant.batch"
title="COM_RESERVATION_CONSULTANTS_BATCH_USE"
description="COM_RESERVATION_CONSULTANTS_BATCH_USE_DESC" />
		<action name="consultant.dashboard_list"
title="COM_RESERVATION_CONSULTANTS_DASHBOARD_LIST"
description="COM_RESERVATION_CONSULTANTS_DASHBOARD_LIST_DESC"
/>
		<action name="consultant.version"
title="COM_RESERVATION_CONSULTANTS_EDIT_VERSION"
description="COM_RESERVATION_CONSULTANTS_EDIT_VERSION_DESC" />
		<action name="consultant.export"
title="COM_RESERVATION_CONSULTANTS_EXPORT"
description="COM_RESERVATION_CONSULTANTS_EXPORT_DESC" />
		<action name="consultant.import"
title="COM_RESERVATION_CONSULTANTS_IMPORT"
description="COM_RESERVATION_CONSULTANTS_IMPORT_DESC" />
		<action name="consultant.submenu"
title="COM_RESERVATION_CONSULTANTS_SUBMENU"
description="COM_RESERVATION_CONSULTANTS_SUBMENU_DESC" />
		<action name="doctor.access"
title="COM_RESERVATION_DOCTORS_ACCESS"
description="COM_RESERVATION_DOCTORS_ACCESS_DESC" />
		<action name="doctor.batch"
title="COM_RESERVATION_DOCTORS_BATCH_USE"
description="COM_RESERVATION_DOCTORS_BATCH_USE_DESC" />
		<action name="doctor.dashboard_list"
title="COM_RESERVATION_DOCTORS_DASHBOARD_LIST"
description="COM_RESERVATION_DOCTORS_DASHBOARD_LIST_DESC" />
		<action name="doctor.version"
title="COM_RESERVATION_DOCTORS_EDIT_VERSION"
description="COM_RESERVATION_DOCTORS_EDIT_VERSION_DESC" />
		<action name="doctor.export"
title="COM_RESERVATION_DOCTORS_EXPORT"
description="COM_RESERVATION_DOCTORS_EXPORT_DESC" />
		<action name="doctor.import"
title="COM_RESERVATION_DOCTORS_IMPORT"
description="COM_RESERVATION_DOCTORS_IMPORT_DESC" />
		<action name="doctor.submenu"
title="COM_RESERVATION_DOCTORS_SUBMENU"
description="COM_RESERVATION_DOCTORS_SUBMENU_DESC" />
		<action name="message.access"
title="COM_RESERVATION_MESSAGES_ACCESS"
description="COM_RESERVATION_MESSAGES_ACCESS_DESC" />
		<action name="message.batch"
title="COM_RESERVATION_MESSAGES_BATCH_USE"
description="COM_RESERVATION_MESSAGES_BATCH_USE_DESC" />
		<action name="message.dashboard_list"
title="COM_RESERVATION_MESSAGES_DASHBOARD_LIST"
description="COM_RESERVATION_MESSAGES_DASHBOARD_LIST_DESC" />
		<action name="message.version"
title="COM_RESERVATION_MESSAGES_EDIT_VERSION"
description="COM_RESERVATION_MESSAGES_EDIT_VERSION_DESC" />
		<action name="message.export"
title="COM_RESERVATION_MESSAGES_EXPORT"
description="COM_RESERVATION_MESSAGES_EXPORT_DESC" />
		<action name="message.import"
title="COM_RESERVATION_MESSAGES_IMPORT"
description="COM_RESERVATION_MESSAGES_IMPORT_DESC" />
		<action name="message.submenu"
title="COM_RESERVATION_MESSAGES_SUBMENU"
description="COM_RESERVATION_MESSAGES_SUBMENU_DESC" />
		<action name="plan.access"
title="COM_RESERVATION_PLANS_ACCESS"
description="COM_RESERVATION_PLANS_ACCESS_DESC" />
		<action name="plan.batch"
title="COM_RESERVATION_PLANS_BATCH_USE"
description="COM_RESERVATION_PLANS_BATCH_USE_DESC" />
		<action name="plan.dashboard_list"
title="COM_RESERVATION_PLANS_DASHBOARD_LIST"
description="COM_RESERVATION_PLANS_DASHBOARD_LIST_DESC" />
		<action name="plan.version"
title="COM_RESERVATION_PLANS_EDIT_VERSION"
description="COM_RESERVATION_PLANS_EDIT_VERSION_DESC" />
		<action name="plan.export"
title="COM_RESERVATION_PLANS_EXPORT"
description="COM_RESERVATION_PLANS_EXPORT_DESC" />
		<action name="plan.import"
title="COM_RESERVATION_PLANS_IMPORT"
description="COM_RESERVATION_PLANS_IMPORT_DESC" />
		<action name="plan.submenu"
title="COM_RESERVATION_PLANS_SUBMENU"
description="COM_RESERVATION_PLANS_SUBMENU_DESC" />
		<action name="reserve.access"
title="COM_RESERVATION_RESERVES_ACCESS"
description="COM_RESERVATION_RESERVES_ACCESS_DESC" />
		<action name="reserve.batch"
title="COM_RESERVATION_RESERVES_BATCH_USE"
description="COM_RESERVATION_RESERVES_BATCH_USE_DESC" />
		<action name="reserve.dashboard_list"
title="COM_RESERVATION_RESERVES_DASHBOARD_LIST"
description="COM_RESERVATION_RESERVES_DASHBOARD_LIST_DESC" />
		<action name="reserve.version"
title="COM_RESERVATION_RESERVES_EDIT_VERSION"
description="COM_RESERVATION_RESERVES_EDIT_VERSION_DESC" />
		<action name="reserve.export"
title="COM_RESERVATION_RESERVES_EXPORT"
description="COM_RESERVATION_RESERVES_EXPORT_DESC" />
		<action name="reserve.import"
title="COM_RESERVATION_RESERVES_IMPORT"
description="COM_RESERVATION_RESERVES_IMPORT_DESC" />
		<action name="reserve.submenu"
title="COM_RESERVATION_RESERVES_SUBMENU"
description="COM_RESERVATION_RESERVES_SUBMENU_DESC" />
		<action name="session.access"
title="COM_RESERVATION_SESSIONS_ACCESS"
description="COM_RESERVATION_SESSIONS_ACCESS_DESC" />
		<action name="session.batch"
title="COM_RESERVATION_SESSIONS_BATCH_USE"
description="COM_RESERVATION_SESSIONS_BATCH_USE_DESC" />
		<action name="session.dashboard_list"
title="COM_RESERVATION_SESSIONS_DASHBOARD_LIST"
description="COM_RESERVATION_SESSIONS_DASHBOARD_LIST_DESC" />
		<action name="session.version"
title="COM_RESERVATION_SESSIONS_EDIT_VERSION"
description="COM_RESERVATION_SESSIONS_EDIT_VERSION_DESC" />
		<action name="session.export"
title="COM_RESERVATION_SESSIONS_EXPORT"
description="COM_RESERVATION_SESSIONS_EXPORT_DESC" />
		<action name="session.import"
title="COM_RESERVATION_SESSIONS_IMPORT"
description="COM_RESERVATION_SESSIONS_IMPORT_DESC" />
		<action name="session.submenu"
title="COM_RESERVATION_SESSIONS_SUBMENU"
description="COM_RESERVATION_SESSIONS_SUBMENU_DESC" />
		<action name="sick.access"
title="COM_RESERVATION_SICKS_ACCESS"
description="COM_RESERVATION_SICKS_ACCESS_DESC" />
		<action name="sick.batch"
title="COM_RESERVATION_SICKS_BATCH_USE"
description="COM_RESERVATION_SICKS_BATCH_USE_DESC" />
		<action name="sick.dashboard_list"
title="COM_RESERVATION_SICKS_DASHBOARD_LIST"
description="COM_RESERVATION_SICKS_DASHBOARD_LIST_DESC" />
		<action name="sick.version"
title="COM_RESERVATION_SICKS_EDIT_VERSION"
description="COM_RESERVATION_SICKS_EDIT_VERSION_DESC" />
		<action name="sick.export"
title="COM_RESERVATION_SICKS_EXPORT"
description="COM_RESERVATION_SICKS_EXPORT_DESC" />
		<action name="sick.import"
title="COM_RESERVATION_SICKS_IMPORT"
description="COM_RESERVATION_SICKS_IMPORT_DESC" />
		<action name="sick.submenu"
title="COM_RESERVATION_SICKS_SUBMENU"
description="COM_RESERVATION_SICKS_SUBMENU_DESC" />
	</section>
	<section name="reserve">
		<action name="reserve.version"
title="COM_RESERVATION_RESERVES_EDIT_VERSION"
description="COM_RESERVATION_RESERVES_EDIT_VERSION_DESC" />
	</section>
	<section name="bbbclass">
		<action name="bbbclass.version"
title="COM_RESERVATION_BBBCLASSES_EDIT_VERSION"
description="COM_RESERVATION_BBBCLASSES_EDIT_VERSION_DESC" />
	</section>
	<section name="doctor">
		<action name="doctor.version"
title="COM_RESERVATION_DOCTORS_EDIT_VERSION"
description="COM_RESERVATION_DOCTORS_EDIT_VERSION_DESC" />
	</section>
	<section name="appointment">
		<action name="appointment.version"
title="COM_RESERVATION_APPOINTMENTS_EDIT_VERSION"
description="COM_RESERVATION_APPOINTMENTS_EDIT_VERSION_DESC"
/>
	</section>
	<section name="capital">
		<action name="capital.version"
title="COM_RESERVATION_CAPITALS_EDIT_VERSION"
description="COM_RESERVATION_CAPITALS_EDIT_VERSION_DESC" />
	</section>
	<section name="comment">
		<action name="comment.version"
title="COM_RESERVATION_COMMENTS_EDIT_VERSION"
description="COM_RESERVATION_COMMENTS_EDIT_VERSION_DESC" />
	</section>
	<section name="session">
		<action name="session.version"
title="COM_RESERVATION_SESSIONS_EDIT_VERSION"
description="COM_RESERVATION_SESSIONS_EDIT_VERSION_DESC" />
	</section>
	<section name="sick">
		<action name="sick.version"
title="COM_RESERVATION_SICKS_EDIT_VERSION"
description="COM_RESERVATION_SICKS_EDIT_VERSION_DESC" />
	</section>
	<section name="plan">
		<action name="plan.version"
title="COM_RESERVATION_PLANS_EDIT_VERSION"
description="COM_RESERVATION_PLANS_EDIT_VERSION_DESC" />
	</section>
	<section name="consultant">
		<action name="consultant.version"
title="COM_RESERVATION_CONSULTANTS_EDIT_VERSION"
description="COM_RESERVATION_CONSULTANTS_EDIT_VERSION_DESC" />
	</section>
	<section name="message">
		<action name="message.version"
title="COM_RESERVATION_MESSAGES_EDIT_VERSION"
description="COM_RESERVATION_MESSAGES_EDIT_VERSION_DESC" />
	</section>
	<section name="category.doctors">
		<action name="core.create" title="JACTION_CREATE"
description="JACTION_CREATE_COMPONENT_DESC" />
		<action name="core.delete" title="JACTION_DELETE"
description="COM_CATEGORIES_ACCESS_DELETE_DESC" />
		<action name="core.edit" title="JACTION_EDIT"
description="COM_CATEGORIES_ACCESS_EDIT_DESC" />
		<action name="core.edit.state"
title="JACTION_EDITSTATE"
description="COM_CATEGORIES_ACCESS_EDITSTATE_DESC" />
		<action name="core.edit.own"
title="JACTION_EDITOWN"
description="COM_CATEGORIES_ACCESS_EDITOWN_DESC" />
	</section>
	<section name="category.consultants">
		<action name="core.create" title="JACTION_CREATE"
description="JACTION_CREATE_COMPONENT_DESC" />
		<action name="core.delete" title="JACTION_DELETE"
description="COM_CATEGORIES_ACCESS_DELETE_DESC" />
		<action name="core.edit" title="JACTION_EDIT"
description="COM_CATEGORIES_ACCESS_EDIT_DESC" />
		<action name="core.edit.state"
title="JACTION_EDITSTATE"
description="COM_CATEGORIES_ACCESS_EDITSTATE_DESC" />
		<action name="core.edit.own"
title="JACTION_EDITOWN"
description="COM_CATEGORIES_ACCESS_EDITOWN_DESC" />
	</section>
</access>PK4~�[:��	TTassets/css/admin.cssnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		admin.css
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

/* CSS Document */
.no-click {
	pointer-events: none;
}

PK4~�[�О66assets/css/appointment.cssnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		appointment.css
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

/* CSS Document */


PK4~�[��77assets/css/appointments.cssnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		appointments.css
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

/* CSS Document */


PK4~�[ġ�33assets/css/bbbclass.cssnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		bbbclass.css
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

/* CSS Document */


PK4~�[p���55assets/css/bbbclasses.cssnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		bbbclasses.css
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

/* CSS Document */


PK4~�[���22assets/css/capital.cssnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		capital.css
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

/* CSS Document */


PK4~�[
��33assets/css/capitals.cssnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		capitals.css
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

/* CSS Document */


PK4~�[,�>�22assets/css/comment.cssnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		comment.css
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

/* CSS Document */


PK4~�[���33assets/css/comments.cssnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		comments.css
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

/* CSS Document */


PK4~�[����55assets/css/consultant.cssnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		consultant.css
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

/* CSS Document */


PK4~�[�4��66assets/css/consultants.cssnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		consultants.css
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

/* CSS Document */


PK4~�[|��ۡ�assets/css/dashboard.cssnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		dashboard.css
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

/* CSS Document */

.dashboard-container {
    margin-left: 10px;
    margin-top: 10px;
    width: 100%;
}
.dashboard-container [class*="span"] {
    display: block;
    float: none;
    margin-left: 0;
    width: auto;
}
.dashboard-container:before, .dashboard-container:after {
    content: "";
    display: table;
}
.dashboard-container:after {
    clear: both;
}
.dashboard-container [class*="span"] {
    box-sizing: border-box;
    display: block;
    float: left;
    min-height: 145px;
    min-width: 96px;
    width: 100%;
}
.dashboard-container [class*="span"]:first-child {
    margin-left: 0;
}
.dashboard-wraper {
    background: none repeat scroll 0 0 hsl(0, 0%, 93%);
    border-radius: 5px;
    float: left;
    margin: 1%;
    padding: 3px;
    width: 17%;
    min-height: 194px;
    min-width: 96px;
}
.dashboard-content a {
    background: linear-gradient(to bottom, hsl(0, 0%, 100%) 0%, hsl(0, 0%,
96%) 47%, hsl(0, 0%, 93%) 100%) repeat scroll 0 0 hsla(0, 0%, 0%, 0);
    border: 1px solid hsl(0, 0%, 85%);
    border-radius: 4px;
    box-shadow: 0 0 3px hsla(0, 0%, 0%, 0.1) inset;
    color: hsl(0, 0%, 20%);
    display: block;
    min-height: 89px;
    padding: 10px;
    text-align: center;
    text-decoration: none;
}
.dashboard-content a:hover {
    background: linear-gradient(to bottom, hsl(0, 0%, 90%) 0%, hsl(0, 0%,
100%) 100%) repeat scroll 0 0 hsla(0, 0%, 0%, 0);
    color: hsl(200, 100%, 30%);
    text-decoration: none;
}
.dashboard-title {
    display: block;
    padding-top: 5px;
}
.dashboard-info {
    background: linear-gradient(to bottom, hsl(0, 0%, 100%) 0%, hsl(0, 0%,
96%) 47%, hsl(0, 0%, 93%) 100%) repeat scroll 0 0 hsla(0, 0%, 0%, 0);
    border: 1px solid hsl(0, 0%, 85%);
    border-radius: 4px;
    box-shadow: 0 0 3px hsla(0, 0%, 0%, 0.1) inset;
    color: hsl(0, 0%, 20%);
    display: block;
    font-size: 12px;
    padding: 10px;
    text-align: center;
}
.dashboard-info span {
    display: block;
    text-align: center;
}
.dashboard-info img {
    margin: 0 auto;
}
.dashboard-table {
    border-top: 1px solid hsl(0, 0%, 87%);
    margin-top: 5px;
    width: 100%;
}
.dashboard-info h5 {
    font-size: 11px;
    font-weight: bold;
}
.dashboard-block {
    background: linear-gradient(to bottom, hsl(0, 0%, 95%) 0%, hsl(0, 0%,
86%) 100%) repeat scroll 0 0 hsla(0, 0%, 0%, 0);
    border: 1px solid hsl(0, 0%, 76%);
    border-radius: 3px;
    box-shadow: 0 1px 0 hsl(0, 0%, 98%) inset;
    margin-bottom: 20px;
}
.dashboard-block .dashboard-block-head {
    background: linear-gradient(to bottom, hsl(0, 0%, 95%) 0%, hsl(0, 0%,
86%) 100%) repeat scroll 0 0 hsla(0, 0%, 0%, 0);
    border-bottom: 1px solid hsl(0, 0%, 76%);
    border-radius: 3px 3px 0 0;
    box-shadow: 0 1px 0 hsl(0, 0%, 98%) inset, 0 0 3px hsl(0, 0%, 87%);
    height: 40px;
    position: relative;
}
.dashboard-block .dashboard-block-head h5 {
    font-size: 12px;
    margin: 0;
    padding-left: 10px;
    padding-top: 11px;
    text-transform: uppercase;
}
.dashboard-block .dashboard-block-content {
    background: none repeat scroll 0 0 hsl(0, 0%, 93%);
    border-radius: 0 0 3px 3px;
}
.dashboard-block .dashboard-block-box {
    background: none repeat scroll 0 0 hsl(0, 0%, 100%);
    border-top: 1px solid hsl(0, 0%, 82%);
    box-shadow: 0 0 5px hsl(0, 0%, 87%) inset;
}
.dashboard-block .dashboard-block-content .dashboard-block-box {
    margin-top: 0 !important;
}
.dashboard-block .dashboard-block-content .dashboard-block-box
.dashboard-block-table {
    margin-bottom: 0 !important;
}
.dashboard-block-table {
    background-color: hsla(0, 0%, 0%, 0);
    border-collapse: collapse;
    border-spacing: 0;
    margin-bottom: 20px;
    max-width: 100%;
    width: 100%;
}
.dashboard-block-table th, .dashboard-block-table td {
    border-top: 1px solid hsl(0, 0%, 87%);
    line-height: 20px;
    padding: 5px;
    text-align: left;
    vertical-align: middle;
}
.dashboard-badge {
    background-color: hsl(0, 0%, 60%);
    border-radius: 9px;
    color: hsl(0, 0%, 100%);
    font-size: 11.844px;
    font-weight: bold;
    line-height: 14px;
    padding: 1px 9px 2px;
    text-shadow: 0 -1px 0 hsla(0, 0%, 0%, 0.25);
    vertical-align: baseline;
    white-space: nowrap;
}PK4~�[��ys11assets/css/doctor.cssnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		doctor.css
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

/* CSS Document */


PK4~�[�v�22assets/css/doctors.cssnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		doctors.css
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

/* CSS Document */


PK4~�[�#o,,assets/css/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK4~�['E22assets/css/message.cssnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		message.css
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

/* CSS Document */


PK4~�[�Kv33assets/css/messages.cssnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		messages.css
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

/* CSS Document */


PK4~�[�
�DDassets/css/order.cssnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.31
	@build			8th May, 2021
	@created		17th December, 2020
	@package		Reservation
	@subpackage		order.css
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

/* CSS Document */


PK4~�[�m��EEassets/css/orders.cssnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.31
	@build			8th May, 2021
	@created		17th December, 2020
	@package		Reservation
	@subpackage		orders.css
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

/* CSS Document */


PK4~�[%i7N//assets/css/plan.cssnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		plan.css
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

/* CSS Document */


PK4~�[�XI�00assets/css/plans.cssnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		plans.css
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

/* CSS Document */


PK4~�[�
��22assets/css/reserve.cssnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		reserve.css
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

/* CSS Document */


PK4~�[�2t-33assets/css/reserves.cssnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		reserves.css
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

/* CSS Document */


PK4~�[��22assets/css/session.cssnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		session.css
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

/* CSS Document */


PK4~�[1(��33assets/css/sessions.cssnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		sessions.css
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

/* CSS Document */


PK4~�[�w`�//assets/css/sick.cssnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		sick.css
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

/* CSS Document */


PK4~�[���h00assets/css/sicks.cssnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		sicks.css
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

/* CSS Document */


PK4~�[�#o,,assets/images/icons/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK4~�[/o����assets/images/import.gifnu�[���GIF89a���Ft���\z����4^����Lr����|��Df�4Z�������$N|l�����<^����$J|����Tr����Dj����t�����<b������!�NETSCAPE2.0!�		,���`'�di�h��l�p,�tm�x��|��pH,�Ȥr�l:�ШtJ�Z�جv��z��xL.���z�n���|N���~����������������������������������������������������������������������������?
������
����
����������������s�!
�|�8@vD*Ǐ@�H�5@8�7,�p�Z��!�		!,���Ft������Tv����t��Tr��������$N|���d��J|��������|��������F|���\z����t��������,R����l�������������pH,�Ȥr�l:�ШtJ�Z�جv��z��xL.���z�n���|N���~������������������������������������������������������������������������������������������|�
��	���
����
����*�3k@|���s�\���uxe�_‡^I���;B���#9t+CB��0��@!��D�7��(�
T�����5J�%�)��P�J�J��իX�j�ʵ��EA!�		#,���Ft���Tv����4^����,R����t��$N|����$J|l��Ln�����J|���d~����<^����F|���\z�������4Z����|���������<b�������pH,�Ȥr�l:�ШtJ�Z�جv��z��xL.���z�n���|N���~��������������������������������������������������������������|��	��������
�����˯
����������������ݮ��'.�+���[�*�q�.L��b6pbi����Y"D�����P���B�2�I��͛8s��ɳ�(ϟ@�
J��ѣH�*]ʴ�ӧP�J�J��իX�j�ʵ�WEA!�		4,���Ft������Tv�<^�������t�����,R����Dj����d����Ԅ�����$N|��Tr�J|���\~�Df�|�����4Z����Lr������̼��F|������\z�<b�������t�����,V����Ln����l�����������������@�pH,�Ȥr�l:�ШtJ�Z�جv��z��xL.���z�n���|N���~���������������������������������������������
(�M)!��I����1�F)úķ�E�����B��·�4����0����)��������ø
���	�Hؖk�o4,�#(�B�	@(DF�t�L�8F�
!B.h�	s%S�\ɲ�˗0cʜI��͛8s��ɳ��ϟ@�
J��ѣH�*]ʴ�ӧP�J�J�j�HP1@�	�H
�CI��ij��@h��[b�g�k0
���⚀[�?��l��a��E�k/D�ki1jP�i�qI�u�Af�!H"\!���Wt�w���J�,����
!�		6,���Ft������Tv�4^������t��,R����Dj����ܤ�Ą��$N|d�����$J|Df�����J|������<^�|��4Z����Lr������ܬ�̌��l��F|������\~������t��,V����Ln���ܤ�̄��l��������<b��������@�pH,�Ȥr�l:�ШtJ�Z�جv��z��xL.���z�n���|N���~�����������������������[(%�c##'�_,����*�\����-�Z0����*�W%��ɣ!�V/����4�U,��ѡ�S4�ٷ+�R
��ҭ1�Q"�и�Q���"�Q4��	��`�vo���Q���*�(:�{�!`@a`�ŏ
C�I��ɓ(S�\ɲ�˗0cʜI��͛8s��ɳ��ϟ@�
J��ѣH�*]ʴ�ӧP�J�J5h	 x|�
V#,h8�2{��`�a�[#��
-�(2RSVw���E
�9��F�@��!2d�N~�.�I_`��R���Q��nd�,�u��Տ]1+;ކ]0W�!������N�����!�		3,���Ft���Tv����4^�������t��,R�Ln���ܤ��d������$N|Df����$J|�����J|���\~����<^�4Z���ܬ��l����쌢�F|���\z���������|��,V�Tr���ܤ��l������Dj��������<b�������pH,�Ȥr�l:�ШtJ�Z�جv��z��xL.���z�n���|N���~������������D)�n
�	�j*���� �g$��� *�d����%�b!���
�a(��ij.�`�����_é��^2�̗��\+�ũ�\0�ԣ�[-2��
-�[,���\'�2=�׏K��FUx� 0
prH��ŋ3j�ȱ�Ǐ
C�I��ɓ(S�\ɲ�˗0cʜI��͛8s��ɳ��$
<pB	��e�Ѡet�&�,
M֥R�8k�)',�DJ���D�$�l�,�@��,<sO���J̖e2��]�~�L��+94�t�K�^�`�ed
pq@��ӨS�^ͺ��װc˞M���۸s��ͻ����N���
!�		7,���Ft���Tv����4^�����t��,R����Ln�d����ܤ���$N|Df�������$J|d~����Ԍ��J|���\~����<^�4Z����Tr�l����ܬ�̄��F|���\z���������,V����Lr�l����ܤ����Dj�������<b����������pH,�Ȥr�l:�ШtJ�Z�جv��z��xL.���z�n���|N���~��9��B)4�x(�$���t����3�r�����p!�����n
����
�m*����$�l��$��k����j���5�i�ґ6�h+��$2�h6���h0���jʶ$�k2%
55
�
H����*\Ȱ�Ç#J�H��ŋ3j�ȱ�Ǐ C�I��
.�D��/%`��b-C1T�Dс��J�h���"]0������mb1�F���0��u�)	";��Z)ȡ���W6C�DV
0�W-q#OeVb�f���L�'��ChDX�@
��#K�L���˘3k�̹��ϠC�M���ӨS�^�ze�d`0���j@<`Y\%%
���IGi�8���7�!#|��#Z�c��Tp��
GՕ�Bd	�ʝ�,�|����*�+�����������3�P]����N�m`�.�ڃF(�e!�		<,���Ft���Tv����4^�������t�����,R����Ln�d�������Ĵ��$N|Df����$J|d~��􌢼���J|���\~����<^�|�����4Z����Tr�l����������̼��F|���\z���������t�����,V����Lr�l�����Dj�����<b�������������@�pH,�Ȥr�l:�ШtJ�Z�جv��z��xL.���z�n��pc�t��Z�|u���(6z�N4�~�	/��H����B	���~(89�����~��8����#��
���8�z6���(0�y
�����q8�����p��ן;�p7�ɖ5�q����p,ؖ��y
�(:�-;)x�
H����*\Ȱ�Ç#J�H��ŋ���0��2^i� �,
DR�
"էTJQ�[��2��X����NE)&P%-\FK�㨒����4Ɏ��	��DAMe�q-����k4�q�U
��1`�-V�y��%��`�'���H���/i���
ɘ3k�̹��ϠC�M���ӨS�^ͺ��װc˞M���۸s��ͻ����N�8��@�0��O�
�:������W4�
H@`�9j�
��l_3���?$����^�B
�����2Q�����6�H�[�$�f�wM��5
�{�ķY��uf
��⋝!�		6,���Ft���Tv����4^�����t��,R�Ln�������܄��$N|���d��Df�$J|������􌢼J|���\~����<^�|��4Z�Tr�������܄�����F|���\z�������t��,V�Lr������ܤ��l��Dj��<b�������������@�pH,�Ȥr�l:�ШtJ�Z�جv��z��xL.���Z;8tH�$���@bv�X
zp{�2���Ry��}$��N�}�z5��I����p��E0��z{��6������o�����+�Ĉ*��%���/ȟ(��ϟ���)֠/�$p+3ݠ��
�(%204���������
H�����,p���&$3@E�=*(L�2B�2C6na�0�j"�@H���WP��I�*#\ѤY�&��|�Z�S
�[���(*��N��\0������p�M�BcڭS[��
��	a�((	�EZ),,#A���) �@
#�ƻ�L���È+^̸��ǐ#K�L���˘3k�̹��ϠC�M������������u�@��1
A%!D��o9[|��N؈�v`�&�X,m��=�?2��XF�b2C�.��b
�g�U�<�!�g�H�G��4����
*

�f�&��6��F(�Vh�fxD!�		:,���Ft���Tv����4^�������t�����,R����Ln�������d������$N|Df����$J|������J|���d~����<^���|�����4Z����Tr�������l��������F|���\z���������t�����,V����Lr����l��Dj����<b�������������@�pH,�Ȥr�l:�ШtJ�Z�جv��z��kI50��h�����$M�E����t|y{z��_+{|�y'0��Z�����U.���,��P(�z��'��L��y���w��{2��D���|.����'8��$��n��,��o6��0�z/f��5�o��
7$6$7
���������h��Ƃv���*	*2�bX�$�
Aۣ�4ҩ M�&�hpT���0*�)ۃ�eFâ"a�
u2����%f2�7�z��F���J�tȖs[T/5.�Ԗ㪗Z
�J���l��,�'�tp�LȺx���˷�߿�L���È+^̸��ǐ#K�L���˘3k�|��/hhU�a076�F��a�]!���3��OU
Fr8=��p�U�T���	\�P��[�|�]@;8Ɓ;�؍H/����k@U��<
l.>-&�@����P�v�@���(�h`T
��
�c��GB
�����EV�{�oD@�c�I3L��p�0�5��V��]c0LWR
�U�*�56Az[Ѩ���xY�
rc!9�s�d0�󂃐��B�A
��Ѝe,��)h�h���l���p�)'�A!�		7,���Ft���Tv����4^������t��Ln����,R�������d��$N|���Df�������$J|�􌢼J|���d~�<^����|��Tr�����������l��F|���\z���������t��Lr����4Z����l�����Dj��������<b�������������pH,�Ȥr�l:�ШtJ�Z�جv˥~80��1u�h.(u��#(M�CA�@�#v��F"nz{��)���&��}{#��h}�����Z���{��Wm�����S�����O4������Jp�����E&��#f��C)��"��7��0s������2���u-0"���

mon,P�C�->+������t�	��\�2Hj	���:DLHP'&���뤥
G�j�х��TԼT�S�L>vZ2�����TP�i#,���Qé%JG�1g�
��е�ٳhӪ]˶�۷p�ʝK��ݻx���˷�߿��=a��Q�Nj@�����LX�i�J������Ù�d-�'�W
4���$�o��ܙEl�Zc?؈Ӗi����ۂ�RAM�X%����/�Q�[�q^��Y�
ڋ00
B��f�_Ͼ�����˟O��������Ͽ���(�h�&��6�`u�	@�^�$�@
�p��H����;����.<�@u3�-�ņ32��h4�i�,CM��bp��@s�`�i�I%G�4#�g�ȴ�Uņ���
�heex�@Q+�g	.؀�'!�		8,���Ft���Tv����4^�������t��,R����d�����Ln���Ą��$N|���$J|d~�Df������J|���\~����|��4Z����l�����Tr������̄�����F|���\z����<b�������t��,V����l�����Lr����Dj�������������@�pH,�Ȥr�l:�Ш����d��v��BQ�`\�8��j��𷠲����>>��Qo�{o���H
���n+���!b�{pn2��z%�qc��k$�����^.���n���S+���&��Q1�n�%��M$c�����J�{�ՖV*Q�n�܌�P�,�'��%P
	&6��V/P
��+X�è�n�0��!R�C
&VkCN_�542s�b2��N{x��a>t�rW���J�k��J}p��(�gnh����+S�
[�Bf.��V�8z�E��V�
�سhӪ]˶�۷p�ʝK��ݻx���˷�߿F
�sA�����(
����������XgTυp����Dh&
$@lu�tV�����
E�}�J_v�.�`p7��i��%�ʇl0u|Ft#�j�U�u#2�����(��@���aO��������Ͽ���(�h�&��6��F(�V��(��
�p@Ha����!b���s%�Q
��L"�!�-�Gi��^2�2�w4��)�g�j�`{+���U߽�ʍ_��9��}[�V�K�5
����'�S�p��~4Ȱ�@��x��|��矀Y!�		9,���Ft������Tv�4^�������t�����,R����d��Ln���Ĵ��$N|������$J|d~�Dj�����J|������\~�<^����4Z����l��Tr������̌�����F|������\z�������|�����,V����l��Lr���̄������<b������������pH,�Ȥr�l:�Ш�%�A�6�z���0��.Dx�n;W�Yn6�|�7��&z��Qr�r)���Gut��f/���8���g2������3��n2s��&���`���e���S
��g���-(N��sī��K4��4ң'�~�L-�&ߢ#���K�e��ڸ�.\L
pa��D����D‡E*pf"ċ9~�K��C�(�����z�(�p?��X���V<���p�	���4@�db�@�	
(����,���@����
�ׯ`ÊK��ٳhӪ]˶�[U"�8�����Dd���E�x�4HA�L�����H�m���l�q�cB�/7\����.
���㳗��94=E�KT���J�hul(&slq[������EGK��Ka�X#�˝���:1<�Pc�
'�vO�����ӫ_Ͼ�����˟O��������Ͽ�����
]ٷ	��t6�p�e�$ ��=�
,�x��o�T�[[PU�7A��;䰅HH��j<��wiY@�'���ch�T.�V<�$�3�eg�s�q
@A��l��
,��OX�!,2���H��`ɍk]���4�@Q��a�Z����Q�!rg���
٥VT�N�9��E�N<��"�y����U�(/��Z+�E�
ذ��`,5�0߁C�A��ͧA-���k��&���6���F+��Vk�ت!�		8,���Ft���Tv����4^�����t��,R����d��Dj���ܤ�Ą��$N|���$J|d~�Df�����J|���\~����<^����|��4Z����l��Lr������ܬ�̌��F|���\z���������t��,V����l��Ln���ܤ�̄������<b��������@�pH,��d�&�9RʨtJ�Z�S�5l�xL._�.��V����zC��x�|��c�^�ja}��X-\x�l���J
�lxk����w�2�������'��R$%2*R%��j���E)�k
4���k��82��#I���ʼ���H֨\$ح��&&67H7�孶�&I5��&��#eCM*A
��(A�Y1��
)78`�!F�V4�[c��ǓF��h��!6p3���{��4��F�CO��|C��Æ�\Q1P7�6d���T�*��0��կ`ÊK��ٳh��
q@��;�*aѢ	�b0��z�҅��%Qjt���đ�idC"�5��ⲡ�z��O�jż<.�'d�TX�!0�D�{N��T��6ߙ���A��3���`���1��q�r1����ËO�����ӫ_Ͼ�����˟O��������+���
C��2A�J~ ����Aj]�Ё}
�)&�x3��UT�|}	��D�
^Ň`c%%_M�fB��r	(�ɗ�8+��}
l��W���@�~*`c2�g�w�pB���0�e�)�d�i�h���l���p�)�t�i�4�
�Gaja�	`�c}"H0Ԁ�dF":h|+�Ɔ	%�Ǥ1\@�|4J�:��gr�@�|�VɅ��(.�r�r��G��k\��|�:�k
��W�6k,�h|
���'�s��`���Փ'!�		<,���Ft���Tv����4^�������t�����,R����Ln�d�������Ĵ��$N|Df����$J|d~��􌢼���J|���\~����<^�|�����4Z����Tr�l����������̼��F|���\z���������t�����,V����Lr�l�����Dj�����<b�������������@�pH,�Ȥ���j��dI�Z�جvh��̅�-���%@��n\+M�۩���
��rw��u*o}�()���X
}|�_0����E)`�n�m
��Z n
J.���o��T
{}7H3���4��G$"��8�F�|�{;��C���G;��m
��Μ_�E9l��������G��(1��5��(H��C+_���}If$Eq	f�ء7ݐ�A�O'ʒ��*
^�)M�8_#X�<�"��Cg��@�6.v
2��������
J��H!�:VF�ʵ�ׯ`ÊmÁ�8r�e�cY=*B�
6�d's�si��<���I�`Q|_�{���m�2$m̨�;�(�Rf���3�7R�dьhl��IjF�:ED�
�o1�=��$882�^tA����-�P#A�&�N����سk�ν����ËO�����ӫ_�H
&B�?B��&�iP�b�
�C1�`�l���5�do,��	?��>��Fi|�0+`(�0��b�3�Ga�`�^�U��&x�y�Z�<��g�
�����F�P��LVi�Xf��\v��`�)�d�i�h���l���KL�+hI�gu�y1i�>}L�BB���_�@�r����\��!憃~^$
�G��A�}ɇ�Y�c�y�!�J���V+A͗Ð���~+��['�M��,�1��bɁ#�pAmpVk��!�		<,���Ft���Tv����4^�������t�����,R����Ln�d�������Ĵ��$N|Df����$J|d~��􌢼���J|���\~����<^�|�����4Z����Tr�l����������̼��F|���\z���������t�����,V����Lr�l�����Dj�����<b�������������@�pH,�Ȥrh�@��賬Z�جv;dEP�pu�q��z����0�����U���Tx��v9}|�a4���,+U'�p�8��v~849I�}�(1��gpcafG���;��X��5$�b��`/��J��bG�(��p
��F*Ԗ(F�o�	��B-㦊F90���zο�.G��0
�w$:~��p-
�Ɗ��DC�["�8�fc�D?��Ё㍀���f
���0�@���`̛I\܂�@#�ΟCr�	&AC�H��
p	��I�"Hq��YQ�j��b[�&l:A�G7��T{�e0G���R�uh�cAP�b[�����5`yO@�l1�*���2��U��,�)�nPlଌ��aB����XW�b���E�yݐ1�
���nm��2T�!���УK�N����سk�ν����Ë7�`�5]a-(~>KO�j�m�BI�
^ү2#�'�-1�N�� .��A!Am~���	(�
sM(��H��C�PX?H���'��E�sT�4dv
�-!
h(0�#4|q�x�
xPh��PF)�TVi�Xf��\v��`�)�d�i�h���F
`���(�
xLi��A�-ڇ���n���P`�5"�I`&�W5�؟��Ӣ����'�N����=��`d	6ڂ��
�E
Di�J5��X�9�`gpp�)h���k6���F+��Vk�^!�		<,���Ft���Tv����4^�������t�����,R����Ln�d�������Ĵ��$N|Df����$J|d~��􌢼���J|���\~����<^�|�����4Z����Tr�l����������̼��F|���\z���������t�����,V����Lr�l�����Dj�����<b�������������@�pH,�Ȥ�غ�"(���Z�جv;|@(���q��z���aȼ���K��=��rx��G-)�J
|p}a4����`
Jzo{�(��k1��n#�Fq�q�-��[-��H|��+��W��nG"�ͯ��I��2G#Ǡ���Eξp�E4��8��B���/F7_�(��3��oʌ��
V��y��#.‰@'��}�����X(j������4�%�$�i�
h1s.�!�!��8t
UB�A0:���qaA�#4��R��8�F#��1
.��@ËrZ�5�u���p��|����F@k7f��mS�ՙ`[F1)�l��A�$-���d���v9��q�Q���GI���[�l�8*��6��B1��m�6�3#���ȓ+_μ���УK�N��u�7��QC��)р�UL�S��1��
����L�@|5-"�>f���>�2�g�B�30�����X���p!54K�fQ�f����L(�#b�Ё����7�v|��Dr��H6f��_���<=i�H&��L6��PF)�TVi�Xf��\v�`+@�W��@a���^��w`1D�B5G�B�J��H�`l�d�Af�8Lh�M6p�8!59Ah�$��
�4���Q(��L:0<���O��BK����1نD(�0%�}��V"p�#�0���+��k��&���6���F+��Vk�!�		<,���Ft���Tv����4^�������t�����,R����Ln�d�������Ĵ��$N|Df����$J|d~��􌢼���J|���\~����<^�|�����4Z����Tr�l����������̼��F|���\z���������t�����,V����Lr�l�����Dj�����<b�������������@�pH,�Ȥ2�c1j����Z�جv;\��p�-���j
�b��F#M��?��(p��؀�p#v��I"�l8J7
`m��(�����I4�����t'��mHpp�n9��\���nG_���6��X���a.��΂1��K��o(Ga�s��F����D»m8��D0֜�TE��(4�8��xP�lA�~.�����d�"8o@�r�
$iK�h
}���$*P@��mɎ
*���@"d�	*	�t�<o2�����MC6T�b��H��$0z�	+%5=B
)nT�7b�3JZ�@0ql���1pK�Ț|�Pd�U�n٨�u���.;�-�uO�U^%rU��`�m�`�$=�l���rm>����>�V�m�"�$e�mA��uN����ȓ+_μ���!c<�p
��Ѝ)�+��DՆ�L"��!E
G�p_�"P8���q`V
t��Q�fK`���
�xK=���f�A�fzQx�
�Ҟ�\�v�
'�ȅC�����e4��>߱x5�R�P2�a�,��@)�Di�H&��L6��PF)�T���
UQ�RÊQڰ�75��d�,�B%6	_h�0�$#.�X�^�\M�W'089K|�8��9�d�d
�-R��%d�NrH^%m.�AT���x`^��H`JY��
EeY�*무�j뭸�뮼���+��k��&���6���!�		;,���Ft���Tv����4^�����t�����,R����Ln�d��������$N|���Df����$J|d~��􌢼���J|���\~����<^�|�����4Z����Tr�l�����������F|���\z���������t�����,V����Lr�l�����Dj�����<b���������������pH,�Ȥr)\!P��I�Z�ج5TxO�GK.���H�1�Tux.�����ԡ�GSJr��rz��K9�`^I8�_�6���(^��'`*H,�~�`��z0���78G���7��f���'�F�út
��X
ɐ�#G�t�+��L+��~�F�����I׳`G2���4�E6��^�F�tB��������;C�2�1#�J.��wb��]�!Q�	���@�d��}�bz)Q�<$����VA��d�U#��ēk�0>�
I/��*+t�@a���<��4f�@y_r0��G���!i�)�?(,W�*޿E>ES�a!%�%x��];Cn���h)���Rl��;�jr��ʓy�o
rN�
�p��N@0P�q9F�`�����ȓ+_μ���T�y^�B��sbܡ~o��`b(���EQ�o�%��‹d�z��ಮ@�;��<�U~Nި"V
�q��F�
W�z_Mr,��"8P���L�HS�AB��x����������x4��e'���"(��G�͸�
:����Di�H&��L6��PF)�TVi�q+�
PܕF�p�.�p�C�d^��
����~�Ve�	dH�S���5�Q�`�}8%�A��甏]���Rb
�#DU�M��v�'p���8
�%��������8D�J��(�i�����+��k��&���6���F+��Vk��f���v���+��!�		;,���Ft������Tv�4^�������t�����,R����d��Ln������Ĵ��$N|���$J|d~�Dj��􌢼���J|������\~�<^�|�����4Z����l��Tr���������̼��F|������\z�������t�����,V����l��Lr��������<b���������������pH,�Ȥry$1�Шtm}h4�T��P�ŋJ.���C�F�ϖ�MG�l�^���Q~J
#~mN{��Lt��(�I2������C���H���������m-G2��~.��f$k���4G0���7��[u��"F8�Ǫ��O'ȸG��m0��I/��_�F0���-**xI-��)G���^'�#�Y�P�2�۱�P�тEE0T����$̸�3D+@�-S�ZHp����zjDP���95�D���D��(4�0?���
���1�ƍ�N5�Ca�Q�r"H!�
�kYư
1Z޿L�;�a$^�b�c!�:B�����(R�c�1Ź�u��!�1-�������-㸐Q��-��!bł�sN�����l�80����
��K��Y6��Z�Y��G'���tH�&�����>ۯ��v�_B������bȴ`+5(Qc�B@|#�!U���a�aQ�J�DDGe~"����+/��4pb/6�Еk3��"31��<���@)�Di�H&��p1�pŽK���Б�xE�D
��i�D��E�w�`�Zj��@��O�F�@�,��Y����~
Q�d�SC�C�p��Y�	_<#%����v'����{��Q�;��!*��*D؎�B�0�U��/8
�oP���+��k��&���6���F+��Vk��f���v���+��k�	覫��!�		9,���Ft������Tv�4^�����t��,R������d��Ln���Ą��$N|���$J|d~�Dj�������܌��J|������\~�<^����4Z�������l��Tr������̄��F|������\z������|��,V������l��Lr��������<b�������������pH,�Ȥr�l:�Ш��!�����43wJ.����n�B�Ģ
dZ��~_\�l�kK�ml)|��J4�l�I%������u��u*H4t��1��|�t�l/G-�����e0���3G���-��QǴ�8F+�Ո2��M3��k�E	ݹuڮ	&W-�H
�ϲ�E4ºk�$���)� C0YkN�2�B��\��""

��(*�$8:<qA"�#g�2�J�4�Ԁ�ll&��0�1�/#�;�A����`���#�I�l`0��%G�Y]��j�Y����
Op��c �2.f�k��

(Pp��||�
N�u.��/1�U�Ő����N�Ș�`��*j��*O"����u-(m�6N�
p
A�۸�x@�N�?sG����/������@���}���(���
K��=�d���(o�RZ1��!=���H�+���p#�C��6d�$'�p�9�pyj#�SktPW���`
@�q(QPA6�,���0�(�4�h�8��6��B<2Rm
�A=A�Q�51�I�R`�P@%�ϕO�
r�ą�ᙘI|0�Sl���
�U͛J�"�*�щ���a��H�F�<�Z�
�	�R��Et`�(-�y��&1M�h��5
6�0Cr���ꪬ��꫰�*무�j뭸�뮼���+��k��&���6���F+��Vk��f���v�J!�		:,���Ft���Tv����4^�����t��,R����Ln����������d��$N|Df�������$J|�􌢼J|���d~����<^�|��4Z����Tr������������l�����F|���\z���������t��,V����Lr���ܤ��l��Dj�����<b�������������@�pH,��d��9RʨtJ�Z�Ә�5l�xL._�.��~�����L��o��z���Dz,sv��Iz^�jaQ#lj���-\{�lQ�z���u%l���&I)��k0��c���z1Iy�j�3��!+'+J
��]'H£��Ɨ7�\oG��{�G+�Ҽ�ۇ*i�l3*G����H'�ڭ���V�^�#�@��V����w���u��d”]�v�H���F.�0��
��7�ܘᒕ%
[�2�Oe��{(z�qD��],D���0|����dG$7,8dC^jR�!��N�*���D�����ք��d�
�H�
��%�[F���^�Ҁ�
�.�41'k�R�$u�COiz@Ѩ�������c��Ռ�7{h#�3%.��Ж�0��8Q��s!8(~)�<7H�^���:��F��>Pu
�\@��/z�@�����bܬ�װ�V��'�z��㑀R�M'�
��y���xY�`v�Q(��b��p��x�@+
��Tp�	dv�0�(�4�h�8��<rG
k\�A��x���PiGt�]p��eH��-�D�7t��>
l9FI�
��bVer�M�&
.¦��Y	J�dB�vNaNU��g0|�J�VA�X��h�yL�Ra�&ԳV:�a��@��N�(�@�
$(V꫰�*무�j뭸�뮼���+��k��&���6���F+��Vk��f���v���+��k��[i!�		9,���Ft������Tv�4^�������t�����,R����d��Ln���Ĵ�Ԅ��$N|Df�$J|d~��������J|������\~�<^�|�����4Z����l�������̌�����F|������\z�������t�����,V����l��Tr���̄��Dj��<b������������pH,�Ȥ2��h�eI�Z�جvh�`I�-���%�0��n�*M�۩����h7w��u)}|n�'X
(22��v
p��.�T+	`&0/��f'�~�n
T/~|*��nJ,���K���8��
�o5H0}��&2K��m��u"1�}6�E$��{�I%��$�u���G8؊�h��@�}l�K�!�;��`�`?%42tCp�}��p�@�����C/��e2��Z�L[b#Q��e�`f	�Q��DN`ș@@9��Zf%���XA
H�<0�pX�[\�f*�-^^�a�(s�fQ�nm�S��K�S/��uz�E�m2��'�6,��X��A��eBh$
F'g
����h3:����0h���s�'�
@c��چQ�9��K<$>
�k�؇�x,�W��)��D�s�a
c����|���An�_C@x����6����5��&AY��
h��D�	)Mh_E��P���ɐ1D�dt����݉�1�4�h�8��<jX�!�C��H�l�3�gd%�@
Y=)H�ds������e�0�e��_c��ŀk��fu�wH�oVe�O��X�2QG{�1C�']h�C���j
�{0��5�%�yMZF�
������@ܹ��|���ꪬ��꫰�*무�j뭸�뮼���+��k��&���6���F+��Vk��f���v���+��k�覫n�A!�		;,���Ft���Tv����4^�����t�����,R����Ln�d��������$N|���Df����$J|d~��􌢼���J|���\~����<^�|�����4Z����Tr�l�����������F|���\z���������t�����,V����Lr�l�����Dj�����<b���������������pH,�Ȥrh�@'�賬Z�جv;dAN�p�t�q��z����0h����U���Rx��v8}|�a���,*U&�p�7��vba78I~c{~0Z6*&*t���}fG���:X�T����Q$����.W��c��u��G�'��`
V-����k)p�qF�o�	V�n��h+���YT�z�.XY0�h������(�xѠ����Np�ȅ/g
ɱ�
rU4L�5��
-�H�!�.����r�B�Yj�F��n�`
�Lw�E���Ƣ'jhғl߉~\��DyH��_N��Z�+��IT��'r��b�yw%����T�on�E�BF\��D
p脌��j<���@Zߐ�0��"���C��#f�đ++/YaĈ��mӧ9���KOb���8[�k72#������3U��{j����+��	
8��ۏQ~:ٹ�dҟv8�6�>U
���9�G
��Q8n�Z�¹pP2�t��x0p�
1�؇(���,���G���20r��z�@@P�!�|��	䁑׈@�s�1�H6י����8
�;'x�� �l��H_
�u�DY��F�	'�Yss�����Ԁ-K�G^E��'
���	zG����x<@�!��
5����v�駠�*ꨤ�jꩨ��ꪬ��꫰�*무�j뭸�뮼���+��k��&���6���F+��Vk��f���v���+��2!�		:,���Ft������Tv�4^�������t�����,R����Ln�������d�����$N|Df����$J|�􌢼���J|������d~�<^�|�����4Z�����������l�����F|������\z�������t�����,V����Tr����l��Dj�����<b�������������@�pH,�ȤYˤf�EC��Z�جv;T%`@L
q��z)���YeM�۫��X��F+'7V5.}{zc%��v�cU1�n||��i/p�$�I$n����Y+�pbJc��zT��K��oI3��}��G��I��&&+X
3),-�j�}z�G��6W5��c3�g����;��Z�n�@�ò~Zdcg���0�!�Jɍa�J��
P�B��4�t:�kFI,P1|SC	��K��؈i�FJTb�ݬR#�DO��
�›�#���
�R+��t�G��Tp�P�P+�Q>aL��v��GH�=��0^kiH/�t����"I�{��u�;]1��X��Q%4dh�NZo�Țv����1����@pC�A7����5
ciO.�#������{��3��`���w��D@�~)t>�}"@�<5�!�}�g�s��7�<a�W�t`��-�_�edB.���$�`��)p�$4`�(���,��(��f�(]|��$�X�yKe>BB�)�'I����1)M��gBbR��aP�@@����K{��
����9��$��n�q�<)EW'%9��J�{
r�CT���P�~	!J�Օ�����`*�QZ�1tpH4��*ꨤ�jꩨ��ꪬ��꫰�*무�j뭸�뮼���+��k��&���6���F+��Vk��f���v���+��k�
覫��H!�		:,���Ft���Tv����4^�����t�����,R����Ln�d����Ԅ��$N|���Df����$J|d~�����J|���\~����<^�|�����4Z����Tr�l�����������F|���\z���������t�����,V����Lr�l�����Dj�����<b�������������@�pH,�Ȥr9�"�R�I�Z�ج����A�-��h��5���&M�c=��(P�*
om�&v��E!�p6U#3���#��u+�n�T���_��f%^p�L������W5��o&Kl�����L��`,K��n��H��&&K��o��Dl���o
J(��`3��.��dI�`���l�#gIۚ�0�5�j���$AJ��נ�L�+�
(i�e�v�|u��a��
�(X��E���$�@�J#4����
'D08��L1,ȇ����%��ȯM�9�$h�\$H��H�p(�hXn@B{oH
�*]�$*Z
(�Q�_�0p�"�D�����L��ja�Y	��ހJEXa:����W
s*��
�;	��E�"<p���Eh&U7S��"/³�R/S)P���t$8{�KV�Fǿ90���T�C��#7X�7�D5MC�}H�@@?L��
�Q�H*�B |֨A�D[� �(�$�P@
�H�P����bl#�V
T5cf#|:��Z�yr���J�o���<�]�
O��m�(X%.d�ȇ[�y�8�`�xԆ�g�‰xo��f.
|ä�͙�E����ɀ�UQo������4��3��^�Vj饘f�馜v�駠�*ꨤ�jꩨ��ꪬ��꫰�*무�j뭸�뮼���+��k��&���6���F+��Vk��f���v���+�䖻i!�		9,���Ft���Tv����4^�������t�����,R�Ln�������d�����$N|���Df�$J|d~�����쌢����J|���\~����<^�|�����4Z�Tr����������F|���\z���������t�����,V�Lr����l�����Dj�����<b���������������pH,�Ȥr�l:�Шtʤ!4�nj��z��Ȫ�p�Z��T���)�v�K����
(r��C7~jvjP1��~��_&k�%v�M4��%0��S/���56M���w�������%M
�����J®���K*���.��EЭ�w5L/�k�%2��9��vL��j��3�ы�L-ٶx���5��Q�Q,�}y#B
J.��u�I�����K	��!@�c�D�
	bG)"�`7Ap�d��@^NI�ώ�#2��`��r��"4J�}��1�������`���U��H@�$�(�)��Җ�qj��L�݉�0��%2a�	
�]��J�?�7N��E44_z�8p	\��p`{����)�H}D���~p�2���`�F�F
��
5J�I	\�
e�"�D�@�5.D4'��%����Y`{���9��
7R�5/C����+�>�k�����M��
Ƞ�u�D�ݱH�T	��`�X��	M�I4��
6��m�i@��!�v).�9�Q!h�c52���%�	�E�@[��1[��V�7AA�!�dG
V^)P^\v�bSFS���� X-%�&*6�d/���
i'���v�bYi��g��5(h*�@b
$y�1|=*餔Vj饘f�馜v�駠�*ꨤ�jꩨ��ꪬ��꫰�*무�j뭸�뮼���+��k��&���6���F+��Vk��f���v���+�O!�		9,���Ft������Tv����<^����t��,R�������d��������Dj����$N|���$J|d~��􌢼Tr����J|������\~�|��4Z����l�����������Lr����F|������\z����<b����t��,V�������l�����Ln������������������pH,�Ȥr�l:�ШԨ:���b��z��@�ȳ�׆z��p(aF6����FZ�-nq��B6u�w&.4P#x���o2���O��x��S6�xg��K���[��M��g�L)��f��J#���L4��d{��D���&-L�����8�Ɍ�K'�e�7�o*((5L*��d�J�����\jX@0i�%Tus�D�u
�R�
�3B$I��9�0�
�	�@(�*�F$2��Z��Gl4S:�!)��sH
D�f��m�0OgM���0U�‚F �A���N��
�O��&��B0aj�6y��!�in,X��C>�L��7�a%�L"�p�1�;
�uL���M�Rn��^�a�Cs�9+nh�!�4c����6,\n�@���*d�H�����˱p�(�|`�@�o�]B�,�g�.%.lrq�t/*��,6��x�]���V�
%��k^���lc'�ҏ6�=�B7
��Q)d{.�@|J��D=��N�I��pT�4�TTg��(f�]L@@"u�xrb8�3�dI8dҊ3&QAG#^��*@�d&��#c؈CN��*&4��	
��DN(� 0^y7u`"7`��
��i�$��cM_���G��Pu,�����I�wz��'h𜡐F*餔Vj饘f�馜v�駠�*ꨤ�jꩨ��ꪬ��꫰�*무�j뭸�뮼���+��k��&���6���F+��Vk��f���v���+��^!�		:,���Ft���Tv����4^����t��������,R�d�����Ln������Ĵ��$N|Df����$J|d~��􌢼���J|���\~�<^�|�����4Z�l����섞������̼��F|���\z������t��������,V�l�����Tr����Dj�����<b�������������@�pH,��dҢ���rJ�Z�����&p�Ӛ��4�f���`�������Q�͏�
qo�n2���f,p_q}���J�&p�`)g,3
-��S7�����Y]�q��E�|�Y3�|���Y����Y"	3�T9���0X��`
�W#
̑RJھ�`3Y�`��Sp� Vh%���K
I�Ν8%@�{^P��P�,*�E�b^�;��G��d�H�DI�G,���J��l�0Ӣ�=8pa�)�W�8Q��DF������ĥ�ѧ]�|�yV.^�"J[�i�>�A8�G]""�-�Y
£h7�	��)�:ޤ��b"�r��@����i���Шu8��O��ԩ�������s����06�����(^���,��=���]DPxv�ԝ����"4�x˔_�i0��#k��W|��P4�A=~\2����Y-�W(W�5�w�`�X�rA���$��:\0C�`�p���P�}*�2�@|̠B���ė��q������0�Q)�~�A�J��Bc˘�]�w��$�ai�Lf�B��ih�'��FM��j�7R!0©E��ҥ�i�	i.(�g50@P3h��e�k��QC��uF�馜v�駠�*ꨤ�jꩨ��ꪬ��꫰�*무�j뭸�뮼���+��k��&���6���F+��Vk��f���V!�		9,���Ft���Tv����4^�����t��,R����Ln����d�����$N|���Df�������$J|d~���J|���\~����<^�|��4Z����Tr����l�����������F|���\z���������t��,V����Lr����l��������Dj�����<b������������pH,�Ȥrh�:�Y��Z�جv;T=J�p�t�q��zi���p'����Յ��Nx��v7}|�a���Y$�p�6���G~c{~-������8��I"*&#*
Yb�pq/��C7�#"W��}�	��)�%o3tUƣcv)��V'�}.�K
,�|~#j/o.7�H��%�U*��,�g"0���@C��
�l`�
[�l�Ҡ�8
2��!M��`���ig�q�`����g%EoP�������ԫ�Aވ����h(�,��x����,�G�-D(�E�	ACe3.b
�
G=g��1�d-NU�9��a#�s
1���F��B��W�KLI��"���rJt��Q�K��	$9������^(8�Є�Y�v����(��
!l�`B��{�0S�z��o�t�^���Zι�m@RfS��	w��lpz�z�^��U����7H��@���Pp�x�AW��I_n�YPנA~�Bxʃ��8�X�V`�	��(���,���0�(�4�h�8��<���@)�D�CC�0�8|X�"8P-��$��q]�D򕂙�I��Y=,8I��ІU�k�Rc��xE�w1ASS�A@�C4�ZB���M��}jF�*zNYm���B�PN�n$ʩ	tUMjrzi��AH�&1���j뭸�뮼���+��k��&���6���F+��Vk��f���v���+n�A!�		:,���Ft������Tv�4^�������t�����,R����d��Ln���Ĵ�Ԅ��$N|Df����$J|d~����Ԍ��J|������\~�<^����4Z����l�������̄�����F|������\z�������|�����,V����l��Tr����Dj�����<b�������������@�pH,�ȤYӤfD��Z�جv;T%`@q��zI���eM�۫��X��u.|z�&%���Y2p�||��\!3.'sX0{�}b
��Un�2X��{T��F+�{,W��}p`��B7�¢c�Ụz+�Ə��`�K��6�ƚ��*U+��o��̢!V��7�(���\���D�Rm���@+7X�caBT5�̓S���0q��(Yd���r-ؼ�f*����	3%oH@���L��0��ia|��Q��OW�g���:hd����lt��������F	3f`��_6�
Ōh&��EAAHyP]�UZ���a�!�P�����Q�S!������%�5
*7�4v�Pò�`�YI}}'A]��g:9�s�I�lc2��_m�Տ����;ނa�
���U�^g!��L�+iq��,2�4����E9#�	/��	ǵ�
K2��N9L
,���!f��h�(���,���0�(�4�h�8��<���@)�Di�H&��L6��PF)�TVi�Xf��\v��`�)�d�9eoY�p�,&d0%R��Sn��U�@Ys�E	Bꡄ������Q�s�29��kz�eM��i֓�5���1ق`ٸ�d����eMF
)>�B!6A���І�	R��I�p��9��6pP@Nf&���6���F+��Vk��f�-�A!�		<,���Ft���Tv����4^�������t�����,R����Ln�d�������Ĵ��$N|Df����$J|d~��􌢼���J|���\~����<^�|�����4Z����Tr�l����������̼��F|���\z���������t�����,V����Lr�l�����Dj�����<b�������������@�pH,�Ȥr�l:�Шt�$A�CIA�z�`%�@�˂Wx�n+s�y^���k˥B��^%f�r�(;x�T4	rt-S
���g0$��N�fg(R��sfv��H���89Q������D
t��(P-�����,��s8P6����ʺq���6O9��2׺*���O2����*�͠jO��f����q�R#��
�Vap���5("�3�F�M9p�k`��d��X`��a��4����:@0�낶9	"}���M]42�����+�ܸPC�DFM��!QUQ�6!pc��Z�ɱ��>ŊMq�^E�j-Tx�\�&���q7숆�P���7���z��Y�nô�v5��hd�6�2��Ȱ��.��,�	#@�2@(�O�Z7�qn��.�С�qZw�	{RL��[gR����_
0��C�.ӗ����&���P�t��.
���~���)ѯ�
���X�I�)�en2�+� � +��%
��&�5�)�\��
i^��8D��,�T�0�(�4�h�8��<���@)�Di�H&��L6��PF)�TVi�Xf��\v��`�)�d�i�h���l���p�)�t�i'�7
B�0sR�҆`���X2�H��0��$�R��-y��*=���f4��<ʵ٨7)w��@j��G.�G1�s�ْ��W�>��>8&%����SޠC
f$��lp!�		:,���Ft���Tv����<^�����t��,R�������d��Dj�������$N|������$J|d~���Tr�������J|���\~����Df�|��4Z�������l��Lr���������̼��F|���\z����<b����t��,V�������l��Ln�������������������@�pH,�Ȥr�l:�ШtJ�Z�X]��r�$ٰx�<P4Z#�*��{~ťx42'Dw,$t�O)xwz(h+Xvy�}��H0w��,7V"��i���B���(Uj��-�����"T6���x��-���,T����džѵ�T.�ĝՆ6�z�(T���9�,е���x1�t�h���i�.O�}nZ@�mD�ޖ�نpN�e�
԰2�U�4*҉��-	�p(�Qj"�$����L␃E��4p�4r�;D؄b#B
��p`��C����XYu�����!�j�&90��r���m�1�yD���
JD��pX���8�
�V�*2�07���WQ��ò��FM��W3���/�p`[m�n���=4A�"�%μ���УK�N����سk�ν���HN<�+�9J�^$�y11�SA��,+��s꾕�ѣMh�Aa�I�@C�S$�'0(�QU���Q@Вd�B�^�u��e��2��NаX)!��	zt���E22�MD��G(��c5��)
	\�
()�TVi�Xf��\v��`�)�d�i�h���l��fX���\���$���i�d��0�pV�$}}Z���y��P��
�JV0�<(\��
���
<�I�W��
��r�
z�G�WW�9xYY�~��Ö\z�5Z�?��e��0�}b�oF+��Vk��f���v���+�sA!�		<,���Ft���Tv����4^�������t�����,R����Ln�d�������Ĵ��$N|Df����$J|d~��􌢼���J|���\~����<^�|�����4Z����Tr�l����������̼��F|���\z���������t�����,V����Lr�l�����Dj�����<b�������������@�pH,�Ȥr�l:�Ш��J�jb��z���@��x�n;
2�l6G8����(06{��Q4ugt���G9
���u1����et�y
+��&���fl98�#j�����.k5�d,��;���(`
Ľ��{-���[_����yŭ0`����n
�`��r��E-4����(&��
f��m�	i�������5�=\!�Bjg(tkrC�E(F�a#�����j6�A�/Z�񠍟�
jUG��!+�R�Ab�_�>�!Ca
��wF�V82{e��'��������#��
���ao1�g�ؠ�A
kgs�-�ip��H<H�
C̠�؈�4P�Ш�`��JE��<vL�)��-<�P�`�m�
^�����ȓ+_μ���УK�N����سk�ν����ËO�����ӫ_Ͼ����+`!b|'����!�$p�$�	�aA�ȑI1\�_�14�W[
�H�f��`X�f@�<�TG�SG@N���da$�a(}58Mi���`a�4�B�Ў�C)�+��J��3����Q�x
��4f9D��oD�0eg���\%�/$h�5��Z;YV`����]
��^5�����e����8���5�����X`��B
b$�p�=5�I�
/-E��*yC
�$�b���>���+��k��&���6���F+��Vk��f���!�		<,���Ft���Tv����4^�������t�����,R����Ln�d�������Ĵ��$N|Df����$J|d~��􌢼���J|���\~����<^�|�����4Z����Tr�l����������̼��F|���\z���������t�����,V����Lr�l�����Dj�����<b�������������@�pH,�ȤRؠ	p��絬Z�جv;\�`�2p��zi���d[���+��q$y��v9pr�a)���Yqc�����G:�}�1���3r~�o;�����}���x��~`��k;���	��;.55T[9��~:á
5c�![��`7Ә+	�q	�Zݓ(�-0�0-[,�0+��<p���pjh��Qv�Pd�а"��B��G"
z�裑��
p`��7ʹ`�ȺRa6�E���74ji�q���&H�&(�)�!
j�Ɵ(j�a@_@S3�pu
E��!e�C�'.o����,
U42�CT���u�2�c�����ѡ�[0�e�[Ld�L�(�R���/��p�
lh�k��8�o�g
±�w��ٳ��ЁC��sN����ȓ+_μ���У/��BD
Ko�⯟ldb/�ǯ�
X[�k�1�>�1�i��fS̵��e��䒀YXvf"x�8��jQ�7	Sa
�Dp0�l�EZ����ZU�;(j��K��;-na�zeVC_5��@�=)�Di�H&��L6��PF)�TVi�Xf��\v��`�)�d�i�h���l���p�)�%/PC0�RN��e��
8&ML�
��`�dgeM"���J�p�yo��Mm��{G�7�"�9�Z��i��\�QKF�Q�D
��
8!'<*��W�h�1ȠQfqE�����C|��f!�		;,���Ft������Tv�4^�������t�����,R����Ln�������d�����$N|Df����$J|�􌢼���J|������\~�<^�|�����4Z����Tr����������l�����F|������\z�������t�����,V����Lr����l��Dj�����<b���������������pH,�Ȥr�X���I�Z�ج�N��-��h�
�z���|N�"�o�>S��"yn`�5��W+mzx`q���F3���7���7��n�8��;"+(+i���`,��8	o^"g4�����,�z4�e-��a4Œ*���1�Z)'��|ӈ��'fΎ�`/���o/�Z/��x�.A0�"(Q	\�#c�Y���@L��AM��rj�pH#����}Aa��
U"pI�}�ث�s����d����7Q���a��ڔ��a�
�R��ЁB���`ÊK�l)

��jV����Dh���	:x�n�
qcbP�7��Rd�2Cޣ
[ѡ��~V�=�Q�v��a)�l��Q0��,�In1k"�$��F��'`�>��Th̃���!��7r�����n0</�q��L�8�Vb;��w�*����_�ba�<�L`:%r�Fح��+��Zy�	��Q�T5K$$HDƩ�{U����–�,�#7�d!�x�7Եb6���:9�8c��B	%�
�Di�H&��L6��PF)�TVi�Xf��\v��`�)�d�i�h���l���p�)�t�i�x��s�
	��%�ɥ��@:|	,�0S��v�6p�Yz���eh�鳚��9*�	*^��7�yAݕ�5�G�Z6�Y#/p�ۋ��%�	sͬX�p#!�p��˦[�0��	
@����+��k��^!�		:,���Ft������Tv�4^�������t�����,R����d��Ln���Ĵ�Ԅ��$N|Df����$J|d~�����J|������\~�<^�|�����4Z����l�������̌�����F|������\z�������t�����,V����l��Tr���̄��Dj�����<b����������@�pH,�Ȥr�l:�ШtJ�Z�ج��"��EK.���`mbGd��H�x6�4�"kwzmw�D!^.acd'z��m78�j�_pZ�y�y*�}+��&Y
���,�r8���w�V��w�q2���
W�����f^��&�V5´w��d��!X7ܔ�d(ɲ�X׭.��Y��w�W
n���._���1��E
��0H�?Zm
h���/�X���s'>-964!���dpH�8j̛Mj����ΟIVi�P�H8��*!ހP�(;
`
��W"�ș����~�>��i�N%xV��9	c��so��
��0��0HZ�0L�n%�1X�4��r$F�38�>&p�s1��a�`:��"�n����x0̰Af�*��N����ȓ+_μ���УK�N����سk�ν����ËO����:H@c����L�0�>����
��
��(���B��l��'��3�5j��b��L=���yg��B����8�܀�$0����XJ�C8�/7(��$�B�'�G@V���uV�
|Y�B$��P�Pw@�\F�[}y_	���B���(���S?��]�y��ACa|
�Ǜ:�X)F�M�
B�:�dR��N�l��C�7��B����ꪬ��꫰�*무�j뭸�뮼���+��k��&���!�		<,���Ft���Tv����4^�������t�����,R����Ln�d�������Ĵ��$N|Df����$J|d~��􌢼���J|���\~����<^�|�����4Z����Tr�l����������̼��F|���\z���������t�����,V����Lr�l�����Dj�����<b�������������@�pH,�Ȥr�l:�ШtJ�Z�X3he�����HP�����M?j�~�D�iuh8y|��D$�v�g���4v�����o���h#�$,'
�b���{-fv7�X���z/
��8�V$�u�g�oʕ(0^�T˻i*o7����T��h4o�(/�D7
L!���n��Xl��&B�J4�›�.�a���m�6XH�@�
pl�r�1�XёpI��s#��38�m�i����)f�H1��F*�L�A�ME�	����F���H�T!12���M*��i���ˆ 㙭�v<���ԓ/�B
�TV���p���	xP�)��0���Ƙ����F��:�2��s��+]���d(.��m#�8\(4�����N����ȓ+_μ���УK�N����سk�ν����ËO����1��|
�E�`�0�~I���
�W�"��쇄
�H#}
�GV���3$֎��2��A�B�%ZD�<8�Sq��!�V��փ���iZ@>����<�P`)�8
�Tr��C(P�6DE�cu&.)�TVi�Xf��\v��`�)�d�i�h���l�����dR�,��^K�Vjx���`�l>^�b2+�]u��9A����(�HG�.p�GJ
����a
��W��(�>jehg>��ͬ�,i�c��'�9�0c
(0�ޔ@@������F+�&A!�		<,���Ft���Tv����4^�������t�����,R����Ln�d�������Ĵ��$N|Df����$J|d~��􌢼���J|���\~����<^�|�����4Z����Tr�l����������̼��F|���\z���������t�����,V����Lr�l�����Dj�����<b�������������@�pH,��$�4`q�ШtJ�Z��Q@e��xL._=\T��\��zX��]�|��C�xj�\;}��b9x�ii5���J���iO������4�����w\)��R!&4-P)l����G+v]6I'���(��B4�x	/H
��x9ͽɩ�F:��](�ݮ	��8�F$8�v����iH6X��F>W8�0"I�Px
q�U�s��bCÈ#h����~�`�\i�#�v6��)�^0U]�,�C�
4��ڗS��Ch�`�%��R7�)��TH�S�X
�1PF�l�`� �Xd
�*��p�`C6�Z�z�LW-v��0��[�C1�p7�f�u��C�livQ�F��ɛ��x����,�|��n�"�a�Y
���Z@.5�ywS�)m�9�����УK�N���H-4̨��A��8��I�i�,���&��T���<�9,3]#����p��Ӂ:G%�E���f��2ZAX��a�����H5
Oqx�7]��a"^a�T(\��)��Bq	"�<1�1���0�U�cܐ����Q@��%��PF)�TVi�Xf��\v��`�)�d�i�h���l���p�)�t�i�x��|���Յ
֘9��^T@M�!$��
|���i���9`��0n��o�d�b�	]��fY�W*�<�%�5ބO��
�i�L���%0�ϖ�L�r����e2��
�v�46�`�@�8,0h��k.�A!�		:,���Ft���Tv����4^�����t��,R����Ln����������d��$N|Df�������$J|�􌢼J|���\~����<^�|��4Z����Tr������������l�����F|���\z���������t��,V����Lr���ܤ��l��Dj�����<b�������������@�pH,�Ȥ�X��l��Z�جv;�u&�XP�����h����DM�۫�6ܽ��t!-o�z&���Yyaz��6���G,���`4��Vq
X({�bm0��G�b5V���&��B!��6�K��{�����oU{ʑͰ�֐9K�|��٠ϛ�bӪ�m�3��`V8o�p��.A���	-���0�%R�܅apE��	d��ԋn�Zt�䄺jzH�\yDŅU�z��9�&w`X��)���0/���B0
�*UqB�
3p4TJ��իX�j�ʵ�ׯ`ÊK��ٳ��P�
�^
�f	r�x�NO���\�U�L&`;��0�(o���N�q�Ĝ���	��
%��&��&p�F�#��61V�a!��0SegهS;�fT
���3	�ru��'	Pn.�A
b��"�
62८�F��b�%�����`Pd��0���bR���!qC]�(ԂPBd����W�=x��f��G�x6�mT�!0��s#1�Dn�!R�E�`�"�8D��f�$�!(���0�J5i�'`��tJF)�TVi�Xf��\v��`�)�d�if�	��ࠔ
��)Y�0�	
d����JJ�0aho�8�����b6C���JJ���iH
Q2�3}q�Ӑ :Y����RސK7 8�
8�f�VҀ�-
0	�)��k��&���6���F+��V[f!�		;,���Ft������Tv�4^�������t�����,R����Ln�������d�����$N|Df����$J|�􌢼���J|������d~�<^�|�����4Z����Tr����������l�����F|������\z�������t�����,V����Lr����l��Dj�����<b���������������pH,�Ȥr�l:�ШtJ�Z��lRq��R8�xLV^h��	�ʄ��(%0�q5`��Xq�M)}cy}k|''��G#�z+Z}����B���Y��}"��+��{'0W|������z��W���z9�q.��k�U2�؍%�p(iٷ'V����e
��{�U5��j��c���k2W1��Pٸ7���o�\\��l_:�b�C�ፕ��ݐQL	}�Fe��m
��Ű��OύIZd�HE!̔b`���(r�p�2@i�)9J�(�C�ӫX�j�ʵ�ׯ`�BԐ#���ZC�7�4�mj�EC5.�M�@�9_t�%h�/d��᰻����R���g���S�����왔䉍��&��^jW�����
٥j`�|N�R:v7B��7),�:�l|�7
���97�ֳk�ν����ËO�����ӫ_Ͼ�����˟O��������Ͽ���.@�4`Om�rCl���AIi`�[~"D��#���7��CC~;�ܧB�="R}&�#��A�w�8��e�P}8$������$`Q}+��G0�	
܈�����s�1�
,�@@�'�d�i�g*�B(
P���b	5�7dc/h��#bA����
31�7C;̔h���͎�p8*�wڅ�|h/�S�3TLq�1�!3rݧ��jl��A�`�S������*��BQ���
(���&���6���F+�Ԗ!�		9,���Ft������Tv�4^������t�����Ln����,R�������d��$N|Df�������$J|�􌢼J|������d~�<^����|�����Tr������������l��F|������\z������t�����Lr����4Z����l��Dj��������<b�������������pH,�Ȥr�l:�ШtJ�Z�جv˥z:2�E�9u�hnhu��%R(M�CC�@�'v��F$nz{��+���'��}{%��h}�����Z���{�'',�Ym����1��U�����|&�S6����u&��n8�Qp���i��{3�O��%u�׈2�O+��$u���%�M��2s�P��}�:�pP�����	��8`&��C����B�
2H`X�ȌQ�h�A�7n^�lY��o�
b0 >x��W���
�3tP���ʽyQ�7��
��*d�h}�hC]�#ɦ�G�A�F$�0�,H
a!��0�i��]�!77L+����覘b�p��-��s��|A5M�Ƌ�nd�`�j{$�����=1�N����ȓ+_μ���УK�N����سk�ν����Ë��"U��Sn8�Ɇ��LȨ���J�x�yϋ�!q�h
%`/5��N���<Р/��/LX�T��hH�OF��B$�ˉ%�Cb�V�g$���h{��b0I\7��`'7��o�P0B�F0`�`-0|HF)�TVi�Xf��\v��`�)�d�i�h���l���p�)�t�Y�08��HV�P"�pW�3����
��M�A>7�P!A}��"Z� �Z���+�S�M�X�@�"4�RB�+F�N
��#6o�b
�D���ݨB����
7�c���@��R��	1ࠂa�!�		;,���Ft������Tv�4^�������t�����,R����Ln�d����Ĵ�Ԅ��$N|Df����$J|d~�����J|������\~�<^�|�����4Z����Tr�l�������̄�����F|������\z�������t�����,V����Lr�l�����Dj�����<b���������������pH,�Ȥr�l:�Ш����f��v��BS`|�8����������>N��Qo�{o���H���n,���#b�{pn3��z'�qc"��k&�����^.���n���S,���(��Q1�n�'��Mc�����J�{�ՖV+5Q"�n�܌	�P3�-�5*��'P
:":��V/�	��+XOĨ�n�0�"R�C&VkCN�	842s�b2��T{xH�a>t�rW���Nب�K��J}p��(�gnh���+S�
S�Bf.��X�8z�E��X� �سhӪ]{��� 8
�Ԍu�0�[Wш@�ї�S_�-\�@��2B�/'�v*�vh!f5&r�p�3Ǣm�6���|QY�i�is����0��9A��^R�B
p4s����
1d�y��ln�A��4�V'�a\�+�����
��㍰0�E8%�m��aB�-�f�
�M�acV�N�r�w'Ǡ3�I$�M�D�+�!���K
��poH�
`Wق'&�q���b8u�('�0c�6�';6��@�ABQ�U��IF)�TVi�Xf��\v��`�)�d�i�h���l���p�)�^���ea���D�)|��P�e
�vBY�@���$�e��BؕIWZ
S+�Q��pÕ5$H��W&ڡ�M)�c��������]�U�p��e��O�385�|i�����i��f���v���6!�		9,���Ft������Tv�4^�������t�����,R����d��Ln���Ĵ��$N|������$J|d~�Dj�����J|������\~�<^����4Z����l��Tr������̌�����F|������\z�������|�����,V����l��Lr���̄������<b������������pH,�Ȥr�l:�Ш�%�A�6�z���0��.Dx�n;W�Yn6�|�7��&z��Qr�r)���Gut��f/���8���g2������3��n2s��&���`���e���S
��g���-(N��sī��K4��4ң'�~�L-�&ߢ#���K�e��ڸ�.\L
pa��D����D‡E*pf"ċ9~�K��C�(�����z�(�p?��X���V<���p�	���4@�db�@�	
(����,���@����
�ׯ`ÊK��ٳhӪ]˶�[U"�8�����Dd���E�x�4HA�L�����H�m���l�q�cB�/7\����.
���㳗��94=E�KT���J�hul(&slq[������EGK��Ka�X#�˝���:1<�Pc�
'�vO�����ӫ_Ͼ�����˟O��������Ͽ�����
]ٷ	��t6�p�e�$ ��=�
,�x��o�T�[[PU�7A��;䰅HH��j<��wiY@�'���ch�T.�V<�$�3�eg�s�q
@A��l��
,��OX�!,2���H��`ɍk]���4�@Q��a�Z����Q�!rg���
٥VT�N�9��E�N<��"�y����U�(/��Z+�E�
ذ��`,5�0߁C�A��ͧA-���k��&���6���F+��Vk�ت!�		8,���Ft���Tv����4^�����t��,R����d��Dj���ܤ�Ą��$N|���$J|d~�Df�����J|���\~����<^����|��4Z����l��Lr������ܬ�̌��F|���\z���������t��,V����l��Ln���ܤ�̄������<b��������@�pH,��d�&�9RʨtJ�Z�S�5l�xL._�.��V����zC��x�|��c�^�ja}��X-\x�l���J
�lxk����w�2�������'��R$%2*R%��j���E)�k
4���k��82��#I���ʼ���H֨\$ح��&&67H7�孶�&I5��&��#eCM*A
��(A�Y1��
)78`�!F�V4�[c��ǓF��h��!6p3���{��4��F�CO��|C��Æ�\Q1P7�6d���T�*��0��կ`ÊK��ٳh��
q@��;�*aѢ	�b0��z�҅��%Qjt���đ�idC"�5��ⲡ�z��O�jż<.�'d�TX�!0�D�{N��T��6ߙ���A��3���`���1��q�r1����ËO�����ӫ_Ͼ�����˟O��������+���
C��2A�J~ ����Aj]�Ё}
�)&�x3��UT�|}	��D�
^Ň`c%%_M�fB��r	(�ɗ�8+��}
l��W���@�~*`c2�g�w�pB���0�e�)�d�i�h���l���p�)�t�i�4�
�Gaja�	`�c}"H0Ԁ�dF":h|+�Ɔ	%�Ǥ1\@�|4J�:��gr�@�|�VɅ��(.�r�r��G��k\��|�:�k
��W�6k,�h|
���'�s��`���Փ'!�		<,���Ft���Tv����4^�������t�����,R����Ln�d�������Ĵ��$N|Df����$J|d~��􌢼���J|���\~����<^�|�����4Z����Tr�l����������̼��F|���\z���������t�����,V����Lr�l�����Dj�����<b�������������@�pH,�Ȥ���j��dI�Z�جvh��̅�-���%@��n\+M�۩���
��rw��u*o}�()���X
}|�_0����E)`�n�m
��Z n
J.���o��T
{}7H3���4��G$"��8�F�|�{;��C���G;��m
��Μ_�E9l��������G��(1��5��(H��C+_���}If$Eq	f�ء7ݐ�A�O'ʒ��*
^�)M�8_#X�<�"��Cg��@�6.v
2��������
J��H!�:VF�ʵ�ׯ`ÊmÁ�8r�e�cY=*B�
6�d's�si��<���I�`Q|_�{���m�2$m̨�;�(�Rf���3�7R�dьhl��IjF�:ED�
�o1�=��$882�^tA����-�P#A�&�N����سk�ν����ËO�����ӫ_�H
&B�?B��&�iP�b�
�C1�`�l���5�do,��	?��>��Fi|�0+`(�0��b�3�Ga�`�^�U��&x�y�Z�<��g�
�����F�P��LVi�Xf��\v��`�)�d�i�h���l���KL�+hI�gu�y1i�>}L�BB���_�@�r����\��!憃~^$
�G��A�}ɇ�Y�c�y�!�J���V+A͗Ð���~+��['�M��,�1��bɁ#�pAmpVk��!�		<,���Ft���Tv����4^�������t�����,R����Ln�d�������Ĵ��$N|Df����$J|d~��􌢼���J|���\~����<^�|�����4Z����Tr�l����������̼��F|���\z���������t�����,V����Lr�l�����Dj�����<b�������������@�pH,�Ȥrh�@��賬Z�جv;dEP�pu�q��z����0�����U���Tx��v9}|�a4���,+U'�p�8��v~849I�}�(1��gpcafG���;��X��5$�b��`/��J��bG�(��p
��F*Ԗ(F�o�	��B-㦊F90���zο�.G��0
�w$:~��p-
�Ɗ��DC�["�8�fc�D?��Ё㍀���f
���0�@���`̛I\܂�@#�ΟCr�	&AC�H��
p	��I�"Hq��YQ�j��b[�&l:A�G7��T{�e0G���R�uh�cAP�b[�����5`yO@�l1�*���2��U��,�)�nPlଌ��aB����XW�b���E�yݐ1�
���nm��2T�!���УK�N����سk�ν����Ë7�`�5]a-(~>KO�j�m�BI�
^ү2#�'�-1�N�� .��A!Am~���	(�
sM(��H��C�PX?H���'��E�sT�4dv
�-!
h(0�#4|q�x�
xPh��PF)�TVi�Xf��\v��`�)�d�i�h���F
`���(�
xLi��A�-ڇ���n���P`�5"�I`&�W5�؟��Ӣ����'�N����=��`d	6ڂ��
�E
Di�J5��X�9�`gpp�)h���k6���F+��Vk�^!�		<,���Ft���Tv����4^�������t�����,R����Ln�d�������Ĵ��$N|Df����$J|d~��􌢼���J|���\~����<^�|�����4Z����Tr�l����������̼��F|���\z���������t�����,V����Lr�l�����Dj�����<b�������������@�pH,�Ȥ�غ�"(���Z�جv;|@(���q��z���aȼ���K��=��rx��G-)�J
|p}a4����`
Jzo{�(��k1��n#�Fq�q�-��[-��H|��+��W��nG"�ͯ��I��2G#Ǡ���Eξp�E4��8��B���/F7_�(��3��oʌ��
V��y��#.‰@'��}�����X(j������4�%�$�i�
h1s.�!�!��8t
UB�A0:���qaA�#4��R��8�F#��1
.��@ËrZ�5�u���p��|����F@k7f��mS�ՙ`[F1)�l��A�$-���d���v9��q�Q���GI���[�l�8*��6��B1��m�6�3#���ȓ+_μ���УK�N��u�7��QC��)р�UL�S��1��
����L�@|5-"�>f���>�2�g�B�30�����X���p!54K�fQ�f����L(�#b�Ё����7�v|��Dr��H6f��_���<=i�H&��L6��PF)�TVi�Xf��\v�`+@�W��@a���^��w`1D�B5G�B�J��H�`l�d�Af�8Lh�M6p�8!59Ah�$��
�4���Q(��L:0<���O��BK����1نD(�0%�}��V"p�#�0���+��k��&���6���F+��Vk�!�		<,���Ft���Tv����4^�������t�����,R����Ln�d�������Ĵ��$N|Df����$J|d~��􌢼���J|���\~����<^�|�����4Z����Tr�l����������̼��F|���\z���������t�����,V����Lr�l�����Dj�����<b�������������@�pH,�Ȥ2�c1j����Z�جv;\��p�-���j
�b��F#M��?��(p��؀�p#v��I"�l8J7
`m��(�����I4�����t'��mHpp�n9��\���nG_���6��X���a.��΂1��K��o(Ga�s��F����D»m8��D0֜�TE��(4�8��xP�lA�~.�����d�"8o@�r�
$iK�h
}���$*P@��mɎ
*���@"d�	*	�t�<o2�����MC6T�b��H��$0z�	+%5=B
)nT�7b�3JZ�@0ql���1pK�Ț|�Pd�U�n٨�u���.;�-�uO�U^%rU��`�m�`�$=�l���rm>����>�V�m�"�$e�mA��uN����ȓ+_μ���!c<�p
��Ѝ)�+��DՆ�L"��!E
G�p_�"P8���q`V
t��Q�fK`���
�xK=���f�A�fzQx�
�Ҟ�\�v�
'�ȅC�����e4��>߱x5�R�P2�a�,��@)�Di�H&��L6��PF)�T���
UQ�RÊQڰ�75��d�,�B%6	_h�0�$#.�X�^�\M�W'089K|�8��9�d�d
�-R��%d�NrH^%m.�AT���x`^��H`JY��
EeY�*무�j뭸�뮼���+��k��&���6���!�		;,���Ft���Tv����4^�����t�����,R����Ln�d��������$N|���Df����$J|d~��􌢼���J|���\~����<^�|�����4Z����Tr�l�����������F|���\z���������t�����,V����Lr�l�����Dj�����<b���������������pH,�Ȥr)\!P��I�Z�ج5TxO�GK.���H�1�Tux.�����ԡ�GSJr��rz��K9�`^I8�_�6���(^��'`*H,�~�`��z0���78G���7��f���'�F�út
��X
ɐ�#G�t�+��L+��~�F�����I׳`G2���4�E6��^�F�tB��������;C�2�1#�J.��wb��]�!Q�	���@�d��}�bz)Q�<$����VA��d�U#��ēk�0>�
I/��*+t�@a���<��4f�@y_r0��G���!i�)�?(,W�*޿E>ES�a!%�%x��];Cn���h)���Rl��;�jr��ʓy�o
rN�
�p��N@0P�q9F�`�����ȓ+_μ���T�y^�B��sbܡ~o��`b(���EQ�o�%��‹d�z��ಮ@�;��<�U~Nި"V
�q��F�
W�z_Mr,��"8P���L�HS�AB��x����������x4��e'���"(��G�͸�
:����Di�H&��L6��PF)�TVi�q+�
PܕF�p�.�p�C�d^��
����~�Ve�	dH�S���5�Q�`�}8%�A��甏]���Rb
�#DU�M��v�'p���8
�%��������8D�J��(�i�����+��k��&���6���F+��Vk��f���v���+��!�		;,���Ft������Tv�4^�������t�����,R����d��Ln������Ĵ��$N|���$J|d~�Dj��􌢼���J|������\~�<^�|�����4Z����l��Tr���������̼��F|������\z�������t�����,V����l��Lr��������<b���������������pH,�Ȥry$1�Шtm}h4�T��P�ŋJ.���C�F�ϖ�MG�l�^���Q~J
#~mN{��Lt��(�I2������C���H���������m-G2��~.��f$k���4G0���7��[u��"F8�Ǫ��O'ȸG��m0��I/��_�F0���-**xI-��)G���^'�#�Y�P�2�۱�P�тEE0T����$̸�3D+@�-S�ZHp����zjDP���95�D���D��(4�0?���
���1�ƍ�N5�Ca�Q�r"H!�
�kYư
1Z޿L�;�a$^�b�c!�:B�����(R�c�1Ź�u��!�1-�������-㸐Q��-��!bł�sN�����l�80����
��K��Y6��Z�Y��G'���tH�&�����>ۯ��v�_B������bȴ`+5(Qc�B@|#�!U���a�aQ�J�DDGe~"����+/��4pb/6�Еk3��"31��<���@)�Di�H&��p1�pŽK���Б�xE�D
��i�D��E�w�`�Zj��@��O�F�@�,��Y����~
Q�d�SC�C�p��Y�	_<#%����v'����{��Q�;��!*��*D؎�B�0�U��/8
�oP���+��k��&���6���F+��Vk��f���v���+��k�	覫��!�		9,���Ft������Tv�4^�����t��,R������d��Ln���Ą��$N|���$J|d~�Dj�������܌��J|������\~�<^����4Z�������l��Tr������̄��F|������\z������|��,V������l��Lr��������<b�������������pH,�Ȥr�l:�Ш��!�����43wJ.����n�B�Ģ
dZ��~_\�l�kK�ml)|��J4�l�I%������u��u*H4t��1��|�t�l/G-�����e0���3G���-��QǴ�8F+�Ո2��M3��k�E	ݹuڮ	&W-�H
�ϲ�E4ºk�$���)� C0YkN�2�B��\��""

��(*�$8:<qA"�#g�2�J�4�Ԁ�ll&��0�1�/#�;�A����`���#�I�l`0��%G�Y]��j�Y����
Op��c �2.f�k��

(Pp��||�
N�u.��/1�U�Ő����N�Ș�`��*j��*O"����u-(m�6N�
p
A�۸�x@�N�?sG����/������@���}���(���
K��=�d���(o�RZ1��!=���H�+���p#�C��6d�$'�p�9�pyj#�SktPW���`
@�q(QPA6�,���0�(�4�h�8��6��B<2Rm
�A=A�Q�51�I�R`�P@%�ϕO�
r�ą�ᙘI|0�Sl���
�U͛J�"�*�щ���a��H�F�<�Z�
�	�R��Et`�(-�y��&1M�h��5
6�0Cr���ꪬ��꫰�*무�j뭸�뮼���+��k��&���6���F+��Vk��f���v�J!�		:,���Ft���Tv����4^�����t��,R����Ln����������d��$N|Df�������$J|�􌢼J|���d~����<^�|��4Z����Tr������������l�����F|���\z���������t��,V����Lr���ܤ��l��Dj�����<b�������������@�pH,��d��9RʨtJ�Z�Ә�5l�xL._�.��~�����L��o��z���Dz,sv��Iz^�jaQ#lj���-\{�lQ�z���u%l���&I)��k0��c���z1Iy�j�3��!+'+J
��]'H£��Ɨ7�\oG��{�G+�Ҽ�ۇ*i�l3*G����H'�ڭ���V�^�#�@��V����w���u��d”]�v�H���F.�0��
��7�ܘᒕ%
[�2�Oe��{(z�qD��],D���0|����dG$7,8dC^jR�!��N�*���D�����ք��d�
�H�
��%�[F���^�Ҁ�
�.�41'k�R�$u�COiz@Ѩ�������c��Ռ�7{h#�3%.��Ж�0��8Q��s!8(~)�<7H�^���:��F��>Pu
�\@��/z�@�����bܬ�װ�V��'�z��㑀R�M'�
��y���xY�`v�Q(��b��p��x�@+
��Tp�	dv�0�(�4�h�8��<rG
k\�A��x���PiGt�]p��eH��-�D�7t��>
l9FI�
��bVer�M�&
.¦��Y	J�dB�vNaNU��g0|�J�VA�X��h�yL�Ra�&ԳV:�a��@��N�(�@�
$(V꫰�*무�j뭸�뮼���+��k��&���6���F+��Vk��f���v���+��k��[i!�		9,���Ft������Tv�4^�������t�����,R����d��Ln���Ĵ�Ԅ��$N|Df�$J|d~��������J|������\~�<^�|�����4Z����l�������̌�����F|������\z�������t�����,V����l��Tr���̄��Dj��<b������������pH,�Ȥ2��h�eI�Z�جvh�`I�-���%�0��n�*M�۩����h7w��u)}|n�'X
(22��v
p��.�T+	`&0/��f'�~�n
T/~|*��nJ,���K���8��
�o5H0}��&2K��m��u"1�}6�E$��{�I%��$�u���G8؊�h��@�}l�K�!�;��`�`?%42tCp�}��p�@�����C/��e2��Z�L[b#Q��e�`f	�Q��DN`ș@@9��Zf%���XA
H�<0�pX�[\�f*�-^^�a�(s�fQ�nm�S��K�S/��uz�E�m2��'�6,��X��A��eBh$
F'g
����h3:����0h���s�'�
@c��چQ�9��K<$>
�k�؇�x,�W��)��D�s�a
c����|���An�_C@x����6����5��&AY��
h��D�	)Mh_E��P���ɐ1D�dt����݉�1�4�h�8��<jX�!�C��H�l�3�gd%�@
Y=)H�ds������e�0�e��_c��ŀk��fu�wH�oVe�O��X�2QG{�1C�']h�C���j
�{0��5�%�yMZF�
������@ܹ��|���ꪬ��꫰�*무�j뭸�뮼���+��k��&���6���F+��Vk��f���v���+��k�覫n�A!�		;,���Ft���Tv����4^�����t�����,R����Ln�d��������$N|���Df����$J|d~��􌢼���J|���\~����<^�|�����4Z����Tr�l�����������F|���\z���������t�����,V����Lr�l�����Dj�����<b���������������pH,�Ȥrh�@'�賬Z�جv;dAN�p�t�q��z����0h����U���Rx��v8}|�a���,*U&�p�7��vba78I~c{~0Z6*&*t���}fG���:X�T����Q$����.W��c��u��G�'��`
V-����k)p�qF�o�	V�n��h+���YT�z�.XY0�h������(�xѠ����Np�ȅ/g
ɱ�
rU4L�5��
-�H�!�.����r�B�Yj�F��n�`
�Lw�E���Ƣ'jhғl߉~\��DyH��_N��Z�+��IT��'r��b�yw%����T�on�E�BF\��D
p脌��j<���@Zߐ�0��"���C��#f�đ++/YaĈ��mӧ9���KOb���8[�k72#������3U��{j����+��	
8��ۏQ~:ٹ�dҟv8�6�>U
���9�G
��Q8n�Z�¹pP2�t��x0p�
1�؇(���,���G���20r��z�@@P�!�|��	䁑׈@�s�1�H6י����8
�;'x�� �l��H_
�u�DY��F�	'�Yss�����Ԁ-K�G^E��'
���	zG����x<@�!��
5����v�駠�*ꨤ�jꩨ��ꪬ��꫰�*무�j뭸�뮼���+��k��&���6���F+��Vk��f���v���+��2!�		:,���Ft������Tv�4^�������t�����,R����Ln�������d�����$N|Df����$J|�􌢼���J|������d~�<^�|�����4Z�����������l�����F|������\z�������t�����,V����Tr����l��Dj�����<b�������������@�pH,�ȤYˤf�EC��Z�جv;T%`@L
q��z)���YeM�۫��X��F+'7V5.}{zc%��v�cU1�n||��i/p�$�I$n����Y+�pbJc��zT��K��oI3��}��G��I��&&+X
3),-�j�}z�G��6W5��c3�g����;��Z�n�@�ò~Zdcg���0�!�Jɍa�J��
P�B��4�t:�kFI,P1|SC	��K��؈i�FJTb�ݬR#�DO��
�›�#���
�R+��t�G��Tp�P�P+�Q>aL��v��GH�=��0^kiH/�t����"I�{��u�;]1��X��Q%4dh�NZo�Țv����1����@pC�A7����5
ciO.�#������{��3��`���w��D@�~)t>�}"@�<5�!�}�g�s��7�<a�W�t`��-�_�edB.���$�`��)p�$4`�(���,��(��f�(]|��$�X�yKe>BB�)�'I����1)M��gBbR��aP�@@����K{��
����9��$��n�q�<)EW'%9��J�{
r�CT���P�~	!J�Օ�����`*�QZ�1tpH4��*ꨤ�jꩨ��ꪬ��꫰�*무�j뭸�뮼���+��k��&���6���F+��Vk��f���v���+��k�
覫��H!�		:,���Ft���Tv����4^�����t�����,R����Ln�d����Ԅ��$N|���Df����$J|d~�����J|���\~����<^�|�����4Z����Tr�l�����������F|���\z���������t�����,V����Lr�l�����Dj�����<b�������������@�pH,�Ȥr9�"�R�I�Z�ج����A�-��h��5���&M�c=��(P�*
om�&v��E!�p6U#3���#��u+�n�T���_��f%^p�L������W5��o&Kl�����L��`,K��n��H��&&K��o��Dl���o
J(��`3��.��dI�`���l�#gIۚ�0�5�j���$AJ��נ�L�+�
(i�e�v�|u��a��
�(X��E���$�@�J#4����
'D08��L1,ȇ����%��ȯM�9�$h�\$H��H�p(�hXn@B{oH
�*]�$*Z
(�Q�_�0p�"�D�����L��ja�Y	��ހJEXa:����W
s*��
�;	��E�"<p���Eh&U7S��"/³�R/S)P���t$8{�KV�Fǿ90���T�C��#7X�7�D5MC�}H�@@?L��
�Q�H*�B |֨A�D[� �(�$�P@
�H�P����bl#�V
T5cf#|:��Z�yr���J�o���<�]�
O��m�(X%.d�ȇ[�y�8�`�xԆ�g�‰xo��f.
|ä�͙�E����ɀ�UQo������4��3��^�Vj饘f�馜v�駠�*ꨤ�jꩨ��ꪬ��꫰�*무�j뭸�뮼���+��k��&���6���F+��Vk��f���v���+�䖻i!�		9,���Ft���Tv����4^�������t�����,R�Ln�������d�����$N|���Df�$J|d~�����쌢����J|���\~����<^�|�����4Z�Tr����������F|���\z���������t�����,V�Lr����l�����Dj�����<b���������������pH,�Ȥr�l:�Шtʤ!4�nj��z��Ȫ�p�Z��T���)�v�K����
(r��C7~jvjP1��~��_&k�%v�M4��%0��S/���56M���w�������%M
�����J®���K*���.��EЭ�w5L/�k�%2��9��vL��j��3�ы�L-ٶx���5��Q�Q,�}y#B
J.��u�I�����K	��!@�c�D�
	bG)"�`7Ap�d��@^NI�ώ�#2��`��r��"4J�}��1�������`���U��H@�$�(�)��Җ�qj��L�݉�0��%2a�	
�]��J�?�7N��E44_z�8p	\��p`{����)�H}D���~p�2���`�F�F
��
5J�I	\�
e�"�D�@�5.D4'��%����Y`{���9��
7R�5/C����+�>�k�����M��
Ƞ�u�D�ݱH�T	��`�X��	M�I4��
6��m�i@��!�v).�9�Q!h�c52���%�	�E�@[��1[��V�7AA�!�dG
V^)P^\v�bSFS���� X-%�&*6�d/���
i'���v�bYi��g��5(h*�@b
$y�1|=*餔Vj饘f�馜v�駠�*ꨤ�jꩨ��ꪬ��꫰�*무�j뭸�뮼���+��k��&���6���F+��Vk��f���v���+�O!�		9,���Ft������Tv����<^����t��,R�������d��������Dj����$N|���$J|d~��􌢼Tr����J|������\~�|��4Z����l�����������Lr����F|������\z����<b����t��,V�������l�����Ln������������������pH,�Ȥr�l:�ШԨ:���b��z��@�ȳ�׆z��p(aF6����FZ�-nq��B6u�w&.4P#x���o2���O��x��S6�xg��K���[��M��g�L)��f��J#���L4��d{��D���&-L�����8�Ɍ�K'�e�7�o*((5L*��d�J�����\jX@0i�%Tus�D�u
�R�
�3B$I��9�0�
�	�@(�*�F$2��Z��Gl4S:�!)��sH
D�f��m�0OgM���0U�‚F �A���N��
�O��&��B0aj�6y��!�in,X��C>�L��7�a%�L"�p�1�;
�uL���M�Rn��^�a�Cs�9+nh�!�4c����6,\n�@���*d�H�����˱p�(�|`�@�o�]B�,�g�.%.lrq�t/*��,6��x�]���V�
%��k^���lc'�ҏ6�=�B7
��Q)d{.�@|J��D=��N�I��pT�4�TTg��(f�]L@@"u�xrb8�3�dI8dҊ3&QAG#^��*@�d&��#c؈CN��*&4��	
��DN(� 0^y7u`"7`��
��i�$��cM_���G��Pu,�����I�wz��'h𜡐F*餔Vj饘f�馜v�駠�*ꨤ�jꩨ��ꪬ��꫰�*무�j뭸�뮼���+��k��&���6���F+��Vk��f���v���+��^!�		:,���Ft���Tv����4^����t��������,R�d�����Ln������Ĵ��$N|Df����$J|d~��􌢼���J|���\~�<^�|�����4Z�l����섞������̼��F|���\z������t��������,V�l�����Tr����Dj�����<b�������������@�pH,��dҢ���rJ�Z�����&p�Ӛ��4�f���`�������Q�͏�
qo�n2���f,p_q}���J�&p�`)g,3
-��S7�����Y]�q��E�|�Y3�|���Y����Y"	3�T9���0X��`
�W#
̑RJھ�`3Y�`��Sp� Vh%���K
I�Ν8%@�{^P��P�,*�E�b^�;��G��d�H�DI�G,���J��l�0Ӣ�=8pa�)�W�8Q��DF������ĥ�ѧ]�|�yV.^�"J[�i�>�A8�G]""�-�Y
£h7�	��)�:ޤ��b"�r��@����i���Шu8��O��ԩ�������s����06�����(^���,��=���]DPxv�ԝ����"4�x˔_�i0��#k��W|��P4�A=~\2����Y-�W(W�5�w�`�X�rA���$��:\0C�`�p���P�}*�2�@|̠B���ė��q������0�Q)�~�A�J��Bc˘�]�w��$�ai�Lf�B��ih�'��FM��j�7R!0©E��ҥ�i�	i.(�g50@P3h��e�k��QC��uF�馜v�駠�*ꨤ�jꩨ��ꪬ��꫰�*무�j뭸�뮼���+��k��&���6���F+��Vk��f���V!�		9,���Ft���Tv����4^�����t��,R����Ln����d�����$N|���Df�������$J|d~���J|���\~����<^�|��4Z����Tr����l�����������F|���\z���������t��,V����Lr����l��������Dj�����<b������������pH,�Ȥrh�:�Y��Z�جv;T=J�p�t�q��zi���p'����Յ��Nx��v7}|�a���Y$�p�6���G~c{~-������8��I"*&#*
Yb�pq/��C7�#"W��}�	��)�%o3tUƣcv)��V'�}.�K
,�|~#j/o.7�H��%�U*��,�g"0���@C��
�l`�
[�l�Ҡ�8
2��!M��`���ig�q�`����g%EoP�������ԫ�Aވ����h(�,��x����,�G�-D(�E�	ACe3.b
�
G=g��1�d-NU�9��a#�s
1���F��B��W�KLI��"���rJt��Q�K��	$9������^(8�Є�Y�v����(��
!l�`B��{�0S�z��o�t�^���Zι�m@RfS��	w��lpz�z�^��U����7H��@���Pp�x�AW��I_n�YPנA~�Bxʃ��8�X�V`�	��(���,���0�(�4�h�8��<���@)�D�CC�0�8|X�"8P-��$��q]�D򕂙�I��Y=,8I��ІU�k�Rc��xE�w1ASS�A@�C4�ZB���M��}jF�*zNYm���B�PN�n$ʩ	tUMjrzi��AH�&1���j뭸�뮼���+��k��&���6���F+��Vk��f���v���+n�A!�		:,���Ft������Tv�4^�������t�����,R����d��Ln���Ĵ�Ԅ��$N|Df����$J|d~����Ԍ��J|������\~�<^����4Z����l�������̄�����F|������\z�������|�����,V����l��Tr����Dj�����<b�������������@�pH,�ȤYӤfD��Z�جv;T%`@q��zI���eM�۫��X��u.|z�&%���Y2p�||��\!3.'sX0{�}b
��Un�2X��{T��F+�{,W��}p`��B7�¢c�Ụz+�Ə��`�K��6�ƚ��*U+��o��̢!V��7�(���\���D�Rm���@+7X�caBT5�̓S���0q��(Yd���r-ؼ�f*����	3%oH@���L��0��ia|��Q��OW�g���:hd����lt��������F	3f`��_6�
Ōh&��EAAHyP]�UZ���a�!�P�����Q�S!������%�5
*7�4v�Pò�`�YI}}'A]��g:9�s�I�lc2��_m�Տ����;ނa�
���U�^g!��L�+iq��,2�4����E9#�	/��	ǵ�
K2��N9L
,���!f��h�(���,���0�(�4�h�8��<���@)�Di�H&��L6��PF)�TVi�Xf��\v��`�)�d�9eoY�p�,&d0%R��Sn��U�@Ys�E	Bꡄ������Q�s�29��kz�eM��i֓�5���1ق`ٸ�d����eMF
)>�B!6A���І�	R��I�p��9��6pP@Nf&���6���F+��Vk��f�-�A!�		<,���Ft���Tv����4^�������t�����,R����Ln�d�������Ĵ��$N|Df����$J|d~��􌢼���J|���\~����<^�|�����4Z����Tr�l����������̼��F|���\z���������t�����,V����Lr�l�����Dj�����<b�������������@�pH,�Ȥr�l:�Шt�$A�CIA�z�`%�@�˂Wx�n+s�y^���k˥B��^%f�r�(;x�T4	rt-S
���g0$��N�fg(R��sfv��H���89Q������D
t��(P-�����,��s8P6����ʺq���6O9��2׺*���O2����*�͠jO��f����q�R#��
�Vap���5("�3�F�M9p�k`��d��X`��a��4����:@0�낶9	"}���M]42�����+�ܸPC�DFM��!QUQ�6!pc��Z�ɱ��>ŊMq�^E�j-Tx�\�&���q7숆�P���7���z��Y�nô�v5��hd�6�2��Ȱ��.��,�	#@�2@(�O�Z7�qn��.�С�qZw�	{RL��[gR����_
0��C�.ӗ����&���P�t��.
���~���)ѯ�
���X�I�)�en2�+� � +��%
��&�5�)�\��
i^��8D��,�T�0�(�4�h�8��<���@)�Di�H&��L6��PF)�TVi�Xf��\v��`�)�d�i�h���l���p�)�t�i'�7
B�0sR�҆`���X2�H��0��$�R��-y��*=���f4��<ʵ٨7)w��@j��G.�G1�s�ْ��W�>��>8&%����SޠC
f$��lp!�		9,���Ft������\z�<^�����t��,R�������l��Dj���Ą��$N|������$J|d����Tr����J|������d~�Df����4Z�������t��Lr������̌�����F|������\~�<b����|��,V�������l��Ln���̄����������������pH,�Ȥr�l:�ШtJ�Z��hv�$ٰx�4N4:�"�*��{~��x4"'bw+#t�O(xwz'h)Xvy�}��H/w��+7V1��i���B-���'Uj��,�����1T6���x-��,���+T����džѵ�T�ĝՆ6�z�'T���8�+е���x0�t%�h���i�.O�}nX@�MDޖ�نp�e�
԰"�U�4*ҁ��-	�h(�Qj"�$�ე�LҐ�E��4p�4r��;b؄b#
��h`��DC����XYsࠡb��!��j�&	1��r���m�1�yD���*
JD��pX���8��V�*2-07���WQ
��FM��W3��P.��`[-�n���=4

1:�%μ���УK�N����سk�ν���HL8�+�9�^�y10�SA��,)��s꾕�ѣMh�Aa�I�0C�S$�'0(�QU���Q@Вd�B�^�u��e��"��N̰X)!���zt���E22�MD��G'��c5��
)
	���()�TVi�Xf��\v��`�)�d�i�h���l���p�)�t�i�x��|��矀*蠄j衈&�袌6�(�A!�		;,���Ft���Tv����4^�����t��,R����Ln����d��������$N|Df�������$J|d~��􌢼J|���\~����<^�|��4Z����Tr����l����������̼��F|���\z���������t��,V����Lr����l�����Dj�����<b���������������pH,�Ȥr�l:�ШԸB�h
�b��z�N�@�Ȋx�n;
��l6C6����'.5{��Q3ugt���G8���u/����et�y	*��%���fl87�"j�����-k4�d,��:���'`
Ľ�&�{+���[_����yŭ.`����n	�`��r��E+2����(%��
F��m�	i�������5
�=T!�Bjg(tkb#��E'D�a#�����j6�A��1V�頍���jUG��!*�R�Ab�_�>�Ca
��
w&��82{e��'�����������#�l
�غao1�g�Ԙс
�q�-�ip��H:H�C̠�Ԁ�4�Ш���*E��;t��)��6:�4sB��۰Ĉa���ȓ+_μ���УK�N����سk�ν����ËO�����ӫ_Ͼ�����˟O��������Ͽ���(��
3�c��_��o��
eg����\~1l#��w�Z;YV�m��]�}3f�p_��s�}6��cS��0����}���	����P��}*���4���
������ـ0�@a+��l���p�)�t�i�x��|��矀*蠄j衈�!�		:,���Ft���Tv����4^�����t�����,R����d��Dj�������$N|������$J|d~�Df��􌢼���J|���\~����<^�|�����4Z����l��Lr����������F|���\z���������t�����,V����l��Ln��������<b�������������@�pH,�ȤR؈l�ǵ�Z�جv;T���*p��z9���D[��+��m$y��v7pr�a(���Yqc�����G8�}�0���1r~�o9�����}���x��~`��k9���	��9-T[7��~8á
c�![��`5Ә*	�q	�Zݓ'�+/�/+[,�/*��<h�e��ph��Qv�Nd�а"��:�G"
z�裑��
p`��7ʹ`�ȺRa6����7ji�q����$H�&(�(�!
J�Ɵ'�Q@_@S3�pu�D��!e�C�'.o�����	U2�;T���u�*�c����ѡ�[0�e�[Ld�L�'�R�����p�
lh�kߎ8�O��
±�w�[ٳ�aC��sN����ȓ+_μ���УK�N����سk�ν����ËO�����ӫ_Ͼ�����˟O��������Ͽ���(�h�&��6��F(�Vh�"��w@�(
_)\����cb���
�\��uV�$�wHL�
�
��A�
�T�j���>)�dz��	D���U�^T-uX�5�Nd�՞^y�b|0��Qfq͗���`C"f�`!�		6,���Ft������Tv�4^�������t�����,R�Ln������Ԅ��$N|���Df����$J|l������J|���<^�|�����4Z�Tr�����������F|������\z�������t�����,V�Lr���섞����Dj����l���<b����������@�pH,�Ȥri��V�I�Z�ج�SD^��-��h���
{���|N�"��<S��n`mx0��W&n��`q���Fx�z3���3���4��6&#
&i���'��4	o^
g/z�����'�y/�e(��_/Œ%��+�Z$��`|ӈϏ"
f(�o�*���*�Y*��_"��i`��
����B�̙�1X� �1�3B�
L�(���FDc�2�K%>r���#�d	KP����A�It���J]JCC�/1�--Z㠛&�j¢ƈ$��K��ٳhӪ]˶��9H
��m�]�P�g��:���t4(���8sa�D9�Y�����\�#�}�
p��@r�o���th�9�}�ul<�A��†�����|g�$~����1�S!�-�OOc�
1\H�N�����ӫ_Ͼ�����˟O��������Ͽ���(�h�&��6��F(�Vh�f��v��
�(�$�h�(���,���0j!�		6,���Ft������Tv����<^����t��,R����d����Ԥ��Dj�$N|������$J|d~�����J|������\~�Df���Ԅ��4Z����l�������ܬ��Tr�F|������\z����<b����|��,V����l����ܤ��Ln��������������@�pH,�Ȥr�l:�ШtJ�Z�ج1�p�EK.���`Mb?`��@�x6�4�
zw���D!^,acd%�mk�)5�j�_pZyx�w*�}(��$+Y�����r5��yw�V!�z��q0���W������f^��x�V3�ǔ��d�τX)��w$�d&�Dž1X֫�,��Y��w�,8��:v�����LO9,-���!!���1�eF�{�,b1��}Z^d8G"��Аq���8��UI�o9�&A1�	B�*���f(�J��իX�j�ʵ�ׯ`ÊK��ٳhӪ]˶�۷p�ʝK��ݻx���˷�߿�L���È+^̸���pC����(G�`�R�<�����(�#d!���fPB�c-7���Y���n���BÂy���7!>�QĎ:�q�R,�`A#u��5����0P�N4
˟O��������Ͽ���(�h�&��6��F(�Vh�f��!�		8,���Ft������Tv�4^�������t�����,R����Dj���Ĵ�Ԅ��$N|d�����$J|Df�����J|������d~�<^�|�����4Z����Lr������̄�����F|������\z�������t�����,V����Ln����l������<b�������������@�pH,�Ȥr�l:�ШtJ�Z�X\�"Pe����HJ�V��`�M?�~�@�iuh4y|��D!�v�g���0v�����o/���h1�!)$
�b���{*fv3�X���z,��4�V!�u�g�oʕ%-^�T˻i(o3�����S��h0o�h,�R.��o4��g�R�Y*��
O��-�'eD�J����
M�R
��Cǃ=3�U��q�
1b���gc#�g"��y��6e�
��9d^�=K-����,��
L�N�J�l�ԫ'S��z��ׯ`ÊK��ٳhӪ]˶�۷p�ʝK��ݻx���˷�߿�L���È+^̸��ǐ#K�L���˘3k�̹��ϠC�M���ӨS�^ͺ��װc˞M���۸s�kƃ2]6�)����XfG�d	�p
 y�#�H!�yɹcs��m�!�3�8�@R��ajs�؄Q�h�͊�1�������O�#�
�sr��`g�W�e�,�ۇ
�(�kA!�		3,���Ft������\z����4^����t�����,R���������Ln����l��$N|Df������$J|���d��������4Z��������������J|������\~����<b����|�����,V�������Tr����t��Dj������������pH,��$�#(��ШtJ�Z�)H�
]XװxL���ht�Sn���Wz�E��<�Η�a1|t0���J�|O����t+����s"��y"�i��o2�h��d[�1��a.����T&����R�
��Prt(��J+�+�������T
"+���+*s	��'0��
�����X�Je"�)
��<2��_B�1�IH*�	��x	U�#9X'�@�K�Dm<	)F�MX^r@��>��Ա[���q",,�I��ѣH�*]ʴ�ӧP�J�J��իX�j�ʵ�ׯ`ÊK��ٳhӪ]˶�۷p�ʝK��ݻx���˷�߿�L���È+^̸��ǐ#K�L���˘3k�̹��ϛ�!�		,,���Ft������Tv�����t��4^����d��Lr������܄��,R���Df����\~���������l����쌢�4Z�������\z������t��<b����l��Tr���܄��,V��Dj��������@�pH,�Ȥ��
,�Ш��Z�جv;�h�0`@����2#n4+�|N�~����+'xn~��Yw�m!���G
�nq����mT��~��a��u�a���h����g�����Z�{��W&����J�m)���GP'����������������������������������������
H�����!����	��E�[�@X�h��ETp�4$	�0fTQ1�	^K�#
$ʙ"L�����p�S9A6�	��Jd�N�"�R!2Mx*�E*P��@�A��
a�C�hӪ]˶�۷p�ʝK��ݻx���˷�߿�L���È+^̸��ǐ#K�L���˘3k�̹��CA!�		4,���Ft���Tv����4^������t��,R������܄��Ln��$N|���d��������$J|���J|������Dj�����|��4Z���섞�Tr����l��F|���d~����<b����t��,V�������Lr����l������������������@�pH,�Ȥr�l:�ШtJ�Z��l2�y�J3�xLVj0�������u�Q�w�
�uxk�"
��By�yi��}x�v""
��c���"��X'���k2��T���!��P���v��L���k���H,Ǣw1��E+�����B���&���!�����)�"���+#2#���
H����*\Ȱ�Ç#J�H��ŋ3j�ȱ�Ǐ
C�I��ɓ(S�\ɲ�˗0cʜI��͛8s��ɳ��ϟ@�
J��ѣH�*]ʴ�ӧP�J�J��իMX0BA��'L�Z��.�(!���U̾L`��0]��g������REں�H�,���#.�5>���w���y��3_.��Q�ܹ�/[�ŔB�{טPA��c#\�,``��X�N����ȓ+_�\H!�		#,���Ft������Tv����4^�t���������$N|���$J|������Ln�J|���l�����Df�|�����F|������d~����<b�t�������������������pH,�Ȥr�l:�ШtJ�Z�جv��z��xL.���z�n���x5����ՈDq
x�M}}���G��~�!��#���������������}�w
~���
�r�����q�����o�����n
|��� �o�ʼn�o	Ĝ	�o��
�p���qv�
H����*\Ȱ�Ç#J�H��ŋ3j�ȱ�Ǐ
C�I��ɓ(S�\ɲ�˗0cʜI��͛8s��ɳ�3ϟ@�
J��ѣH�*]ʴ�ӧP�J�J��իX�j�ʵ�ׯ`ÊK��ٳh9!�		#,���Ft������Lr����4Z����l�����,R����$J|���d��������J|��̼��Dj�t�����F|������Tv����<^�t����ܬ�����l�����������pH,�Ȥr�l:�ШtJ�Z�جv��z��xL.���z�n���|N���~����������������������������������Z	���T���
�S!�����N���
�O�����K����K�Ѭ��J������H���H����H
��	D�;"
��\�	`���I$����$��@�"�$
�汤ɓ(S�\ɲ�˗0cʜI��͛8s��ɳ�2ϟ@�
J��ѣH�*]ʴ�ӧP�J�J��իX�j�ʵ�ׯ`ÊK��ٳ�!�		!,���Ft������Tv����<b����t�����,V�����$N|��Ԅ��$J|���d���Tr�������F|���������Dj����|��������l��������pH,�Ȥr�l:�ШtJ�Z�جv��z��xL.���z�n���|N���~�������������������������������������������������������������������������������������D

�	�������������������q��ۂW���+���w��v�q��
�D��,�U@aD`]�X�ހX&�<�R���I<8K�)o�4�����M[ʴ�ӧP�J�J��իX�j�ʵ�ׯÂ;PK4~�[�#o,,assets/images/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK4~�[�#o,,assets/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK4~�[2[�rrassets/js/admin.jsnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		admin.js
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

/* JS Document */

/***[JCBGUI.joomla_component.javascript.28.$$$$]***/
jQuery(document).ready(function($) {
  $(window).on('load', function() {
    var token = Joomla.optionsStorage['csrf.token'];
    var url = $('#jform_serverurl').val();
    var secret = $('#jform_serversecret').val();
    $.ajax({
      url: '/administrator/index.php?option=com_reservation',
      method: 'post',
      dataType: 'json',
      data: {[token] : '1', task:'ajax.isRegistered',
format: 'json' , raw: 'true' , url: url, secret:
secret},
      success: function (msg) {
        if(msg.status) {
         
$('#wlists').parent().addClass('alert-success')
          $('#wlists').text('connected!');
        }
        else {
         
$('#wlists').parent().addClass('alert-error')
          $('#wlists').text('not connected!');
        }
      },
      error: function(err) {
      }
    });
  });
  var url = $('#jform_serverurl').val();
  var secret = $('#jform_serversecret').val();
  jsprovider = jQuery('#jform_adminjsprovider');
  jsprovider.parent().parent().remove();
  saltcode = $('#jform_serversecret');
  p = saltcode.parent();
  disable = url && secret ? '' :
'disabled="disabled"';
  p.append(`<button class="btn btn-small"
type="button" id="connectwebhook"
${disable}><span>Create WebHook</span></button>`);
  jQuery(document).on('keyup', '#jform_serversecret',
function(e) {
    if(this.value && $('#jform_serverurl').val())
     
jQuery('#connectwebhook').removeAttr('disabled');
  });
  jQuery(document).on('keyup', '#jform_serverurl',
function(e) {
    if(this.value && $('#jform_serversecret').val())
     
jQuery('#connectwebhook').removeAttr('disabled');
  });
  $('#connectwebhook').click(function(e) {
    url = $('#jform_serverurl').val();
    secret = $('#jform_serversecret').val();
    token = Joomla.optionsStorage['csrf.token'];
    
    $.ajax({
      url: '/administrator/index.php?option=com_reservation',
      method: 'post',
      dataType: 'json',
      data: {[token] : '1', task:'ajax.setWebHook',
format: 'json' , raw: 'true' , url: url, secret:
secret},
      success: function (msg) {
        if(msg.status) {
          Joomla.JText.load({success: "Success"});
          Joomla.renderMessages({'success':
['Created']});
          $('#wlists').text('connected!');
         
$('#wlists').parent().removeClass('alert-error')
         
$('#wlists').parent().addClass('alert-success')
        }
        else {
          Joomla.JText.load({error: "Error"});
          Joomla.renderMessages({'error': ['Not
created']});
         
$('#wlists').parent().removeClass('alert-success')
         
$('#wlists').parent().addClass('alert-error')
          $('#wlists').text('not connected!');
        }
      },
      error: function(err) {
        Joomla.JText.load({error: "Error"});
        Joomla.renderMessages({'error': ['Not
created']});
       
$('#wlists').parent().removeClass('alert-success')
        $('#wlists').parent().addClass('alert-error')
        $('#wlists').text('not connected!');
      }
    });
    event.preventDefault();
  });
})/***[/JCBGUI$$$$]***/
PK4~�[�#o,,assets/js/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK4~�[!���M(M(
config.xmlnu�[���<?xml version="1.0"
encoding="utf-8"?>
<config>
	<fieldset
		addrulepath="/administrator/components/com_reservation/models/rules"
		addfieldpath="/administrator/components/com_reservation/models/fields"
		name="global_config"
		label="COM_RESERVATION_CONFIG_GLOBAL_LABEL"
		description="COM_RESERVATION_CONFIG_GLOBAL_DESC">
		<field
			name="check_in"
			type="list"
			default="0"
			label="COM_RESERVATION_CONFIG_CHECK_TIMER_LABEL"
			description="COM_RESERVATION_CONFIG_CHECK_TIMER_DESC">
			<option
				value="-5
hours">COM_RESERVATION_CONFIG_CHECK_TIMER_OPTION_ONE</option>
			<option
				value="-12
hours">COM_RESERVATION_CONFIG_CHECK_TIMER_OPTION_TWO</option>
			<option
				value="-1
day">COM_RESERVATION_CONFIG_CHECK_TIMER_OPTION_THREE</option>
			<option
				value="-2
day">COM_RESERVATION_CONFIG_CHECK_TIMER_OPTION_FOUR</option>
			<option
				value="-1
week">COM_RESERVATION_CONFIG_CHECK_TIMER_OPTION_FIVE</option>
			<option
				value="0">COM_RESERVATION_CONFIG_CHECK_TIMER_OPTION_SIX</option>
		</field>
		<field type="spacer" name="spacerAuthor"
hr="true" />
		<field
			name="save_history"
			type="radio"
			class="btn-group btn-group-yesno"
			default="1"
			label="JGLOBAL_SAVE_HISTORY_OPTIONS_LABEL"
			description="JGLOBAL_SAVE_HISTORY_OPTIONS_DESC"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>
		<field
			name="history_limit"
			type="text"
			filter="integer"
			label="JGLOBAL_HISTORY_LIMIT_OPTIONS_LABEL"
			description="JGLOBAL_HISTORY_LIMIT_OPTIONS_DESC"
			default="10"
		/>
		<field type="spacer" name="spacerHistory"
hr="true" />
		<field name="autorTitle"
			type="spacer"
			label="COM_RESERVATION_CONFIG_AUTHOR"
		/>
		<field name="autorName"
			type="text"
			label="COM_RESERVATION_CONFIG_AUTHOR_NAME_LABEL"
			description="COM_RESERVATION_CONFIG_AUTHOR_NAME_DESC"
			size="60"
			default="farhad shahbazi"
			readonly="true"
			class="readonly"
		/>
		<field name="autorEmail"
			type="email"
			label="COM_RESERVATION_CONFIG_AUTHOR_EMAIL_LABEL"
			description="COM_RESERVATION_CONFIG_AUTHOR_EMAIL_DESC"
			size="60"
			default="farhad.shahbazi0010@gmail.com"
			readonly="true"
			class="readonly"
		/>
	</fieldset>
	<fieldset
		name="usergroup_custom_config"
		label="COM_RESERVATION_CONFIG_USERGROUP">

		<!--  Consultantgroup Field. Type: Usergroup. (joomla) -->
	<field type="usergroup"
               name="consultantgroup"
              
label="COM_RESERVATION_CONFIG_CONSULTANTGROUP_LABEL"
              
description="COM_RESERVATION_CONFIG_CONSULTANTGROUP_DESCRIPTION"
               multiple="true" />
		<!--  Doctorgroup Field. Type: Usergroup. (joomla) -->
	<field type="usergroup"
               name="doctorgroup"
               label="COM_RESERVATION_CONFIG_DOCTORGROUP_LABEL"
              
description="COM_RESERVATION_CONFIG_DOCTORGROUP_DESCRIPTION"
               multiple="true" />
		<!--  Sickgroup Field. Type: Usergroup. (joomla) -->
	<field type="usergroup"
               name="sickgroup"
               label="COM_RESERVATION_CONFIG_SICKGROUP_LABEL"
              
description="COM_RESERVATION_CONFIG_SICKGROUP_DESCRIPTION"
               multiple="true" />
	</fieldset>
	<fieldset
		name="check_out_custom_config"
		label="COM_RESERVATION_CONFIG_CHECK_OUT">

		<!--  Checkout Field. Type: Subform. (joomla) -->
	<field type="subform"
               name="checkout"
               label="COM_RESERVATION_CONFIG_CHECKOUT_LABEL"
              
layout="joomla.form.field.subform.repeatable-table"
               multiple="true"
               buttons="add,remove,move"
               default=""
               icon="list"
               max="50"
               >
                <form hidden="true"
                      name="list_checkout_modal"
                      repeat="true">
                        <!-- Reservetemplate Field. Type: Filelist.
(joomla)-->
                        <field type="filelist"
                               name="reservetemplate"
                              
label="COM_RESERVATION_CONFIG_RESERVETEMPLATE_LABEL"
                              
directory="/components/com_reservation/views/reserve_appointment/tmpl"
                               default=""
                               filter="\.php$"
                               stripext="\.php$"
                               hide_none="true"
                               hide_default="true" />
                        <!-- Checkout_navber Field. Type: Text.
(joomla)-->
                        <field type="text"
                               name="checkout_navber"
                              
label="COM_RESERVATION_CONFIG_CHECKOUT_NAVBER_LABEL"
                               size="10"
                               maxlength="100"
                               default=""
                              
description="COM_RESERVATION_CONFIG_CHECKOUT_NAVBER_DESCRIPTION"
                               class="text_area"
                               readonly="false"
                               disabled="false"
                               required="true"
                               filter="STRING"
                              
message="COM_RESERVATION_CONFIG_CHECKOUT_NAVBER_MESSAGE" />
                </form>
        </field>
	</fieldset>
	<fieldset
		name="appointment_custom_config"
		label="COM_RESERVATION_CONFIG_APPOINTMENT">

		<!--  Full_price Field. Type: Text. (joomla) -->
	<field type="text"
               name="full_price"
               label="COM_RESERVATION_CONFIG_FULL_PRICE_LABEL"
               size="10"
               maxlength="100"
               default=""
              
description="COM_RESERVATION_CONFIG_FULL_PRICE_DESCRIPTION"
               class="text_area"
               readonly="false"
               disabled="false"
               required="true"
               filter="UINT"
               validate="number"
              
message="COM_RESERVATION_CONFIG_FULL_PRICE_MESSAGE"
               autocomplete="on" />
		<!--  Doctor_quota Field. Type: Text. (joomla) -->
	<field type="text"
               name="doctor_quota"
               label="COM_RESERVATION_CONFIG_DOCTOR_QUOTA_LABEL"
               size="10"
               maxlength="50"
               default=""
              
description="COM_RESERVATION_CONFIG_DOCTOR_QUOTA_DESCRIPTION"
               class="text_area"
               readonly="false"
               disabled="false"
               required="true"
               filter="UINT"
               validate="number"
              
message="COM_RESERVATION_CONFIG_DOCTOR_QUOTA_MESSAGE"
               autocomplete="on" />
		<!--  System_quota Field. Type: Text. (joomla) -->
	<field type="text"
               name="system_quota"
               label="COM_RESERVATION_CONFIG_SYSTEM_QUOTA_LABEL"
               size="10"
               maxlength="50"
               default=""
              
description="COM_RESERVATION_CONFIG_SYSTEM_QUOTA_DESCRIPTION"
               class="text_area"
               readonly="false"
               disabled="false"
               required="true"
               filter="UINT"
               validate="number"
              
message="COM_RESERVATION_CONFIG_SYSTEM_QUOTA_MESSAGE"
               autocomplete="on" />
	</fieldset>
	<fieldset
		name="chat_custom_config"
		label="COM_RESERVATION_CONFIG_CHAT">

		<!--  Imgext Field. Type: Text. (joomla) -->
	<field type="text"
               name="imgext"
               label="COM_RESERVATION_CONFIG_IMGEXT_LABEL"
               size="250"
               maxlength="250"
              
default="jpg,jpeg,png,gif,bmp,jfif,pjpeg,webp,tif,tiff"
              
description="COM_RESERVATION_CONFIG_IMGEXT_DESCRIPTION"
               class="text_area"
               readonly="false"
               disabled="false"
               required="false"
               filter="STRING"
               message="COM_RESERVATION_CONFIG_IMGEXT_MESSAGE"
               hint="COM_RESERVATION_CONFIG_IMGEXT_HINT"
               autocomplete="off" />
	</fieldset>
	<fieldset
		name="bigbluebutton_custom_config"
		label="COM_RESERVATION_CONFIG_BIGBLUEBUTTON">

		<!--  Adminjsprovider Field. Type: Adminjsprovider. (custom) -->
	<field type="adminjsprovider"
               name="adminjsprovider"
              
label="COM_RESERVATION_CONFIG_ADMINJSPROVIDER_LABEL"
              
description="COM_RESERVATION_CONFIG_ADMINJSPROVIDER_DESCRIPTION"
/>
		<!--  Serverurl Field. Type: Text. (joomla) -->
	<field type="text"
               name="serverurl"
               label="COM_RESERVATION_CONFIG_SERVERURL_LABEL"
               size="255"
               maxlength="255"
               default=""
              
description="COM_RESERVATION_CONFIG_SERVERURL_DESCRIPTION"
               class="text_area"
               readonly="false"
               disabled="false"
               required="false"
               filter="STRING"
               message="COM_RESERVATION_CONFIG_SERVERURL_MESSAGE"
               hint="COM_RESERVATION_CONFIG_SERVERURL_HINT"
               autocomplete="on" />
		<!--  Serversecret Field. Type: Text. (joomla) -->
	<field type="text"
               name="serversecret"
               label="COM_RESERVATION_CONFIG_SERVERSECRET_LABEL"
               size="255"
               maxlength="255"
               default=""
              
description="COM_RESERVATION_CONFIG_SERVERSECRET_DESCRIPTION"
               class="text_area"
               readonly="false"
               disabled="false"
               required="false"
               filter="STRING"
              
message="COM_RESERVATION_CONFIG_SERVERSECRET_MESSAGE"
               autocomplete="on" />
		<!--  Webhooks Field. Type: Note. A None Database Field. (joomla)
-->
	<field type="note"
               name="webhooks"
               label="COM_RESERVATION_CONFIG_WEBHOOKS_LABEL"
              
description="COM_RESERVATION_CONFIG_WEBHOOKS_DESCRIPTION"
               heading="h4"
               class="alert webhooks"
               close="false" />
	</fieldset>
	<fieldset
		name="permissions"
		label="JCONFIG_PERMISSIONS_LABEL"
		description="JCONFIG_PERMISSIONS_DESC">
		<field
			name="rules"
			type="rules"
			label="JCONFIG_PERMISSIONS_LABEL"
			class="inputbox"
			validate="rules"
			filter="rules"
			component="com_reservation"
			section="component"
		/>
	</fieldset>
</config>PK4~�[�@�	llcontroller.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		controller.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Utilities\ArrayHelper;

/**
 * General Controller of Reservation component
 */
class ReservationController extends JControllerLegacy
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration
settings.
	 * Recognized key values include 'name',
'default_task', 'model_path', and
	 * 'view_path' (this list is not meant to be comprehensive).
	 *
	 * @since   3.0
	 */
	public function __construct($config = array())
	{
		// set the default view
		$config['default_view'] = 'reservation';

		parent::__construct($config);
	}

	/**
	 * display task
	 *
	 * @return void
	 */
	function display($cachable = false, $urlparams = false)
	{
		// set default view if not set
		$view   = $this->input->getCmd('view',
'reservation');
		$data	= $this->getViewRelation($view);
		$layout	= $this->input->get('layout', null,
'WORD');
		$id    	= $this->input->getInt('id');

		// Check for edit form.
		if(ReservationHelper::checkArray($data))
		{
			if ($data['edit'] && $layout == 'edit'
&&
!$this->checkEditId('com_reservation.edit.'.$data['view'],
$id))
			{
				// Somehow the person just went to the form - we don't allow that.
				$this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_UNHELD_ID',
$id));
				$this->setMessage($this->getError(), 'error');
				// check if item was opend from other then its own list view
				$ref 	= $this->input->getCmd('ref', 0);
				$refid 	= $this->input->getInt('refid', 0);
				// set redirect
				if ($refid > 0 && ReservationHelper::checkString($ref))
				{
					// redirect to item of ref
					$this->setRedirect(JRoute::_('index.php?option=com_reservation&view='.(string)$ref.'&layout=edit&id='.(int)$refid,
false));
				}
				elseif (ReservationHelper::checkString($ref))
				{

					// redirect to ref
					$this->setRedirect(JRoute::_('index.php?option=com_reservation&view='.(string)$ref,
false));
				}
				else
				{
					// normal redirect back to the list view
					$this->setRedirect(JRoute::_('index.php?option=com_reservation&view='.$data['views'],
false));
				}

				return false;
			}
		}

		return parent::display($cachable, $urlparams);
	}

	protected function getViewRelation($view)
	{
		// check the we have a value
		if (ReservationHelper::checkString($view))
		{
			// the view relationships
			$views = array(
				'reserve' => 'reserves',
				'bbbclass' => 'bbbclasses',
				'doctor' => 'doctors',
				'appointment' => 'appointments',
				'capital' => 'capitals',
				'comment' => 'comments',
				'session' => 'sessions',
				'sick' => 'sicks',
				'plan' => 'plans',
				'consultant' => 'consultants',
				'message' => 'messages'
					);
			// check if this is a list view
			if (in_array($view, $views))
			{
				// this is a list view
				return array('edit' => false, 'view' =>
array_search($view,$views), 'views' => $view);
			}
			// check if it is an edit view
			elseif (array_key_exists($view, $views))
			{
				// this is a edit view
				return array('edit' => true, 'view' => $view,
'views' => $views[$view]);
			}
		}
		return false;
	}
}
PK4~�[U�11controllers/ajax.json.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		ajax.json.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Utilities\ArrayHelper;

/**
 * Reservation Ajax Controller
 */
class ReservationControllerAjax extends JControllerLegacy
{
	public function __construct($config)
	{
		parent::__construct($config);
		// make sure all json stuff are set
		JFactory::getDocument()->setMimeEncoding( 'application/json'
);
		JResponse::setHeader('Content-Disposition','attachment;filename="getajax.json"');
		JResponse::setHeader("Access-Control-Allow-Origin",
"*");
		// load the tasks 
		$this->registerTask('setWebHook', 'ajax');
		$this->registerTask('isRegistered', 'ajax');
		$this->registerTask('getCity', 'ajax');
	}

	public function ajax()
	{
		$user 		= JFactory::getUser();
		$jinput 	= JFactory::getApplication()->input;
		// Check Token!
		$token 		= JSession::getFormToken();
		$call_token	= $jinput->get('token', 0, 'ALNUM');
		if($jinput->get($token, 0, 'ALNUM') || $token ===
$call_token)
		{
			$task = $this->getTask();
			switch($task)
			{
				case 'setWebHook':
					try
					{
						$returnRaw = $jinput->get('raw', false,
'BOOLEAN');
						$urlValue = $jinput->get('url', NULL,
'STRING');
						$secretValue = $jinput->get('secret', NULL,
'STRING');
						if($urlValue && $user->id != 0 && $secretValue)
						{
							$result =
$this->getModel('ajax')->setWebHook($urlValue,
$secretValue);
						}
						else
						{
							$result = false;
						}
						if($callback = $jinput->get('callback', null,
'CMD'))
						{
							echo $callback . "(".json_encode($result).");";
						}
						elseif($returnRaw)
						{
							echo json_encode($result);
						}
						else
						{
							echo "(".json_encode($result).");";
						}
					}
					catch(Exception $e)
					{
						if($callback = $jinput->get('callback', null,
'CMD'))
						{
							echo $callback."(".json_encode($e).");";
						}
						else
						{
							echo "(".json_encode($e).");";
						}
					}
				break;
				case 'isRegistered':
					try
					{
						$returnRaw = $jinput->get('raw', false,
'BOOLEAN');
						$urlValue = $jinput->get('url', NULL,
'STRING');
						$secretValue = $jinput->get('secret', NULL,
'STRING');
						if($urlValue && $user->id != 0 && $secretValue)
						{
							$result =
$this->getModel('ajax')->isRegistered($urlValue,
$secretValue);
						}
						else
						{
							$result = false;
						}
						if($callback = $jinput->get('callback', null,
'CMD'))
						{
							echo $callback . "(".json_encode($result).");";
						}
						elseif($returnRaw)
						{
							echo json_encode($result);
						}
						else
						{
							echo "(".json_encode($result).");";
						}
					}
					catch(Exception $e)
					{
						if($callback = $jinput->get('callback', null,
'CMD'))
						{
							echo $callback."(".json_encode($e).");";
						}
						else
						{
							echo "(".json_encode($e).");";
						}
					}
				break;
				case 'getCity':
					try
					{
						$returnRaw = $jinput->get('raw', false,
'BOOLEAN');
						$capitalidValue = $jinput->get('capitalid', NULL,
'INT');
						$result =
$this->getModel('ajax')->getCity($capitalidValue);
						if($callback = $jinput->get('callback', null,
'CMD'))
						{
							echo $callback . "(".json_encode($result).");";
						}
						elseif($returnRaw)
						{
							echo json_encode($result);
						}
						else
						{
							echo "(".json_encode($result).");";
						}
					}
					catch(Exception $e)
					{
						if($callback = $jinput->get('callback', null,
'CMD'))
						{
							echo $callback."(".json_encode($e).");";
						}
						else
						{
							echo "(".json_encode($e).");";
						}
					}
				break;
			}
		}
		else
		{
			if($callback = $jinput->get('callback', null,
'CMD'))
			{
				echo $callback."(".json_encode(false).");";
			}
			else
			{
				echo "(".json_encode(false).");";
			}
		}
	}
}
PK4~�[MnXC!C!controllers/appointment.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		appointment.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Utilities\ArrayHelper;

/**
 * Appointment Controller
 */
class ReservationControllerAppointment extends JControllerForm
{
	/**
	 * Current or most recently performed task.
	 *
	 * @var    string
	 * @since  12.2
	 * @note   Replaces _task.
	 */
	protected $task;

	/**
	 * Class constructor.
	 *
	 * @param   array  $config  A named array of configuration variables.
	 *
	 * @since   1.6
	 */
	public function __construct($config = array())
	{
		$this->view_list = 'Appointments'; // safeguard for setting
the return view listing to the main view.
		parent::__construct($config);
	}

        /**
	 * Method override to check if you can add a new record.
	 *
	 * @param   array  $data  An array of input data.
	 *
	 * @return  boolean
	 *
	 * @since   1.6
	 */
	protected function allowAdd($data = array())
	{
		// Get user object.
		$user = JFactory::getUser();
		// Access check.
		$access = $user->authorise('appointment.access',
'com_reservation');
		if (!$access)
		{
			return false;
		}

		// In the absense of better information, revert to the component
permissions.
		return parent::allowAdd($data);
	}

	/**
	 * Method override to check if you can edit an existing record.
	 *
	 * @param   array   $data  An array of input data.
	 * @param   string  $key   The name of the key for the primary key.
	 *
	 * @return  boolean
	 *
	 * @since   1.6
	 */
	protected function allowEdit($data = array(), $key = 'id')
	{
		// get user object.
		$user = JFactory::getUser();
		// get record id.
		$recordId = (int) isset($data[$key]) ? $data[$key] : 0;


		if ($recordId)
		{
			// The record has been set. Check the record permissions.
			$permission = $user->authorise('core.edit',
'com_reservation.appointment.' . (int) $recordId);
			if (!$permission)
			{
				if ($user->authorise('core.edit.own',
'com_reservation.appointment.' . $recordId))
				{
					// Now test the owner is the user.
					$ownerId = (int) isset($data['created_by']) ?
$data['created_by'] : 0;
					if (empty($ownerId))
					{
						// Need to do a lookup from the model.
						$record = $this->getModel()->getItem($recordId);

						if (empty($record))
						{
							return false;
						}
						$ownerId = $record->created_by;
					}

					// If the owner matches 'me' then allow.
					if ($ownerId == $user->id)
					{
						if ($user->authorise('core.edit.own',
'com_reservation'))
						{
							return true;
						}
					}
				}
				return false;
			}
		}
		// Since there is no permission, revert to the component permissions.
		return parent::allowEdit($data, $key);
	}

	/**
	 * Gets the URL arguments to append to an item redirect.
	 *
	 * @param   integer  $recordId  The primary key id for the item.
	 * @param   string   $urlVar    The name of the URL variable for the id.
	 *
	 * @return  string  The arguments to append to the redirect URL.
	 *
	 * @since   1.6
	 */
	protected function getRedirectToItemAppend($recordId = null, $urlVar =
'id')
	{
		// get the referral options (old method use return instead see parent)
		$ref = $this->input->get('ref', 0, 'string');
		$refid = $this->input->get('refid', 0, 'int');

		// get redirect info.
		$append = parent::getRedirectToItemAppend($recordId, $urlVar);

		// set the referral options
		if ($refid && $ref)
                {
			$append = '&ref=' . (string)$ref .
'&refid='. (int)$refid . $append;
		}
		elseif ($ref)
		{
			$append = '&ref='. (string)$ref . $append;
		}

		return $append;
	}

	/**
	 * Method to run batch operations.
	 *
	 * @param   object  $model  The model.
	 *
	 * @return  boolean   True if successful, false otherwise and internal
error is set.
	 *
	 * @since   2.5
	 */
	public function batch($model = null)
	{
		JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN'));

		// Set the model
		$model = $this->getModel('Appointment', '',
array());

		// Preset the redirect
		$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=appointments'
. $this->getRedirectToListAppend(), false));

		return parent::batch($model);
	}

	/**
	 * Method to cancel an edit.
	 *
	 * @param   string  $key  The name of the primary key of the URL variable.
	 *
	 * @return  boolean  True if access level checks pass, false otherwise.
	 *
	 * @since   12.2
	 */
	public function cancel($key = null)
	{
		// get the referral options
		$this->ref = $this->input->get('ref', 0,
'word');
		$this->refid = $this->input->get('refid', 0,
'int');

		// Check if there is a return value
		$return = $this->input->get('return', null,
'base64');

		$cancel = parent::cancel($key);

		if (!is_null($return) &&
JUri::isInternal(base64_decode($return)))
		{
			$redirect = base64_decode($return);

			// Redirect to the return value.
			$this->setRedirect(
				JRoute::_(
					$redirect, false
				)
			);
		}
		elseif ($this->refid && $this->ref)
		{
			$redirect = '&view=' . (string)$this->ref .
'&layout=edit&id=' . (int)$this->refid;

			// Redirect to the item screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		elseif ($this->ref)
		{
			$redirect = '&view='.(string)$this->ref;

			// Redirect to the list screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		return $cancel;
	}

	/**
	 * Method to save a record.
	 *
	 * @param   string  $key     The name of the primary key of the URL
variable.
	 * @param   string  $urlVar  The name of the URL variable if different
from the primary key (sometimes required to avoid router collisions).
	 *
	 * @return  boolean  True if successful, false otherwise.
	 *
	 * @since   12.2
	 */
	public function save($key = null, $urlVar = null)
	{
		// get the referral options
		$this->ref = $this->input->get('ref', 0,
'word');
		$this->refid = $this->input->get('refid', 0,
'int');

		// Check if there is a return value
		$return = $this->input->get('return', null,
'base64');
		$canReturn = (!is_null($return) &&
JUri::isInternal(base64_decode($return)));

		if ($this->ref || $this->refid || $canReturn)
		{
			// to make sure the item is checkedin on redirect
			$this->task = 'save';
		}

		$saved = parent::save($key, $urlVar);

		// This is not needed since parent save already does this
		// Due to the ref and refid implementation we need to add this
		if ($canReturn)
		{
			$redirect = base64_decode($return);

			// Redirect to the return value.
			$this->setRedirect(
				JRoute::_(
					$redirect, false
				)
			);
		}
		elseif ($this->refid && $this->ref)
		{
			$redirect = '&view=' . (string)$this->ref .
'&layout=edit&id=' . (int)$this->refid;

			// Redirect to the item screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		elseif ($this->ref)
		{
			$redirect = '&view=' . (string)$this->ref;

			// Redirect to the list screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		return $saved;
	}

	/**
	 * Function that allows child controller access to model data
	 * after the data has been saved.
	 *
	 * @param   JModel  &$model     The data model object.
	 * @param   array   $validData  The validated data.
	 *
	 * @return  void
	 *
	 * @since   11.1
	 */
	protected function postSaveHook(JModelLegacy $model, $validData = array())
	{
		return;
	}

}
PK4~�[���controllers/appointments.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		appointments.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Utilities\ArrayHelper;

/**
 * Appointments Controller
 */
class ReservationControllerAppointments extends JControllerAdmin
{
	/**
	 * The prefix to use with controller messages.
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $text_prefix = 'COM_RESERVATION_APPOINTMENTS';

	/**
	 * Method to get a model object, loading it if required.
	 *
	 * @param   string  $name    The model name. Optional.
	 * @param   string  $prefix  The class prefix. Optional.
	 * @param   array   $config  Configuration array for model. Optional.
	 *
	 * @return  JModelLegacy  The model.
	 *
	 * @since   1.6
	 */
	public function getModel($name = 'Appointment', $prefix =
'ReservationModel', $config = array('ignore_request'
=> true))
	{
		return parent::getModel($name, $prefix, $config);
	}

	public function exportData()
	{
		// Check for request forgeries
		JSession::checkToken() or die(JText::_('JINVALID_TOKEN'));
		// check if export is allowed for this user.
		$user = JFactory::getUser();
		if ($user->authorise('appointment.export',
'com_reservation') &&
$user->authorise('core.export', 'com_reservation'))
		{
			// Get the input
			$input = JFactory::getApplication()->input;
			$pks = $input->post->get('cid', array(),
'array');
			// Sanitize the input
			$pks = ArrayHelper::toInteger($pks);
			// Get the model
			$model = $this->getModel('Appointments');
			// get the data to export
			$data = $model->getExportData($pks);
			if (ReservationHelper::checkArray($data))
			{
				// now set the data to the spreadsheet
				$date = JFactory::getDate();
				ReservationHelper::xls($data,'Appointments_'.$date->format('jS_F_Y'),'Appointments
exported ('.$date->format('jS F,
Y').')','appointments');
			}
		}
		// Redirect to the list screen with error.
		$message = JText::_('COM_RESERVATION_EXPORT_FAILED');
		$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=appointments',
false), $message, 'error');
		return;
	}


	public function importData()
	{
		// Check for request forgeries
		JSession::checkToken() or die(JText::_('JINVALID_TOKEN'));
		// check if import is allowed for this user.
		$user = JFactory::getUser();
		if ($user->authorise('appointment.import',
'com_reservation') &&
$user->authorise('core.import', 'com_reservation'))
		{
			// Get the import model
			$model = $this->getModel('Appointments');
			// get the headers to import
			$headers = $model->getExImPortHeaders();
			if (ReservationHelper::checkObject($headers))
			{
				// Load headers to session.
				$session = JFactory::getSession();
				$headers = json_encode($headers);
				$session->set('appointment_VDM_IMPORTHEADERS', $headers);
				$session->set('backto_VDM_IMPORT',
'appointments');
				$session->set('dataType_VDM_IMPORTINTO',
'appointment');
				// Redirect to import view.
				$message =
JText::_('COM_RESERVATION_IMPORT_SELECT_FILE_FOR_APPOINTMENTS');
				$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=import',
false), $message);
				return;
			}
		}
		// Redirect to the list screen with error.
		$message = JText::_('COM_RESERVATION_IMPORT_FAILED');
		$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=appointments',
false), $message, 'error');
		return;
	}
}
PK4~�[>PV�*!*!controllers/bbbclass.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		bbbclass.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Utilities\ArrayHelper;

/**
 * Bbbclass Controller
 */
class ReservationControllerBbbclass extends JControllerForm
{
	/**
	 * Current or most recently performed task.
	 *
	 * @var    string
	 * @since  12.2
	 * @note   Replaces _task.
	 */
	protected $task;

	/**
	 * Class constructor.
	 *
	 * @param   array  $config  A named array of configuration variables.
	 *
	 * @since   1.6
	 */
	public function __construct($config = array())
	{
		$this->view_list = 'Bbbclasses'; // safeguard for setting
the return view listing to the main view.
		parent::__construct($config);
	}

        /**
	 * Method override to check if you can add a new record.
	 *
	 * @param   array  $data  An array of input data.
	 *
	 * @return  boolean
	 *
	 * @since   1.6
	 */
	protected function allowAdd($data = array())
	{
		// Get user object.
		$user = JFactory::getUser();
		// Access check.
		$access = $user->authorise('bbbclass.access',
'com_reservation');
		if (!$access)
		{
			return false;
		}

		// In the absense of better information, revert to the component
permissions.
		return parent::allowAdd($data);
	}

	/**
	 * Method override to check if you can edit an existing record.
	 *
	 * @param   array   $data  An array of input data.
	 * @param   string  $key   The name of the key for the primary key.
	 *
	 * @return  boolean
	 *
	 * @since   1.6
	 */
	protected function allowEdit($data = array(), $key = 'id')
	{
		// get user object.
		$user = JFactory::getUser();
		// get record id.
		$recordId = (int) isset($data[$key]) ? $data[$key] : 0;


		if ($recordId)
		{
			// The record has been set. Check the record permissions.
			$permission = $user->authorise('core.edit',
'com_reservation.bbbclass.' . (int) $recordId);
			if (!$permission)
			{
				if ($user->authorise('core.edit.own',
'com_reservation.bbbclass.' . $recordId))
				{
					// Now test the owner is the user.
					$ownerId = (int) isset($data['created_by']) ?
$data['created_by'] : 0;
					if (empty($ownerId))
					{
						// Need to do a lookup from the model.
						$record = $this->getModel()->getItem($recordId);

						if (empty($record))
						{
							return false;
						}
						$ownerId = $record->created_by;
					}

					// If the owner matches 'me' then allow.
					if ($ownerId == $user->id)
					{
						if ($user->authorise('core.edit.own',
'com_reservation'))
						{
							return true;
						}
					}
				}
				return false;
			}
		}
		// Since there is no permission, revert to the component permissions.
		return parent::allowEdit($data, $key);
	}

	/**
	 * Gets the URL arguments to append to an item redirect.
	 *
	 * @param   integer  $recordId  The primary key id for the item.
	 * @param   string   $urlVar    The name of the URL variable for the id.
	 *
	 * @return  string  The arguments to append to the redirect URL.
	 *
	 * @since   1.6
	 */
	protected function getRedirectToItemAppend($recordId = null, $urlVar =
'id')
	{
		// get the referral options (old method use return instead see parent)
		$ref = $this->input->get('ref', 0, 'string');
		$refid = $this->input->get('refid', 0, 'int');

		// get redirect info.
		$append = parent::getRedirectToItemAppend($recordId, $urlVar);

		// set the referral options
		if ($refid && $ref)
                {
			$append = '&ref=' . (string)$ref .
'&refid='. (int)$refid . $append;
		}
		elseif ($ref)
		{
			$append = '&ref='. (string)$ref . $append;
		}

		return $append;
	}

	/**
	 * Method to run batch operations.
	 *
	 * @param   object  $model  The model.
	 *
	 * @return  boolean   True if successful, false otherwise and internal
error is set.
	 *
	 * @since   2.5
	 */
	public function batch($model = null)
	{
		JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN'));

		// Set the model
		$model = $this->getModel('Bbbclass', '', array());

		// Preset the redirect
		$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=bbbclasses'
. $this->getRedirectToListAppend(), false));

		return parent::batch($model);
	}

	/**
	 * Method to cancel an edit.
	 *
	 * @param   string  $key  The name of the primary key of the URL variable.
	 *
	 * @return  boolean  True if access level checks pass, false otherwise.
	 *
	 * @since   12.2
	 */
	public function cancel($key = null)
	{
		// get the referral options
		$this->ref = $this->input->get('ref', 0,
'word');
		$this->refid = $this->input->get('refid', 0,
'int');

		// Check if there is a return value
		$return = $this->input->get('return', null,
'base64');

		$cancel = parent::cancel($key);

		if (!is_null($return) &&
JUri::isInternal(base64_decode($return)))
		{
			$redirect = base64_decode($return);

			// Redirect to the return value.
			$this->setRedirect(
				JRoute::_(
					$redirect, false
				)
			);
		}
		elseif ($this->refid && $this->ref)
		{
			$redirect = '&view=' . (string)$this->ref .
'&layout=edit&id=' . (int)$this->refid;

			// Redirect to the item screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		elseif ($this->ref)
		{
			$redirect = '&view='.(string)$this->ref;

			// Redirect to the list screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		return $cancel;
	}

	/**
	 * Method to save a record.
	 *
	 * @param   string  $key     The name of the primary key of the URL
variable.
	 * @param   string  $urlVar  The name of the URL variable if different
from the primary key (sometimes required to avoid router collisions).
	 *
	 * @return  boolean  True if successful, false otherwise.
	 *
	 * @since   12.2
	 */
	public function save($key = null, $urlVar = null)
	{
		// get the referral options
		$this->ref = $this->input->get('ref', 0,
'word');
		$this->refid = $this->input->get('refid', 0,
'int');

		// Check if there is a return value
		$return = $this->input->get('return', null,
'base64');
		$canReturn = (!is_null($return) &&
JUri::isInternal(base64_decode($return)));

		if ($this->ref || $this->refid || $canReturn)
		{
			// to make sure the item is checkedin on redirect
			$this->task = 'save';
		}

		$saved = parent::save($key, $urlVar);

		// This is not needed since parent save already does this
		// Due to the ref and refid implementation we need to add this
		if ($canReturn)
		{
			$redirect = base64_decode($return);

			// Redirect to the return value.
			$this->setRedirect(
				JRoute::_(
					$redirect, false
				)
			);
		}
		elseif ($this->refid && $this->ref)
		{
			$redirect = '&view=' . (string)$this->ref .
'&layout=edit&id=' . (int)$this->refid;

			// Redirect to the item screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		elseif ($this->ref)
		{
			$redirect = '&view=' . (string)$this->ref;

			// Redirect to the list screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		return $saved;
	}

	/**
	 * Function that allows child controller access to model data
	 * after the data has been saved.
	 *
	 * @param   JModel  &$model     The data model object.
	 * @param   array   $validData  The validated data.
	 *
	 * @return  void
	 *
	 * @since   11.1
	 */
	protected function postSaveHook(JModelLegacy $model, $validData = array())
	{
		return;
	}

}
PK4~�[�ff��controllers/bbbclasses.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		bbbclasses.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Utilities\ArrayHelper;

/**
 * Bbbclasses Controller
 */
class ReservationControllerBbbclasses extends JControllerAdmin
{
	/**
	 * The prefix to use with controller messages.
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $text_prefix = 'COM_RESERVATION_BBBCLASSES';

	/**
	 * Method to get a model object, loading it if required.
	 *
	 * @param   string  $name    The model name. Optional.
	 * @param   string  $prefix  The class prefix. Optional.
	 * @param   array   $config  Configuration array for model. Optional.
	 *
	 * @return  JModelLegacy  The model.
	 *
	 * @since   1.6
	 */
	public function getModel($name = 'Bbbclass', $prefix =
'ReservationModel', $config = array('ignore_request'
=> true))
	{
		return parent::getModel($name, $prefix, $config);
	}

	public function exportData()
	{
		// Check for request forgeries
		JSession::checkToken() or die(JText::_('JINVALID_TOKEN'));
		// check if export is allowed for this user.
		$user = JFactory::getUser();
		if ($user->authorise('bbbclass.export',
'com_reservation') &&
$user->authorise('core.export', 'com_reservation'))
		{
			// Get the input
			$input = JFactory::getApplication()->input;
			$pks = $input->post->get('cid', array(),
'array');
			// Sanitize the input
			$pks = ArrayHelper::toInteger($pks);
			// Get the model
			$model = $this->getModel('Bbbclasses');
			// get the data to export
			$data = $model->getExportData($pks);
			if (ReservationHelper::checkArray($data))
			{
				// now set the data to the spreadsheet
				$date = JFactory::getDate();
				ReservationHelper::xls($data,'Bbbclasses_'.$date->format('jS_F_Y'),'Bbbclasses
exported ('.$date->format('jS F,
Y').')','bbbclasses');
			}
		}
		// Redirect to the list screen with error.
		$message = JText::_('COM_RESERVATION_EXPORT_FAILED');
		$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=bbbclasses',
false), $message, 'error');
		return;
	}


	public function importData()
	{
		// Check for request forgeries
		JSession::checkToken() or die(JText::_('JINVALID_TOKEN'));
		// check if import is allowed for this user.
		$user = JFactory::getUser();
		if ($user->authorise('bbbclass.import',
'com_reservation') &&
$user->authorise('core.import', 'com_reservation'))
		{
			// Get the import model
			$model = $this->getModel('Bbbclasses');
			// get the headers to import
			$headers = $model->getExImPortHeaders();
			if (ReservationHelper::checkObject($headers))
			{
				// Load headers to session.
				$session = JFactory::getSession();
				$headers = json_encode($headers);
				$session->set('bbbclass_VDM_IMPORTHEADERS', $headers);
				$session->set('backto_VDM_IMPORT',
'bbbclasses');
				$session->set('dataType_VDM_IMPORTINTO',
'bbbclass');
				// Redirect to import view.
				$message =
JText::_('COM_RESERVATION_IMPORT_SELECT_FILE_FOR_BBBCLASSES');
				$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=import',
false), $message);
				return;
			}
		}
		// Redirect to the list screen with error.
		$message = JText::_('COM_RESERVATION_IMPORT_FAILED');
		$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=bbbclasses',
false), $message, 'error');
		return;
	}
}
PK4~�[���!!controllers/capital.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		capital.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Utilities\ArrayHelper;

/**
 * Capital Controller
 */
class ReservationControllerCapital extends JControllerForm
{
	/**
	 * Current or most recently performed task.
	 *
	 * @var    string
	 * @since  12.2
	 * @note   Replaces _task.
	 */
	protected $task;

	/**
	 * Class constructor.
	 *
	 * @param   array  $config  A named array of configuration variables.
	 *
	 * @since   1.6
	 */
	public function __construct($config = array())
	{
		$this->view_list = 'Capitals'; // safeguard for setting the
return view listing to the main view.
		parent::__construct($config);
	}

        /**
	 * Method override to check if you can add a new record.
	 *
	 * @param   array  $data  An array of input data.
	 *
	 * @return  boolean
	 *
	 * @since   1.6
	 */
	protected function allowAdd($data = array())
	{
		// Get user object.
		$user = JFactory::getUser();
		// Access check.
		$access = $user->authorise('capital.access',
'com_reservation');
		if (!$access)
		{
			return false;
		}

		// In the absense of better information, revert to the component
permissions.
		return parent::allowAdd($data);
	}

	/**
	 * Method override to check if you can edit an existing record.
	 *
	 * @param   array   $data  An array of input data.
	 * @param   string  $key   The name of the key for the primary key.
	 *
	 * @return  boolean
	 *
	 * @since   1.6
	 */
	protected function allowEdit($data = array(), $key = 'id')
	{
		// get user object.
		$user = JFactory::getUser();
		// get record id.
		$recordId = (int) isset($data[$key]) ? $data[$key] : 0;


		if ($recordId)
		{
			// The record has been set. Check the record permissions.
			$permission = $user->authorise('core.edit',
'com_reservation.capital.' . (int) $recordId);
			if (!$permission)
			{
				if ($user->authorise('core.edit.own',
'com_reservation.capital.' . $recordId))
				{
					// Now test the owner is the user.
					$ownerId = (int) isset($data['created_by']) ?
$data['created_by'] : 0;
					if (empty($ownerId))
					{
						// Need to do a lookup from the model.
						$record = $this->getModel()->getItem($recordId);

						if (empty($record))
						{
							return false;
						}
						$ownerId = $record->created_by;
					}

					// If the owner matches 'me' then allow.
					if ($ownerId == $user->id)
					{
						if ($user->authorise('core.edit.own',
'com_reservation'))
						{
							return true;
						}
					}
				}
				return false;
			}
		}
		// Since there is no permission, revert to the component permissions.
		return parent::allowEdit($data, $key);
	}

	/**
	 * Gets the URL arguments to append to an item redirect.
	 *
	 * @param   integer  $recordId  The primary key id for the item.
	 * @param   string   $urlVar    The name of the URL variable for the id.
	 *
	 * @return  string  The arguments to append to the redirect URL.
	 *
	 * @since   1.6
	 */
	protected function getRedirectToItemAppend($recordId = null, $urlVar =
'id')
	{
		// get the referral options (old method use return instead see parent)
		$ref = $this->input->get('ref', 0, 'string');
		$refid = $this->input->get('refid', 0, 'int');

		// get redirect info.
		$append = parent::getRedirectToItemAppend($recordId, $urlVar);

		// set the referral options
		if ($refid && $ref)
                {
			$append = '&ref=' . (string)$ref .
'&refid='. (int)$refid . $append;
		}
		elseif ($ref)
		{
			$append = '&ref='. (string)$ref . $append;
		}

		return $append;
	}

	/**
	 * Method to run batch operations.
	 *
	 * @param   object  $model  The model.
	 *
	 * @return  boolean   True if successful, false otherwise and internal
error is set.
	 *
	 * @since   2.5
	 */
	public function batch($model = null)
	{
		JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN'));

		// Set the model
		$model = $this->getModel('Capital', '', array());

		// Preset the redirect
		$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=capitals'
. $this->getRedirectToListAppend(), false));

		return parent::batch($model);
	}

	/**
	 * Method to cancel an edit.
	 *
	 * @param   string  $key  The name of the primary key of the URL variable.
	 *
	 * @return  boolean  True if access level checks pass, false otherwise.
	 *
	 * @since   12.2
	 */
	public function cancel($key = null)
	{
		// get the referral options
		$this->ref = $this->input->get('ref', 0,
'word');
		$this->refid = $this->input->get('refid', 0,
'int');

		// Check if there is a return value
		$return = $this->input->get('return', null,
'base64');

		$cancel = parent::cancel($key);

		if (!is_null($return) &&
JUri::isInternal(base64_decode($return)))
		{
			$redirect = base64_decode($return);

			// Redirect to the return value.
			$this->setRedirect(
				JRoute::_(
					$redirect, false
				)
			);
		}
		elseif ($this->refid && $this->ref)
		{
			$redirect = '&view=' . (string)$this->ref .
'&layout=edit&id=' . (int)$this->refid;

			// Redirect to the item screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		elseif ($this->ref)
		{
			$redirect = '&view='.(string)$this->ref;

			// Redirect to the list screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		return $cancel;
	}

	/**
	 * Method to save a record.
	 *
	 * @param   string  $key     The name of the primary key of the URL
variable.
	 * @param   string  $urlVar  The name of the URL variable if different
from the primary key (sometimes required to avoid router collisions).
	 *
	 * @return  boolean  True if successful, false otherwise.
	 *
	 * @since   12.2
	 */
	public function save($key = null, $urlVar = null)
	{
		// get the referral options
		$this->ref = $this->input->get('ref', 0,
'word');
		$this->refid = $this->input->get('refid', 0,
'int');

		// Check if there is a return value
		$return = $this->input->get('return', null,
'base64');
		$canReturn = (!is_null($return) &&
JUri::isInternal(base64_decode($return)));

		if ($this->ref || $this->refid || $canReturn)
		{
			// to make sure the item is checkedin on redirect
			$this->task = 'save';
		}

		$saved = parent::save($key, $urlVar);

		// This is not needed since parent save already does this
		// Due to the ref and refid implementation we need to add this
		if ($canReturn)
		{
			$redirect = base64_decode($return);

			// Redirect to the return value.
			$this->setRedirect(
				JRoute::_(
					$redirect, false
				)
			);
		}
		elseif ($this->refid && $this->ref)
		{
			$redirect = '&view=' . (string)$this->ref .
'&layout=edit&id=' . (int)$this->refid;

			// Redirect to the item screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		elseif ($this->ref)
		{
			$redirect = '&view=' . (string)$this->ref;

			// Redirect to the list screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		return $saved;
	}

	/**
	 * Function that allows child controller access to model data
	 * after the data has been saved.
	 *
	 * @param   JModel  &$model     The data model object.
	 * @param   array   $validData  The validated data.
	 *
	 * @return  void
	 *
	 * @since   11.1
	 */
	protected function postSaveHook(JModelLegacy $model, $validData = array())
	{
		return;
	}

}
PK4~�[��'���controllers/capitals.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		capitals.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Utilities\ArrayHelper;

/**
 * Capitals Controller
 */
class ReservationControllerCapitals extends JControllerAdmin
{
	/**
	 * The prefix to use with controller messages.
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $text_prefix = 'COM_RESERVATION_CAPITALS';

	/**
	 * Method to get a model object, loading it if required.
	 *
	 * @param   string  $name    The model name. Optional.
	 * @param   string  $prefix  The class prefix. Optional.
	 * @param   array   $config  Configuration array for model. Optional.
	 *
	 * @return  JModelLegacy  The model.
	 *
	 * @since   1.6
	 */
	public function getModel($name = 'Capital', $prefix =
'ReservationModel', $config = array('ignore_request'
=> true))
	{
		return parent::getModel($name, $prefix, $config);
	}

	public function exportData()
	{
		// Check for request forgeries
		JSession::checkToken() or die(JText::_('JINVALID_TOKEN'));
		// check if export is allowed for this user.
		$user = JFactory::getUser();
		if ($user->authorise('capital.export',
'com_reservation') &&
$user->authorise('core.export', 'com_reservation'))
		{
			// Get the input
			$input = JFactory::getApplication()->input;
			$pks = $input->post->get('cid', array(),
'array');
			// Sanitize the input
			$pks = ArrayHelper::toInteger($pks);
			// Get the model
			$model = $this->getModel('Capitals');
			// get the data to export
			$data = $model->getExportData($pks);
			if (ReservationHelper::checkArray($data))
			{
				// now set the data to the spreadsheet
				$date = JFactory::getDate();
				ReservationHelper::xls($data,'Capitals_'.$date->format('jS_F_Y'),'Capitals
exported ('.$date->format('jS F,
Y').')','capitals');
			}
		}
		// Redirect to the list screen with error.
		$message = JText::_('COM_RESERVATION_EXPORT_FAILED');
		$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=capitals',
false), $message, 'error');
		return;
	}


	public function importData()
	{
		// Check for request forgeries
		JSession::checkToken() or die(JText::_('JINVALID_TOKEN'));
		// check if import is allowed for this user.
		$user = JFactory::getUser();
		if ($user->authorise('capital.import',
'com_reservation') &&
$user->authorise('core.import', 'com_reservation'))
		{
			// Get the import model
			$model = $this->getModel('Capitals');
			// get the headers to import
			$headers = $model->getExImPortHeaders();
			if (ReservationHelper::checkObject($headers))
			{
				// Load headers to session.
				$session = JFactory::getSession();
				$headers = json_encode($headers);
				$session->set('capital_VDM_IMPORTHEADERS', $headers);
				$session->set('backto_VDM_IMPORT', 'capitals');
				$session->set('dataType_VDM_IMPORTINTO',
'capital');
				// Redirect to import view.
				$message =
JText::_('COM_RESERVATION_IMPORT_SELECT_FILE_FOR_CAPITALS');
				$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=import',
false), $message);
				return;
			}
		}
		// Redirect to the list screen with error.
		$message = JText::_('COM_RESERVATION_IMPORT_FAILED');
		$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=capitals',
false), $message, 'error');
		return;
	}
}
PK4~�[�ZP!!!controllers/comment.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		comment.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Utilities\ArrayHelper;

/**
 * Comment Controller
 */
class ReservationControllerComment extends JControllerForm
{
	/**
	 * Current or most recently performed task.
	 *
	 * @var    string
	 * @since  12.2
	 * @note   Replaces _task.
	 */
	protected $task;

	/**
	 * Class constructor.
	 *
	 * @param   array  $config  A named array of configuration variables.
	 *
	 * @since   1.6
	 */
	public function __construct($config = array())
	{
		$this->view_list = 'Comments'; // safeguard for setting the
return view listing to the main view.
		parent::__construct($config);
	}

        /**
	 * Method override to check if you can add a new record.
	 *
	 * @param   array  $data  An array of input data.
	 *
	 * @return  boolean
	 *
	 * @since   1.6
	 */
	protected function allowAdd($data = array())
	{
		// Get user object.
		$user = JFactory::getUser();
		// Access check.
		$access = $user->authorise('comment.access',
'com_reservation');
		if (!$access)
		{
			return false;
		}

		// In the absense of better information, revert to the component
permissions.
		return parent::allowAdd($data);
	}

	/**
	 * Method override to check if you can edit an existing record.
	 *
	 * @param   array   $data  An array of input data.
	 * @param   string  $key   The name of the key for the primary key.
	 *
	 * @return  boolean
	 *
	 * @since   1.6
	 */
	protected function allowEdit($data = array(), $key = 'id')
	{
		// get user object.
		$user = JFactory::getUser();
		// get record id.
		$recordId = (int) isset($data[$key]) ? $data[$key] : 0;


		if ($recordId)
		{
			// The record has been set. Check the record permissions.
			$permission = $user->authorise('core.edit',
'com_reservation.comment.' . (int) $recordId);
			if (!$permission)
			{
				if ($user->authorise('core.edit.own',
'com_reservation.comment.' . $recordId))
				{
					// Now test the owner is the user.
					$ownerId = (int) isset($data['created_by']) ?
$data['created_by'] : 0;
					if (empty($ownerId))
					{
						// Need to do a lookup from the model.
						$record = $this->getModel()->getItem($recordId);

						if (empty($record))
						{
							return false;
						}
						$ownerId = $record->created_by;
					}

					// If the owner matches 'me' then allow.
					if ($ownerId == $user->id)
					{
						if ($user->authorise('core.edit.own',
'com_reservation'))
						{
							return true;
						}
					}
				}
				return false;
			}
		}
		// Since there is no permission, revert to the component permissions.
		return parent::allowEdit($data, $key);
	}

	/**
	 * Gets the URL arguments to append to an item redirect.
	 *
	 * @param   integer  $recordId  The primary key id for the item.
	 * @param   string   $urlVar    The name of the URL variable for the id.
	 *
	 * @return  string  The arguments to append to the redirect URL.
	 *
	 * @since   1.6
	 */
	protected function getRedirectToItemAppend($recordId = null, $urlVar =
'id')
	{
		// get the referral options (old method use return instead see parent)
		$ref = $this->input->get('ref', 0, 'string');
		$refid = $this->input->get('refid', 0, 'int');

		// get redirect info.
		$append = parent::getRedirectToItemAppend($recordId, $urlVar);

		// set the referral options
		if ($refid && $ref)
                {
			$append = '&ref=' . (string)$ref .
'&refid='. (int)$refid . $append;
		}
		elseif ($ref)
		{
			$append = '&ref='. (string)$ref . $append;
		}

		return $append;
	}

	/**
	 * Method to run batch operations.
	 *
	 * @param   object  $model  The model.
	 *
	 * @return  boolean   True if successful, false otherwise and internal
error is set.
	 *
	 * @since   2.5
	 */
	public function batch($model = null)
	{
		JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN'));

		// Set the model
		$model = $this->getModel('Comment', '', array());

		// Preset the redirect
		$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=comments'
. $this->getRedirectToListAppend(), false));

		return parent::batch($model);
	}

	/**
	 * Method to cancel an edit.
	 *
	 * @param   string  $key  The name of the primary key of the URL variable.
	 *
	 * @return  boolean  True if access level checks pass, false otherwise.
	 *
	 * @since   12.2
	 */
	public function cancel($key = null)
	{
		// get the referral options
		$this->ref = $this->input->get('ref', 0,
'word');
		$this->refid = $this->input->get('refid', 0,
'int');

		// Check if there is a return value
		$return = $this->input->get('return', null,
'base64');

		$cancel = parent::cancel($key);

		if (!is_null($return) &&
JUri::isInternal(base64_decode($return)))
		{
			$redirect = base64_decode($return);

			// Redirect to the return value.
			$this->setRedirect(
				JRoute::_(
					$redirect, false
				)
			);
		}
		elseif ($this->refid && $this->ref)
		{
			$redirect = '&view=' . (string)$this->ref .
'&layout=edit&id=' . (int)$this->refid;

			// Redirect to the item screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		elseif ($this->ref)
		{
			$redirect = '&view='.(string)$this->ref;

			// Redirect to the list screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		return $cancel;
	}

	/**
	 * Method to save a record.
	 *
	 * @param   string  $key     The name of the primary key of the URL
variable.
	 * @param   string  $urlVar  The name of the URL variable if different
from the primary key (sometimes required to avoid router collisions).
	 *
	 * @return  boolean  True if successful, false otherwise.
	 *
	 * @since   12.2
	 */
	public function save($key = null, $urlVar = null)
	{
		// get the referral options
		$this->ref = $this->input->get('ref', 0,
'word');
		$this->refid = $this->input->get('refid', 0,
'int');

		// Check if there is a return value
		$return = $this->input->get('return', null,
'base64');
		$canReturn = (!is_null($return) &&
JUri::isInternal(base64_decode($return)));

		if ($this->ref || $this->refid || $canReturn)
		{
			// to make sure the item is checkedin on redirect
			$this->task = 'save';
		}

		$saved = parent::save($key, $urlVar);

		// This is not needed since parent save already does this
		// Due to the ref and refid implementation we need to add this
		if ($canReturn)
		{
			$redirect = base64_decode($return);

			// Redirect to the return value.
			$this->setRedirect(
				JRoute::_(
					$redirect, false
				)
			);
		}
		elseif ($this->refid && $this->ref)
		{
			$redirect = '&view=' . (string)$this->ref .
'&layout=edit&id=' . (int)$this->refid;

			// Redirect to the item screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		elseif ($this->ref)
		{
			$redirect = '&view=' . (string)$this->ref;

			// Redirect to the list screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		return $saved;
	}

	/**
	 * Function that allows child controller access to model data
	 * after the data has been saved.
	 *
	 * @param   JModel  &$model     The data model object.
	 * @param   array   $validData  The validated data.
	 *
	 * @return  void
	 *
	 * @since   11.1
	 */
	protected function postSaveHook(JModelLegacy $model, $validData = array())
	{
		return;
	}

}
PK4~�[�N4`��controllers/comments.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		comments.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Utilities\ArrayHelper;

/**
 * Comments Controller
 */
class ReservationControllerComments extends JControllerAdmin
{
	/**
	 * The prefix to use with controller messages.
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $text_prefix = 'COM_RESERVATION_COMMENTS';

	/**
	 * Method to get a model object, loading it if required.
	 *
	 * @param   string  $name    The model name. Optional.
	 * @param   string  $prefix  The class prefix. Optional.
	 * @param   array   $config  Configuration array for model. Optional.
	 *
	 * @return  JModelLegacy  The model.
	 *
	 * @since   1.6
	 */
	public function getModel($name = 'Comment', $prefix =
'ReservationModel', $config = array('ignore_request'
=> true))
	{
		return parent::getModel($name, $prefix, $config);
	}

	public function exportData()
	{
		// Check for request forgeries
		JSession::checkToken() or die(JText::_('JINVALID_TOKEN'));
		// check if export is allowed for this user.
		$user = JFactory::getUser();
		if ($user->authorise('comment.export',
'com_reservation') &&
$user->authorise('core.export', 'com_reservation'))
		{
			// Get the input
			$input = JFactory::getApplication()->input;
			$pks = $input->post->get('cid', array(),
'array');
			// Sanitize the input
			$pks = ArrayHelper::toInteger($pks);
			// Get the model
			$model = $this->getModel('Comments');
			// get the data to export
			$data = $model->getExportData($pks);
			if (ReservationHelper::checkArray($data))
			{
				// now set the data to the spreadsheet
				$date = JFactory::getDate();
				ReservationHelper::xls($data,'Comments_'.$date->format('jS_F_Y'),'Comments
exported ('.$date->format('jS F,
Y').')','comments');
			}
		}
		// Redirect to the list screen with error.
		$message = JText::_('COM_RESERVATION_EXPORT_FAILED');
		$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=comments',
false), $message, 'error');
		return;
	}


	public function importData()
	{
		// Check for request forgeries
		JSession::checkToken() or die(JText::_('JINVALID_TOKEN'));
		// check if import is allowed for this user.
		$user = JFactory::getUser();
		if ($user->authorise('comment.import',
'com_reservation') &&
$user->authorise('core.import', 'com_reservation'))
		{
			// Get the import model
			$model = $this->getModel('Comments');
			// get the headers to import
			$headers = $model->getExImPortHeaders();
			if (ReservationHelper::checkObject($headers))
			{
				// Load headers to session.
				$session = JFactory::getSession();
				$headers = json_encode($headers);
				$session->set('comment_VDM_IMPORTHEADERS', $headers);
				$session->set('backto_VDM_IMPORT', 'comments');
				$session->set('dataType_VDM_IMPORTINTO',
'comment');
				// Redirect to import view.
				$message =
JText::_('COM_RESERVATION_IMPORT_SELECT_FILE_FOR_COMMENTS');
				$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=import',
false), $message);
				return;
			}
		}
		// Redirect to the list screen with error.
		$message = JText::_('COM_RESERVATION_IMPORT_FAILED');
		$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=comments',
false), $message, 'error');
		return;
	}
}
PK4~�[]ؖ�4"4"controllers/consultant.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		consultant.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Utilities\ArrayHelper;

/**
 * Consultant Controller
 */
class ReservationControllerConsultant extends JControllerForm
{
	/**
	 * Current or most recently performed task.
	 *
	 * @var    string
	 * @since  12.2
	 * @note   Replaces _task.
	 */
	protected $task;

	/**
	 * Class constructor.
	 *
	 * @param   array  $config  A named array of configuration variables.
	 *
	 * @since   1.6
	 */
	public function __construct($config = array())
	{
		$this->view_list = 'Consultants'; // safeguard for setting
the return view listing to the main view.
		parent::__construct($config);
	}

        /**
	 * Method override to check if you can add a new record.
	 *
	 * @param   array  $data  An array of input data.
	 *
	 * @return  boolean
	 *
	 * @since   1.6
	 */
	protected function allowAdd($data = array())
	{
		// Get user object.
		$user = JFactory::getUser();
		// Access check.
		$access = $user->authorise('consultant.access',
'com_reservation');
		if (!$access)
		{
			return false;
		}

		// In the absense of better information, revert to the component
permissions.
		return parent::allowAdd($data);
	}

	/**
	 * Method override to check if you can edit an existing record.
	 *
	 * @param   array   $data  An array of input data.
	 * @param   string  $key   The name of the key for the primary key.
	 *
	 * @return  boolean
	 *
	 * @since   1.6
	 */
	protected function allowEdit($data = array(), $key = 'id')
	{		// get user object.
		$user = JFactory::getUser();
		// get record id.
		$recordId = (int) isset($data[$key]) ? $data[$key] : 0;


		// Access check.
		$access = ($user->authorise('consultant.access',
'com_reservation.consultant.' . (int) $recordId) &&
$user->authorise('consultant.access',
'com_reservation'));
		if (!$access)
		{
			return false;
		}

		if ($recordId)
		{
			// The record has been set. Check the record permissions.
			$permission = $user->authorise('core.edit',
'com_reservation.consultant.' . (int) $recordId);
			if (!$permission)
			{
				if ($user->authorise('core.edit.own',
'com_reservation.consultant.' . $recordId))
				{
					// Fallback on edit.own. Now test the owner is the user.
					$ownerId = (int) isset($data['created_by']) ?
$data['created_by'] : 0;
					if (empty($ownerId))
					{
						// Need to do a lookup from the model.
						$record = $this->getModel()->getItem($recordId);

						if (empty($record))
						{
							return false;
						}
						$ownerId = $record->created_by;
					}

					// If the owner matches 'me' then do the test.
					if ($ownerId == $user->id)
					{
						if ($user->authorise('core.edit.own',
'com_reservation'))
						{
							return true;
						}
					}
				}
				return false;
			}
		}
		// Since there is no permission, revert to the component permissions.
		return parent::allowEdit($data, $key);
	}

	/**
	 * Gets the URL arguments to append to an item redirect.
	 *
	 * @param   integer  $recordId  The primary key id for the item.
	 * @param   string   $urlVar    The name of the URL variable for the id.
	 *
	 * @return  string  The arguments to append to the redirect URL.
	 *
	 * @since   1.6
	 */
	protected function getRedirectToItemAppend($recordId = null, $urlVar =
'id')
	{
		// get the referral options (old method use return instead see parent)
		$ref = $this->input->get('ref', 0, 'string');
		$refid = $this->input->get('refid', 0, 'int');

		// get redirect info.
		$append = parent::getRedirectToItemAppend($recordId, $urlVar);

		// set the referral options
		if ($refid && $ref)
                {
			$append = '&ref=' . (string)$ref .
'&refid='. (int)$refid . $append;
		}
		elseif ($ref)
		{
			$append = '&ref='. (string)$ref . $append;
		}

		return $append;
	}

	/**
	 * Method to run batch operations.
	 *
	 * @param   object  $model  The model.
	 *
	 * @return  boolean   True if successful, false otherwise and internal
error is set.
	 *
	 * @since   2.5
	 */
	public function batch($model = null)
	{
		JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN'));

		// Set the model
		$model = $this->getModel('Consultant', '',
array());

		// Preset the redirect
		$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=consultants'
. $this->getRedirectToListAppend(), false));

		return parent::batch($model);
	}

	/**
	 * Method to cancel an edit.
	 *
	 * @param   string  $key  The name of the primary key of the URL variable.
	 *
	 * @return  boolean  True if access level checks pass, false otherwise.
	 *
	 * @since   12.2
	 */
	public function cancel($key = null)
	{
		// get the referral options
		$this->ref = $this->input->get('ref', 0,
'word');
		$this->refid = $this->input->get('refid', 0,
'int');

		// Check if there is a return value
		$return = $this->input->get('return', null,
'base64');

		$cancel = parent::cancel($key);

		if (!is_null($return) &&
JUri::isInternal(base64_decode($return)))
		{
			$redirect = base64_decode($return);

			// Redirect to the return value.
			$this->setRedirect(
				JRoute::_(
					$redirect, false
				)
			);
		}
		elseif ($this->refid && $this->ref)
		{
			$redirect = '&view=' . (string)$this->ref .
'&layout=edit&id=' . (int)$this->refid;

			// Redirect to the item screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		elseif ($this->ref)
		{
			$redirect = '&view='.(string)$this->ref;

			// Redirect to the list screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		return $cancel;
	}

	/**
	 * Method to save a record.
	 *
	 * @param   string  $key     The name of the primary key of the URL
variable.
	 * @param   string  $urlVar  The name of the URL variable if different
from the primary key (sometimes required to avoid router collisions).
	 *
	 * @return  boolean  True if successful, false otherwise.
	 *
	 * @since   12.2
	 */
	public function save($key = null, $urlVar = null)
	{
		// get the referral options
		$this->ref = $this->input->get('ref', 0,
'word');
		$this->refid = $this->input->get('refid', 0,
'int');

		// Check if there is a return value
		$return = $this->input->get('return', null,
'base64');
		$canReturn = (!is_null($return) &&
JUri::isInternal(base64_decode($return)));

		if ($this->ref || $this->refid || $canReturn)
		{
			// to make sure the item is checkedin on redirect
			$this->task = 'save';
		}

		$saved = parent::save($key, $urlVar);

		// This is not needed since parent save already does this
		// Due to the ref and refid implementation we need to add this
		if ($canReturn)
		{
			$redirect = base64_decode($return);

			// Redirect to the return value.
			$this->setRedirect(
				JRoute::_(
					$redirect, false
				)
			);
		}
		elseif ($this->refid && $this->ref)
		{
			$redirect = '&view=' . (string)$this->ref .
'&layout=edit&id=' . (int)$this->refid;

			// Redirect to the item screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		elseif ($this->ref)
		{
			$redirect = '&view=' . (string)$this->ref;

			// Redirect to the list screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		return $saved;
	}

	/**
	 * Function that allows child controller access to model data
	 * after the data has been saved.
	 *
	 * @param   JModel  &$model     The data model object.
	 * @param   array   $validData  The validated data.
	 *
	 * @return  void
	 *
	 * @since   11.1
	 */
	protected function postSaveHook(JModelLegacy $model, $validData = array())
	{
		return;
	}

}
PK4~�[��Mcontrollers/consultants.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		consultants.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Utilities\ArrayHelper;

/**
 * Consultants Controller
 */
class ReservationControllerConsultants extends JControllerAdmin
{
	/**
	 * The prefix to use with controller messages.
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $text_prefix = 'COM_RESERVATION_CONSULTANTS';

	/**
	 * Method to get a model object, loading it if required.
	 *
	 * @param   string  $name    The model name. Optional.
	 * @param   string  $prefix  The class prefix. Optional.
	 * @param   array   $config  Configuration array for model. Optional.
	 *
	 * @return  JModelLegacy  The model.
	 *
	 * @since   1.6
	 */
	public function getModel($name = 'Consultant', $prefix =
'ReservationModel', $config = array('ignore_request'
=> true))
	{
		return parent::getModel($name, $prefix, $config);
	}

	public function exportData()
	{
		// Check for request forgeries
		JSession::checkToken() or die(JText::_('JINVALID_TOKEN'));
		// check if export is allowed for this user.
		$user = JFactory::getUser();
		if ($user->authorise('consultant.export',
'com_reservation') &&
$user->authorise('core.export', 'com_reservation'))
		{
			// Get the input
			$input = JFactory::getApplication()->input;
			$pks = $input->post->get('cid', array(),
'array');
			// Sanitize the input
			$pks = ArrayHelper::toInteger($pks);
			// Get the model
			$model = $this->getModel('Consultants');
			// get the data to export
			$data = $model->getExportData($pks);
			if (ReservationHelper::checkArray($data))
			{
				// now set the data to the spreadsheet
				$date = JFactory::getDate();
				ReservationHelper::xls($data,'Consultants_'.$date->format('jS_F_Y'),'Consultants
exported ('.$date->format('jS F,
Y').')','consultants');
			}
		}
		// Redirect to the list screen with error.
		$message = JText::_('COM_RESERVATION_EXPORT_FAILED');
		$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=consultants',
false), $message, 'error');
		return;
	}


	public function importData()
	{
		// Check for request forgeries
		JSession::checkToken() or die(JText::_('JINVALID_TOKEN'));
		// check if import is allowed for this user.
		$user = JFactory::getUser();
		if ($user->authorise('consultant.import',
'com_reservation') &&
$user->authorise('core.import', 'com_reservation'))
		{
			// Get the import model
			$model = $this->getModel('Consultants');
			// get the headers to import
			$headers = $model->getExImPortHeaders();
			if (ReservationHelper::checkObject($headers))
			{
				// Load headers to session.
				$session = JFactory::getSession();
				$headers = json_encode($headers);
				$session->set('consultant_VDM_IMPORTHEADERS', $headers);
				$session->set('backto_VDM_IMPORT',
'consultants');
				$session->set('dataType_VDM_IMPORTINTO',
'consultant');
				// Redirect to import view.
				$message =
JText::_('COM_RESERVATION_IMPORT_SELECT_FILE_FOR_CONSULTANTS');
				$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=import',
false), $message);
				return;
			}
		}
		// Redirect to the list screen with error.
		$message = JText::_('COM_RESERVATION_IMPORT_FAILED');
		$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=consultants',
false), $message, 'error');
		return;
	}
}
PK4~�[Ũ�?""controllers/doctor.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		doctor.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Utilities\ArrayHelper;

/**
 * Doctor Controller
 */
class ReservationControllerDoctor extends JControllerForm
{
	/**
	 * Current or most recently performed task.
	 *
	 * @var    string
	 * @since  12.2
	 * @note   Replaces _task.
	 */
	protected $task;

	/**
	 * Class constructor.
	 *
	 * @param   array  $config  A named array of configuration variables.
	 *
	 * @since   1.6
	 */
	public function __construct($config = array())
	{
		$this->view_list = 'Doctors'; // safeguard for setting the
return view listing to the main view.
		parent::__construct($config);
	}

        /**
	 * Method override to check if you can add a new record.
	 *
	 * @param   array  $data  An array of input data.
	 *
	 * @return  boolean
	 *
	 * @since   1.6
	 */
	protected function allowAdd($data = array())
	{
		// Get user object.
		$user = JFactory::getUser();
		// Access check.
		$access = $user->authorise('doctor.access',
'com_reservation');
		if (!$access)
		{
			return false;
		}

		// In the absense of better information, revert to the component
permissions.
		return parent::allowAdd($data);
	}

	/**
	 * Method override to check if you can edit an existing record.
	 *
	 * @param   array   $data  An array of input data.
	 * @param   string  $key   The name of the key for the primary key.
	 *
	 * @return  boolean
	 *
	 * @since   1.6
	 */
	protected function allowEdit($data = array(), $key = 'id')
	{		// get user object.
		$user = JFactory::getUser();
		// get record id.
		$recordId = (int) isset($data[$key]) ? $data[$key] : 0;


		// Access check.
		$access = ($user->authorise('doctor.access',
'com_reservation.doctor.' . (int) $recordId) &&
$user->authorise('doctor.access',
'com_reservation'));
		if (!$access)
		{
			return false;
		}

		if ($recordId)
		{
			// The record has been set. Check the record permissions.
			$permission = $user->authorise('core.edit',
'com_reservation.doctor.' . (int) $recordId);
			if (!$permission)
			{
				if ($user->authorise('core.edit.own',
'com_reservation.doctor.' . $recordId))
				{
					// Fallback on edit.own. Now test the owner is the user.
					$ownerId = (int) isset($data['created_by']) ?
$data['created_by'] : 0;
					if (empty($ownerId))
					{
						// Need to do a lookup from the model.
						$record = $this->getModel()->getItem($recordId);

						if (empty($record))
						{
							return false;
						}
						$ownerId = $record->created_by;
					}

					// If the owner matches 'me' then do the test.
					if ($ownerId == $user->id)
					{
						if ($user->authorise('core.edit.own',
'com_reservation'))
						{
							return true;
						}
					}
				}
				return false;
			}
		}
		// Since there is no permission, revert to the component permissions.
		return parent::allowEdit($data, $key);
	}

	/**
	 * Gets the URL arguments to append to an item redirect.
	 *
	 * @param   integer  $recordId  The primary key id for the item.
	 * @param   string   $urlVar    The name of the URL variable for the id.
	 *
	 * @return  string  The arguments to append to the redirect URL.
	 *
	 * @since   1.6
	 */
	protected function getRedirectToItemAppend($recordId = null, $urlVar =
'id')
	{
		// get the referral options (old method use return instead see parent)
		$ref = $this->input->get('ref', 0, 'string');
		$refid = $this->input->get('refid', 0, 'int');

		// get redirect info.
		$append = parent::getRedirectToItemAppend($recordId, $urlVar);

		// set the referral options
		if ($refid && $ref)
                {
			$append = '&ref=' . (string)$ref .
'&refid='. (int)$refid . $append;
		}
		elseif ($ref)
		{
			$append = '&ref='. (string)$ref . $append;
		}

		return $append;
	}

	/**
	 * Method to run batch operations.
	 *
	 * @param   object  $model  The model.
	 *
	 * @return  boolean   True if successful, false otherwise and internal
error is set.
	 *
	 * @since   2.5
	 */
	public function batch($model = null)
	{
		JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN'));

		// Set the model
		$model = $this->getModel('Doctor', '', array());

		// Preset the redirect
		$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=doctors'
. $this->getRedirectToListAppend(), false));

		return parent::batch($model);
	}

	/**
	 * Method to cancel an edit.
	 *
	 * @param   string  $key  The name of the primary key of the URL variable.
	 *
	 * @return  boolean  True if access level checks pass, false otherwise.
	 *
	 * @since   12.2
	 */
	public function cancel($key = null)
	{
		// get the referral options
		$this->ref = $this->input->get('ref', 0,
'word');
		$this->refid = $this->input->get('refid', 0,
'int');

		// Check if there is a return value
		$return = $this->input->get('return', null,
'base64');

		$cancel = parent::cancel($key);

		if (!is_null($return) &&
JUri::isInternal(base64_decode($return)))
		{
			$redirect = base64_decode($return);

			// Redirect to the return value.
			$this->setRedirect(
				JRoute::_(
					$redirect, false
				)
			);
		}
		elseif ($this->refid && $this->ref)
		{
			$redirect = '&view=' . (string)$this->ref .
'&layout=edit&id=' . (int)$this->refid;

			// Redirect to the item screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		elseif ($this->ref)
		{
			$redirect = '&view='.(string)$this->ref;

			// Redirect to the list screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		return $cancel;
	}

	/**
	 * Method to save a record.
	 *
	 * @param   string  $key     The name of the primary key of the URL
variable.
	 * @param   string  $urlVar  The name of the URL variable if different
from the primary key (sometimes required to avoid router collisions).
	 *
	 * @return  boolean  True if successful, false otherwise.
	 *
	 * @since   12.2
	 */
	public function save($key = null, $urlVar = null)
	{
		// get the referral options
		$this->ref = $this->input->get('ref', 0,
'word');
		$this->refid = $this->input->get('refid', 0,
'int');

		// Check if there is a return value
		$return = $this->input->get('return', null,
'base64');
		$canReturn = (!is_null($return) &&
JUri::isInternal(base64_decode($return)));

		if ($this->ref || $this->refid || $canReturn)
		{
			// to make sure the item is checkedin on redirect
			$this->task = 'save';
		}

		$saved = parent::save($key, $urlVar);

		// This is not needed since parent save already does this
		// Due to the ref and refid implementation we need to add this
		if ($canReturn)
		{
			$redirect = base64_decode($return);

			// Redirect to the return value.
			$this->setRedirect(
				JRoute::_(
					$redirect, false
				)
			);
		}
		elseif ($this->refid && $this->ref)
		{
			$redirect = '&view=' . (string)$this->ref .
'&layout=edit&id=' . (int)$this->refid;

			// Redirect to the item screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		elseif ($this->ref)
		{
			$redirect = '&view=' . (string)$this->ref;

			// Redirect to the list screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		return $saved;
	}

	/**
	 * Function that allows child controller access to model data
	 * after the data has been saved.
	 *
	 * @param   JModel  &$model     The data model object.
	 * @param   array   $validData  The validated data.
	 *
	 * @return  void
	 *
	 * @since   11.1
	 */
	protected function postSaveHook(JModelLegacy $model, $validData = array())
	{
		return;
	}

}
PK4~�[���A��controllers/doctors.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		doctors.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Utilities\ArrayHelper;

/**
 * Doctors Controller
 */
class ReservationControllerDoctors extends JControllerAdmin
{
	/**
	 * The prefix to use with controller messages.
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $text_prefix = 'COM_RESERVATION_DOCTORS';

	/**
	 * Method to get a model object, loading it if required.
	 *
	 * @param   string  $name    The model name. Optional.
	 * @param   string  $prefix  The class prefix. Optional.
	 * @param   array   $config  Configuration array for model. Optional.
	 *
	 * @return  JModelLegacy  The model.
	 *
	 * @since   1.6
	 */
	public function getModel($name = 'Doctor', $prefix =
'ReservationModel', $config = array('ignore_request'
=> true))
	{
		return parent::getModel($name, $prefix, $config);
	}

	public function exportData()
	{
		// Check for request forgeries
		JSession::checkToken() or die(JText::_('JINVALID_TOKEN'));
		// check if export is allowed for this user.
		$user = JFactory::getUser();
		if ($user->authorise('doctor.export',
'com_reservation') &&
$user->authorise('core.export', 'com_reservation'))
		{
			// Get the input
			$input = JFactory::getApplication()->input;
			$pks = $input->post->get('cid', array(),
'array');
			// Sanitize the input
			$pks = ArrayHelper::toInteger($pks);
			// Get the model
			$model = $this->getModel('Doctors');
			// get the data to export
			$data = $model->getExportData($pks);
			if (ReservationHelper::checkArray($data))
			{
				// now set the data to the spreadsheet
				$date = JFactory::getDate();
				ReservationHelper::xls($data,'Doctors_'.$date->format('jS_F_Y'),'Doctors
exported ('.$date->format('jS F,
Y').')','doctors');
			}
		}
		// Redirect to the list screen with error.
		$message = JText::_('COM_RESERVATION_EXPORT_FAILED');
		$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=doctors',
false), $message, 'error');
		return;
	}


	public function importData()
	{
		// Check for request forgeries
		JSession::checkToken() or die(JText::_('JINVALID_TOKEN'));
		// check if import is allowed for this user.
		$user = JFactory::getUser();
		if ($user->authorise('doctor.import',
'com_reservation') &&
$user->authorise('core.import', 'com_reservation'))
		{
			// Get the import model
			$model = $this->getModel('Doctors');
			// get the headers to import
			$headers = $model->getExImPortHeaders();
			if (ReservationHelper::checkObject($headers))
			{
				// Load headers to session.
				$session = JFactory::getSession();
				$headers = json_encode($headers);
				$session->set('doctor_VDM_IMPORTHEADERS', $headers);
				$session->set('backto_VDM_IMPORT', 'doctors');
				$session->set('dataType_VDM_IMPORTINTO',
'doctor');
				// Redirect to import view.
				$message =
JText::_('COM_RESERVATION_IMPORT_SELECT_FILE_FOR_DOCTORS');
				$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=import',
false), $message);
				return;
			}
		}
		// Redirect to the list screen with error.
		$message = JText::_('COM_RESERVATION_IMPORT_FAILED');
		$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=doctors',
false), $message, 'error');
		return;
	}
}
PK4~�[ɳ`E��controllers/import.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		import.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Utilities\ArrayHelper;

/**
 * Reservation Import Controller
 */
class ReservationControllerImport extends JControllerLegacy
{
	/**
	 * Import an spreadsheet.
	 *
	 * @return  void
	 */
	public function import()
	{
		// Check for request forgeries
		JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN'));

		$model = $this->getModel('import');
		if ($model->import())
		{
			$cache = JFactory::getCache('mod_menu');
			$cache->clean();
			// TODO: Reset the users acl here as well to kill off any missing bits
		}

		$app = JFactory::getApplication();
		$redirect_url =
$app->getUserState('com_reservation.redirect_url');
		if (empty($redirect_url))
		{
			$redirect_url =
JRoute::_('index.php?option=com_reservation&view=import',
false);
		}
		else
		{
			// wipe out the user state when we're going to redirect
			$app->setUserState('com_reservation.redirect_url',
'');
			$app->setUserState('com_reservation.message',
'');
			$app->setUserState('com_reservation.extension_message',
'');
		}
		$this->setRedirect($redirect_url);
	}
}
PK4~�[w�K@��controllers/import_reserves.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.30
	@build			6th March, 2021
	@created		17th December, 2020
	@package		Reservation
	@subpackage		import_reserves.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Utilities\ArrayHelper;

/**
 * Reservation Import_reserves Controller
 */
class ReservationControllerImport_reserves extends JControllerLegacy
{
	/**
	 * Import an spreadsheet.
	 *
	 * @return  void
	 */
	public function import()
	{
		// Check for request forgeries
		JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN'));

		$model = $this->getModel('Import_reserves');
		if ($model->import())
		{
			$cache = JFactory::getCache('mod_menu');
			$cache->clean();
			// TODO: Reset the users acl here as well to kill off any missing bits
		}

		$app = JFactory::getApplication();
		$redirect_url =
$app->getUserState('com_reservation.redirect_url');
		if (empty($redirect_url))
		{
			$redirect_url =
JRoute::_('index.php?option=com_reservation&view=import_reserves',
false);
		}
		else
		{
			// wipe out the user state when we're going to redirect
			$app->setUserState('com_reservation.redirect_url',
'');
			$app->setUserState('com_reservation.message',
'');
			$app->setUserState('com_reservation.extension_message',
'');
		}
		$this->setRedirect($redirect_url);
	}
}
PK4~�[�#o,,controllers/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK4~�[&[��!!controllers/message.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		message.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Utilities\ArrayHelper;

/**
 * Message Controller
 */
class ReservationControllerMessage extends JControllerForm
{
	/**
	 * Current or most recently performed task.
	 *
	 * @var    string
	 * @since  12.2
	 * @note   Replaces _task.
	 */
	protected $task;

	/**
	 * Class constructor.
	 *
	 * @param   array  $config  A named array of configuration variables.
	 *
	 * @since   1.6
	 */
	public function __construct($config = array())
	{
		$this->view_list = 'Messages'; // safeguard for setting the
return view listing to the main view.
		parent::__construct($config);
	}

        /**
	 * Method override to check if you can add a new record.
	 *
	 * @param   array  $data  An array of input data.
	 *
	 * @return  boolean
	 *
	 * @since   1.6
	 */
	protected function allowAdd($data = array())
	{
		// Get user object.
		$user = JFactory::getUser();
		// Access check.
		$access = $user->authorise('message.access',
'com_reservation');
		if (!$access)
		{
			return false;
		}

		// In the absense of better information, revert to the component
permissions.
		return parent::allowAdd($data);
	}

	/**
	 * Method override to check if you can edit an existing record.
	 *
	 * @param   array   $data  An array of input data.
	 * @param   string  $key   The name of the key for the primary key.
	 *
	 * @return  boolean
	 *
	 * @since   1.6
	 */
	protected function allowEdit($data = array(), $key = 'id')
	{
		// get user object.
		$user = JFactory::getUser();
		// get record id.
		$recordId = (int) isset($data[$key]) ? $data[$key] : 0;


		if ($recordId)
		{
			// The record has been set. Check the record permissions.
			$permission = $user->authorise('core.edit',
'com_reservation.message.' . (int) $recordId);
			if (!$permission)
			{
				if ($user->authorise('core.edit.own',
'com_reservation.message.' . $recordId))
				{
					// Now test the owner is the user.
					$ownerId = (int) isset($data['created_by']) ?
$data['created_by'] : 0;
					if (empty($ownerId))
					{
						// Need to do a lookup from the model.
						$record = $this->getModel()->getItem($recordId);

						if (empty($record))
						{
							return false;
						}
						$ownerId = $record->created_by;
					}

					// If the owner matches 'me' then allow.
					if ($ownerId == $user->id)
					{
						if ($user->authorise('core.edit.own',
'com_reservation'))
						{
							return true;
						}
					}
				}
				return false;
			}
		}
		// Since there is no permission, revert to the component permissions.
		return parent::allowEdit($data, $key);
	}

	/**
	 * Gets the URL arguments to append to an item redirect.
	 *
	 * @param   integer  $recordId  The primary key id for the item.
	 * @param   string   $urlVar    The name of the URL variable for the id.
	 *
	 * @return  string  The arguments to append to the redirect URL.
	 *
	 * @since   1.6
	 */
	protected function getRedirectToItemAppend($recordId = null, $urlVar =
'id')
	{
		// get the referral options (old method use return instead see parent)
		$ref = $this->input->get('ref', 0, 'string');
		$refid = $this->input->get('refid', 0, 'int');

		// get redirect info.
		$append = parent::getRedirectToItemAppend($recordId, $urlVar);

		// set the referral options
		if ($refid && $ref)
                {
			$append = '&ref=' . (string)$ref .
'&refid='. (int)$refid . $append;
		}
		elseif ($ref)
		{
			$append = '&ref='. (string)$ref . $append;
		}

		return $append;
	}

	/**
	 * Method to run batch operations.
	 *
	 * @param   object  $model  The model.
	 *
	 * @return  boolean   True if successful, false otherwise and internal
error is set.
	 *
	 * @since   2.5
	 */
	public function batch($model = null)
	{
		JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN'));

		// Set the model
		$model = $this->getModel('Message', '', array());

		// Preset the redirect
		$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=messages'
. $this->getRedirectToListAppend(), false));

		return parent::batch($model);
	}

	/**
	 * Method to cancel an edit.
	 *
	 * @param   string  $key  The name of the primary key of the URL variable.
	 *
	 * @return  boolean  True if access level checks pass, false otherwise.
	 *
	 * @since   12.2
	 */
	public function cancel($key = null)
	{
		// get the referral options
		$this->ref = $this->input->get('ref', 0,
'word');
		$this->refid = $this->input->get('refid', 0,
'int');

		// Check if there is a return value
		$return = $this->input->get('return', null,
'base64');

		$cancel = parent::cancel($key);

		if (!is_null($return) &&
JUri::isInternal(base64_decode($return)))
		{
			$redirect = base64_decode($return);

			// Redirect to the return value.
			$this->setRedirect(
				JRoute::_(
					$redirect, false
				)
			);
		}
		elseif ($this->refid && $this->ref)
		{
			$redirect = '&view=' . (string)$this->ref .
'&layout=edit&id=' . (int)$this->refid;

			// Redirect to the item screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		elseif ($this->ref)
		{
			$redirect = '&view='.(string)$this->ref;

			// Redirect to the list screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		return $cancel;
	}

	/**
	 * Method to save a record.
	 *
	 * @param   string  $key     The name of the primary key of the URL
variable.
	 * @param   string  $urlVar  The name of the URL variable if different
from the primary key (sometimes required to avoid router collisions).
	 *
	 * @return  boolean  True if successful, false otherwise.
	 *
	 * @since   12.2
	 */
	public function save($key = null, $urlVar = null)
	{
		// get the referral options
		$this->ref = $this->input->get('ref', 0,
'word');
		$this->refid = $this->input->get('refid', 0,
'int');

		// Check if there is a return value
		$return = $this->input->get('return', null,
'base64');
		$canReturn = (!is_null($return) &&
JUri::isInternal(base64_decode($return)));

		if ($this->ref || $this->refid || $canReturn)
		{
			// to make sure the item is checkedin on redirect
			$this->task = 'save';
		}

		$saved = parent::save($key, $urlVar);

		// This is not needed since parent save already does this
		// Due to the ref and refid implementation we need to add this
		if ($canReturn)
		{
			$redirect = base64_decode($return);

			// Redirect to the return value.
			$this->setRedirect(
				JRoute::_(
					$redirect, false
				)
			);
		}
		elseif ($this->refid && $this->ref)
		{
			$redirect = '&view=' . (string)$this->ref .
'&layout=edit&id=' . (int)$this->refid;

			// Redirect to the item screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		elseif ($this->ref)
		{
			$redirect = '&view=' . (string)$this->ref;

			// Redirect to the list screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		return $saved;
	}

	/**
	 * Function that allows child controller access to model data
	 * after the data has been saved.
	 *
	 * @param   JModel  &$model     The data model object.
	 * @param   array   $validData  The validated data.
	 *
	 * @return  void
	 *
	 * @since   11.1
	 */
	protected function postSaveHook(JModelLegacy $model, $validData = array())
	{
		return;
	}

}
PK4~�[��>t��controllers/messages.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		messages.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Utilities\ArrayHelper;

/**
 * Messages Controller
 */
class ReservationControllerMessages extends JControllerAdmin
{
	/**
	 * The prefix to use with controller messages.
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $text_prefix = 'COM_RESERVATION_MESSAGES';

	/**
	 * Method to get a model object, loading it if required.
	 *
	 * @param   string  $name    The model name. Optional.
	 * @param   string  $prefix  The class prefix. Optional.
	 * @param   array   $config  Configuration array for model. Optional.
	 *
	 * @return  JModelLegacy  The model.
	 *
	 * @since   1.6
	 */
	public function getModel($name = 'Message', $prefix =
'ReservationModel', $config = array('ignore_request'
=> true))
	{
		return parent::getModel($name, $prefix, $config);
	}

	public function exportData()
	{
		// Check for request forgeries
		JSession::checkToken() or die(JText::_('JINVALID_TOKEN'));
		// check if export is allowed for this user.
		$user = JFactory::getUser();
		if ($user->authorise('message.export',
'com_reservation') &&
$user->authorise('core.export', 'com_reservation'))
		{
			// Get the input
			$input = JFactory::getApplication()->input;
			$pks = $input->post->get('cid', array(),
'array');
			// Sanitize the input
			$pks = ArrayHelper::toInteger($pks);
			// Get the model
			$model = $this->getModel('Messages');
			// get the data to export
			$data = $model->getExportData($pks);
			if (ReservationHelper::checkArray($data))
			{
				// now set the data to the spreadsheet
				$date = JFactory::getDate();
				ReservationHelper::xls($data,'Messages_'.$date->format('jS_F_Y'),'Messages
exported ('.$date->format('jS F,
Y').')','messages');
			}
		}
		// Redirect to the list screen with error.
		$message = JText::_('COM_RESERVATION_EXPORT_FAILED');
		$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=messages',
false), $message, 'error');
		return;
	}


	public function importData()
	{
		// Check for request forgeries
		JSession::checkToken() or die(JText::_('JINVALID_TOKEN'));
		// check if import is allowed for this user.
		$user = JFactory::getUser();
		if ($user->authorise('message.import',
'com_reservation') &&
$user->authorise('core.import', 'com_reservation'))
		{
			// Get the import model
			$model = $this->getModel('Messages');
			// get the headers to import
			$headers = $model->getExImPortHeaders();
			if (ReservationHelper::checkObject($headers))
			{
				// Load headers to session.
				$session = JFactory::getSession();
				$headers = json_encode($headers);
				$session->set('message_VDM_IMPORTHEADERS', $headers);
				$session->set('backto_VDM_IMPORT', 'messages');
				$session->set('dataType_VDM_IMPORTINTO',
'message');
				// Redirect to import view.
				$message =
JText::_('COM_RESERVATION_IMPORT_SELECT_FILE_FOR_MESSAGES');
				$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=import',
false), $message);
				return;
			}
		}
		// Redirect to the list screen with error.
		$message = JText::_('COM_RESERVATION_IMPORT_FAILED');
		$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=messages',
false), $message, 'error');
		return;
	}
}
PK4~�[�4-""controllers/order.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.31
	@build			8th May, 2021
	@created		17th December, 2020
	@package		Reservation
	@subpackage		order.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Utilities\ArrayHelper;

/**
 * Order Controller
 */
class ReservationControllerOrder extends JControllerForm
{
	/**
	 * Current or most recently performed task.
	 *
	 * @var    string
	 * @since  12.2
	 * @note   Replaces _task.
	 */
	protected $task;

	/**
	 * Class constructor.
	 *
	 * @param   array  $config  A named array of configuration variables.
	 *
	 * @since   1.6
	 */
	public function __construct($config = array())
	{
		$this->view_list = 'Orders'; // safeguard for setting the
return view listing to the main view.
		parent::__construct($config);
	}

        /**
	 * Method override to check if you can add a new record.
	 *
	 * @param   array  $data  An array of input data.
	 *
	 * @return  boolean
	 *
	 * @since   1.6
	 */
	protected function allowAdd($data = array())
	{
		// Get user object.
		$user = JFactory::getUser();
		// Access check.
		$access = $user->authorise('order.access',
'com_reservation');
		if (!$access)
		{
			return false;
		}

		// In the absense of better information, revert to the component
permissions.
		return parent::allowAdd($data);
	}

	/**
	 * Method override to check if you can edit an existing record.
	 *
	 * @param   array   $data  An array of input data.
	 * @param   string  $key   The name of the key for the primary key.
	 *
	 * @return  boolean
	 *
	 * @since   1.6
	 */
	protected function allowEdit($data = array(), $key = 'id')
	{
		// get user object.
		$user = JFactory::getUser();
		// get record id.
		$recordId = (int) isset($data[$key]) ? $data[$key] : 0;


		if ($recordId)
		{
			// The record has been set. Check the record permissions.
			$permission = $user->authorise('core.edit',
'com_reservation.order.' . (int) $recordId);
			if (!$permission)
			{
				if ($user->authorise('core.edit.own',
'com_reservation.order.' . $recordId))
				{
					// Now test the owner is the user.
					$ownerId = (int) isset($data['created_by']) ?
$data['created_by'] : 0;
					if (empty($ownerId))
					{
						// Need to do a lookup from the model.
						$record = $this->getModel()->getItem($recordId);

						if (empty($record))
						{
							return false;
						}
						$ownerId = $record->created_by;
					}

					// If the owner matches 'me' then allow.
					if ($ownerId == $user->id)
					{
						if ($user->authorise('core.edit.own',
'com_reservation'))
						{
							return true;
						}
					}
				}
				return false;
			}
		}
		// Since there is no permission, revert to the component permissions.
		return parent::allowEdit($data, $key);
	}

	/**
	 * Gets the URL arguments to append to an item redirect.
	 *
	 * @param   integer  $recordId  The primary key id for the item.
	 * @param   string   $urlVar    The name of the URL variable for the id.
	 *
	 * @return  string  The arguments to append to the redirect URL.
	 *
	 * @since   1.6
	 */
	protected function getRedirectToItemAppend($recordId = null, $urlVar =
'id')
	{
		// get the referral options (old method use return instead see parent)
		$ref = $this->input->get('ref', 0, 'string');
		$refid = $this->input->get('refid', 0, 'int');

		// get redirect info.
		$append = parent::getRedirectToItemAppend($recordId, $urlVar);

		// set the referral options
		if ($refid && $ref)
                {
			$append = '&ref=' . (string)$ref .
'&refid='. (int)$refid . $append;
		}
		elseif ($ref)
		{
			$append = '&ref='. (string)$ref . $append;
		}

		return $append;
	}

	/**
	 * Method to run batch operations.
	 *
	 * @param   object  $model  The model.
	 *
	 * @return  boolean   True if successful, false otherwise and internal
error is set.
	 *
	 * @since   2.5
	 */
	public function batch($model = null)
	{
		JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN'));

		// Set the model
		$model = $this->getModel('Order', '', array());

		// Preset the redirect
		$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=orders'
. $this->getRedirectToListAppend(), false));

		return parent::batch($model);
	}

	/**
	 * Method to cancel an edit.
	 *
	 * @param   string  $key  The name of the primary key of the URL
variable.
	 *
	 * @return  boolean  True if access level checks pass, false otherwise.
	 *
	 * @since   12.2
	 */
	public function cancel($key = null)
	{
		// get the referral options
		$this->ref = $this->input->get('ref', 0,
'word');
		$this->refid = $this->input->get('refid', 0,
'int');

		// Check if there is a return value
		$return = $this->input->get('return', null,
'base64');

		$cancel = parent::cancel($key);

		if (!is_null($return) &&
JUri::isInternal(base64_decode($return)))
		{
			$redirect = base64_decode($return);

			// Redirect to the return value.
			$this->setRedirect(
				JRoute::_(
					$redirect, false
				)
			);
		}
		elseif ($this->refid && $this->ref)
		{
			$redirect = '&view=' . (string)$this->ref .
'&layout=edit&id=' . (int)$this->refid;

			// Redirect to the item screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		elseif ($this->ref)
		{
			$redirect = '&view='.(string)$this->ref;

			// Redirect to the list screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		return $cancel;
	}

	/**
	 * Method to save a record.
	 *
	 * @param   string  $key     The name of the primary key of the URL
variable.
	 * @param   string  $urlVar  The name of the URL variable if different
from the primary key (sometimes required to avoid router collisions).
	 *
	 * @return  boolean  True if successful, false otherwise.
	 *
	 * @since   12.2
	 */
	public function save($key = null, $urlVar = null)
	{
		// get the referral options
		$this->ref = $this->input->get('ref', 0,
'word');
		$this->refid = $this->input->get('refid', 0,
'int');

		// Check if there is a return value
		$return = $this->input->get('return', null,
'base64');
		$canReturn = (!is_null($return) &&
JUri::isInternal(base64_decode($return)));

		if ($this->ref || $this->refid || $canReturn)
		{
			// to make sure the item is checkedin on redirect
			$this->task = 'save';
		}

		$saved = parent::save($key, $urlVar);

		// This is not needed since parent save already does this
		// Due to the ref and refid implementation we need to add this
		if ($canReturn)
		{
			$redirect = base64_decode($return);

			// Redirect to the return value.
			$this->setRedirect(
				JRoute::_(
					$redirect, false
				)
			);
		}
		elseif ($this->refid && $this->ref)
		{
			$redirect = '&view=' . (string)$this->ref .
'&layout=edit&id=' . (int)$this->refid;

			// Redirect to the item screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		elseif ($this->ref)
		{
			$redirect = '&view=' . (string)$this->ref;

			// Redirect to the list screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		return $saved;
	}

	/**
	 * Function that allows child controller access to model data
	 * after the data has been saved.
	 *
	 * @param   JModel  &$model     The data model object.
	 * @param   array   $validData  The validated data.
	 *
	 * @return  void
	 *
	 * @since   11.1
	 */
	protected function postSaveHook(JModelLegacy $model, $validData =
array())
	{
		return;
	}

}
PK4~�[��yn��controllers/orders.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.31
	@build			8th May, 2021
	@created		17th December, 2020
	@package		Reservation
	@subpackage		orders.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Utilities\ArrayHelper;

/**
 * Orders Controller
 */
class ReservationControllerOrders extends JControllerAdmin
{
	/**
	 * The prefix to use with controller messages.
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $text_prefix = 'COM_RESERVATION_ORDERS';

	/**
	 * Method to get a model object, loading it if required.
	 *
	 * @param   string  $name    The model name. Optional.
	 * @param   string  $prefix  The class prefix. Optional.
	 * @param   array   $config  Configuration array for model. Optional.
	 *
	 * @return  JModelLegacy  The model.
	 *
	 * @since   1.6
	 */
	public function getModel($name = 'Order', $prefix =
'ReservationModel', $config = array('ignore_request'
=> true))
	{
		return parent::getModel($name, $prefix, $config);
	}

	public function exportData()
	{
		// Check for request forgeries
		JSession::checkToken() or die(JText::_('JINVALID_TOKEN'));
		// check if export is allowed for this user.
		$user = JFactory::getUser();
		if ($user->authorise('order.export',
'com_reservation') &&
$user->authorise('core.export', 'com_reservation'))
		{
			// Get the input
			$input = JFactory::getApplication()->input;
			$pks = $input->post->get('cid', array(),
'array');
			// Sanitize the input
			$pks = ArrayHelper::toInteger($pks);
			// Get the model
			$model = $this->getModel('Orders');
			// get the data to export
			$data = $model->getExportData($pks);
			if (ReservationHelper::checkArray($data))
			{
				// now set the data to the spreadsheet
				$date = JFactory::getDate();
				ReservationHelper::xls($data,'Orders_'.$date->format('jS_F_Y'),'Orders
exported ('.$date->format('jS F,
Y').')','orders');
			}
		}
		// Redirect to the list screen with error.
		$message = JText::_('COM_RESERVATION_EXPORT_FAILED');
		$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=orders',
false), $message, 'error');
		return;
	}


	public function importData()
	{
		// Check for request forgeries
		JSession::checkToken() or die(JText::_('JINVALID_TOKEN'));
		// check if import is allowed for this user.
		$user = JFactory::getUser();
		if ($user->authorise('order.import',
'com_reservation') &&
$user->authorise('core.import', 'com_reservation'))
		{
			// Get the import model
			$model = $this->getModel('Orders');
			// get the headers to import
			$headers = $model->getExImPortHeaders();
			if (ReservationHelper::checkObject($headers))
			{
				// Load headers to session.
				$session = JFactory::getSession();
				$headers = json_encode($headers);
				$session->set('order_VDM_IMPORTHEADERS', $headers);
				$session->set('backto_VDM_IMPORT', 'orders');
				$session->set('dataType_VDM_IMPORTINTO',
'order');
				// Redirect to import view.
				$message =
JText::_('COM_RESERVATION_IMPORT_SELECT_FILE_FOR_ORDERS');
				$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=import',
false), $message);
				return;
			}
		}
		// Redirect to the list screen with error.
		$message = JText::_('COM_RESERVATION_IMPORT_FAILED');
		$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=orders',
false), $message, 'error');
		return;
	}
}
PK4~�[���?"?"controllers/plan.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		plan.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Utilities\ArrayHelper;

/**
 * Plan Controller
 */
class ReservationControllerPlan extends JControllerForm
{
	/**
	 * Current or most recently performed task.
	 *
	 * @var    string
	 * @since  12.2
	 * @note   Replaces _task.
	 */
	protected $task;

	/**
	 * Class constructor.
	 *
	 * @param   array  $config  A named array of configuration variables.
	 *
	 * @since   1.6
	 */
	public function __construct($config = array())
	{
		$this->view_list = 'Plans'; // safeguard for setting the
return view listing to the main view.
		parent::__construct($config);
	}

        /**
	 * Method override to check if you can add a new record.
	 *
	 * @param   array  $data  An array of input data.
	 *
	 * @return  boolean
	 *
	 * @since   1.6
	 */
	protected function allowAdd($data = array())
	{
		// Get user object.
		$user = JFactory::getUser();
		// Access check.
		$access = $user->authorise('plan.access',
'com_reservation');
		if (!$access)
		{
			return false;
		}

		// In the absense of better information, revert to the component
permissions.
		return parent::allowAdd($data);
	}

	/**
	 * Method override to check if you can edit an existing record.
	 *
	 * @param   array   $data  An array of input data.
	 * @param   string  $key   The name of the key for the primary key.
	 *
	 * @return  boolean
	 *
	 * @since   1.6
	 */
	protected function allowEdit($data = array(), $key = 'id')
	{
		// get user object.
		$user = JFactory::getUser();
		// get record id.
		$recordId = (int) isset($data[$key]) ? $data[$key] : 0;


		if ($recordId)
		{
			// The record has been set. Check the record permissions.
			$permission = $user->authorise('core.edit',
'com_reservation.plan.' . (int) $recordId);
			if (!$permission)
			{
				if ($user->authorise('core.edit.own',
'com_reservation.plan.' . $recordId))
				{
					// Now test the owner is the user.
					$ownerId = (int) isset($data['created_by']) ?
$data['created_by'] : 0;
					if (empty($ownerId))
					{
						// Need to do a lookup from the model.
						$record = $this->getModel()->getItem($recordId);

						if (empty($record))
						{
							return false;
						}
						$ownerId = $record->created_by;
					}

					// If the owner matches 'me' then allow.
					if ($ownerId == $user->id)
					{
						if ($user->authorise('core.edit.own',
'com_reservation'))
						{
							return true;
						}
					}
				}
				return false;
			}
		}
		// Since there is no permission, revert to the component permissions.
		return parent::allowEdit($data, $key);
	}

	/**
	 * Gets the URL arguments to append to an item redirect.
	 *
	 * @param   integer  $recordId  The primary key id for the item.
	 * @param   string   $urlVar    The name of the URL variable for the id.
	 *
	 * @return  string  The arguments to append to the redirect URL.
	 *
	 * @since   1.6
	 */
	protected function getRedirectToItemAppend($recordId = null, $urlVar =
'id')
	{
		// get the referral options (old method use return instead see parent)
		$ref = $this->input->get('ref', 0, 'string');
		$refid = $this->input->get('refid', 0, 'int');

		// get redirect info.
		$append = parent::getRedirectToItemAppend($recordId, $urlVar);

		// set the referral options
		if ($refid && $ref)
                {
			$append = '&ref=' . (string)$ref .
'&refid='. (int)$refid . $append;
		}
		elseif ($ref)
		{
			$append = '&ref='. (string)$ref . $append;
		}

		return $append;
	}

	/**
	 * Method to run batch operations.
	 *
	 * @param   object  $model  The model.
	 *
	 * @return  boolean   True if successful, false otherwise and internal
error is set.
	 *
	 * @since   2.5
	 */
	public function batch($model = null)
	{
		JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN'));

		// Set the model
		$model = $this->getModel('Plan', '', array());

		// Preset the redirect
		$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=plans'
. $this->getRedirectToListAppend(), false));

		return parent::batch($model);
	}

	/**
	 * Method to cancel an edit.
	 *
	 * @param   string  $key  The name of the primary key of the URL variable.
	 *
	 * @return  boolean  True if access level checks pass, false otherwise.
	 *
	 * @since   12.2
	 */
	public function cancel($key = null)
	{
		// get the referral options
		$this->ref = $this->input->get('ref', 0,
'word');
		$this->refid = $this->input->get('refid', 0,
'int');

		// Check if there is a return value
		$return = $this->input->get('return', null,
'base64');

		$cancel = parent::cancel($key);

		if (!is_null($return) &&
JUri::isInternal(base64_decode($return)))
		{
			$redirect = base64_decode($return);

			// Redirect to the return value.
			$this->setRedirect(
				JRoute::_(
					$redirect, false
				)
			);
		}
		elseif ($this->refid && $this->ref)
		{
			$redirect = '&view=' . (string)$this->ref .
'&layout=edit&id=' . (int)$this->refid;

			// Redirect to the item screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		elseif ($this->ref)
		{
			$redirect = '&view='.(string)$this->ref;

			// Redirect to the list screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		return $cancel;
	}

	/**
	 * Method to save a record.
	 *
	 * @param   string  $key     The name of the primary key of the URL
variable.
	 * @param   string  $urlVar  The name of the URL variable if different
from the primary key (sometimes required to avoid router collisions).
	 *
	 * @return  boolean  True if successful, false otherwise.
	 *
	 * @since   12.2
	 */
	public function save($key = null, $urlVar = null)
	{
		// get the referral options
		$this->ref = $this->input->get('ref', 0,
'word');
		$this->refid = $this->input->get('refid', 0,
'int');

		// Check if there is a return value
		$return = $this->input->get('return', null,
'base64');
		$canReturn = (!is_null($return) &&
JUri::isInternal(base64_decode($return)));

		if ($this->ref || $this->refid || $canReturn)
		{
			// to make sure the item is checkedin on redirect
			$this->task = 'save';
		}

		$saved = parent::save($key, $urlVar);

		// This is not needed since parent save already does this
		// Due to the ref and refid implementation we need to add this
		if ($canReturn)
		{
			$redirect = base64_decode($return);

			// Redirect to the return value.
			$this->setRedirect(
				JRoute::_(
					$redirect, false
				)
			);
		}
		elseif ($this->refid && $this->ref)
		{
			$redirect = '&view=' . (string)$this->ref .
'&layout=edit&id=' . (int)$this->refid;

			// Redirect to the item screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		elseif ($this->ref)
		{
			$redirect = '&view=' . (string)$this->ref;

			// Redirect to the list screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		return $saved;
	}

	/**
	 * Function that allows child controller access to model data
	 * after the data has been saved.
	 *
	 * @param   JModel  &$model     The data model object.
	 * @param   array   $validData  The validated data.
	 *
	 * @return  void
	 *
	 * @since   11.1
	 */
	protected function postSaveHook(JModelLegacy $model, $validData = array())
	{

/***[JCBGUI.admin_view.php_postsavehook.112.$$$$]***/
		$id = $model->getState()->{'plan.id'};
		$validData['id'] = $id;
		JPluginHelper::importPlugin('reservation');
		$dispatcher = JEventDispatcher::getInstance();
		$dispatcher->trigger('onReservationPlanCreated',
array($validData));/***[/JCBGUI$$$$]***/


		return;
	}

}
PK4~�[���՚�controllers/plans.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		plans.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Utilities\ArrayHelper;

/**
 * Plans Controller
 */
class ReservationControllerPlans extends JControllerAdmin
{
	/**
	 * The prefix to use with controller messages.
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $text_prefix = 'COM_RESERVATION_PLANS';

	/**
	 * Method to get a model object, loading it if required.
	 *
	 * @param   string  $name    The model name. Optional.
	 * @param   string  $prefix  The class prefix. Optional.
	 * @param   array   $config  Configuration array for model. Optional.
	 *
	 * @return  JModelLegacy  The model.
	 *
	 * @since   1.6
	 */
	public function getModel($name = 'Plan', $prefix =
'ReservationModel', $config = array('ignore_request'
=> true))
	{
		return parent::getModel($name, $prefix, $config);
	}

	public function exportData()
	{
		// Check for request forgeries
		JSession::checkToken() or die(JText::_('JINVALID_TOKEN'));
		// check if export is allowed for this user.
		$user = JFactory::getUser();
		if ($user->authorise('plan.export',
'com_reservation') &&
$user->authorise('core.export', 'com_reservation'))
		{
			// Get the input
			$input = JFactory::getApplication()->input;
			$pks = $input->post->get('cid', array(),
'array');
			// Sanitize the input
			$pks = ArrayHelper::toInteger($pks);
			// Get the model
			$model = $this->getModel('Plans');
			// get the data to export
			$data = $model->getExportData($pks);
			if (ReservationHelper::checkArray($data))
			{
				// now set the data to the spreadsheet
				$date = JFactory::getDate();
				ReservationHelper::xls($data,'Plans_'.$date->format('jS_F_Y'),'Plans
exported ('.$date->format('jS F,
Y').')','plans');
			}
		}
		// Redirect to the list screen with error.
		$message = JText::_('COM_RESERVATION_EXPORT_FAILED');
		$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=plans',
false), $message, 'error');
		return;
	}


	public function importData()
	{
		// Check for request forgeries
		JSession::checkToken() or die(JText::_('JINVALID_TOKEN'));
		// check if import is allowed for this user.
		$user = JFactory::getUser();
		if ($user->authorise('plan.import',
'com_reservation') &&
$user->authorise('core.import', 'com_reservation'))
		{
			// Get the import model
			$model = $this->getModel('Plans');
			// get the headers to import
			$headers = $model->getExImPortHeaders();
			if (ReservationHelper::checkObject($headers))
			{
				// Load headers to session.
				$session = JFactory::getSession();
				$headers = json_encode($headers);
				$session->set('plan_VDM_IMPORTHEADERS', $headers);
				$session->set('backto_VDM_IMPORT', 'plans');
				$session->set('dataType_VDM_IMPORTINTO',
'plan');
				// Redirect to import view.
				$message =
JText::_('COM_RESERVATION_IMPORT_SELECT_FILE_FOR_PLANS');
				$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=import',
false), $message);
				return;
			}
		}
		// Redirect to the list screen with error.
		$message = JText::_('COM_RESERVATION_IMPORT_FAILED');
		$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=plans',
false), $message, 'error');
		return;
	}
}
PK4~�[�����controllers/reservation.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		reservation.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

/**
 * Reservation Controller
 */
class ReservationControllerReservation extends JControllerAdmin
{

}
PK4~�[^�8�!!controllers/reserve.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		reserve.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Utilities\ArrayHelper;

/**
 * Reserve Controller
 */
class ReservationControllerReserve extends JControllerForm
{
	/**
	 * Current or most recently performed task.
	 *
	 * @var    string
	 * @since  12.2
	 * @note   Replaces _task.
	 */
	protected $task;

	/**
	 * Class constructor.
	 *
	 * @param   array  $config  A named array of configuration variables.
	 *
	 * @since   1.6
	 */
	public function __construct($config = array())
	{
		$this->view_list = 'Reserves'; // safeguard for setting the
return view listing to the main view.
		parent::__construct($config);
	}

        /**
	 * Method override to check if you can add a new record.
	 *
	 * @param   array  $data  An array of input data.
	 *
	 * @return  boolean
	 *
	 * @since   1.6
	 */
	protected function allowAdd($data = array())
	{
		// Get user object.
		$user = JFactory::getUser();
		// Access check.
		$access = $user->authorise('reserve.access',
'com_reservation');
		if (!$access)
		{
			return false;
		}

		// In the absense of better information, revert to the component
permissions.
		return parent::allowAdd($data);
	}

	/**
	 * Method override to check if you can edit an existing record.
	 *
	 * @param   array   $data  An array of input data.
	 * @param   string  $key   The name of the key for the primary key.
	 *
	 * @return  boolean
	 *
	 * @since   1.6
	 */
	protected function allowEdit($data = array(), $key = 'id')
	{
		// get user object.
		$user = JFactory::getUser();
		// get record id.
		$recordId = (int) isset($data[$key]) ? $data[$key] : 0;


		if ($recordId)
		{
			// The record has been set. Check the record permissions.
			$permission = $user->authorise('core.edit',
'com_reservation.reserve.' . (int) $recordId);
			if (!$permission)
			{
				if ($user->authorise('core.edit.own',
'com_reservation.reserve.' . $recordId))
				{
					// Now test the owner is the user.
					$ownerId = (int) isset($data['created_by']) ?
$data['created_by'] : 0;
					if (empty($ownerId))
					{
						// Need to do a lookup from the model.
						$record = $this->getModel()->getItem($recordId);

						if (empty($record))
						{
							return false;
						}
						$ownerId = $record->created_by;
					}

					// If the owner matches 'me' then allow.
					if ($ownerId == $user->id)
					{
						if ($user->authorise('core.edit.own',
'com_reservation'))
						{
							return true;
						}
					}
				}
				return false;
			}
		}
		// Since there is no permission, revert to the component permissions.
		return parent::allowEdit($data, $key);
	}

	/**
	 * Gets the URL arguments to append to an item redirect.
	 *
	 * @param   integer  $recordId  The primary key id for the item.
	 * @param   string   $urlVar    The name of the URL variable for the id.
	 *
	 * @return  string  The arguments to append to the redirect URL.
	 *
	 * @since   1.6
	 */
	protected function getRedirectToItemAppend($recordId = null, $urlVar =
'id')
	{
		// get the referral options (old method use return instead see parent)
		$ref = $this->input->get('ref', 0, 'string');
		$refid = $this->input->get('refid', 0, 'int');

		// get redirect info.
		$append = parent::getRedirectToItemAppend($recordId, $urlVar);

		// set the referral options
		if ($refid && $ref)
                {
			$append = '&ref=' . (string)$ref .
'&refid='. (int)$refid . $append;
		}
		elseif ($ref)
		{
			$append = '&ref='. (string)$ref . $append;
		}

		return $append;
	}

	/**
	 * Method to run batch operations.
	 *
	 * @param   object  $model  The model.
	 *
	 * @return  boolean   True if successful, false otherwise and internal
error is set.
	 *
	 * @since   2.5
	 */
	public function batch($model = null)
	{
		JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN'));

		// Set the model
		$model = $this->getModel('Reserve', '', array());

		// Preset the redirect
		$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=reserves'
. $this->getRedirectToListAppend(), false));

		return parent::batch($model);
	}

	/**
	 * Method to cancel an edit.
	 *
	 * @param   string  $key  The name of the primary key of the URL variable.
	 *
	 * @return  boolean  True if access level checks pass, false otherwise.
	 *
	 * @since   12.2
	 */
	public function cancel($key = null)
	{
		// get the referral options
		$this->ref = $this->input->get('ref', 0,
'word');
		$this->refid = $this->input->get('refid', 0,
'int');

		// Check if there is a return value
		$return = $this->input->get('return', null,
'base64');

		$cancel = parent::cancel($key);

		if (!is_null($return) &&
JUri::isInternal(base64_decode($return)))
		{
			$redirect = base64_decode($return);

			// Redirect to the return value.
			$this->setRedirect(
				JRoute::_(
					$redirect, false
				)
			);
		}
		elseif ($this->refid && $this->ref)
		{
			$redirect = '&view=' . (string)$this->ref .
'&layout=edit&id=' . (int)$this->refid;

			// Redirect to the item screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		elseif ($this->ref)
		{
			$redirect = '&view='.(string)$this->ref;

			// Redirect to the list screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		return $cancel;
	}

	/**
	 * Method to save a record.
	 *
	 * @param   string  $key     The name of the primary key of the URL
variable.
	 * @param   string  $urlVar  The name of the URL variable if different
from the primary key (sometimes required to avoid router collisions).
	 *
	 * @return  boolean  True if successful, false otherwise.
	 *
	 * @since   12.2
	 */
	public function save($key = null, $urlVar = null)
	{
		// get the referral options
		$this->ref = $this->input->get('ref', 0,
'word');
		$this->refid = $this->input->get('refid', 0,
'int');

		// Check if there is a return value
		$return = $this->input->get('return', null,
'base64');
		$canReturn = (!is_null($return) &&
JUri::isInternal(base64_decode($return)));

		if ($this->ref || $this->refid || $canReturn)
		{
			// to make sure the item is checkedin on redirect
			$this->task = 'save';
		}

		$saved = parent::save($key, $urlVar);

		// This is not needed since parent save already does this
		// Due to the ref and refid implementation we need to add this
		if ($canReturn)
		{
			$redirect = base64_decode($return);

			// Redirect to the return value.
			$this->setRedirect(
				JRoute::_(
					$redirect, false
				)
			);
		}
		elseif ($this->refid && $this->ref)
		{
			$redirect = '&view=' . (string)$this->ref .
'&layout=edit&id=' . (int)$this->refid;

			// Redirect to the item screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		elseif ($this->ref)
		{
			$redirect = '&view=' . (string)$this->ref;

			// Redirect to the list screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		return $saved;
	}

	/**
	 * Function that allows child controller access to model data
	 * after the data has been saved.
	 *
	 * @param   JModel  &$model     The data model object.
	 * @param   array   $validData  The validated data.
	 *
	 * @return  void
	 *
	 * @since   11.1
	 */
	protected function postSaveHook(JModelLegacy $model, $validData = array())
	{
		return;
	}

}
PK4~�[7�2��controllers/reserves.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		reserves.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Utilities\ArrayHelper;

/**
 * Reserves Controller
 */
class ReservationControllerReserves extends JControllerAdmin
{
	/**
	 * The prefix to use with controller messages.
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $text_prefix = 'COM_RESERVATION_RESERVES';

	/**
	 * Method to get a model object, loading it if required.
	 *
	 * @param   string  $name    The model name. Optional.
	 * @param   string  $prefix  The class prefix. Optional.
	 * @param   array   $config  Configuration array for model. Optional.
	 *
	 * @return  JModelLegacy  The model.
	 *
	 * @since   1.6
	 */
	public function getModel($name = 'Reserve', $prefix =
'ReservationModel', $config = array('ignore_request'
=> true))
	{
		return parent::getModel($name, $prefix, $config);
	}

	public function exportData()
	{
		// Check for request forgeries
		JSession::checkToken() or die(JText::_('JINVALID_TOKEN'));
		// check if export is allowed for this user.
		$user = JFactory::getUser();
		if ($user->authorise('reserve.export',
'com_reservation') &&
$user->authorise('core.export', 'com_reservation'))
		{
			// Get the input
			$input = JFactory::getApplication()->input;
			$pks = $input->post->get('cid', array(),
'array');
			// Sanitize the input
			$pks = ArrayHelper::toInteger($pks);
			// Get the model
			$model = $this->getModel('Reserves');
			// get the data to export
			$data = $model->getExportData($pks);
			if (ReservationHelper::checkArray($data))
			{
				// now set the data to the spreadsheet
				$date = JFactory::getDate();
				ReservationHelper::xls($data,'Reserves_'.$date->format('jS_F_Y'),'Reserves
exported ('.$date->format('jS F,
Y').')','reserves');
			}
		}
		// Redirect to the list screen with error.
		$message = JText::_('COM_RESERVATION_EXPORT_FAILED');
		$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=reserves',
false), $message, 'error');
		return;
	}


	public function importData()
	{
		// Check for request forgeries
		JSession::checkToken() or die(JText::_('JINVALID_TOKEN'));
		// check if import is allowed for this user.
		$user = JFactory::getUser();
		if ($user->authorise('reserve.import',
'com_reservation') &&
$user->authorise('core.import', 'com_reservation'))
		{
			// Get the import model
			$model = $this->getModel('Reserves');
			// get the headers to import
			$headers = $model->getExImPortHeaders();
			if (ReservationHelper::checkObject($headers))
			{
				// Load headers to session.
				$session = JFactory::getSession();
				$headers = json_encode($headers);
				$session->set('reserve_VDM_IMPORTHEADERS', $headers);
				$session->set('backto_VDM_IMPORT', 'reserves');
				$session->set('dataType_VDM_IMPORTINTO',
'reserve');
				// Redirect to import view.
				$message =
JText::_('COM_RESERVATION_IMPORT_SELECT_FILE_FOR_RESERVES');
				$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=import',
false), $message);
				return;
			}
		}
		// Redirect to the list screen with error.
		$message = JText::_('COM_RESERVATION_IMPORT_FAILED');
		$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=reserves',
false), $message, 'error');
		return;
	}
}
PK4~�[R�C�!!controllers/session.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		session.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Utilities\ArrayHelper;

/**
 * Session Controller
 */
class ReservationControllerSession extends JControllerForm
{
	/**
	 * Current or most recently performed task.
	 *
	 * @var    string
	 * @since  12.2
	 * @note   Replaces _task.
	 */
	protected $task;

	/**
	 * Class constructor.
	 *
	 * @param   array  $config  A named array of configuration variables.
	 *
	 * @since   1.6
	 */
	public function __construct($config = array())
	{
		$this->view_list = 'Sessions'; // safeguard for setting the
return view listing to the main view.
		parent::__construct($config);
	}

        /**
	 * Method override to check if you can add a new record.
	 *
	 * @param   array  $data  An array of input data.
	 *
	 * @return  boolean
	 *
	 * @since   1.6
	 */
	protected function allowAdd($data = array())
	{
		// Get user object.
		$user = JFactory::getUser();
		// Access check.
		$access = $user->authorise('session.access',
'com_reservation');
		if (!$access)
		{
			return false;
		}

		// In the absense of better information, revert to the component
permissions.
		return parent::allowAdd($data);
	}

	/**
	 * Method override to check if you can edit an existing record.
	 *
	 * @param   array   $data  An array of input data.
	 * @param   string  $key   The name of the key for the primary key.
	 *
	 * @return  boolean
	 *
	 * @since   1.6
	 */
	protected function allowEdit($data = array(), $key = 'id')
	{
		// get user object.
		$user = JFactory::getUser();
		// get record id.
		$recordId = (int) isset($data[$key]) ? $data[$key] : 0;


		if ($recordId)
		{
			// The record has been set. Check the record permissions.
			$permission = $user->authorise('core.edit',
'com_reservation.session.' . (int) $recordId);
			if (!$permission)
			{
				if ($user->authorise('core.edit.own',
'com_reservation.session.' . $recordId))
				{
					// Now test the owner is the user.
					$ownerId = (int) isset($data['created_by']) ?
$data['created_by'] : 0;
					if (empty($ownerId))
					{
						// Need to do a lookup from the model.
						$record = $this->getModel()->getItem($recordId);

						if (empty($record))
						{
							return false;
						}
						$ownerId = $record->created_by;
					}

					// If the owner matches 'me' then allow.
					if ($ownerId == $user->id)
					{
						if ($user->authorise('core.edit.own',
'com_reservation'))
						{
							return true;
						}
					}
				}
				return false;
			}
		}
		// Since there is no permission, revert to the component permissions.
		return parent::allowEdit($data, $key);
	}

	/**
	 * Gets the URL arguments to append to an item redirect.
	 *
	 * @param   integer  $recordId  The primary key id for the item.
	 * @param   string   $urlVar    The name of the URL variable for the id.
	 *
	 * @return  string  The arguments to append to the redirect URL.
	 *
	 * @since   1.6
	 */
	protected function getRedirectToItemAppend($recordId = null, $urlVar =
'id')
	{
		// get the referral options (old method use return instead see parent)
		$ref = $this->input->get('ref', 0, 'string');
		$refid = $this->input->get('refid', 0, 'int');

		// get redirect info.
		$append = parent::getRedirectToItemAppend($recordId, $urlVar);

		// set the referral options
		if ($refid && $ref)
                {
			$append = '&ref=' . (string)$ref .
'&refid='. (int)$refid . $append;
		}
		elseif ($ref)
		{
			$append = '&ref='. (string)$ref . $append;
		}

		return $append;
	}

	/**
	 * Method to run batch operations.
	 *
	 * @param   object  $model  The model.
	 *
	 * @return  boolean   True if successful, false otherwise and internal
error is set.
	 *
	 * @since   2.5
	 */
	public function batch($model = null)
	{
		JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN'));

		// Set the model
		$model = $this->getModel('Session', '', array());

		// Preset the redirect
		$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=sessions'
. $this->getRedirectToListAppend(), false));

		return parent::batch($model);
	}

	/**
	 * Method to cancel an edit.
	 *
	 * @param   string  $key  The name of the primary key of the URL variable.
	 *
	 * @return  boolean  True if access level checks pass, false otherwise.
	 *
	 * @since   12.2
	 */
	public function cancel($key = null)
	{
		// get the referral options
		$this->ref = $this->input->get('ref', 0,
'word');
		$this->refid = $this->input->get('refid', 0,
'int');

		// Check if there is a return value
		$return = $this->input->get('return', null,
'base64');

		$cancel = parent::cancel($key);

		if (!is_null($return) &&
JUri::isInternal(base64_decode($return)))
		{
			$redirect = base64_decode($return);

			// Redirect to the return value.
			$this->setRedirect(
				JRoute::_(
					$redirect, false
				)
			);
		}
		elseif ($this->refid && $this->ref)
		{
			$redirect = '&view=' . (string)$this->ref .
'&layout=edit&id=' . (int)$this->refid;

			// Redirect to the item screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		elseif ($this->ref)
		{
			$redirect = '&view='.(string)$this->ref;

			// Redirect to the list screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		return $cancel;
	}

	/**
	 * Method to save a record.
	 *
	 * @param   string  $key     The name of the primary key of the URL
variable.
	 * @param   string  $urlVar  The name of the URL variable if different
from the primary key (sometimes required to avoid router collisions).
	 *
	 * @return  boolean  True if successful, false otherwise.
	 *
	 * @since   12.2
	 */
	public function save($key = null, $urlVar = null)
	{
		// get the referral options
		$this->ref = $this->input->get('ref', 0,
'word');
		$this->refid = $this->input->get('refid', 0,
'int');

		// Check if there is a return value
		$return = $this->input->get('return', null,
'base64');
		$canReturn = (!is_null($return) &&
JUri::isInternal(base64_decode($return)));

		if ($this->ref || $this->refid || $canReturn)
		{
			// to make sure the item is checkedin on redirect
			$this->task = 'save';
		}

		$saved = parent::save($key, $urlVar);

		// This is not needed since parent save already does this
		// Due to the ref and refid implementation we need to add this
		if ($canReturn)
		{
			$redirect = base64_decode($return);

			// Redirect to the return value.
			$this->setRedirect(
				JRoute::_(
					$redirect, false
				)
			);
		}
		elseif ($this->refid && $this->ref)
		{
			$redirect = '&view=' . (string)$this->ref .
'&layout=edit&id=' . (int)$this->refid;

			// Redirect to the item screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		elseif ($this->ref)
		{
			$redirect = '&view=' . (string)$this->ref;

			// Redirect to the list screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		return $saved;
	}

	/**
	 * Function that allows child controller access to model data
	 * after the data has been saved.
	 *
	 * @param   JModel  &$model     The data model object.
	 * @param   array   $validData  The validated data.
	 *
	 * @return  void
	 *
	 * @since   11.1
	 */
	protected function postSaveHook(JModelLegacy $model, $validData = array())
	{
		return;
	}

}
PK4~�[�1���controllers/sessions.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		sessions.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Utilities\ArrayHelper;

/**
 * Sessions Controller
 */
class ReservationControllerSessions extends JControllerAdmin
{
	/**
	 * The prefix to use with controller messages.
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $text_prefix = 'COM_RESERVATION_SESSIONS';

	/**
	 * Method to get a model object, loading it if required.
	 *
	 * @param   string  $name    The model name. Optional.
	 * @param   string  $prefix  The class prefix. Optional.
	 * @param   array   $config  Configuration array for model. Optional.
	 *
	 * @return  JModelLegacy  The model.
	 *
	 * @since   1.6
	 */
	public function getModel($name = 'Session', $prefix =
'ReservationModel', $config = array('ignore_request'
=> true))
	{
		return parent::getModel($name, $prefix, $config);
	}

	public function exportData()
	{
		// Check for request forgeries
		JSession::checkToken() or die(JText::_('JINVALID_TOKEN'));
		// check if export is allowed for this user.
		$user = JFactory::getUser();
		if ($user->authorise('session.export',
'com_reservation') &&
$user->authorise('core.export', 'com_reservation'))
		{
			// Get the input
			$input = JFactory::getApplication()->input;
			$pks = $input->post->get('cid', array(),
'array');
			// Sanitize the input
			$pks = ArrayHelper::toInteger($pks);
			// Get the model
			$model = $this->getModel('Sessions');
			// get the data to export
			$data = $model->getExportData($pks);
			if (ReservationHelper::checkArray($data))
			{
				// now set the data to the spreadsheet
				$date = JFactory::getDate();
				ReservationHelper::xls($data,'Sessions_'.$date->format('jS_F_Y'),'Sessions
exported ('.$date->format('jS F,
Y').')','sessions');
			}
		}
		// Redirect to the list screen with error.
		$message = JText::_('COM_RESERVATION_EXPORT_FAILED');
		$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=sessions',
false), $message, 'error');
		return;
	}


	public function importData()
	{
		// Check for request forgeries
		JSession::checkToken() or die(JText::_('JINVALID_TOKEN'));
		// check if import is allowed for this user.
		$user = JFactory::getUser();
		if ($user->authorise('session.import',
'com_reservation') &&
$user->authorise('core.import', 'com_reservation'))
		{
			// Get the import model
			$model = $this->getModel('Sessions');
			// get the headers to import
			$headers = $model->getExImPortHeaders();
			if (ReservationHelper::checkObject($headers))
			{
				// Load headers to session.
				$session = JFactory::getSession();
				$headers = json_encode($headers);
				$session->set('session_VDM_IMPORTHEADERS', $headers);
				$session->set('backto_VDM_IMPORT', 'sessions');
				$session->set('dataType_VDM_IMPORTINTO',
'session');
				// Redirect to import view.
				$message =
JText::_('COM_RESERVATION_IMPORT_SELECT_FILE_FOR_SESSIONS');
				$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=import',
false), $message);
				return;
			}
		}
		// Redirect to the list screen with error.
		$message = JText::_('COM_RESERVATION_IMPORT_FAILED');
		$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=sessions',
false), $message, 'error');
		return;
	}
}
PK4~�[��X�!!controllers/sick.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		sick.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Utilities\ArrayHelper;

/**
 * Sick Controller
 */
class ReservationControllerSick extends JControllerForm
{
	/**
	 * Current or most recently performed task.
	 *
	 * @var    string
	 * @since  12.2
	 * @note   Replaces _task.
	 */
	protected $task;

	/**
	 * Class constructor.
	 *
	 * @param   array  $config  A named array of configuration variables.
	 *
	 * @since   1.6
	 */
	public function __construct($config = array())
	{
		$this->view_list = 'Sicks'; // safeguard for setting the
return view listing to the main view.
		parent::__construct($config);
	}

        /**
	 * Method override to check if you can add a new record.
	 *
	 * @param   array  $data  An array of input data.
	 *
	 * @return  boolean
	 *
	 * @since   1.6
	 */
	protected function allowAdd($data = array())
	{
		// Get user object.
		$user = JFactory::getUser();
		// Access check.
		$access = $user->authorise('sick.access',
'com_reservation');
		if (!$access)
		{
			return false;
		}

		// In the absense of better information, revert to the component
permissions.
		return parent::allowAdd($data);
	}

	/**
	 * Method override to check if you can edit an existing record.
	 *
	 * @param   array   $data  An array of input data.
	 * @param   string  $key   The name of the key for the primary key.
	 *
	 * @return  boolean
	 *
	 * @since   1.6
	 */
	protected function allowEdit($data = array(), $key = 'id')
	{
		// get user object.
		$user = JFactory::getUser();
		// get record id.
		$recordId = (int) isset($data[$key]) ? $data[$key] : 0;


		if ($recordId)
		{
			// The record has been set. Check the record permissions.
			$permission = $user->authorise('core.edit',
'com_reservation.sick.' . (int) $recordId);
			if (!$permission)
			{
				if ($user->authorise('core.edit.own',
'com_reservation.sick.' . $recordId))
				{
					// Now test the owner is the user.
					$ownerId = (int) isset($data['created_by']) ?
$data['created_by'] : 0;
					if (empty($ownerId))
					{
						// Need to do a lookup from the model.
						$record = $this->getModel()->getItem($recordId);

						if (empty($record))
						{
							return false;
						}
						$ownerId = $record->created_by;
					}

					// If the owner matches 'me' then allow.
					if ($ownerId == $user->id)
					{
						if ($user->authorise('core.edit.own',
'com_reservation'))
						{
							return true;
						}
					}
				}
				return false;
			}
		}
		// Since there is no permission, revert to the component permissions.
		return parent::allowEdit($data, $key);
	}

	/**
	 * Gets the URL arguments to append to an item redirect.
	 *
	 * @param   integer  $recordId  The primary key id for the item.
	 * @param   string   $urlVar    The name of the URL variable for the id.
	 *
	 * @return  string  The arguments to append to the redirect URL.
	 *
	 * @since   1.6
	 */
	protected function getRedirectToItemAppend($recordId = null, $urlVar =
'id')
	{
		// get the referral options (old method use return instead see parent)
		$ref = $this->input->get('ref', 0, 'string');
		$refid = $this->input->get('refid', 0, 'int');

		// get redirect info.
		$append = parent::getRedirectToItemAppend($recordId, $urlVar);

		// set the referral options
		if ($refid && $ref)
                {
			$append = '&ref=' . (string)$ref .
'&refid='. (int)$refid . $append;
		}
		elseif ($ref)
		{
			$append = '&ref='. (string)$ref . $append;
		}

		return $append;
	}

	/**
	 * Method to run batch operations.
	 *
	 * @param   object  $model  The model.
	 *
	 * @return  boolean   True if successful, false otherwise and internal
error is set.
	 *
	 * @since   2.5
	 */
	public function batch($model = null)
	{
		JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN'));

		// Set the model
		$model = $this->getModel('Sick', '', array());

		// Preset the redirect
		$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=sicks'
. $this->getRedirectToListAppend(), false));

		return parent::batch($model);
	}

	/**
	 * Method to cancel an edit.
	 *
	 * @param   string  $key  The name of the primary key of the URL variable.
	 *
	 * @return  boolean  True if access level checks pass, false otherwise.
	 *
	 * @since   12.2
	 */
	public function cancel($key = null)
	{
		// get the referral options
		$this->ref = $this->input->get('ref', 0,
'word');
		$this->refid = $this->input->get('refid', 0,
'int');

		// Check if there is a return value
		$return = $this->input->get('return', null,
'base64');

		$cancel = parent::cancel($key);

		if (!is_null($return) &&
JUri::isInternal(base64_decode($return)))
		{
			$redirect = base64_decode($return);

			// Redirect to the return value.
			$this->setRedirect(
				JRoute::_(
					$redirect, false
				)
			);
		}
		elseif ($this->refid && $this->ref)
		{
			$redirect = '&view=' . (string)$this->ref .
'&layout=edit&id=' . (int)$this->refid;

			// Redirect to the item screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		elseif ($this->ref)
		{
			$redirect = '&view='.(string)$this->ref;

			// Redirect to the list screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		return $cancel;
	}

	/**
	 * Method to save a record.
	 *
	 * @param   string  $key     The name of the primary key of the URL
variable.
	 * @param   string  $urlVar  The name of the URL variable if different
from the primary key (sometimes required to avoid router collisions).
	 *
	 * @return  boolean  True if successful, false otherwise.
	 *
	 * @since   12.2
	 */
	public function save($key = null, $urlVar = null)
	{
		// get the referral options
		$this->ref = $this->input->get('ref', 0,
'word');
		$this->refid = $this->input->get('refid', 0,
'int');

		// Check if there is a return value
		$return = $this->input->get('return', null,
'base64');
		$canReturn = (!is_null($return) &&
JUri::isInternal(base64_decode($return)));

		if ($this->ref || $this->refid || $canReturn)
		{
			// to make sure the item is checkedin on redirect
			$this->task = 'save';
		}

		$saved = parent::save($key, $urlVar);

		// This is not needed since parent save already does this
		// Due to the ref and refid implementation we need to add this
		if ($canReturn)
		{
			$redirect = base64_decode($return);

			// Redirect to the return value.
			$this->setRedirect(
				JRoute::_(
					$redirect, false
				)
			);
		}
		elseif ($this->refid && $this->ref)
		{
			$redirect = '&view=' . (string)$this->ref .
'&layout=edit&id=' . (int)$this->refid;

			// Redirect to the item screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		elseif ($this->ref)
		{
			$redirect = '&view=' . (string)$this->ref;

			// Redirect to the list screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . $redirect, false
				)
			);
		}
		return $saved;
	}

	/**
	 * Function that allows child controller access to model data
	 * after the data has been saved.
	 *
	 * @param   JModel  &$model     The data model object.
	 * @param   array   $validData  The validated data.
	 *
	 * @return  void
	 *
	 * @since   11.1
	 */
	protected function postSaveHook(JModelLegacy $model, $validData = array())
	{
		return;
	}

}
PK4~�[���̚�controllers/sicks.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		sicks.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Utilities\ArrayHelper;

/**
 * Sicks Controller
 */
class ReservationControllerSicks extends JControllerAdmin
{
	/**
	 * The prefix to use with controller messages.
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $text_prefix = 'COM_RESERVATION_SICKS';

	/**
	 * Method to get a model object, loading it if required.
	 *
	 * @param   string  $name    The model name. Optional.
	 * @param   string  $prefix  The class prefix. Optional.
	 * @param   array   $config  Configuration array for model. Optional.
	 *
	 * @return  JModelLegacy  The model.
	 *
	 * @since   1.6
	 */
	public function getModel($name = 'Sick', $prefix =
'ReservationModel', $config = array('ignore_request'
=> true))
	{
		return parent::getModel($name, $prefix, $config);
	}

	public function exportData()
	{
		// Check for request forgeries
		JSession::checkToken() or die(JText::_('JINVALID_TOKEN'));
		// check if export is allowed for this user.
		$user = JFactory::getUser();
		if ($user->authorise('sick.export',
'com_reservation') &&
$user->authorise('core.export', 'com_reservation'))
		{
			// Get the input
			$input = JFactory::getApplication()->input;
			$pks = $input->post->get('cid', array(),
'array');
			// Sanitize the input
			$pks = ArrayHelper::toInteger($pks);
			// Get the model
			$model = $this->getModel('Sicks');
			// get the data to export
			$data = $model->getExportData($pks);
			if (ReservationHelper::checkArray($data))
			{
				// now set the data to the spreadsheet
				$date = JFactory::getDate();
				ReservationHelper::xls($data,'Sicks_'.$date->format('jS_F_Y'),'Sicks
exported ('.$date->format('jS F,
Y').')','sicks');
			}
		}
		// Redirect to the list screen with error.
		$message = JText::_('COM_RESERVATION_EXPORT_FAILED');
		$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=sicks',
false), $message, 'error');
		return;
	}


	public function importData()
	{
		// Check for request forgeries
		JSession::checkToken() or die(JText::_('JINVALID_TOKEN'));
		// check if import is allowed for this user.
		$user = JFactory::getUser();
		if ($user->authorise('sick.import',
'com_reservation') &&
$user->authorise('core.import', 'com_reservation'))
		{
			// Get the import model
			$model = $this->getModel('Sicks');
			// get the headers to import
			$headers = $model->getExImPortHeaders();
			if (ReservationHelper::checkObject($headers))
			{
				// Load headers to session.
				$session = JFactory::getSession();
				$headers = json_encode($headers);
				$session->set('sick_VDM_IMPORTHEADERS', $headers);
				$session->set('backto_VDM_IMPORT', 'sicks');
				$session->set('dataType_VDM_IMPORTINTO',
'sick');
				// Redirect to import view.
				$message =
JText::_('COM_RESERVATION_IMPORT_SELECT_FILE_FOR_SICKS');
				$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=import',
false), $message);
				return;
			}
		}
		// Redirect to the list screen with error.
		$message = JText::_('COM_RESERVATION_IMPORT_FAILED');
		$this->setRedirect(JRoute::_('index.php?option=com_reservation&view=sicks',
false), $message, 'error');
		return;
	}
}
PK4~�[���s��helpers/headercheck.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		headercheck.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

class reservationHeaderCheck
{
	function js_loaded($script_name)
	{
		// UIkit check point
		if (strpos($script_name,'uikit') !== false)
		{
			$app            	= JFactory::getApplication();
			$getTemplateName  	=
$app->getTemplate('template')->template;
			
			if (strpos($getTemplateName,'yoo') !== false)
			{
				return true;
			}
		}
		
		$document 	= JFactory::getDocument();
		$head_data 	= $document->getHeadData();
		foreach (array_keys($head_data['scripts']) as $script)
		{
			if (stristr($script, $script_name))
			{
				return true;
			}
		}

		return false;
	}
	
	function css_loaded($script_name)
	{
		// UIkit check point
		if (strpos($script_name,'uikit') !== false)
		{
			$app            	= JFactory::getApplication();
			$getTemplateName  	=
$app->getTemplate('template')->template;
			
			if (strpos($getTemplateName,'yoo') !== false)
			{
				return true;
			}
		}
		
		$document 	= JFactory::getDocument();
		$head_data 	= $document->getHeadData();
		
		foreach (array_keys($head_data['styleSheets']) as $script)
		{
			if (stristr($script, $script_name))
			{
				return true;
			}
		}

		return false;
	}
}PK4~�[��HJ
J
helpers/html/batch_.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		batch_.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('JPATH_PLATFORM') or die;

/**
 * Utility class to render a list view batch selection options
 *
 * @since  3.0
 */
abstract class JHtmlBatch_
{
	/**
	 * ListSelection
	 *
	 * @var    array
	 * @since  3.0
	 */
	protected static $ListSelection = array();

	/**
	 * Render the batch selection options.
	 *
	 * @return  string  The necessary HTML to display the batch selection
options
	 *
	 * @since   3.0
	 */
	public static function render()
	{
		// Collect display data
		$data                 = new stdClass;
		$data->ListSelection  = static::getListSelection();

		// Create a layout object and ask it to render the batch selection
options
		$layout    = new JLayoutFile('batchselection');
		$batchHtml = $layout->render($data);

		return $batchHtml;
	}

	/**
	 * Method to add a list selection to the batch modal
	 *
	 * @param   string  $label      Label for the menu item.
	 * @param   string  $name       Name for the filter. Also used as id.
	 * @param   string  $options    Options for the select field.
	 * @param   bool    $noDefault  Don't the label as the empty option
	 *
	 * @return  void
	 *
	 * @since   3.0
	 */
	public static function addListSelection($label, $name, $options,
$noDefault = false)
	{
		array_push(static::$ListSelection, array('label' => $label,
'name' => $name, 'options' => $options,
'noDefault' => $noDefault));
	}

	/**
	 * Returns an array of all ListSelection
	 *
	 * @return  array
	 *
	 * @since   3.0
	 */
	public static function getListSelection()
	{
		return static::$ListSelection;
	}
}
PK4~�[�#o,,helpers/html/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK4~�[�#o,,helpers/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK4~�[��j���helpers/reservation.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		reservation.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Filesystem\File;
use Joomla\CMS\Language\Language;
use Joomla\Registry\Registry;
use Joomla\String\StringHelper;
use Joomla\Utilities\ArrayHelper;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

/**
 * Reservation component helper.
 */
abstract class ReservationHelper
{
	/**
	 * Composer Switch
	 * 
	 * @var      array
	 */
	protected static $composer = array();

	/**
	 * The Main Active Language
	 * 
	 * @var      string
	 */
	public static $langTag;

/***[JCBGUI.joomla_component.php_helper_both.28.$$$$]***/
 public static function getConsultant($coid= null, $userid= null)
    {
        $db = JFactory::getDbo();
        $query = $db->getQuery(true);

        $query->select('*, co.id as id');
       
$query->from($db->quoteName('#__reservation_consultant',
'co'));
       
$query->join('inner',$db->quoteName('#__users',
'u'). ' on '.
$db->quoteName('co.userid').' = '.
$db->quoteName('u.id'));
       
$query->join('inner',$db->quoteName('#__categories',
'c'). ' on '.
$db->quoteName('c.id').' = '.
$db->quoteName('co.catid'));
        if ($coid)
           
$query->where($db->quoteName('co.id').'='.$db->quote($coid));
        elseif ($userid)
           
$query->where($db->quoteName('u.id').'='.$db->quote($userid));

        $db->setQuery($query);
        $result = $db->loadObject();
        return $result;
    }
    public static function setExpireTime()
    {
        $app= JFactory::getApplication();
        date_default_timezone_set('asia/tehran');
        $expire= date("M d, Y  H:i:s", strtotime(date("M d,
Y  H:i:s"))+(3*60));
        $app->setUserState('expire',$expire );
        JFactory::getDocument()->addScriptOptions('expire',
$expire);
    }
    public static function setVerifyCode()
    {
        $app= JFactory::getApplication();
        $verify= rand(1000, 9999);
        $app->setUserState('verify',$verify );
        return $verify;
    }/***[/JCBGUI$$$$]***/


	/**
	 * Load the Composer Vendors
	 */
	public static function composerAutoload($target)
	{
		// insure we load the composer vendor only once
		if (!isset(self::$composer[$target]))
		{
			// get the function name
			$functionName = self::safeString('compose' . $target);
			// check if method exist
			if (method_exists(__CLASS__, $functionName))
			{
				return self::{$functionName}();
			}
			return false;
		}
		return self::$composer[$target];
	}

	/**
	 * Load the Component xml manifest.
	 */
	public static function manifest()
	{
		$manifestUrl =
JPATH_ADMINISTRATOR."/components/com_reservation/reservation.xml";
		return simplexml_load_file($manifestUrl);
	}

	/**
	 * Joomla version object
	 */	
	protected static $JVersion;

	/**
	 * set/get Joomla version
	 */
	public static function jVersion()
	{
		// check if set
		if (!self::checkObject(self::$JVersion))
		{
			self::$JVersion = new JVersion();
		}
		return self::$JVersion;
	}

	/**
	 * Load the Contributors details.
	 */
	public static function getContributors()
	{
		// get params
		$params	= JComponentHelper::getParams('com_reservation');
		// start contributors array
		$contributors = array();
		// get all Contributors (max 20)
		$searchArray = range('0','20');
		foreach($searchArray as $nr)
 		{
			if ((NULL !== $params->get("showContributor".$nr))
&& ($params->get("showContributor".$nr) == 1 ||
$params->get("showContributor".$nr) == 3))
			{
				// set link based of selected option
				if($params->get("useContributor".$nr) == 1)
         		{
					$link_front = '<a
href="mailto:'.$params->get("emailContributor".$nr).'"
target="_blank">';
					$link_back = '</a>';
				}
				elseif($params->get("useContributor".$nr) == 2)
				{
					$link_front = '<a
href="'.$params->get("linkContributor".$nr).'"
target="_blank">';
					$link_back = '</a>';
				}
				else
				{
					$link_front = '';
					$link_back = '';
				}
				$contributors[$nr]['title']	=
self::htmlEscape($params->get("titleContributor".$nr));
				$contributors[$nr]['name']	=
$link_front.self::htmlEscape($params->get("nameContributor".$nr)).$link_back;
			}
		}
		return $contributors;
	}

	/**
	 *	Can be used to build help urls.
	 **/
	public static function getHelpUrl($view)
	{
		return false;
	}

	/**
	 * Configure the Linkbar.
	 */
	public static function addSubmenu($submenu)
	{
		// load user for access menus
		$user = JFactory::getUser();
		// load the submenus to sidebar
		JHtmlSidebar::addEntry(JText::_('COM_RESERVATION_SUBMENU_DASHBOARD'),
'index.php?option=com_reservation&view=reservation', $submenu
=== 'reservation');
		if ($user->authorise('reserve.access',
'com_reservation') &&
$user->authorise('reserve.submenu',
'com_reservation'))
		{
			JHtmlSidebar::addEntry(JText::_('COM_RESERVATION_SUBMENU_RESERVES'),
'index.php?option=com_reservation&view=reserves', $submenu
=== 'reserves');
		}
		if ($user->authorise('bbbclass.access',
'com_reservation') &&
$user->authorise('bbbclass.submenu',
'com_reservation'))
		{
			JHtmlSidebar::addEntry(JText::_('COM_RESERVATION_SUBMENU_BBBCLASSES'),
'index.php?option=com_reservation&view=bbbclasses', $submenu
=== 'bbbclasses');
		}
		if ($user->authorise('doctor.access',
'com_reservation') &&
$user->authorise('doctor.submenu',
'com_reservation'))
		{
			JHtmlSidebar::addEntry(JText::_('COM_RESERVATION_SUBMENU_DOCTORS'),
'index.php?option=com_reservation&view=doctors', $submenu ===
'doctors');
			JHtmlSidebar::addEntry(JText::_('COM_RESERVATION_DOCTOR_DOCTORS_CATEGORIES'),
'index.php?option=com_categories&view=categories&extension=com_reservation',
$submenu === 'categories');
		}
		if ($user->authorise('appointment.access',
'com_reservation') &&
$user->authorise('appointment.submenu',
'com_reservation'))
		{
			JHtmlSidebar::addEntry(JText::_('COM_RESERVATION_SUBMENU_APPOINTMENTS'),
'index.php?option=com_reservation&view=appointments',
$submenu === 'appointments');
		}
		if ($user->authorise('capital.access',
'com_reservation') &&
$user->authorise('capital.submenu',
'com_reservation'))
		{
			JHtmlSidebar::addEntry(JText::_('COM_RESERVATION_SUBMENU_CAPITALS'),
'index.php?option=com_reservation&view=capitals', $submenu
=== 'capitals');
		}
		if ($user->authorise('comment.access',
'com_reservation') &&
$user->authorise('comment.submenu',
'com_reservation'))
		{
			JHtmlSidebar::addEntry(JText::_('COM_RESERVATION_SUBMENU_COMMENTS'),
'index.php?option=com_reservation&view=comments', $submenu
=== 'comments');
		}
		if ($user->authorise('session.access',
'com_reservation') &&
$user->authorise('session.submenu',
'com_reservation'))
		{
			JHtmlSidebar::addEntry(JText::_('COM_RESERVATION_SUBMENU_SESSIONS'),
'index.php?option=com_reservation&view=sessions', $submenu
=== 'sessions');
		}
		if ($user->authorise('sick.access',
'com_reservation') &&
$user->authorise('sick.submenu', 'com_reservation'))
		{
			JHtmlSidebar::addEntry(JText::_('COM_RESERVATION_SUBMENU_SICKS'),
'index.php?option=com_reservation&view=sicks', $submenu ===
'sicks');
		}
		if ($user->authorise('plan.access',
'com_reservation') &&
$user->authorise('plan.submenu', 'com_reservation'))
		{
			JHtmlSidebar::addEntry(JText::_('COM_RESERVATION_SUBMENU_PLANS'),
'index.php?option=com_reservation&view=plans', $submenu ===
'plans');
		}
		if ($user->authorise('consultant.access',
'com_reservation') &&
$user->authorise('consultant.submenu',
'com_reservation'))
		{
			JHtmlSidebar::addEntry(JText::_('COM_RESERVATION_SUBMENU_CONSULTANTS'),
'index.php?option=com_reservation&view=consultants', $submenu
=== 'consultants');
			JHtmlSidebar::addEntry(JText::_('COM_RESERVATION_CONSULTANT_CONSULTANTS_CATEGORIES'),
'index.php?option=com_categories&view=categories&extension=com_reservation',
$submenu === 'categories');
		}
		if ($user->authorise('message.access',
'com_reservation') &&
$user->authorise('message.submenu',
'com_reservation'))
		{
			JHtmlSidebar::addEntry(JText::_('COM_RESERVATION_SUBMENU_MESSAGES'),
'index.php?option=com_reservation&view=messages', $submenu
=== 'messages');
		}
	}

	/**
	* Prepares the xml document
	*/
	public static function xls($rows, $fileName = null, $title = null,
$subjectTab = null, $creator = 'fdsh', $description = null,
$category = null,$keywords = null, $modified = null)
	{
		// set the user
		$user = JFactory::getUser();
		// set fileName if not set
		if (!$fileName)
		{
			$fileName =
'exported_'.JFactory::getDate()->format('jS_F_Y');
		}
		// set modified if not set
		if (!$modified)
		{
			$modified = $user->name;
		}
		// set title if not set
		if (!$title)
		{
			$title = 'Book1';
		}
		// set tab name if not set
		if (!$subjectTab)
		{
			$subjectTab = 'Sheet1';
		}

		// make sure we have the composer classes loaded
		self::composerAutoload('phpspreadsheet');

		// Create new Spreadsheet object
		$spreadsheet = new Spreadsheet();

		// Set document properties
		$spreadsheet->getProperties()
			->setCreator($creator)
			->setCompany('fdsh')
			->setLastModifiedBy($modified)
			->setTitle($title)
			->setSubject($subjectTab);
		// The file type
		$file_type = 'Xls';
		// set description
		if ($description)
		{
			$spreadsheet->getProperties()->setDescription($description);
		}
		// set keywords
		if ($keywords)
		{
			$spreadsheet->getProperties()->setKeywords($keywords);
		}
		// set category
		if ($category)
		{
			$spreadsheet->getProperties()->setCategory($category);
		}

		// Some styles
		$headerStyles = array(
			'font'  => array(
				'bold'  => true,
				'color' => array('rgb' =>
'1171A3'),
				'size'  => 12,
				'name'  => 'Verdana'
		));
		$sideStyles = array(
			'font'  => array(
				'bold'  => true,
				'color' => array('rgb' =>
'444444'),
				'size'  => 11,
				'name'  => 'Verdana'
		));
		$normalStyles = array(
			'font'  => array(
				'color' => array('rgb' =>
'444444'),
				'size'  => 11,
				'name'  => 'Verdana'
		));

		// Add some data
		if (($size = self::checkArray($rows)) !== false)
		{
			$i = 1;

			// Based on data size we adapt the behaviour.
			$xls_mode = 1;
			if ($size > 3000)
			{
				$xls_mode = 3;
				$file_type = 'Csv';
			}
			elseif ($size > 2000)
			{
				$xls_mode = 2;
			}

			// Set active sheet and get it.
			$active_sheet = $spreadsheet->setActiveSheetIndex(0);
			foreach ($rows as $array)
			{
				$a = 'A';
				foreach ($array as $value)
				{
					$active_sheet->setCellValue($a.$i, $value);
					if ($xls_mode != 3)
					{
						if ($i == 1)
						{
							$active_sheet->getColumnDimension($a)->setAutoSize(true);
							$active_sheet->getStyle($a.$i)->applyFromArray($headerStyles);
							$active_sheet->getStyle($a.$i)->getAlignment()->setHorizontal(PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
						}
						elseif ($a === 'A')
						{
							$active_sheet->getStyle($a.$i)->applyFromArray($sideStyles);
						}
						elseif ($xls_mode == 1)
						{
							$active_sheet->getStyle($a.$i)->applyFromArray($normalStyles);
						}
					}
					$a++;
				}
				$i++;
			}
		}
		else
		{
			return false;
		}

		// Rename worksheet
		$spreadsheet->getActiveSheet()->setTitle($subjectTab);

		// Set active sheet index to the first sheet, so Excel opens this as the
first sheet
		$spreadsheet->setActiveSheetIndex(0);

		// Redirect output to a client's web browser (Excel5)
		header('Content-Type: application/vnd.ms-excel');
		header('Content-Disposition: attachment;filename="' .
$fileName . '.' . strtolower($file_type) .'"');
		header('Cache-Control: max-age=0');
		// If you're serving to IE 9, then the following may be needed
		header('Cache-Control: max-age=1');

		// If you're serving to IE over SSL, then the following may be
needed
		header ('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in
the past
		header ('Last-Modified: '.gmdate('D, d M Y
H:i:s').' GMT'); // always modified
		header ('Cache-Control: cache, must-revalidate'); // HTTP/1.1
		header ('Pragma: public'); // HTTP/1.0

		$writer = IOFactory::createWriter($spreadsheet, $file_type);
		$writer->save('php://output');
		jexit();
	}

	/**
	* Get CSV Headers
	*/
	public static function getFileHeaders($dataType)
	{
		// make sure we have the composer classes loaded
		self::composerAutoload('phpspreadsheet');
		// get session object
		$session = JFactory::getSession();
		$package = $session->get('package', null);
		$package = json_decode($package, true);
		// set the headers
		if(isset($package['dir']))
		{
			// only load first three rows
			$chunkFilter = new PhpOffice\PhpSpreadsheet\Reader\chunkReadFilter(2,1);
			// identify the file type
			$inputFileType = IOFactory::identify($package['dir']);
			// create the reader for this file type
			$excelReader = IOFactory::createReader($inputFileType);
			// load the limiting filter
			$excelReader->setReadFilter($chunkFilter);
			$excelReader->setReadDataOnly(true);
			// load the rows (only first three)
			$excelObj = $excelReader->load($package['dir']);
			$headers = array();
			foreach ($excelObj->getActiveSheet()->getRowIterator() as $row)
			{
				if($row->getRowIndex() == 1)
				{
					$cellIterator = $row->getCellIterator();
					$cellIterator->setIterateOnlyExistingCells(false);
					foreach ($cellIterator as $cell)
					{
						if (!is_null($cell))
						{
							$headers[$cell->getColumn()] = $cell->getValue();
						}
					}
					$excelObj->disconnectWorksheets();
					unset($excelObj);
					break;
				}
			}
			return $headers;
		}
		return false;
	}

	/**
	* Load the Composer Vendor phpspreadsheet
	*/
	protected static function composephpspreadsheet()
	{
		// load the autoloader for phpspreadsheet
		require_once JPATH_SITE .
'/libraries/phpspreadsheet/vendor/autoload.php';
		// do not load again
		self::$composer['phpspreadsheet'] = true;

		return  true;
	}

	/**
	 * Get a Variable 
	 *
	 * @param   string   $table        The table from which to get the
variable
	 * @param   string   $where        The value where
	 * @param   string   $whereString  The target/field string where/name
	 * @param   string   $what         The return field
	 * @param   string   $operator     The operator between $whereString/field
and $where/value
	 * @param   string   $main         The component in which the table is
found
	 *
	 * @return  mix string/int/float
	 *
	 */
	public static function getVar($table, $where = null, $whereString =
'user', $what = 'id', $operator = '=', $main
= 'reservation')
	{
		if(!$where)
		{
			$where = JFactory::getUser()->id;
		}
		// Get a db connection.
		$db = JFactory::getDbo();
		// Create a new query object.
		$query = $db->getQuery(true);
		$query->select($db->quoteName(array($what)));
		if (empty($table))
		{
			$query->from($db->quoteName('#__'.$main));
		}
		else
		{
			$query->from($db->quoteName('#__'.$main.'_'.$table));
		}
		if (is_numeric($where))
		{
			$query->where($db->quoteName($whereString) . '
'.$operator.' '.(int) $where);
		}
		elseif (is_string($where))
		{
			$query->where($db->quoteName($whereString) . '
'.$operator.' '. $db->quote((string)$where));
		}
		else
		{
			return false;
		}
		$db->setQuery($query);
		$db->execute();
		if ($db->getNumRows())
		{
			return $db->loadResult();
		}
		return false;
	}

	/**
	 * Get array of variables
	 *
	 * @param   string   $table        The table from which to get the
variables
	 * @param   string   $where        The value where
	 * @param   string   $whereString  The target/field string where/name
	 * @param   string   $what         The return field
	 * @param   string   $operator     The operator between $whereString/field
and $where/value
	 * @param   string   $main         The component in which the table is
found
	 * @param   bool     $unique       The switch to return a unique array
	 *
	 * @return  array
	 *
	 */
	public static function getVars($table, $where = null, $whereString =
'user', $what = 'id', $operator = 'IN', $main
= 'reservation', $unique = true)
	{
		if(!$where)
		{
			$where = JFactory::getUser()->id;
		}

		if (!self::checkArray($where) && $where > 0)
		{
			$where = array($where);
		}

		if (self::checkArray($where))
		{
			// prep main <-- why? well if $main='' is empty then $table
can be categories or users
			if (self::checkString($main))
			{
				$main = '_'.ltrim($main, '_');
			}
			// Get a db connection.
			$db = JFactory::getDbo();
			// Create a new query object.
			$query = $db->getQuery(true);

			$query->select($db->quoteName(array($what)));
			if (empty($table))
			{
				$query->from($db->quoteName('#__'.$main));
			}
			else
			{
				$query->from($db->quoteName('#_'.$main.'_'.$table));
			}
			// add strings to array search
			if ('IN_STRINGS' === $operator || 'NOT IN_STRINGS'
=== $operator)
			{
				$query->where($db->quoteName($whereString) . ' ' .
str_replace('_STRINGS', '', $operator) . '
("' . implode('","',$where) .
'")');
			}
			else
			{
				$query->where($db->quoteName($whereString) . ' ' .
$operator . ' (' . implode(',',$where) .
')');
			}
			$db->setQuery($query);
			$db->execute();
			if ($db->getNumRows())
			{
				if ($unique)
				{
					return array_unique($db->loadColumn());
				}
				return $db->loadColumn();
			}
		}
		return false;
	}

	public static function jsonToString($value, $sperator = ", ",
$table = null, $id = 'id', $name = 'name')
	{
		// do some table foot work
		$external = false;
		if (strpos($table, '#__') !== false)
		{
			$external = true;
			$table = str_replace('#__', '', $table);
		}
		// check if string is JSON
		$result = json_decode($value, true);
		if (json_last_error() === JSON_ERROR_NONE)
		{
			// is JSON
			if (self::checkArray($result))
			{
				if (self::checkString($table))
				{
					$names = array();
					foreach ($result as $val)
					{
						if ($external)
						{
							if ($_name = self::getVar(null, $val, $id, $name, '=',
$table))
							{
								$names[] = $_name;
							}
						}
						else
						{
							if ($_name = self::getVar($table, $val, $id, $name))
							{
								$names[] = $_name;
							}
						}
					}
					if (self::checkArray($names))
					{
						return (string) implode($sperator,$names);
					}	
				}
				return (string) implode($sperator,$result);
			}
			return (string) json_decode($value);
		}
		return $value;
	}

	public static function isPublished($id,$type)
	{
		if ($type == 'raw')
		{
			$type = 'item';
		}
		$db = JFactory::getDbo();
		$query = $db->getQuery(true);
		$query->select(array('a.published'));
		$query->from('#__reservation_'.$type.' AS a');
		$query->where('a.id = '. (int) $id);
		$query->where('a.published = 1');
		$db->setQuery($query);
		$db->execute();
		$found = $db->getNumRows();
		if($found)
		{
			return true;
		}
		return false;
	}

	public static function getGroupName($id)
	{
		$db = JFactory::getDBO();
		$query = $db->getQuery(true);
		$query->select(array('a.title'));
		$query->from('#__usergroups AS a');
		$query->where('a.id = '. (int) $id);
		$db->setQuery($query);
		$db->execute();
		$found = $db->getNumRows();
		if($found)
  		{
			return $db->loadResult();
		}
		return $id;
	}

	/**
	 * Get the action permissions
	 *
	 * @param  string   $view        The related view name
	 * @param  int      $record      The item to act upon
	 * @param  string   $views       The related list view name
	 * @param  mixed    $target      Only get this permission (like edit,
create, delete)
	 * @param  string   $component   The target component
	 * @param  object   $user        The user whose permissions we are loading
	 *
	 * @return  object   The JObject of permission/authorised actions
	 * 
	 */
	public static function getActions($view, &$record = null, $views =
null, $target = null, $component = 'reservation', $user =
'null')
	{
		// load the user if not given
		if (!self::checkObject($user))
		{
			// get the user object
			$user = JFactory::getUser();
		}
		// load the JObject
		$result = new JObject;
		// make view name safe (just incase)
		$view = self::safeString($view);
		if (self::checkString($views))
		{
			$views = self::safeString($views);
 		}
		// get all actions from component
		$actions = JAccess::getActionsFromFile(
			JPATH_ADMINISTRATOR . '/components/com_' . $component .
'/access.xml',
			"/access/section[@name='component']/"
		);
		// if non found then return empty JObject
		if (empty($actions))
		{
			return $result;
		}
		// get created by if not found
		if (self::checkObject($record) && !isset($record->created_by)
&& isset($record->id))
		{
			$record->created_by = self::getVar($view, $record->id,
'id', 'created_by', '=', $component);
		}
		// set actions only set in component settings
		$componentActions = array('core.admin',
'core.manage', 'core.options',
'core.export');
		// check if we have a target
		$checkTarget = false;
		if ($target)
		{
			// convert to an array
			if (self::checkString($target))
			{
				$target = array($target);
			}
			// check if we are good to go
			if (self::checkArray($target))
			{
				$checkTarget = true;
			}
		}
		// loop the actions and set the permissions
		foreach ($actions as $action)
		{
			// check target action filter
			if ($checkTarget && self::filterActions($view, $action->name,
$target))
			{
				continue;
			}
			// set to use component default
			$fallback = true;
			// reset permission per/action
			$permission = false;
			$catpermission = false;
			// set area
			$area = 'comp';
			// check if the record has an ID and the action is item related (not a
component action)
			if (self::checkObject($record) && isset($record->id)
&& $record->id > 0 && !in_array($action->name,
$componentActions) &&
				(strpos($action->name, 'core.') !== false ||
strpos($action->name, $view . '.') !== false))
			{
				// we are in item
				$area = 'item';
				// The record has been set. Check the record permissions.
				$permission = $user->authorise($action->name, 'com_' .
$component . '.' . $view . '.' . (int) $record->id);
				// if no permission found, check edit own
				if (!$permission)
				{
					// With edit, if the created_by matches current user then dig deeper.
					if (($action->name === 'core.edit' || $action->name
=== $view . '.edit') && $record->created_by > 0
&& ($record->created_by == $user->id))
					{
						// the correct target
						$coreCheck = (array) explode('.', $action->name);
						// check that we have both local and global access
						if ($user->authorise($coreCheck[0] . '.edit.own',
'com_' . $component . '.' . $view . '.' .
(int) $record->id) &&
							$user->authorise($coreCheck[0]  . '.edit.own',
'com_' . $component))
						{
							// allow edit
							$result->set($action->name, true);
							// set not to use global default
							// because we already validated it
							$fallback = false;
						}
						else
						{
							// do not allow edit
							$result->set($action->name, false);
							$fallback = false;
						}
					}
				}
				elseif (self::checkString($views) && isset($record->catid)
&& $record->catid > 0)
				{
					// we are in item
					$area = 'category';
					// set the core check
					$coreCheck = explode('.', $action->name);
					$core = $coreCheck[0];
					// make sure we use the core. action check for the categories
					if (strpos($action->name, $view) !== false &&
strpos($action->name, 'core.') === false )
					{
						$coreCheck[0] = 'core';
						$categoryCheck = implode('.', $coreCheck);
					}
					else
					{
						$categoryCheck = $action->name;
					}
					// The record has a category. Check the category permissions.
					$catpermission = $user->authorise($categoryCheck, 'com_'
. $component . '.' . $views . '.category.' . (int)
$record->catid);
					if (!$catpermission && !is_null($catpermission))
					{
						// With edit, if the created_by matches current user then dig deeper.
						if (($action->name === 'core.edit' || $action->name
=== $view . '.edit') && $record->created_by > 0
&& ($record->created_by == $user->id))
						{
							// check that we have both local and global access
							if ($user->authorise('core.edit.own', 'com_'
. $component . '.' . $views . '.category.' . (int)
$record->catid) &&
								$user->authorise($core . '.edit.own', 'com_'
. $component))
							{
								// allow edit
								$result->set($action->name, true);
								// set not to use global default
								// because we already validated it
								$fallback = false;
							}
							else
							{
								// do not allow edit
								$result->set($action->name, false);
								$fallback = false;
							}
						}
					}
				}
			}
			// if allowed then fallback on component global settings
			if ($fallback)
			{
				// if item/category blocks access then don't fall back on global
				if ((($area === 'item') && !$permission) || (($area
=== 'category') && !$catpermission))
				{
					// do not allow
					$result->set($action->name, false);
				}
				// Finally remember the global settings have the final say. (even if
item allow)
				// The local item permissions can block, but it can't open and
override of global permissions.
				// Since items are created by users and global permissions is set by
system admin.
				else
				{
					$result->set($action->name,
$user->authorise($action->name, 'com_' . $component));
				}
			}
		}
		return $result;
	}

	/**
	 * Filter the action permissions
	 *
	 * @param  string   $action   The action to check
	 * @param  array    $targets  The array of target actions
	 *
	 * @return  boolean   true if action should be filtered out
	 * 
	 */
	protected static function filterActions(&$view, &$action,
&$targets)
	{
		foreach ($targets as $target)
		{
			if (strpos($action, $view . '.' . $target) !== false ||
				strpos($action, 'core.' . $target) !== false)
			{
				return false;
				break;
			}
		}
		return true;
	}

	/**
	 * Get any component's model
	 */
	public static function getModel($name, $path =
JPATH_COMPONENT_ADMINISTRATOR, $Component = 'Reservation',
$config = array())
	{
		// fix the name
		$name = self::safeString($name);
		// full path to models
		$fullPathModels = $path . '/models';
		// load the model file
		JModelLegacy::addIncludePath($fullPathModels, $Component .
'Model');
		// make sure the table path is loaded
		if (!isset($config['table_path']) ||
!self::checkString($config['table_path']))
		{
			// This is the JCB default path to tables in Joomla 3.x
			$config['table_path'] = JPATH_ADMINISTRATOR .
'/components/com_' . strtolower($Component) .
'/tables';
		}
		// get instance
		$model = JModelLegacy::getInstance($name, $Component . 'Model',
$config);
		// if model not found (strange)
		if ($model == false)
		{
			jimport('joomla.filesystem.file');
			// get file path
			$filePath = $path . '/' . $name . '.php';
			$fullPathModel = $fullPathModels . '/' . $name .
'.php';
			// check if it exists
			if (File::exists($filePath))
			{
				// get the file
				require_once $filePath;
			}
			elseif (File::exists($fullPathModel))
			{
				// get the file
				require_once $fullPathModel;
			}
			// build class names
			$modelClass = $Component . 'Model' . $name;
			if (class_exists($modelClass))
			{
				// initialize the model
				return new $modelClass($config);
			}
		}
		return $model;
	}

	/**
	 * Add to asset Table
	 */
	public static function setAsset($id, $table, $inherit = true)
	{
		$parent = JTable::getInstance('Asset');
		$parent->loadByName('com_reservation');
		
		$parentId = $parent->id;
		$name     = 'com_reservation.'.$table.'.'.$id;
		$title    = '';

		$asset = JTable::getInstance('Asset');
		$asset->loadByName($name);

		// Check for an error.
		$error = $asset->getError();

		if ($error)
		{
			return false;
		}
		else
		{
			// Specify how a new or moved node asset is inserted into the tree.
			if ($asset->parent_id != $parentId)
			{
				$asset->setLocation($parentId, 'last-child');
			}

			// Prepare the asset to be stored.
			$asset->parent_id = $parentId;
			$asset->name      = $name;
			$asset->title     = $title;
			// get the default asset rules
			$rules = self::getDefaultAssetRules('com_reservation', $table,
$inherit);
			if ($rules instanceof JAccessRules)
			{
				$asset->rules = (string) $rules;
			}

			if (!$asset->check() || !$asset->store())
			{
				JFactory::getApplication()->enqueueMessage($asset->getError(),
'warning');
				return false;
			}
			else
			{
				// Create an asset_id or heal one that is corrupted.
				$object = new stdClass();

				// Must be a valid primary key value.
				$object->id = $id;
				$object->asset_id = (int) $asset->id;

				// Update their asset_id to link to the asset table.
				return
JFactory::getDbo()->updateObject('#__reservation_'.$table,
$object, 'id');
			}
		}
		return false;
	}

	/**
	 * Gets the default asset Rules for a component/view.
	 */
	protected static function getDefaultAssetRules($component, $view, $inherit
= true)
	{
		// if new or inherited
		$assetId = 0;
		// Only get the actual item rules if not inheriting
		if (!$inherit)
		{
			// Need to find the asset id by the name of the component.
			$db = JFactory::getDbo();
			$query = $db->getQuery(true)
				->select($db->quoteName('id'))
				->from($db->quoteName('#__assets'))
				->where($db->quoteName('name') . ' = ' .
$db->quote($component));
			$db->setQuery($query);
			$db->execute();
			// check that there is a value
			if ($db->getNumRows())
			{
				// asset already set so use saved rules
				$assetId = (int) $db->loadResult();
			}
		}
		// get asset rules
		$result =  JAccess::getAssetRules($assetId);
		if ($result instanceof JAccessRules)
		{
			$_result = (string) $result;
			$_result = json_decode($_result);
			foreach ($_result as $name => &$rule)
			{
				$v = explode('.', $name);
				if ($view !== $v[0])
				{
					// remove since it is not part of this view
					unset($_result->$name);
				}
				elseif ($inherit)
				{
					// clear the value since we inherit
					$rule = array();
				}
			}
			// check if there are any view values remaining
			if (count((array) $_result))
			{
				$_result = json_encode($_result);
				$_result = array($_result);
				// Instantiate and return the JAccessRules object for the asset rules.
				$rules = new JAccessRules($_result);
				// return filtered rules
				return $rules;
			}
		}
		return $result;
	}

	/**
	 * xmlAppend
	 *
	 * @param   SimpleXMLElement   $xml      The XML element reference in
which to inject a comment
	 * @param   mixed              $node     A SimpleXMLElement node to append
to the XML element reference, or a stdClass object containing a comment
attribute to be injected before the XML node and a fieldXML attribute
containing a SimpleXMLElement
	 *
	 * @return  null
	 *
	 */
	public static function xmlAppend(&$xml, $node)
	{
		if (!$node)
		{
			// element was not returned
			return;
		}
		switch (get_class($node))
		{
			case 'stdClass':
				if (property_exists($node, 'comment'))
				{
					self::xmlComment($xml, $node->comment);
				}
				if (property_exists($node, 'fieldXML'))
				{
					self::xmlAppend($xml, $node->fieldXML);
				}
				break;
			case 'SimpleXMLElement':
				$domXML = dom_import_simplexml($xml);
				$domNode = dom_import_simplexml($node);
				$domXML->appendChild($domXML->ownerDocument->importNode($domNode,
true));
				$xml = simplexml_import_dom($domXML);
				break;
		}
	}

	/**
	 * xmlComment
	 *
	 * @param   SimpleXMLElement   $xml        The XML element reference in
which to inject a comment
	 * @param   string             $comment    The comment to inject
	 *
	 * @return  null
	 *
	 */
	public static function xmlComment(&$xml, $comment)
	{
		$domXML = dom_import_simplexml($xml);
		$domComment = new DOMComment($comment);
		$nodeTarget = $domXML->ownerDocument->importNode($domComment,
true);
		$domXML->appendChild($nodeTarget);
		$xml = simplexml_import_dom($domXML);
	}

	/**
	 * xmlAddAttributes
	 *
	 * @param   SimpleXMLElement   $xml          The XML element reference in
which to inject a comment
	 * @param   array              $attributes   The attributes to apply to
the XML element
	 *
	 * @return  null
	 *
	 */
	public static function xmlAddAttributes(&$xml, $attributes = array())
	{
		foreach ($attributes as $key => $value)
		{
			$xml->addAttribute($key, $value);
		}
	}

	/**
	 * xmlAddOptions
	 *
	 * @param   SimpleXMLElement   $xml          The XML element reference in
which to inject a comment
	 * @param   array              $options      The options to apply to the
XML element
	 *
	 * @return  void
	 *
	 */
	public static function xmlAddOptions(&$xml, $options = array())
	{
		foreach ($options as $key => $value)
		{
			$addOption = $xml->addChild('option');
			$addOption->addAttribute('value', $key);
			$addOption[] = $value;
		}
	}

	/**
	 * get the field object
	 *
	 * @param   array      $attributes   The array of attributes
	 * @param   string     $default      The default of the field
	 * @param   array      $options      The options to apply to the XML
element
	 *
	 * @return  object
	 *
	 */
	public static function getFieldObject(&$attributes, $default =
'', $options = null)
	{
		// make sure we have attributes and a type value
		if (self::checkArray($attributes) &&
isset($attributes['type']))
		{
			// make sure the form helper class is loaded
			if (!method_exists('JFormHelper', 'loadFieldType'))
			{
				jimport('joomla.form.form');
			}
			// get field type
			$field = JFormHelper::loadFieldType($attributes['type'],
true);
			// get field xml
			$XML = self::getFieldXML($attributes, $options);
			// setup the field
			$field->setup($XML, $default);
			// return the field object
			return $field;
		}
		return false;
	}

	/**
	 * get the field xml
	 *
	 * @param   array      $attributes   The array of attributes
	 * @param   array      $options      The options to apply to the XML
element
	 *
	 * @return  object
	 *
	 */
	public static function getFieldXML(&$attributes, $options = null)
	{
		// make sure we have attributes and a type value
		if (self::checkArray($attributes))
		{
			// start field xml
			$XML = new SimpleXMLElement('<field/>');
			// load the attributes
			self::xmlAddAttributes($XML, $attributes);
			// check if we have options
			if (self::checkArray($options))
			{
				// load the options
				self::xmlAddOptions($XML, $options);
			}
			// return the field xml
			return $XML;
		}
		return false;
	}

	/**
	 * Render Bool Button
	 *
	 * @param   array   $args   All the args for the button
	 *                             0) name
	 *                             1) additional (options class) // not used
at this time
	 *                             2) default
	 *                             3) yes (name)
	 *                             4) no (name)
	 *
	 * @return  string    The input html of the button
	 *
	 */
	public static function renderBoolButton()
	{
		$args = func_get_args();
		// check if there is additional button class
		$additional = isset($args[1]) ? (string) $args[1] : ''; // not
used at this time
		// button attributes
		$buttonAttributes = array(
			'type' => 'radio',
			'name' => isset($args[0]) ? self::htmlEscape($args[0]) :
'bool_button',
			'label' => isset($args[0]) ?
self::safeString(self::htmlEscape($args[0]), 'Ww') : 'Bool
Button', // not seen anyway
			'class' => 'btn-group',
			'filter' => 'INT',
			'default' => isset($args[2]) ? (int) $args[2] : 0);
		// set the button options
		$buttonOptions = array(
			'1' => isset($args[3]) ? self::htmlEscape($args[3]) :
'JYES',
			'0' => isset($args[4]) ? self::htmlEscape($args[4]) :
'JNO');
		// return the input
		return self::getFieldObject($buttonAttributes,
$buttonAttributes['default'], $buttonOptions)->input;
	}

	/**
	 * Check if have an json string
	 *
	 * @input	string   The json string to check
	 *
	 * @returns bool true on success
	 */
	public static function checkJson($string)
	{
		if (self::checkString($string))
		{
			json_decode($string);
			return (json_last_error() === JSON_ERROR_NONE);
		}
		return false;
	}

	/**
	 * Check if have an object with a length
	 *
	 * @input	object   The object to check
	 *
	 * @returns bool true on success
	 */
	public static function checkObject($object)
	{
		if (isset($object) && is_object($object))
		{
			return count((array)$object) > 0;
		}
		return false;
	}

	/**
	 * Check if have an array with a length
	 *
	 * @input	array   The array to check
	 *
	 * @returns bool/int  number of items in array on success
	 */
	public static function checkArray($array, $removeEmptyString = false)
	{
		if (isset($array) && is_array($array) && ($nr =
count((array)$array)) > 0)
		{
			// also make sure the empty strings are removed
			if ($removeEmptyString)
			{
				foreach ($array as $key => $string)
				{
					if (empty($string))
					{
						unset($array[$key]);
					}
				}
				return self::checkArray($array, false);
			}
			return $nr;
		}
		return false;
	}

	/**
	 * Check if have a string with a length
	 *
	 * @input	string   The string to check
	 *
	 * @returns bool true on success
	 */
	public static function checkString($string)
	{
		if (isset($string) && is_string($string) &&
strlen($string) > 0)
		{
			return true;
		}
		return false;
	}

	/**
	 * Check if we are connected
	 * Thanks https://stackoverflow.com/a/4860432/1429677
	 *
	 * @returns bool true on success
	 */
	public static function isConnected()
	{
		// If example.com is down, then probably the whole internet is down,
since IANA maintains the domain. Right?
		$connected = @fsockopen("www.example.com", 80); 
                // website, port  (try 80 or 443)
		if ($connected)
		{
			//action when connected
			$is_conn = true;
			fclose($connected);
		}
		else
		{
			//action in connection failure
			$is_conn = false;
		}
		return $is_conn;
	}

	/**
	 * Merge an array of array's
	 *
	 * @input	array   The arrays you would like to merge
	 *
	 * @returns array on success
	 */
	public static function mergeArrays($arrays)
	{
		if(self::checkArray($arrays))
		{
			$arrayBuket = array();
			foreach ($arrays as $array)
			{
				if (self::checkArray($array))
				{
					$arrayBuket = array_merge($arrayBuket, $array);
				}
			}
			return $arrayBuket;
		}
		return false;
	}

	// typo sorry!
	public static function sorten($string, $length = 40, $addTip = true)
	{
		return self::shorten($string, $length, $addTip);
	}

	/**
	 * Shorten a string
	 *
	 * @input	string   The you would like to shorten
	 *
	 * @returns string on success
	 */
	public static function shorten($string, $length = 40, $addTip = true)
	{
		if (self::checkString($string))
		{
			$initial = strlen($string);
			$words = preg_split('/([\s\n\r]+)/', $string, null,
PREG_SPLIT_DELIM_CAPTURE);
			$words_count = count((array)$words);

			$word_length = 0;
			$last_word = 0;
			for (; $last_word < $words_count; ++$last_word)
			{
				$word_length += strlen($words[$last_word]);
				if ($word_length > $length)
				{
					break;
				}
			}

			$newString	= implode(array_slice($words, 0, $last_word));
			$final	= strlen($newString);
			if ($initial != $final && $addTip)
			{
				$title = self::shorten($string, 400 , false);
				return '<span class="hasTip"
title="'.$title.'"
style="cursor:help">'.trim($newString).'...</span>';
			}
			elseif ($initial != $final && !$addTip)
			{
				return trim($newString).'...';
			}
		}
		return $string;
	}

	/**
	 * Making strings safe (various ways)
	 *
	 * @input	string   The you would like to make safe
	 *
	 * @returns string on success
	 */
	public static function safeString($string, $type = 'L', $spacer
= '_', $replaceNumbers = true, $keepOnlyCharacters = true)
	{
		if ($replaceNumbers === true)
		{
			// remove all numbers and replace with english text version (works well
only up to millions)
			$string = self::replaceNumbers($string);
		}
		// 0nly continue if we have a string
		if (self::checkString($string))
		{
			// create file name without the extention that is safe
			if ($type === 'filename')
			{
				// make sure VDM is not in the string
				$string = str_replace('VDM', 'vDm', $string);
				// Remove anything which isn't a word, whitespace, number
				// or any of the following caracters -_()
				// If you don't need to handle multi-byte characters
				// you can use preg_replace rather than mb_ereg_replace
				// Thanks @Łukasz Rysiak!
				// $string = mb_ereg_replace("([^\w\s\d\-_\(\)])",
'', $string);
				$string = preg_replace("([^\w\s\d\-_\(\)])", '',
$string);
				// http://stackoverflow.com/a/2021729/1429677
				return preg_replace('/\s+/', ' ', $string);
			}
			// remove all other characters
			$string = trim($string);
			$string = preg_replace('/'.$spacer.'+/', '
', $string);
			$string = preg_replace('/\s+/', ' ', $string);
			// Transliterate string
			$string = self::transliterate($string);
			// remove all and keep only characters
			if ($keepOnlyCharacters)
			{
				$string = preg_replace("/[^A-Za-z ]/", '',
$string);
			}
			// keep both numbers and characters
			else
			{
				$string = preg_replace("/[^A-Za-z0-9 ]/", '',
$string);
			}
			// select final adaptations
			if ($type === 'L' || $type === 'strtolower')
			{
				// replace white space with underscore
				$string = preg_replace('/\s+/', $spacer, $string);
				// default is to return lower
				return strtolower($string);
			}
			elseif ($type === 'W')
			{
				// return a string with all first letter of each word uppercase(no
undersocre)
				return ucwords(strtolower($string));
			}
			elseif ($type === 'w' || $type === 'word')
			{
				// return a string with all lowercase(no undersocre)
				return strtolower($string);
			}
			elseif ($type === 'Ww' || $type === 'Word')
			{
				// return a string with first letter of the first word uppercase and
all the rest lowercase(no undersocre)
				return ucfirst(strtolower($string));
			}
			elseif ($type === 'WW' || $type === 'WORD')
			{
				// return a string with all the uppercase(no undersocre)
				return strtoupper($string);
			}
			elseif ($type === 'U' || $type === 'strtoupper')
			{
					// replace white space with underscore
					$string = preg_replace('/\s+/', $spacer, $string);
					// return all upper
					return strtoupper($string);
			}
			elseif ($type === 'F' || $type === 'ucfirst')
			{
					// replace white space with underscore
					$string = preg_replace('/\s+/', $spacer, $string);
					// return with first caracter to upper
					return ucfirst(strtolower($string));
			}
			elseif ($type === 'cA' || $type === 'cAmel' || $type
=== 'camelcase')
			{
				// convert all words to first letter uppercase
				$string = ucwords(strtolower($string));
				// remove white space
				$string = preg_replace('/\s+/', '', $string);
				// now return first letter lowercase
				return lcfirst($string);
			}
			// return string
			return $string;
		}
		// not a string
		return '';
	}

	public static function transliterate($string)
	{
		// set tag only once
		if (!self::checkString(self::$langTag))
		{
			// get global value
			self::$langTag =
JComponentHelper::getParams('com_reservation')->get('language',
'en-GB');
		}
		// Transliterate on the language requested
		$lang = Language::getInstance(self::$langTag);
		return $lang->transliterate($string);
	}

	public static function htmlEscape($var, $charset = 'UTF-8',
$shorten = false, $length = 40)
	{
		if (self::checkString($var))
		{
			$filter = new JFilterInput();
			$string = $filter->clean(html_entity_decode(htmlentities($var,
ENT_COMPAT, $charset)), 'HTML');
			if ($shorten)
			{
                                return self::shorten($string,$length);
			}
			return $string;
		}
		else
		{
			return '';
		}
	}

	public static function replaceNumbers($string)
	{
		// set numbers array
		$numbers = array();
		// first get all numbers
		preg_match_all('!\d+!', $string, $numbers);
		// check if we have any numbers
		if (isset($numbers[0]) && self::checkArray($numbers[0]))
		{
			foreach ($numbers[0] as $number)
			{
				$searchReplace[$number] = self::numberToString((int)$number);
			}
			// now replace numbers in string
			$string = str_replace(array_keys($searchReplace),
array_values($searchReplace),$string);
			// check if we missed any, strange if we did.
			return self::replaceNumbers($string);
		}
		// return the string with no numbers remaining.
		return $string;
	}

	/**
	 * Convert an integer into an English word string
	 * Thanks to Tom Nicholson
<http://php.net/manual/en/function.strval.php#41988>
	 *
	 * @input	an int
	 * @returns a string
	 */
	public static function numberToString($x)
	{
		$nwords = array( "zero", "one", "two",
"three", "four", "five", "six",
"seven",
			"eight", "nine", "ten",
"eleven", "twelve", "thirteen",
			"fourteen", "fifteen", "sixteen",
"seventeen", "eighteen",
			"nineteen", "twenty", 30 => "thirty",
40 => "forty",
			50 => "fifty", 60 => "sixty", 70 =>
"seventy", 80 => "eighty",
			90 => "ninety" );

		if(!is_numeric($x))
		{
			$w = $x;
		}
		elseif(fmod($x, 1) != 0)
		{
			$w = $x;
		}
		else
		{
			if($x < 0)
			{
				$w = 'minus ';
				$x = -$x;
			}
			else
			{
				$w = '';
				// ... now $x is a non-negative integer.
			}

			if($x < 21)   // 0 to 20
			{
				$w .= $nwords[$x];
			}
			elseif($x < 100)  // 21 to 99
			{ 
				$w .= $nwords[10 * floor($x/10)];
				$r = fmod($x, 10);
				if($r > 0)
				{
					$w .= ' '. $nwords[$r];
				}
			}
			elseif($x < 1000)  // 100 to 999
			{
				$w .= $nwords[floor($x/100)] .' hundred';
				$r = fmod($x, 100);
				if($r > 0)
				{
					$w .= ' and '. self::numberToString($r);
				}
			}
			elseif($x < 1000000)  // 1000 to 999999
			{
				$w .= self::numberToString(floor($x/1000)) .' thousand';
				$r = fmod($x, 1000);
				if($r > 0)
				{
					$w .= ' ';
					if($r < 100)
					{
						$w .= 'and ';
					}
					$w .= self::numberToString($r);
				}
			} 
			else //  millions
			{    
				$w .= self::numberToString(floor($x/1000000)) .' million';
				$r = fmod($x, 1000000);
				if($r > 0)
				{
					$w .= ' ';
					if($r < 100)
					{
						$w .= 'and ';
					}
					$w .= self::numberToString($r);
				}
			}
		}
		return $w;
	}

	/**
	 * Random Key
	 *
	 * @returns a string
	 */
	public static function randomkey($size)
	{
		$bag =
"abcefghijknopqrstuwxyzABCDDEFGHIJKLLMMNOPQRSTUVVWXYZabcddefghijkllmmnopqrstuvvwxyzABCEFGHIJKNOPQRSTUWXYZ";
		$key = array();
		$bagsize = strlen($bag) - 1;
		for ($i = 0; $i < $size; $i++)
		{
			$get = rand(0, $bagsize);
			$key[] = $bag[$get];
		}
		return implode($key);
	}
}
PK4~�[��%p��helpers/webhook.phpnu�[���<?php

define('_JEXEC', 1);

define('JPATH_BASE',
dirname(dirname(dirname(dirname(__FILE__)))));
require_once JPATH_BASE . '/includes/defines.php';
require_once JPATH_BASE . '/includes/framework.php';
$app = JFactory::getApplication('site');

// print_r($app);
$filename = __DIR__ . '/log.txt';
$input = $app->input;

file_put_contents($filename, "input = " .
print_r($input->getArray(), True) . "\n", FILE_APPEND);
PK4~�[�#o,,
index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK4~�[L��+��$layouts/appointment/details_left.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		details_left.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'doctorid',
	'appointment'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[n�<%��%layouts/appointment/details_right.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		details_right.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'title'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[�#o,,layouts/appointment/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK4~�[�w+e��"layouts/appointment/publishing.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		publishing.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'created',
	'created_by',
	'modified',
	'modified_by'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[8���"layouts/appointment/publlshing.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		publlshing.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'published',
	'ordering',
	'access',
	'version',
	'hits',
	'id'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[f&S

layouts/batchselection.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		batchselection.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('JPATH_BASE') or die;

JHtmlBehavior::core();
$divWrapper = range(1,120,2);
$counter = 0;
?>
<?php if ($displayData->ListSelection) : ?>
<div class="row-fluid">
	<?php foreach ($displayData->ListSelection as $ListSelection) :
?>
    <div class="control-group span6">
    	<div class="controls">
		<label for="<?php echo $ListSelection['name'];
?>" class="element-invisible"><?php echo
$ListSelection['label']; ?></label>
		<select name="<?php echo $ListSelection['name'];
?>" id="<?php echo $ListSelection['name'];
?>" class="span12 small">
			<?php if (!$ListSelection['noDefault']) : ?>
				<option value=""><?php echo
$ListSelection['label']; ?></option>
			<?php endif; ?>
			<?php echo $ListSelection['options']; ?>
		</select>
      	</div>
	</div>
		<?php if (in_array($counter,$divWrapper)) : ?>
</div>
<div class="row-fluid">
		<?php endif; ?>
        <?php $counter++; ?>
	<?php endforeach; ?>
</div>
<div class="control-group radio"
id="batch-move-copy">
	<div class="controls">
        <label class="radio"
id="batch[move_copy]c-lbl" for="batch[move_copy]c">
        <input type="radio" value="c"
id="batch[move_copy]c"
name="batch[move_copy]"><?php echo
JText::_('Copy'); ?></label>
        <label class="radio"
id="batch[move_copy]m-lbl" for="batch[move_copy]m">
        <input type="radio" checked="checked"
value="m" id="batch[move_copy]m"
name="batch[move_copy]"><?php echo
JText::_('Update'); ?></label>
    </div>
</div>
<?php endif;
?>PK4~�[tv�t��!layouts/bbbclass/details_left.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		details_left.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'name',
	'planid',
	'seid',
	'exmid',
	'inmid',
	'mpass',
	'vpass'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[�#o,,layouts/bbbclass/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK4~�[�����layouts/bbbclass/publishing.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		publishing.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'title',
	'created',
	'created_by',
	'modified',
	'modified_by'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[8���layouts/bbbclass/publlshing.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		publlshing.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'published',
	'ordering',
	'access',
	'version',
	'hits',
	'id'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[�l����
layouts/capital/details_left.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		details_left.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'name'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[o���!layouts/capital/details_right.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		details_right.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'capitalid'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[�#o,,layouts/capital/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK4~�[�����layouts/capital/publishing.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		publishing.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'title',
	'created',
	'created_by',
	'modified',
	'modified_by'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[8���layouts/capital/publlshing.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		publlshing.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'published',
	'ordering',
	'access',
	'version',
	'hits',
	'id'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[��=��%layouts/comment/details_fullwidth.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		details_fullwidth.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'text'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<div class="form-vertical">
	<?php foreach($fields as $field): ?>
		<?php if (in_array($field, $hiddenFields)) : ?>
			<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
		<?php endif; ?>
		<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
	<?php endforeach; ?>
</div>
<?php endif; ?>
PK4~�[Fu
0�� layouts/comment/details_left.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		details_left.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'consultantid',
	'seid',
	'rate'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[���N��!layouts/comment/details_right.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		details_right.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'sickid',
	'token'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[�#o,,layouts/comment/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK4~�[�����layouts/comment/publishing.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		publishing.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'title',
	'created',
	'created_by',
	'modified',
	'modified_by'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[8���layouts/comment/publlshing.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		publlshing.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'published',
	'ordering',
	'access',
	'version',
	'hits',
	'id'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[�c�4,	,	(layouts/consultant/details_fullwidth.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.33
	@build			20th July, 2021
	@created		17th December, 2020
	@package		Reservation
	@subpackage		details_fullwidth.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'introduction'
);

$hiddenFields = $displayData->get('hidden_fields') ?:
array();

?>
<?php if ($fields && count((array) $fields)) :?>
<div class="form-vertical">
	<?php foreach($fields as $field): ?>
		<?php if (in_array($field, $hiddenFields)) : ?>
			<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
		<?php endif; ?>
		<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
	<?php endforeach; ?>
</div>
<?php endif; ?>
PK4~�[Knn-	-	#layouts/consultant/details_left.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		details_left.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'userid',
	'nationalnumber',
	'phonenumber',
	'officephone',
	'capitalid',
	'cityid',
	'account',
	'introduction'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[$脽		$layouts/consultant/details_right.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		details_right.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'msn',
	'catid',
	'experience',
	'image',
	'alt',
	'video',
	'presence',
	'address',
	'shortlink'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[�#o,,layouts/consultant/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK4~�[�����!layouts/consultant/publishing.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		publishing.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'title',
	'created',
	'created_by',
	'modified',
	'modified_by'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[8���!layouts/consultant/publlshing.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		publlshing.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'published',
	'ordering',
	'access',
	'version',
	'hits',
	'id'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[OH��$layouts/doctor/details_fullwidth.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		details_fullwidth.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'address'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<div class="form-vertical">
	<?php foreach($fields as $field): ?>
		<?php if (in_array($field, $hiddenFields)) : ?>
			<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
		<?php endif; ?>
		<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
	<?php endforeach; ?>
</div>
<?php endif; ?>
PK4~�[M����layouts/doctor/details_left.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		details_left.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'userid',
	'phonenumber',
	'msn',
	'presence',
	'capitalid'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[�u����
layouts/doctor/details_right.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		details_right.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'catid',
	'officephone',
	'image',
	'alt',
	'cityid'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[�#o,,layouts/doctor/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK4~�[�����layouts/doctor/publishing.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		publishing.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'title',
	'created',
	'created_by',
	'modified',
	'modified_by'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[8���layouts/doctor/publlshing.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		publlshing.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'published',
	'ordering',
	'access',
	'version',
	'hits',
	'id'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[�#o,,layouts/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK4~�[��5��
layouts/message/details_left.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		details_left.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'from',
	'reply',
	'message',
	'seid'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[B��z��!layouts/message/details_right.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		details_right.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'to',
	'read',
	'seen'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[�#o,,layouts/message/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK4~�[�����layouts/message/publishing.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		publishing.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'title',
	'created',
	'created_by',
	'modified',
	'modified_by'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[8���layouts/message/publlshing.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		publlshing.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'published',
	'ordering',
	'access',
	'version',
	'hits',
	'id'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[���`		layouts/order/details_left.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.31
	@build			8th May, 2021
	@created		17th December, 2020
	@package		Reservation
	@subpackage		details_left.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'sickid',
	'full_price'
);

$hiddenFields = $displayData->get('hidden_fields') ?:
array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[`��A		layouts/order/details_right.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.31
	@build			8th May, 2021
	@created		17th December, 2020
	@package		Reservation
	@subpackage		details_right.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'doctor_quota',
	'system_quota',
	'status'
);

$hiddenFields = $displayData->get('hidden_fields') ?:
array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[�#o,,layouts/order/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK4~�[~�w�)	)	layouts/order/publishing.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.31
	@build			8th May, 2021
	@created		17th December, 2020
	@package		Reservation
	@subpackage		publishing.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'title',
	'created',
	'created_by',
	'modified',
	'modified_by'
);

$hiddenFields = $displayData->get('hidden_fields') ?:
array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[9LM�)	)	layouts/order/publlshing.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.31
	@build			8th May, 2021
	@created		17th December, 2020
	@package		Reservation
	@subpackage		publlshing.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'published',
	'ordering',
	'access',
	'version',
	'hits',
	'id'
);

$hiddenFields = $displayData->get('hidden_fields') ?:
array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[���w��layouts/plan/details_left.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		details_left.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'plantype',
	'consultantid',
	'price'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[���g��layouts/plan/details_right.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		details_right.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'time',
	'waitingtime'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[�#o,,layouts/plan/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK4~�[�����layouts/plan/publishing.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		publishing.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'title',
	'created',
	'created_by',
	'modified',
	'modified_by'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[8���layouts/plan/publlshing.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		publlshing.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'published',
	'ordering',
	'access',
	'version',
	'hits',
	'id'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[2����
layouts/reserve/details_left.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		details_left.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'sickid',
	'full_price',
	'doctor_quota',
	'system_quota'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[�V$��!layouts/reserve/details_right.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		details_right.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'appointmentid',
	'status',
	'payment_method',
	'tracking_code'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[�#o,,layouts/reserve/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK4~�[�����layouts/reserve/publishing.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		publishing.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'title',
	'created',
	'created_by',
	'modified',
	'modified_by'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[8���layouts/reserve/publlshing.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		publlshing.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'published',
	'ordering',
	'access',
	'version',
	'hits',
	'id'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[Rg����
layouts/session/details_left.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		details_left.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'sickid',
	'pay',
	'finish'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[��AN��!layouts/session/details_right.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		details_right.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'planid',
	'firsttext',
	'channel_token'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[�#o,,layouts/session/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK4~�[�����layouts/session/publishing.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		publishing.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'title',
	'created',
	'created_by',
	'modified',
	'modified_by'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[8���layouts/session/publlshing.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		publlshing.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'published',
	'ordering',
	'access',
	'version',
	'hits',
	'id'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[�
�K��layouts/sick/details_left.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		details_left.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'userid',
	'capitalid',
	'image',
	'alt'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[X	^��layouts/sick/details_right.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		details_right.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'phonenumber',
	'cityid',
	'cardnumber'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[�#o,,layouts/sick/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK4~�[�����layouts/sick/publishing.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		publishing.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'title',
	'created',
	'created_by',
	'modified',
	'modified_by'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[8���layouts/sick/publlshing.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		publlshing.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// get the form
$form = $displayData->getForm();

// get the layout fields override method name (from layout path/ID)
$layout_path_array = explode('.', $this->getLayoutId());
// Since we cannot pass the layout and tab names as parameters to the model
method
// this name combination of tab and layout in the method name is the only
work around
// seeing that JCB uses those two values (tab_name & layout_name) as
the layout file name.
// example of layout name: details_left.php
// example of method name: getFields_details_left()
$fields_tab_layout = 'fields_' . $layout_path_array[1];

// get the fields
$fields = $displayData->get($fields_tab_layout) ?: array(
	'published',
	'ordering',
	'access',
	'version',
	'hits',
	'id'
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

?>
<?php if ($fields && count((array) $fields)) :?>
<?php foreach($fields as $field): ?>
	<?php if (in_array($field, $hiddenFields)) : ?>
		<?php $form->setFieldAttribute($field, 'type',
'hidden'); ?>
	<?php endif; ?>
	<?php echo $form->renderField($field, null, null,
array('class' => 'control-wrapper-' . $field));
?>
<?php endforeach; ?>
<?php endif; ?>
PK4~�[�L���models/ajax.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		ajax.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Utilities\ArrayHelper;

/**
 * Reservation Ajax Model
 */
class ReservationModelAjax extends JModelList
{
	protected $app_params;
	
	public function __construct() 
	{		
		parent::__construct();		
		// get params
		$this->app_params	=
JComponentHelper::getParams('com_reservation');
		
	}

	// Used in bbbclass

/***[JCBGUI.admin_view.php_ajaxmethod.144.$$$$]***/
  public function setWebHook($url, $secret)
  {
    require_once dirname(dirname(__FILE__)) .
'/bbb/autoload.php';
    $bbb = new BigBlueButton\BigBlueButton($url, $secret);
    $methods = get_class_methods($bbb);
    // $hooksList = array();
    // $hresponse = $bbb->hooksList();
    // $registered = false;
    // if ($hresponse->getReturnCode() == 'SUCCESS') {
      // foreach ($hresponse->getHooks() as $hook) {
        //
if(JURI::root().'administrator/components/com_reservation/helpers/webhook.php')
        // {
          // $registered = true;
          // break;
        // }
      // }
    // }

    // $meetings = array();
    // $response = $bbb->getMeetings();
    // if ($response->getReturnCode() == 'SUCCESS') {
      // foreach ($response->getRawXml()->meetings->meeting as
$meeting) {
      	// $meetings[] = $meeting;
      // }
    // }
    // print_r($hresponse->getRawXml(), True)
    $hookURL =
JURI::root().'administrator/components/com_reservation/helpers/webhook.php';
    $hp = new BigBlueButton\Parameters\HooksCreateParameters($hookURL);
    $hcresponse = $bbb->hooksCreate($hp);
    return array('status' => ($hcresponse->getReturnCode()
== 'SUCCESS'));
  }
  public function isRegistered($url, $secret)
  {
    require_once dirname(dirname(__FILE__)) .
'/bbb/autoload.php';
    $bbb = new BigBlueButton\BigBlueButton($url, $secret);
    $hresponse = $bbb->hooksList();
    $registered = false;
    $hookURL =
JURI::root().'administrator/components/com_reservation/helpers/webhook.php';
    if ($hresponse->getReturnCode() == 'SUCCESS') {
      foreach ($hresponse->getHooks() as $hook) {
        if($hookURL == $hook->getCallbackUrl())
        {
          $registered = true;
          break;
        }
      }
    }
    return array('status' => $registered);
  }/***[/JCBGUI$$$$]***/


	// Used in sick

/***[JCBGUI.admin_view.php_ajaxmethod.113.$$$$]***/
	public function getCity($capitalid)
    {
        $db = JFactory::getDbo();

        $query = $db->getQuery(true);

        $query
            ->select($db->quoteName(array('a.id',
'a.name'),array('id','name')))
            ->from($db->quoteName('#__reservation_capital',
'a'))
            ->where($db->quoteName('a.capitalid') . '
= ' . $db->quote($capitalid))
            ->order($db->quoteName('a.name') . '
ASC');

        $db->setQuery($query);

        $results = $db->loadAssocList();
        return $results;
    }/***[/JCBGUI$$$$]***/

}
PK4~�[n���NUNUmodels/appointment.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		appointment.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Registry\Registry;
use Joomla\String\StringHelper;
use Joomla\Utilities\ArrayHelper;

/**
 * Reservation Appointment Model
 */
class ReservationModelAppointment extends JModelAdmin
{
	/**
	 * The tab layout fields array.
	 *
	 * @var      array
	 */
	protected $tabLayoutFields = array(
		'details' => array(
			'left' => array(
				'doctorid',
				'appointment'
			),
			'right' => array(
				'title'
			)
		)
	);

	/**
	 * @var        string    The prefix to use with controller messages.
	 * @since   1.6
	 */
	protected $text_prefix = 'COM_RESERVATION';

	/**
	 * The type alias for this content type.
	 *
	 * @var      string
	 * @since    3.2
	 */
	public $typeAlias = 'com_reservation.appointment';

	/**
	 * Returns a Table object, always creating it
	 *
	 * @param   type    $type    The table type to instantiate
	 * @param   string  $prefix  A prefix for the table class name. Optional.
	 * @param   array   $config  Configuration array for model. Optional.
	 *
	 * @return  JTable  A database object
	 *
	 * @since   1.6
	 */
	public function getTable($type = 'appointment', $prefix =
'ReservationTable', $config = array())
	{
		// add table path for when model gets used from other component
		$this->addTablePath(JPATH_ADMINISTRATOR .
'/components/com_reservation/tables');
		// get instance of the table
		return JTable::getInstance($type, $prefix, $config);
	}
    
	/**
	 * Method to get a single record.
	 *
	 * @param   integer  $pk  The id of the primary key.
	 *
	 * @return  mixed  Object on success, false on failure.
	 *
	 * @since   1.6
	 */
	public function getItem($pk = null)
	{
		if ($item = parent::getItem($pk))
		{
			if (!empty($item->params) && !is_array($item->params))
			{
				// Convert the params field to an array.
				$registry = new Registry;
				$registry->loadString($item->params);
				$item->params = $registry->toArray();
			}

			if (!empty($item->metadata))
			{
				// Convert the metadata field to an array.
				$registry = new Registry;
				$registry->loadString($item->metadata);
				$item->metadata = $registry->toArray();
			}
		}

		return $item;
	}

	/**
	 * Method to get the record form.
	 *
	 * @param   array    $data      Data for the form.
	 * @param   boolean  $loadData  True if the form is to load its own data
(default case), false if not.
	 * @param   array    $options   Optional array of options for the form
creation.
	 *
	 * @return  mixed  A JForm object on success, false on failure
	 *
	 * @since   1.6
	 */
	public function getForm($data = array(), $loadData = true, $options =
array('control' => 'jform'))
	{
		// set load data option
		$options['load_data'] = $loadData;
		// check if xpath was set in options
		$xpath = false;
		if (isset($options['xpath']))
		{
			$xpath = $options['xpath'];
			unset($options['xpath']);
		}
		// check if clear form was set in options
		$clear = false;
		if (isset($options['clear']))
		{
			$clear = $options['clear'];
			unset($options['clear']);
		}

		// Get the form.
		$form = $this->loadForm('com_reservation.appointment',
'appointment', $options, $clear, $xpath);

		if (empty($form))
		{
			return false;
		}

		$jinput = JFactory::getApplication()->input;

		// The front end calls this model and uses a_id to avoid id clashes so we
need to check for that first.
		if ($jinput->get('a_id'))
		{
			$id = $jinput->get('a_id', 0, 'INT');
		}
		// The back end uses id so we use that the rest of the time and set it to
0 by default.
		else
		{
			$id = $jinput->get('id', 0, 'INT');
		}

		$user = JFactory::getUser();

		// Check for existing item.
		// Modify the form based on Edit State access controls.
		if ($id != 0 &&
(!$user->authorise('core.edit.state',
'com_reservation.appointment.' . (int) $id))
			|| ($id == 0 &&
!$user->authorise('core.edit.state',
'com_reservation')))
		{
			// Disable fields for display.
			$form->setFieldAttribute('ordering', 'disabled',
'true');
			$form->setFieldAttribute('published', 'disabled',
'true');
			// Disable fields while saving.
			$form->setFieldAttribute('ordering', 'filter',
'unset');
			$form->setFieldAttribute('published', 'filter',
'unset');
		}
		// If this is a new item insure the greated by is set.
		if (0 == $id)
		{
			// Set the created_by to this user
			$form->setValue('created_by', null, $user->id);
		}
		// Modify the form based on Edit Creaded By access controls.
		if (!$user->authorise('core.edit.created_by',
'com_reservation'))
		{
			// Disable fields for display.
			$form->setFieldAttribute('created_by',
'disabled', 'true');
			// Disable fields for display.
			$form->setFieldAttribute('created_by',
'readonly', 'true');
			// Disable fields while saving.
			$form->setFieldAttribute('created_by', 'filter',
'unset');
		}
		// Modify the form based on Edit Creaded Date access controls.
		if (!$user->authorise('core.edit.created',
'com_reservation'))
		{
			// Disable fields for display.
			$form->setFieldAttribute('created', 'disabled',
'true');
			// Disable fields while saving.
			$form->setFieldAttribute('created', 'filter',
'unset');
		}
		// Only load these values if no id is found
		if (0 == $id)
		{
			// Set redirected view name
			$redirectedView = $jinput->get('ref', null,
'STRING');
			// Set field name (or fall back to view name)
			$redirectedField = $jinput->get('field', $redirectedView,
'STRING');
			// Set redirected view id
			$redirectedId = $jinput->get('refid', 0, 'INT');
			// Set field id (or fall back to redirected view id)
			$redirectedValue = $jinput->get('field_id', $redirectedId,
'INT');
			if (0 != $redirectedValue && $redirectedField)
			{
				// Now set the local-redirected field default value
				$form->setValue($redirectedField, null, $redirectedValue);
			}
		}
		return $form;
	}

	/**
	 * Method to get the script that have to be included on the form
	 *
	 * @return string	script files
	 */
	public function getScript()
	{
		return 'media/com_reservation/js/appointment.js';
	}
    
	/**
	 * Method to test whether a record can be deleted.
	 *
	 * @param   object  $record  A record object.
	 *
	 * @return  boolean  True if allowed to delete the record. Defaults to the
permission set in the component.
	 *
	 * @since   1.6
	 */
	protected function canDelete($record)
	{
		if (!empty($record->id))
		{
			if ($record->published != -2)
			{
				return;
			}

			$user = JFactory::getUser();
			// The record has been set. Check the record permissions.
			return $user->authorise('core.delete',
'com_reservation.appointment.' . (int) $record->id);
		}
		return false;
	}

	/**
	 * Method to test whether a record can have its state edited.
	 *
	 * @param   object  $record  A record object.
	 *
	 * @return  boolean  True if allowed to change the state of the record.
Defaults to the permission set in the component.
	 *
	 * @since   1.6
	 */
	protected function canEditState($record)
	{
		$user = JFactory::getUser();
		$recordId = (!empty($record->id)) ? $record->id : 0;

		if ($recordId)
		{
			// The record has been set. Check the record permissions.
			$permission = $user->authorise('core.edit.state',
'com_reservation.appointment.' . (int) $recordId);
			if (!$permission && !is_null($permission))
			{
				return false;
			}
		}
		// In the absense of better information, revert to the component
permissions.
		return parent::canEditState($record);
	}
    
	/**
	 * Method override to check if you can edit an existing record.
	 *
	 * @param	array	$data	An array of input data.
	 * @param	string	$key	The name of the key for the primary key.
	 *
	 * @return	boolean
	 * @since	2.5
	 */
	protected function allowEdit($data = array(), $key = 'id')
	{
		// Check specific edit permission then general edit permission.

		return JFactory::getUser()->authorise('core.edit',
'com_reservation.appointment.'. ((int) isset($data[$key]) ?
$data[$key] : 0)) or parent::allowEdit($data, $key);
	}
    
	/**
	 * Prepare and sanitise the table data prior to saving.
	 *
	 * @param   JTable  $table  A JTable object.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function prepareTable($table)
	{
		$date = JFactory::getDate();
		$user = JFactory::getUser();
		
		if (isset($table->name))
		{
			$table->name = htmlspecialchars_decode($table->name, ENT_QUOTES);
		}
		
		if (isset($table->alias) && empty($table->alias))
		{
			$table->generateAlias();
		}
		
		if (empty($table->id))
		{
			$table->created = $date->toSql();
			// set the user
			if ($table->created_by == 0 || empty($table->created_by))
			{
				$table->created_by = $user->id;
			}
			// Set ordering to the last item if not set
			if (empty($table->ordering))
			{
				$db = JFactory::getDbo();
				$query = $db->getQuery(true)
					->select('MAX(ordering)')
					->from($db->quoteName('#__reservation_appointment'));
				$db->setQuery($query);
				$max = $db->loadResult();

				$table->ordering = $max + 1;
			}
		}
		else
		{
			$table->modified = $date->toSql();
			$table->modified_by = $user->id;
		}
        
		if (!empty($table->id))
		{
			// Increment the items version number.
			$table->version++;
		}
	}

	/**
	 * Method to get the data that should be injected in the form.
	 *
	 * @return  mixed  The data for the form.
	 *
	 * @since   1.6
	 */
	protected function loadFormData() 
	{
		// Check the session for previously entered form data.
		$data =
JFactory::getApplication()->getUserState('com_reservation.edit.appointment.data',
array());

		if (empty($data))
		{
			$data = $this->getItem();
			// run the perprocess of the data
			$this->preprocessData('com_reservation.appointment',
$data);
		}

		return $data;
	}

	/**
	 * Method to get the unique fields of this table.
	 *
	 * @return  mixed  An array of field names, boolean false if none is set.
	 *
	 * @since   3.0
	 */
	protected function getUniqueFields()
	{
		return false;
	}
	
	/**
	 * Method to delete one or more records.
	 *
	 * @param   array  &$pks  An array of record primary keys.
	 *
	 * @return  boolean  True if successful, false if an error occurs.
	 *
	 * @since   12.2
	 */
	public function delete(&$pks)
	{
		if (!parent::delete($pks))
		{
			return false;
		}
		
		return true;
	}

	/**
	 * Method to change the published state of one or more records.
	 *
	 * @param   array    &$pks   A list of the primary keys to change.
	 * @param   integer  $value  The value of the published state.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   12.2
	 */
	public function publish(&$pks, $value = 1)
	{
		if (!parent::publish($pks, $value))
		{
			return false;
		}
		
		return true;
        }
    
	/**
	 * Method to perform batch operations on an item or a set of items.
	 *
	 * @param   array  $commands  An array of commands to perform.
	 * @param   array  $pks       An array of item ids.
	 * @param   array  $contexts  An array of item contexts.
	 *
	 * @return  boolean  Returns true on success, false on failure.
	 *
	 * @since   12.2
	 */
	public function batch($commands, $pks, $contexts)
	{
		// Sanitize ids.
		$pks = array_unique($pks);
		ArrayHelper::toInteger($pks);

		// Remove any values of zero.
		if (array_search(0, $pks, true))
		{
			unset($pks[array_search(0, $pks, true)]);
		}

		if (empty($pks))
		{
			$this->setError(JText::_('JGLOBAL_NO_ITEM_SELECTED'));
			return false;
		}

		$done = false;

		// Set some needed variables.
		$this->user			= JFactory::getUser();
		$this->table			= $this->getTable();
		$this->tableClassName		= get_class($this->table);
		$this->contentType		= new JUcmType;
		$this->type			=
$this->contentType->getTypeByTable($this->tableClassName);
		$this->canDo			=
ReservationHelper::getActions('appointment');
		$this->batchSet			= true;

		if (!$this->canDo->get('core.batch'))
		{
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_INSUFFICIENT_BATCH_INFORMATION'));
			return false;
		}
        
		if ($this->type == false)
		{
			$type = new JUcmType;
			$this->type = $type->getTypeByAlias($this->typeAlias);
		}

		$this->tagsObserver =
$this->table->getObserverOfClass('JTableObserverTags');

		if (!empty($commands['move_copy']))
		{
			$cmd = ArrayHelper::getValue($commands, 'move_copy',
'c');

			if ($cmd == 'c')
			{
				$result = $this->batchCopy($commands, $pks, $contexts);

				if (is_array($result))
				{
					foreach ($result as $old => $new)
					{
						$contexts[$new] = $contexts[$old];
					}
					$pks = array_values($result);
				}
				else
				{
					return false;
				}
			}
			elseif ($cmd == 'm' && !$this->batchMove($commands,
$pks, $contexts))
			{
				return false;
			}

			$done = true;
		}

		if (!$done)
		{
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_INSUFFICIENT_BATCH_INFORMATION'));

			return false;
		}

		// Clear the cache
		$this->cleanCache();

		return true;
	}

	/**
	 * Batch copy items to a new category or current.
	 *
	 * @param   integer  $values    The new values.
	 * @param   array    $pks       An array of row IDs.
	 * @param   array    $contexts  An array of item contexts.
	 *
	 * @return  mixed  An array of new IDs on success, boolean false on
failure.
	 *
	 * @since 12.2
	 */
	protected function batchCopy($values, $pks, $contexts)
	{
		if (empty($this->batchSet))
		{
			// Set some needed variables.
			$this->user 		= JFactory::getUser();
			$this->table 		= $this->getTable();
			$this->tableClassName	= get_class($this->table);
			$this->canDo		=
ReservationHelper::getActions('appointment');
		}

		if (!$this->canDo->get('core.create') ||
!$this->canDo->get('core.batch'))
		{
			return false;
		}

		// get list of unique fields
		$uniqueFields = $this->getUniqueFields();
		// remove move_copy from array
		unset($values['move_copy']);

		// make sure published is set
		if (!isset($values['published']))
		{
			$values['published'] = 0;
		}
		elseif (isset($values['published']) &&
!$this->canDo->get('core.edit.state'))
		{
				$values['published'] = 0;
		}

		$newIds = array();
		// Parent exists so let's proceed
		while (!empty($pks))
		{
			// Pop the first ID off the stack
			$pk = array_shift($pks);

			$this->table->reset();

			// only allow copy if user may edit this item.
			if (!$this->user->authorise('core.edit',
$contexts[$pk]))
			{
				// Not fatal error
				$this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND',
$pk));
				continue;
			}

			// Check that the row actually exists
			if (!$this->table->load($pk))
			{
				if ($error = $this->table->getError())
				{
					// Fatal error
					$this->setError($error);
					return false;
				}
				else
				{
					// Not fatal error
					$this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND',
$pk));
					continue;
				}
			}

			// Only for strings
			if (ReservationHelper::checkString($this->table->title) &&
!is_numeric($this->table->title))
			{
				$this->table->title =
$this->generateUnique('title',$this->table->title);
			}

			// insert all set values
			if (ReservationHelper::checkArray($values))
			{
				foreach ($values as $key => $value)
				{
					if (strlen($value) > 0 && isset($this->table->$key))
					{
						$this->table->$key = $value;
					}
				}
			}

			// update all unique fields
			if (ReservationHelper::checkArray($uniqueFields))
			{
				foreach ($uniqueFields as $uniqueField)
				{
					$this->table->$uniqueField =
$this->generateUnique($uniqueField,$this->table->$uniqueField);
				}
			}

			// Reset the ID because we are making a copy
			$this->table->id = 0;

			// TODO: Deal with ordering?
			// $this->table->ordering = 1;

			// Check the row.
			if (!$this->table->check())
			{
				$this->setError($this->table->getError());

				return false;
			}

			if (!empty($this->type))
			{
				$this->createTagsHelper($this->tagsObserver, $this->type, $pk,
$this->typeAlias, $this->table);
			}

			// Store the row.
			if (!$this->table->store())
			{
				$this->setError($this->table->getError());

				return false;
			}

			// Get the new item ID
			$newId = $this->table->get('id');

			// Add the new ID to the array
			$newIds[$pk] = $newId;
		}

		// Clean the cache
		$this->cleanCache();

		return $newIds;
	}

	/**
	 * Batch move items to a new category
	 *
	 * @param   integer  $value     The new category ID.
	 * @param   array    $pks       An array of row IDs.
	 * @param   array    $contexts  An array of item contexts.
	 *
	 * @return  boolean  True if successful, false otherwise and internal
error is set.
	 *
	 * @since 12.2
	 */
	protected function batchMove($values, $pks, $contexts)
	{
		if (empty($this->batchSet))
		{
			// Set some needed variables.
			$this->user		= JFactory::getUser();
			$this->table		= $this->getTable();
			$this->tableClassName	= get_class($this->table);
			$this->canDo		=
ReservationHelper::getActions('appointment');
		}

		if (!$this->canDo->get('core.edit') &&
!$this->canDo->get('core.batch'))
		{
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT'));
			return false;
		}

		// make sure published only updates if user has the permission.
		if (isset($values['published']) &&
!$this->canDo->get('core.edit.state'))
		{
			unset($values['published']);
		}
		// remove move_copy from array
		unset($values['move_copy']);

		// Parent exists so we proceed
		foreach ($pks as $pk)
		{
			if (!$this->user->authorise('core.edit',
$contexts[$pk]))
			{
				$this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT'));
				return false;
			}

			// Check that the row actually exists
			if (!$this->table->load($pk))
			{
				if ($error = $this->table->getError())
				{
					// Fatal error
					$this->setError($error);
					return false;
				}
				else
				{
					// Not fatal error
					$this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND',
$pk));
					continue;
				}
			}

			// insert all set values.
			if (ReservationHelper::checkArray($values))
			{
				foreach ($values as $key => $value)
				{
					// Do special action for access.
					if ('access' === $key && strlen($value) > 0)
					{
						$this->table->$key = $value;
					}
					elseif (strlen($value) > 0 &&
isset($this->table->$key))
					{
						$this->table->$key = $value;
					}
				}
			}


			// Check the row.
			if (!$this->table->check())
			{
				$this->setError($this->table->getError());

				return false;
			}

			if (!empty($this->type))
			{
				$this->createTagsHelper($this->tagsObserver, $this->type, $pk,
$this->typeAlias, $this->table);
			}

			// Store the row.
			if (!$this->table->store())
			{
				$this->setError($this->table->getError());

				return false;
			}
		}

		// Clean the cache
		$this->cleanCache();

		return true;
	}
	
	/**
	 * Method to save the form data.
	 *
	 * @param   array  $data  The form data.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   1.6
	 */
	public function save($data)
	{
		$input	= JFactory::getApplication()->input;
		$filter	= JFilterInput::getInstance();
        
		// set the metadata to the Item Data
		if (isset($data['metadata']) &&
isset($data['metadata']['author']))
		{
			$data['metadata']['author'] =
$filter->clean($data['metadata']['author'],
'TRIM');
            
			$metadata = new JRegistry;
			$metadata->loadArray($data['metadata']);
			$data['metadata'] = (string) $metadata;
		}
        
		// Set the Params Items to data
		if (isset($data['params']) &&
is_array($data['params']))
		{
			$params = new JRegistry;
			$params->loadArray($data['params']);
			$data['params'] = (string) $params;
		}

		// Alter the unique field for save as copy
		if ($input->get('task') === 'save2copy')
		{
			// Automatic handling of other unique fields
			$uniqueFields = $this->getUniqueFields();
			if (ReservationHelper::checkArray($uniqueFields))
			{
				foreach ($uniqueFields as $uniqueField)
				{
					$data[$uniqueField] =
$this->generateUnique($uniqueField,$data[$uniqueField]);
				}
			}
		}
		
		if (parent::save($data))
		{
			return true;
		}
		return false;
	}
	
	/**
	 * Method to generate a unique value.
	 *
	 * @param   string  $field name.
	 * @param   string  $value data.
	 *
	 * @return  string  New value.
	 *
	 * @since   3.0
	 */
	protected function generateUnique($field,$value)
	{

		// set field value unique
		$table = $this->getTable();

		while ($table->load(array($field => $value)))
		{
			$value = StringHelper::increment($value);
		}

		return $value;
	}

	/**
	 * Method to change the title
	 *
	 * @param   string   $title   The title.
	 *
	 * @return	array  Contains the modified title and alias.
	 *
	 */
	protected function _generateNewTitle($title)
	{

		// Alter the title
		$table = $this->getTable();

		while ($table->load(array('title' => $title)))
		{
			$title = StringHelper::increment($title);
		}

		return $title;
	}
}
PK4~�[�C�|�,�,models/appointments.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		appointments.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Utilities\ArrayHelper;

/**
 * Appointments Model
 */
class ReservationModelAppointments extends JModelList
{
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
        {
			$config['filter_fields'] = array(
				'a.id','id',
				'a.published','published',
				'a.access','access',
				'a.ordering','ordering',
				'a.created_by','created_by',
				'a.modified_by','modified_by',
				'a.appointment','appointment'
			);
		}

		parent::__construct($config);
	}

	/**
	 * Method to auto-populate the model state.
	 *
	 * Note. Calling getState in this method will result in recursion.
	 *
	 * @param   string  $ordering   An optional ordering field.
	 * @param   string  $direction  An optional direction (asc|desc).
	 *
	 * @return  void
	 *
	 */
	protected function populateState($ordering = null, $direction = null)
	{
		$app = JFactory::getApplication();

		// Adjust the context to support modal layouts.
		if ($layout = $app->input->get('layout'))
		{
			$this->context .= '.' . $layout;
		}

		// Check if the form was submitted
		$formSubmited =
$app->input->post->get('form_submited');

		$access = $this->getUserStateFromRequest($this->context .
'.filter.access', 'filter_access', 0, 'int');
		if ($formSubmited)
		{
			$access = $app->input->post->get('access');
			$this->setState('filter.access', $access);
		}

		$published = $this->getUserStateFromRequest($this->context .
'.filter.published', 'filter_published', '');
		$this->setState('filter.published', $published);

		$created_by = $this->getUserStateFromRequest($this->context .
'.filter.created_by', 'filter_created_by',
'');
		$this->setState('filter.created_by', $created_by);

		$created = $this->getUserStateFromRequest($this->context .
'.filter.created', 'filter_created');
		$this->setState('filter.created', $created);

		$sorting = $this->getUserStateFromRequest($this->context .
'.filter.sorting', 'filter_sorting', 0,
'int');
		$this->setState('filter.sorting', $sorting);

		$search = $this->getUserStateFromRequest($this->context .
'.filter.search', 'filter_search');
		$this->setState('filter.search', $search);

		$appointment = $this->getUserStateFromRequest($this->context .
'.filter.appointment', 'filter_appointment');
		if ($formSubmited)
		{
			$appointment = $app->input->post->get('appointment');
			$this->setState('filter.appointment', $appointment);
		}

		// List state information.
		parent::populateState($ordering, $direction);
	}
	
	/**
	 * Method to get an array of data items.
	 *
	 * @return  mixed  An array of data items on success, false on failure.
	 */
	public function getItems()
	{
		// check in items
		$this->checkInNow();

		// load parent items
		$items = parent::getItems();
        
		// return items
		return $items;
	}
	
	/**
	 * Method to build an SQL query to load the list data.
	 *
	 * @return	string	An SQL query
	 */
	protected function getListQuery()
	{
		// Get the user object.
		$user = JFactory::getUser();
		// Create a new query object.
		$db = JFactory::getDBO();
		$query = $db->getQuery(true);

		// Select some fields
		$query->select('a.*');

		// From the reservation_item table
		$query->from($db->quoteName('#__reservation_appointment',
'a'));

		// From the reservation_consultant table.
		$query->select($db->quoteName('g.id','doctorid_id'));
		$query->join('LEFT',
$db->quoteName('#__reservation_consultant', 'g') .
' ON (' . $db->quoteName('a.doctorid') . ' =
' . $db->quoteName('g.id') . ')');

		// Filter by published state
		$published = $this->getState('filter.published');
		if (is_numeric($published))
		{
			$query->where('a.published = ' . (int) $published);
		}
		elseif ($published === '')
		{
			$query->where('(a.published = 0 OR a.published = 1)');
		}

		// Join over the asset groups.
		$query->select('ag.title AS access_level');
		$query->join('LEFT', '#__viewlevels AS ag ON ag.id =
a.access');
		// Filter by access level.
		$_access = $this->getState('filter.access');
		if ($_access && is_numeric($_access))
		{
			$query->where('a.access = ' . (int) $_access);
		}
		elseif (ReservationHelper::checkArray($_access))
		{
			// Secure the array for the query
			$_access = ArrayHelper::toInteger($_access);
			// Filter by the Access Array.
			$query->where('a.access IN (' . implode(',',
$_access) . ')');
		}
		// Implement View Level Access
		if (!$user->authorise('core.options',
'com_reservation'))
		{
			$groups = implode(',', $user->getAuthorisedViewLevels());
			$query->where('a.access IN (' . $groups . ')');
		}
		// Filter by search.
		$search = $this->getState('filter.search');
		if (!empty($search))
		{
			if (stripos($search, 'id:') === 0)
			{
				$query->where('a.id = ' . (int) substr($search, 3));
			}
			else
			{
				$search = $db->quote('%' . $db->escape($search) .
'%');
				$query->where('(a.appointment LIKE
'.$search.')');
			}
		}


		// Add the list ordering clause.
		$orderCol = $this->state->get('list.ordering',
'a.id');
		$orderDirn = $this->state->get('list.direction',
'desc');
		if ($orderCol != '')
		{
			$query->order($db->escape($orderCol . ' ' .
$orderDirn));
		}

		return $query;
	}

	/**
	 * Method to get list export data.
	 *
	 * @param   array  $pks  The ids of the items to get
	 * @param   JUser  $user  The user making the request
	 *
	 * @return mixed  An array of data items on success, false on failure.
	 */
	public function getExportData($pks, $user = null)
	{
		// setup the query
		if (($pks_size = ReservationHelper::checkArray($pks)) !== false ||
'bulk' === $pks)
		{
			// Set a value to know this is export method. (USE IN CUSTOM CODE TO
ALTER OUTCOME)
			$_export = true;
			// Get the user object if not set.
			if (!isset($user) || !ReservationHelper::checkObject($user))
			{
				$user = JFactory::getUser();
			}
			// Create a new query object.
			$db = JFactory::getDBO();
			$query = $db->getQuery(true);

			// Select some fields
			$query->select('a.*');

			// From the reservation_appointment table
			$query->from($db->quoteName('#__reservation_appointment',
'a'));
			// The bulk export path
			if ('bulk' === $pks)
			{
				$query->where('a.id > 0');
			}
			// A large array of ID's will not work out well
			elseif ($pks_size > 500)
			{
				// Use lowest ID
				$query->where('a.id >= ' . (int) min($pks));
				// Use highest ID
				$query->where('a.id <= ' . (int) max($pks));
			}
			// The normal default path
			else
			{
				$query->where('a.id IN (' . implode(',',$pks) .
')');
			}
			// Implement View Level Access
			if (!$user->authorise('core.options',
'com_reservation'))
			{
				$groups = implode(',', $user->getAuthorisedViewLevels());
				$query->where('a.access IN (' . $groups . ')');
			}

			// Order the results by ordering
			$query->order('a.ordering  ASC');

			// Load the items
			$db->setQuery($query);
			$db->execute();
			if ($db->getNumRows())
			{
				$items = $db->loadObjectList();

				// Set values to display correctly.
				if (ReservationHelper::checkArray($items))
				{
					foreach ($items as $nr => &$item)
					{
						// unset the values we don't want exported.
						unset($item->asset_id);
						unset($item->checked_out);
						unset($item->checked_out_time);
					}
				}
				// Add headers to items array.
				$headers = $this->getExImPortHeaders();
				if (ReservationHelper::checkObject($headers))
				{
					array_unshift($items,$headers);
				}
				return $items;
			}
		}
		return false;
	}

	/**
	* Method to get header.
	*
	* @return mixed  An array of data items on success, false on failure.
	*/
	public function getExImPortHeaders()
	{
		// Get a db connection.
		$db = JFactory::getDbo();
		// get the columns
		$columns =
$db->getTableColumns("#__reservation_appointment");
		if (ReservationHelper::checkArray($columns))
		{
			// remove the headers you don't import/export.
			unset($columns['asset_id']);
			unset($columns['checked_out']);
			unset($columns['checked_out_time']);
			$headers = new stdClass();
			foreach ($columns as $column => $type)
			{
				$headers->{$column} = $column;
			}
			return $headers;
		}
		return false;
	}
	
	/**
	 * Method to get a store id based on model configuration state.
	 *
	 * @return  string  A store id.
	 *
	 */
	protected function getStoreId($id = '')
	{
		// Compile the store id.
		$id .= ':' . $this->getState('filter.id');
		$id .= ':' . $this->getState('filter.search');
		$id .= ':' . $this->getState('filter.published');
		// Check if the value is an array
		$_access = $this->getState('filter.access');
		if (ReservationHelper::checkArray($_access))
		{
			$id .= ':' . implode(':', $_access);
		}
		// Check if this is only an number or string
		elseif (is_numeric($_access)
		 || ReservationHelper::checkString($_access))
		{
			$id .= ':' . $_access;
		}
		$id .= ':' . $this->getState('filter.ordering');
		$id .= ':' . $this->getState('filter.created_by');
		$id .= ':' .
$this->getState('filter.modified_by');
		$id .= ':' .
$this->getState('filter.appointment');

		return parent::getStoreId($id);
	}

	/**
	 * Build an SQL query to checkin all items left checked out longer then a
set time.
	 *
	 * @return  a bool
	 *
	 */
	protected function checkInNow()
	{
		// Get set check in time
		$time =
JComponentHelper::getParams('com_reservation')->get('check_in');

		if ($time)
		{

			// Get a db connection.
			$db = JFactory::getDbo();
			// reset query
			$query = $db->getQuery(true);
			$query->select('*');
			$query->from($db->quoteName('#__reservation_appointment'));
			$db->setQuery($query);
			$db->execute();
			if ($db->getNumRows())
			{
				// Get Yesterdays date
				$date = JFactory::getDate()->modify($time)->toSql();
				// reset query
				$query = $db->getQuery(true);

				// Fields to update.
				$fields = array(
					$db->quoteName('checked_out_time') .
'=\'0000-00-00 00:00:00\'',
					$db->quoteName('checked_out') . '=0'
				);

				// Conditions for which records should be updated.
				$conditions = array(
					$db->quoteName('checked_out') . '!=0', 
					$db->quoteName('checked_out_time') .
'<\''.$date.'\''
				);

				// Check table
				$query->update($db->quoteName('#__reservation_appointment'))->set($fields)->where($conditions);


				$db->setQuery($query);

				$db->execute();
			}
		}

		return false;
	}
}
PK4~�[���n#U#Umodels/bbbclass.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		bbbclass.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Registry\Registry;
use Joomla\String\StringHelper;
use Joomla\Utilities\ArrayHelper;

/**
 * Reservation Bbbclass Model
 */
class ReservationModelBbbclass extends JModelAdmin
{
	/**
	 * The tab layout fields array.
	 *
	 * @var      array
	 */
	protected $tabLayoutFields = array(
		'details' => array(
			'left' => array(
				'name',
				'planid',
				'seid',
				'exmid',
				'inmid',
				'mpass',
				'vpass'
			)
		)
	);

	/**
	 * @var        string    The prefix to use with controller messages.
	 * @since   1.6
	 */
	protected $text_prefix = 'COM_RESERVATION';

	/**
	 * The type alias for this content type.
	 *
	 * @var      string
	 * @since    3.2
	 */
	public $typeAlias = 'com_reservation.bbbclass';

	/**
	 * Returns a Table object, always creating it
	 *
	 * @param   type    $type    The table type to instantiate
	 * @param   string  $prefix  A prefix for the table class name. Optional.
	 * @param   array   $config  Configuration array for model. Optional.
	 *
	 * @return  JTable  A database object
	 *
	 * @since   1.6
	 */
	public function getTable($type = 'bbbclass', $prefix =
'ReservationTable', $config = array())
	{
		// add table path for when model gets used from other component
		$this->addTablePath(JPATH_ADMINISTRATOR .
'/components/com_reservation/tables');
		// get instance of the table
		return JTable::getInstance($type, $prefix, $config);
	}
    
	/**
	 * Method to get a single record.
	 *
	 * @param   integer  $pk  The id of the primary key.
	 *
	 * @return  mixed  Object on success, false on failure.
	 *
	 * @since   1.6
	 */
	public function getItem($pk = null)
	{
		if ($item = parent::getItem($pk))
		{
			if (!empty($item->params) && !is_array($item->params))
			{
				// Convert the params field to an array.
				$registry = new Registry;
				$registry->loadString($item->params);
				$item->params = $registry->toArray();
			}

			if (!empty($item->metadata))
			{
				// Convert the metadata field to an array.
				$registry = new Registry;
				$registry->loadString($item->metadata);
				$item->metadata = $registry->toArray();
			}
		}

		return $item;
	}

	/**
	 * Method to get the record form.
	 *
	 * @param   array    $data      Data for the form.
	 * @param   boolean  $loadData  True if the form is to load its own data
(default case), false if not.
	 * @param   array    $options   Optional array of options for the form
creation.
	 *
	 * @return  mixed  A JForm object on success, false on failure
	 *
	 * @since   1.6
	 */
	public function getForm($data = array(), $loadData = true, $options =
array('control' => 'jform'))
	{
		// set load data option
		$options['load_data'] = $loadData;
		// check if xpath was set in options
		$xpath = false;
		if (isset($options['xpath']))
		{
			$xpath = $options['xpath'];
			unset($options['xpath']);
		}
		// check if clear form was set in options
		$clear = false;
		if (isset($options['clear']))
		{
			$clear = $options['clear'];
			unset($options['clear']);
		}

		// Get the form.
		$form = $this->loadForm('com_reservation.bbbclass',
'bbbclass', $options, $clear, $xpath);

		if (empty($form))
		{
			return false;
		}

		$jinput = JFactory::getApplication()->input;

		// The front end calls this model and uses a_id to avoid id clashes so we
need to check for that first.
		if ($jinput->get('a_id'))
		{
			$id = $jinput->get('a_id', 0, 'INT');
		}
		// The back end uses id so we use that the rest of the time and set it to
0 by default.
		else
		{
			$id = $jinput->get('id', 0, 'INT');
		}

		$user = JFactory::getUser();

		// Check for existing item.
		// Modify the form based on Edit State access controls.
		if ($id != 0 &&
(!$user->authorise('core.edit.state',
'com_reservation.bbbclass.' . (int) $id))
			|| ($id == 0 &&
!$user->authorise('core.edit.state',
'com_reservation')))
		{
			// Disable fields for display.
			$form->setFieldAttribute('ordering', 'disabled',
'true');
			$form->setFieldAttribute('published', 'disabled',
'true');
			// Disable fields while saving.
			$form->setFieldAttribute('ordering', 'filter',
'unset');
			$form->setFieldAttribute('published', 'filter',
'unset');
		}
		// If this is a new item insure the greated by is set.
		if (0 == $id)
		{
			// Set the created_by to this user
			$form->setValue('created_by', null, $user->id);
		}
		// Modify the form based on Edit Creaded By access controls.
		if (!$user->authorise('core.edit.created_by',
'com_reservation'))
		{
			// Disable fields for display.
			$form->setFieldAttribute('created_by',
'disabled', 'true');
			// Disable fields for display.
			$form->setFieldAttribute('created_by',
'readonly', 'true');
			// Disable fields while saving.
			$form->setFieldAttribute('created_by', 'filter',
'unset');
		}
		// Modify the form based on Edit Creaded Date access controls.
		if (!$user->authorise('core.edit.created',
'com_reservation'))
		{
			// Disable fields for display.
			$form->setFieldAttribute('created', 'disabled',
'true');
			// Disable fields while saving.
			$form->setFieldAttribute('created', 'filter',
'unset');
		}
		// Only load these values if no id is found
		if (0 == $id)
		{
			// Set redirected view name
			$redirectedView = $jinput->get('ref', null,
'STRING');
			// Set field name (or fall back to view name)
			$redirectedField = $jinput->get('field', $redirectedView,
'STRING');
			// Set redirected view id
			$redirectedId = $jinput->get('refid', 0, 'INT');
			// Set field id (or fall back to redirected view id)
			$redirectedValue = $jinput->get('field_id', $redirectedId,
'INT');
			if (0 != $redirectedValue && $redirectedField)
			{
				// Now set the local-redirected field default value
				$form->setValue($redirectedField, null, $redirectedValue);
			}
		}
		return $form;
	}

	/**
	 * Method to get the script that have to be included on the form
	 *
	 * @return string	script files
	 */
	public function getScript()
	{
		return 'media/com_reservation/js/bbbclass.js';
	}
    
	/**
	 * Method to test whether a record can be deleted.
	 *
	 * @param   object  $record  A record object.
	 *
	 * @return  boolean  True if allowed to delete the record. Defaults to the
permission set in the component.
	 *
	 * @since   1.6
	 */
	protected function canDelete($record)
	{
		if (!empty($record->id))
		{
			if ($record->published != -2)
			{
				return;
			}

			$user = JFactory::getUser();
			// The record has been set. Check the record permissions.
			return $user->authorise('core.delete',
'com_reservation.bbbclass.' . (int) $record->id);
		}
		return false;
	}

	/**
	 * Method to test whether a record can have its state edited.
	 *
	 * @param   object  $record  A record object.
	 *
	 * @return  boolean  True if allowed to change the state of the record.
Defaults to the permission set in the component.
	 *
	 * @since   1.6
	 */
	protected function canEditState($record)
	{
		$user = JFactory::getUser();
		$recordId = (!empty($record->id)) ? $record->id : 0;

		if ($recordId)
		{
			// The record has been set. Check the record permissions.
			$permission = $user->authorise('core.edit.state',
'com_reservation.bbbclass.' . (int) $recordId);
			if (!$permission && !is_null($permission))
			{
				return false;
			}
		}
		// In the absense of better information, revert to the component
permissions.
		return parent::canEditState($record);
	}
    
	/**
	 * Method override to check if you can edit an existing record.
	 *
	 * @param	array	$data	An array of input data.
	 * @param	string	$key	The name of the key for the primary key.
	 *
	 * @return	boolean
	 * @since	2.5
	 */
	protected function allowEdit($data = array(), $key = 'id')
	{
		// Check specific edit permission then general edit permission.

		return JFactory::getUser()->authorise('core.edit',
'com_reservation.bbbclass.'. ((int) isset($data[$key]) ?
$data[$key] : 0)) or parent::allowEdit($data, $key);
	}
    
	/**
	 * Prepare and sanitise the table data prior to saving.
	 *
	 * @param   JTable  $table  A JTable object.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function prepareTable($table)
	{
		$date = JFactory::getDate();
		$user = JFactory::getUser();
		
		if (isset($table->name))
		{
			$table->name = htmlspecialchars_decode($table->name, ENT_QUOTES);
		}
		
		if (isset($table->alias) && empty($table->alias))
		{
			$table->generateAlias();
		}
		
		if (empty($table->id))
		{
			$table->created = $date->toSql();
			// set the user
			if ($table->created_by == 0 || empty($table->created_by))
			{
				$table->created_by = $user->id;
			}
			// Set ordering to the last item if not set
			if (empty($table->ordering))
			{
				$db = JFactory::getDbo();
				$query = $db->getQuery(true)
					->select('MAX(ordering)')
					->from($db->quoteName('#__reservation_bbbclass'));
				$db->setQuery($query);
				$max = $db->loadResult();

				$table->ordering = $max + 1;
			}
		}
		else
		{
			$table->modified = $date->toSql();
			$table->modified_by = $user->id;
		}
        
		if (!empty($table->id))
		{
			// Increment the items version number.
			$table->version++;
		}
	}

	/**
	 * Method to get the data that should be injected in the form.
	 *
	 * @return  mixed  The data for the form.
	 *
	 * @since   1.6
	 */
	protected function loadFormData() 
	{
		// Check the session for previously entered form data.
		$data =
JFactory::getApplication()->getUserState('com_reservation.edit.bbbclass.data',
array());

		if (empty($data))
		{
			$data = $this->getItem();
			// run the perprocess of the data
			$this->preprocessData('com_reservation.bbbclass', $data);
		}

		return $data;
	}

	/**
	 * Method to get the unique fields of this table.
	 *
	 * @return  mixed  An array of field names, boolean false if none is set.
	 *
	 * @since   3.0
	 */
	protected function getUniqueFields()
	{
		return false;
	}
	
	/**
	 * Method to delete one or more records.
	 *
	 * @param   array  &$pks  An array of record primary keys.
	 *
	 * @return  boolean  True if successful, false if an error occurs.
	 *
	 * @since   12.2
	 */
	public function delete(&$pks)
	{
		if (!parent::delete($pks))
		{
			return false;
		}
		
		return true;
	}

	/**
	 * Method to change the published state of one or more records.
	 *
	 * @param   array    &$pks   A list of the primary keys to change.
	 * @param   integer  $value  The value of the published state.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   12.2
	 */
	public function publish(&$pks, $value = 1)
	{
		if (!parent::publish($pks, $value))
		{
			return false;
		}
		
		return true;
        }
    
	/**
	 * Method to perform batch operations on an item or a set of items.
	 *
	 * @param   array  $commands  An array of commands to perform.
	 * @param   array  $pks       An array of item ids.
	 * @param   array  $contexts  An array of item contexts.
	 *
	 * @return  boolean  Returns true on success, false on failure.
	 *
	 * @since   12.2
	 */
	public function batch($commands, $pks, $contexts)
	{
		// Sanitize ids.
		$pks = array_unique($pks);
		ArrayHelper::toInteger($pks);

		// Remove any values of zero.
		if (array_search(0, $pks, true))
		{
			unset($pks[array_search(0, $pks, true)]);
		}

		if (empty($pks))
		{
			$this->setError(JText::_('JGLOBAL_NO_ITEM_SELECTED'));
			return false;
		}

		$done = false;

		// Set some needed variables.
		$this->user			= JFactory::getUser();
		$this->table			= $this->getTable();
		$this->tableClassName		= get_class($this->table);
		$this->contentType		= new JUcmType;
		$this->type			=
$this->contentType->getTypeByTable($this->tableClassName);
		$this->canDo			= ReservationHelper::getActions('bbbclass');
		$this->batchSet			= true;

		if (!$this->canDo->get('core.batch'))
		{
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_INSUFFICIENT_BATCH_INFORMATION'));
			return false;
		}
        
		if ($this->type == false)
		{
			$type = new JUcmType;
			$this->type = $type->getTypeByAlias($this->typeAlias);
		}

		$this->tagsObserver =
$this->table->getObserverOfClass('JTableObserverTags');

		if (!empty($commands['move_copy']))
		{
			$cmd = ArrayHelper::getValue($commands, 'move_copy',
'c');

			if ($cmd == 'c')
			{
				$result = $this->batchCopy($commands, $pks, $contexts);

				if (is_array($result))
				{
					foreach ($result as $old => $new)
					{
						$contexts[$new] = $contexts[$old];
					}
					$pks = array_values($result);
				}
				else
				{
					return false;
				}
			}
			elseif ($cmd == 'm' && !$this->batchMove($commands,
$pks, $contexts))
			{
				return false;
			}

			$done = true;
		}

		if (!$done)
		{
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_INSUFFICIENT_BATCH_INFORMATION'));

			return false;
		}

		// Clear the cache
		$this->cleanCache();

		return true;
	}

	/**
	 * Batch copy items to a new category or current.
	 *
	 * @param   integer  $values    The new values.
	 * @param   array    $pks       An array of row IDs.
	 * @param   array    $contexts  An array of item contexts.
	 *
	 * @return  mixed  An array of new IDs on success, boolean false on
failure.
	 *
	 * @since 12.2
	 */
	protected function batchCopy($values, $pks, $contexts)
	{
		if (empty($this->batchSet))
		{
			// Set some needed variables.
			$this->user 		= JFactory::getUser();
			$this->table 		= $this->getTable();
			$this->tableClassName	= get_class($this->table);
			$this->canDo		= ReservationHelper::getActions('bbbclass');
		}

		if (!$this->canDo->get('core.create') ||
!$this->canDo->get('core.batch'))
		{
			return false;
		}

		// get list of unique fields
		$uniqueFields = $this->getUniqueFields();
		// remove move_copy from array
		unset($values['move_copy']);

		// make sure published is set
		if (!isset($values['published']))
		{
			$values['published'] = 0;
		}
		elseif (isset($values['published']) &&
!$this->canDo->get('core.edit.state'))
		{
				$values['published'] = 0;
		}

		$newIds = array();
		// Parent exists so let's proceed
		while (!empty($pks))
		{
			// Pop the first ID off the stack
			$pk = array_shift($pks);

			$this->table->reset();

			// only allow copy if user may edit this item.
			if (!$this->user->authorise('core.edit',
$contexts[$pk]))
			{
				// Not fatal error
				$this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND',
$pk));
				continue;
			}

			// Check that the row actually exists
			if (!$this->table->load($pk))
			{
				if ($error = $this->table->getError())
				{
					// Fatal error
					$this->setError($error);
					return false;
				}
				else
				{
					// Not fatal error
					$this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND',
$pk));
					continue;
				}
			}

			// Only for strings
			if (ReservationHelper::checkString($this->table->name) &&
!is_numeric($this->table->name))
			{
				$this->table->name =
$this->generateUnique('name',$this->table->name);
			}

			// insert all set values
			if (ReservationHelper::checkArray($values))
			{
				foreach ($values as $key => $value)
				{
					if (strlen($value) > 0 && isset($this->table->$key))
					{
						$this->table->$key = $value;
					}
				}
			}

			// update all unique fields
			if (ReservationHelper::checkArray($uniqueFields))
			{
				foreach ($uniqueFields as $uniqueField)
				{
					$this->table->$uniqueField =
$this->generateUnique($uniqueField,$this->table->$uniqueField);
				}
			}

			// Reset the ID because we are making a copy
			$this->table->id = 0;

			// TODO: Deal with ordering?
			// $this->table->ordering = 1;

			// Check the row.
			if (!$this->table->check())
			{
				$this->setError($this->table->getError());

				return false;
			}

			if (!empty($this->type))
			{
				$this->createTagsHelper($this->tagsObserver, $this->type, $pk,
$this->typeAlias, $this->table);
			}

			// Store the row.
			if (!$this->table->store())
			{
				$this->setError($this->table->getError());

				return false;
			}

			// Get the new item ID
			$newId = $this->table->get('id');

			// Add the new ID to the array
			$newIds[$pk] = $newId;
		}

		// Clean the cache
		$this->cleanCache();

		return $newIds;
	}

	/**
	 * Batch move items to a new category
	 *
	 * @param   integer  $value     The new category ID.
	 * @param   array    $pks       An array of row IDs.
	 * @param   array    $contexts  An array of item contexts.
	 *
	 * @return  boolean  True if successful, false otherwise and internal
error is set.
	 *
	 * @since 12.2
	 */
	protected function batchMove($values, $pks, $contexts)
	{
		if (empty($this->batchSet))
		{
			// Set some needed variables.
			$this->user		= JFactory::getUser();
			$this->table		= $this->getTable();
			$this->tableClassName	= get_class($this->table);
			$this->canDo		= ReservationHelper::getActions('bbbclass');
		}

		if (!$this->canDo->get('core.edit') &&
!$this->canDo->get('core.batch'))
		{
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT'));
			return false;
		}

		// make sure published only updates if user has the permission.
		if (isset($values['published']) &&
!$this->canDo->get('core.edit.state'))
		{
			unset($values['published']);
		}
		// remove move_copy from array
		unset($values['move_copy']);

		// Parent exists so we proceed
		foreach ($pks as $pk)
		{
			if (!$this->user->authorise('core.edit',
$contexts[$pk]))
			{
				$this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT'));
				return false;
			}

			// Check that the row actually exists
			if (!$this->table->load($pk))
			{
				if ($error = $this->table->getError())
				{
					// Fatal error
					$this->setError($error);
					return false;
				}
				else
				{
					// Not fatal error
					$this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND',
$pk));
					continue;
				}
			}

			// insert all set values.
			if (ReservationHelper::checkArray($values))
			{
				foreach ($values as $key => $value)
				{
					// Do special action for access.
					if ('access' === $key && strlen($value) > 0)
					{
						$this->table->$key = $value;
					}
					elseif (strlen($value) > 0 &&
isset($this->table->$key))
					{
						$this->table->$key = $value;
					}
				}
			}


			// Check the row.
			if (!$this->table->check())
			{
				$this->setError($this->table->getError());

				return false;
			}

			if (!empty($this->type))
			{
				$this->createTagsHelper($this->tagsObserver, $this->type, $pk,
$this->typeAlias, $this->table);
			}

			// Store the row.
			if (!$this->table->store())
			{
				$this->setError($this->table->getError());

				return false;
			}
		}

		// Clean the cache
		$this->cleanCache();

		return true;
	}
	
	/**
	 * Method to save the form data.
	 *
	 * @param   array  $data  The form data.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   1.6
	 */
	public function save($data)
	{
		$input	= JFactory::getApplication()->input;
		$filter	= JFilterInput::getInstance();
        
		// set the metadata to the Item Data
		if (isset($data['metadata']) &&
isset($data['metadata']['author']))
		{
			$data['metadata']['author'] =
$filter->clean($data['metadata']['author'],
'TRIM');
            
			$metadata = new JRegistry;
			$metadata->loadArray($data['metadata']);
			$data['metadata'] = (string) $metadata;
		}
        
		// Set the Params Items to data
		if (isset($data['params']) &&
is_array($data['params']))
		{
			$params = new JRegistry;
			$params->loadArray($data['params']);
			$data['params'] = (string) $params;
		}

		// Alter the unique field for save as copy
		if ($input->get('task') === 'save2copy')
		{
			// Automatic handling of other unique fields
			$uniqueFields = $this->getUniqueFields();
			if (ReservationHelper::checkArray($uniqueFields))
			{
				foreach ($uniqueFields as $uniqueField)
				{
					$data[$uniqueField] =
$this->generateUnique($uniqueField,$data[$uniqueField]);
				}
			}
		}
		
		if (parent::save($data))
		{
			return true;
		}
		return false;
	}
	
	/**
	 * Method to generate a unique value.
	 *
	 * @param   string  $field name.
	 * @param   string  $value data.
	 *
	 * @return  string  New value.
	 *
	 * @since   3.0
	 */
	protected function generateUnique($field,$value)
	{

		// set field value unique
		$table = $this->getTable();

		while ($table->load(array($field => $value)))
		{
			$value = StringHelper::increment($value);
		}

		return $value;
	}

	/**
	 * Method to change the title
	 *
	 * @param   string   $title   The title.
	 *
	 * @return	array  Contains the modified title and alias.
	 *
	 */
	protected function _generateNewTitle($title)
	{

		// Alter the title
		$table = $this->getTable();

		while ($table->load(array('title' => $title)))
		{
			$title = StringHelper::increment($title);
		}

		return $title;
	}
}
PK4~�[X�&]-]-models/bbbclasses.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		bbbclasses.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Utilities\ArrayHelper;

/**
 * Bbbclasses Model
 */
class ReservationModelBbbclasses extends JModelList
{
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
        {
			$config['filter_fields'] = array(
				'a.id','id',
				'a.published','published',
				'a.access','access',
				'a.ordering','ordering',
				'a.created_by','created_by',
				'a.modified_by','modified_by',
				'a.name','name',
				'g.id','planid'
			);
		}

		parent::__construct($config);
	}

	/**
	 * Method to auto-populate the model state.
	 *
	 * Note. Calling getState in this method will result in recursion.
	 *
	 * @param   string  $ordering   An optional ordering field.
	 * @param   string  $direction  An optional direction (asc|desc).
	 *
	 * @return  void
	 *
	 */
	protected function populateState($ordering = null, $direction = null)
	{
		$app = JFactory::getApplication();

		// Adjust the context to support modal layouts.
		if ($layout = $app->input->get('layout'))
		{
			$this->context .= '.' . $layout;
		}

		// Check if the form was submitted
		$formSubmited =
$app->input->post->get('form_submited');

		$access = $this->getUserStateFromRequest($this->context .
'.filter.access', 'filter_access', 0, 'int');
		if ($formSubmited)
		{
			$access = $app->input->post->get('access');
			$this->setState('filter.access', $access);
		}

		$published = $this->getUserStateFromRequest($this->context .
'.filter.published', 'filter_published', '');
		$this->setState('filter.published', $published);

		$created_by = $this->getUserStateFromRequest($this->context .
'.filter.created_by', 'filter_created_by',
'');
		$this->setState('filter.created_by', $created_by);

		$created = $this->getUserStateFromRequest($this->context .
'.filter.created', 'filter_created');
		$this->setState('filter.created', $created);

		$sorting = $this->getUserStateFromRequest($this->context .
'.filter.sorting', 'filter_sorting', 0,
'int');
		$this->setState('filter.sorting', $sorting);

		$search = $this->getUserStateFromRequest($this->context .
'.filter.search', 'filter_search');
		$this->setState('filter.search', $search);

		$name = $this->getUserStateFromRequest($this->context .
'.filter.name', 'filter_name');
		if ($formSubmited)
		{
			$name = $app->input->post->get('name');
			$this->setState('filter.name', $name);
		}

		$planid = $this->getUserStateFromRequest($this->context .
'.filter.planid', 'filter_planid');
		if ($formSubmited)
		{
			$planid = $app->input->post->get('planid');
			$this->setState('filter.planid', $planid);
		}

		// List state information.
		parent::populateState($ordering, $direction);
	}
	
	/**
	 * Method to get an array of data items.
	 *
	 * @return  mixed  An array of data items on success, false on failure.
	 */
	public function getItems()
	{
		// check in items
		$this->checkInNow();

		// load parent items
		$items = parent::getItems();
        
		// return items
		return $items;
	}
	
	/**
	 * Method to build an SQL query to load the list data.
	 *
	 * @return	string	An SQL query
	 */
	protected function getListQuery()
	{
		// Get the user object.
		$user = JFactory::getUser();
		// Create a new query object.
		$db = JFactory::getDBO();
		$query = $db->getQuery(true);

		// Select some fields
		$query->select('a.*');

		// From the reservation_item table
		$query->from($db->quoteName('#__reservation_bbbclass',
'a'));

		// From the reservation_plan table.
		$query->select($db->quoteName('g.id','planid_id'));
		$query->join('LEFT',
$db->quoteName('#__reservation_plan', 'g') . '
ON (' . $db->quoteName('a.planid') . ' = ' .
$db->quoteName('g.id') . ')');

		// Filter by published state
		$published = $this->getState('filter.published');
		if (is_numeric($published))
		{
			$query->where('a.published = ' . (int) $published);
		}
		elseif ($published === '')
		{
			$query->where('(a.published = 0 OR a.published = 1)');
		}

		// Join over the asset groups.
		$query->select('ag.title AS access_level');
		$query->join('LEFT', '#__viewlevels AS ag ON ag.id =
a.access');
		// Filter by access level.
		$_access = $this->getState('filter.access');
		if ($_access && is_numeric($_access))
		{
			$query->where('a.access = ' . (int) $_access);
		}
		elseif (ReservationHelper::checkArray($_access))
		{
			// Secure the array for the query
			$_access = ArrayHelper::toInteger($_access);
			// Filter by the Access Array.
			$query->where('a.access IN (' . implode(',',
$_access) . ')');
		}
		// Implement View Level Access
		if (!$user->authorise('core.options',
'com_reservation'))
		{
			$groups = implode(',', $user->getAuthorisedViewLevels());
			$query->where('a.access IN (' . $groups . ')');
		}
		// Filter by search.
		$search = $this->getState('filter.search');
		if (!empty($search))
		{
			if (stripos($search, 'id:') === 0)
			{
				$query->where('a.id = ' . (int) substr($search, 3));
			}
			else
			{
				$search = $db->quote('%' . $db->escape($search) .
'%');
				$query->where('(a.name LIKE '.$search.' OR a.exmid
LIKE '.$search.')');
			}
		}


		// Add the list ordering clause.
		$orderCol = $this->state->get('list.ordering',
'a.id');
		$orderDirn = $this->state->get('list.direction',
'desc');
		if ($orderCol != '')
		{
			$query->order($db->escape($orderCol . ' ' .
$orderDirn));
		}

		return $query;
	}

	/**
	 * Method to get list export data.
	 *
	 * @param   array  $pks  The ids of the items to get
	 * @param   JUser  $user  The user making the request
	 *
	 * @return mixed  An array of data items on success, false on failure.
	 */
	public function getExportData($pks, $user = null)
	{
		// setup the query
		if (($pks_size = ReservationHelper::checkArray($pks)) !== false ||
'bulk' === $pks)
		{
			// Set a value to know this is export method. (USE IN CUSTOM CODE TO
ALTER OUTCOME)
			$_export = true;
			// Get the user object if not set.
			if (!isset($user) || !ReservationHelper::checkObject($user))
			{
				$user = JFactory::getUser();
			}
			// Create a new query object.
			$db = JFactory::getDBO();
			$query = $db->getQuery(true);

			// Select some fields
			$query->select('a.*');

			// From the reservation_bbbclass table
			$query->from($db->quoteName('#__reservation_bbbclass',
'a'));
			// The bulk export path
			if ('bulk' === $pks)
			{
				$query->where('a.id > 0');
			}
			// A large array of ID's will not work out well
			elseif ($pks_size > 500)
			{
				// Use lowest ID
				$query->where('a.id >= ' . (int) min($pks));
				// Use highest ID
				$query->where('a.id <= ' . (int) max($pks));
			}
			// The normal default path
			else
			{
				$query->where('a.id IN (' . implode(',',$pks) .
')');
			}
			// Implement View Level Access
			if (!$user->authorise('core.options',
'com_reservation'))
			{
				$groups = implode(',', $user->getAuthorisedViewLevels());
				$query->where('a.access IN (' . $groups . ')');
			}

			// Order the results by ordering
			$query->order('a.ordering  ASC');

			// Load the items
			$db->setQuery($query);
			$db->execute();
			if ($db->getNumRows())
			{
				$items = $db->loadObjectList();

				// Set values to display correctly.
				if (ReservationHelper::checkArray($items))
				{
					foreach ($items as $nr => &$item)
					{
						// unset the values we don't want exported.
						unset($item->asset_id);
						unset($item->checked_out);
						unset($item->checked_out_time);
					}
				}
				// Add headers to items array.
				$headers = $this->getExImPortHeaders();
				if (ReservationHelper::checkObject($headers))
				{
					array_unshift($items,$headers);
				}
				return $items;
			}
		}
		return false;
	}

	/**
	* Method to get header.
	*
	* @return mixed  An array of data items on success, false on failure.
	*/
	public function getExImPortHeaders()
	{
		// Get a db connection.
		$db = JFactory::getDbo();
		// get the columns
		$columns = $db->getTableColumns("#__reservation_bbbclass");
		if (ReservationHelper::checkArray($columns))
		{
			// remove the headers you don't import/export.
			unset($columns['asset_id']);
			unset($columns['checked_out']);
			unset($columns['checked_out_time']);
			$headers = new stdClass();
			foreach ($columns as $column => $type)
			{
				$headers->{$column} = $column;
			}
			return $headers;
		}
		return false;
	}
	
	/**
	 * Method to get a store id based on model configuration state.
	 *
	 * @return  string  A store id.
	 *
	 */
	protected function getStoreId($id = '')
	{
		// Compile the store id.
		$id .= ':' . $this->getState('filter.id');
		$id .= ':' . $this->getState('filter.search');
		$id .= ':' . $this->getState('filter.published');
		// Check if the value is an array
		$_access = $this->getState('filter.access');
		if (ReservationHelper::checkArray($_access))
		{
			$id .= ':' . implode(':', $_access);
		}
		// Check if this is only an number or string
		elseif (is_numeric($_access)
		 || ReservationHelper::checkString($_access))
		{
			$id .= ':' . $_access;
		}
		$id .= ':' . $this->getState('filter.ordering');
		$id .= ':' . $this->getState('filter.created_by');
		$id .= ':' .
$this->getState('filter.modified_by');
		$id .= ':' . $this->getState('filter.name');
		$id .= ':' . $this->getState('filter.planid');

		return parent::getStoreId($id);
	}

	/**
	 * Build an SQL query to checkin all items left checked out longer then a
set time.
	 *
	 * @return  a bool
	 *
	 */
	protected function checkInNow()
	{
		// Get set check in time
		$time =
JComponentHelper::getParams('com_reservation')->get('check_in');

		if ($time)
		{

			// Get a db connection.
			$db = JFactory::getDbo();
			// reset query
			$query = $db->getQuery(true);
			$query->select('*');
			$query->from($db->quoteName('#__reservation_bbbclass'));
			$db->setQuery($query);
			$db->execute();
			if ($db->getNumRows())
			{
				// Get Yesterdays date
				$date = JFactory::getDate()->modify($time)->toSql();
				// reset query
				$query = $db->getQuery(true);

				// Fields to update.
				$fields = array(
					$db->quoteName('checked_out_time') .
'=\'0000-00-00 00:00:00\'',
					$db->quoteName('checked_out') . '=0'
				);

				// Conditions for which records should be updated.
				$conditions = array(
					$db->quoteName('checked_out') . '!=0', 
					$db->quoteName('checked_out_time') .
'<\''.$date.'\''
				);

				// Check table
				$query->update($db->quoteName('#__reservation_bbbclass'))->set($fields)->where($conditions);


				$db->setQuery($query);

				$db->execute();
			}
		}

		return false;
	}
}
PK4~�[%P�T�Tmodels/capital.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		capital.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Registry\Registry;
use Joomla\String\StringHelper;
use Joomla\Utilities\ArrayHelper;

/**
 * Reservation Capital Model
 */
class ReservationModelCapital extends JModelAdmin
{
	/**
	 * The tab layout fields array.
	 *
	 * @var      array
	 */
	protected $tabLayoutFields = array(
		'details' => array(
			'left' => array(
				'name'
			),
			'right' => array(
				'capitalid'
			)
		)
	);

	/**
	 * @var        string    The prefix to use with controller messages.
	 * @since   1.6
	 */
	protected $text_prefix = 'COM_RESERVATION';

	/**
	 * The type alias for this content type.
	 *
	 * @var      string
	 * @since    3.2
	 */
	public $typeAlias = 'com_reservation.capital';

	/**
	 * Returns a Table object, always creating it
	 *
	 * @param   type    $type    The table type to instantiate
	 * @param   string  $prefix  A prefix for the table class name. Optional.
	 * @param   array   $config  Configuration array for model. Optional.
	 *
	 * @return  JTable  A database object
	 *
	 * @since   1.6
	 */
	public function getTable($type = 'capital', $prefix =
'ReservationTable', $config = array())
	{
		// add table path for when model gets used from other component
		$this->addTablePath(JPATH_ADMINISTRATOR .
'/components/com_reservation/tables');
		// get instance of the table
		return JTable::getInstance($type, $prefix, $config);
	}
    
	/**
	 * Method to get a single record.
	 *
	 * @param   integer  $pk  The id of the primary key.
	 *
	 * @return  mixed  Object on success, false on failure.
	 *
	 * @since   1.6
	 */
	public function getItem($pk = null)
	{
		if ($item = parent::getItem($pk))
		{
			if (!empty($item->params) && !is_array($item->params))
			{
				// Convert the params field to an array.
				$registry = new Registry;
				$registry->loadString($item->params);
				$item->params = $registry->toArray();
			}

			if (!empty($item->metadata))
			{
				// Convert the metadata field to an array.
				$registry = new Registry;
				$registry->loadString($item->metadata);
				$item->metadata = $registry->toArray();
			}
		}

		return $item;
	}

	/**
	 * Method to get the record form.
	 *
	 * @param   array    $data      Data for the form.
	 * @param   boolean  $loadData  True if the form is to load its own data
(default case), false if not.
	 * @param   array    $options   Optional array of options for the form
creation.
	 *
	 * @return  mixed  A JForm object on success, false on failure
	 *
	 * @since   1.6
	 */
	public function getForm($data = array(), $loadData = true, $options =
array('control' => 'jform'))
	{
		// set load data option
		$options['load_data'] = $loadData;
		// check if xpath was set in options
		$xpath = false;
		if (isset($options['xpath']))
		{
			$xpath = $options['xpath'];
			unset($options['xpath']);
		}
		// check if clear form was set in options
		$clear = false;
		if (isset($options['clear']))
		{
			$clear = $options['clear'];
			unset($options['clear']);
		}

		// Get the form.
		$form = $this->loadForm('com_reservation.capital',
'capital', $options, $clear, $xpath);

		if (empty($form))
		{
			return false;
		}

		$jinput = JFactory::getApplication()->input;

		// The front end calls this model and uses a_id to avoid id clashes so we
need to check for that first.
		if ($jinput->get('a_id'))
		{
			$id = $jinput->get('a_id', 0, 'INT');
		}
		// The back end uses id so we use that the rest of the time and set it to
0 by default.
		else
		{
			$id = $jinput->get('id', 0, 'INT');
		}

		$user = JFactory::getUser();

		// Check for existing item.
		// Modify the form based on Edit State access controls.
		if ($id != 0 &&
(!$user->authorise('core.edit.state',
'com_reservation.capital.' . (int) $id))
			|| ($id == 0 &&
!$user->authorise('core.edit.state',
'com_reservation')))
		{
			// Disable fields for display.
			$form->setFieldAttribute('ordering', 'disabled',
'true');
			$form->setFieldAttribute('published', 'disabled',
'true');
			// Disable fields while saving.
			$form->setFieldAttribute('ordering', 'filter',
'unset');
			$form->setFieldAttribute('published', 'filter',
'unset');
		}
		// If this is a new item insure the greated by is set.
		if (0 == $id)
		{
			// Set the created_by to this user
			$form->setValue('created_by', null, $user->id);
		}
		// Modify the form based on Edit Creaded By access controls.
		if (!$user->authorise('core.edit.created_by',
'com_reservation'))
		{
			// Disable fields for display.
			$form->setFieldAttribute('created_by',
'disabled', 'true');
			// Disable fields for display.
			$form->setFieldAttribute('created_by',
'readonly', 'true');
			// Disable fields while saving.
			$form->setFieldAttribute('created_by', 'filter',
'unset');
		}
		// Modify the form based on Edit Creaded Date access controls.
		if (!$user->authorise('core.edit.created',
'com_reservation'))
		{
			// Disable fields for display.
			$form->setFieldAttribute('created', 'disabled',
'true');
			// Disable fields while saving.
			$form->setFieldAttribute('created', 'filter',
'unset');
		}
		// Only load these values if no id is found
		if (0 == $id)
		{
			// Set redirected view name
			$redirectedView = $jinput->get('ref', null,
'STRING');
			// Set field name (or fall back to view name)
			$redirectedField = $jinput->get('field', $redirectedView,
'STRING');
			// Set redirected view id
			$redirectedId = $jinput->get('refid', 0, 'INT');
			// Set field id (or fall back to redirected view id)
			$redirectedValue = $jinput->get('field_id', $redirectedId,
'INT');
			if (0 != $redirectedValue && $redirectedField)
			{
				// Now set the local-redirected field default value
				$form->setValue($redirectedField, null, $redirectedValue);
			}
		}
		return $form;
	}

	/**
	 * Method to get the script that have to be included on the form
	 *
	 * @return string	script files
	 */
	public function getScript()
	{
		return 'media/com_reservation/js/capital.js';
	}
    
	/**
	 * Method to test whether a record can be deleted.
	 *
	 * @param   object  $record  A record object.
	 *
	 * @return  boolean  True if allowed to delete the record. Defaults to the
permission set in the component.
	 *
	 * @since   1.6
	 */
	protected function canDelete($record)
	{
		if (!empty($record->id))
		{
			if ($record->published != -2)
			{
				return;
			}

			$user = JFactory::getUser();
			// The record has been set. Check the record permissions.
			return $user->authorise('core.delete',
'com_reservation.capital.' . (int) $record->id);
		}
		return false;
	}

	/**
	 * Method to test whether a record can have its state edited.
	 *
	 * @param   object  $record  A record object.
	 *
	 * @return  boolean  True if allowed to change the state of the record.
Defaults to the permission set in the component.
	 *
	 * @since   1.6
	 */
	protected function canEditState($record)
	{
		$user = JFactory::getUser();
		$recordId = (!empty($record->id)) ? $record->id : 0;

		if ($recordId)
		{
			// The record has been set. Check the record permissions.
			$permission = $user->authorise('core.edit.state',
'com_reservation.capital.' . (int) $recordId);
			if (!$permission && !is_null($permission))
			{
				return false;
			}
		}
		// In the absense of better information, revert to the component
permissions.
		return parent::canEditState($record);
	}
    
	/**
	 * Method override to check if you can edit an existing record.
	 *
	 * @param	array	$data	An array of input data.
	 * @param	string	$key	The name of the key for the primary key.
	 *
	 * @return	boolean
	 * @since	2.5
	 */
	protected function allowEdit($data = array(), $key = 'id')
	{
		// Check specific edit permission then general edit permission.

		return JFactory::getUser()->authorise('core.edit',
'com_reservation.capital.'. ((int) isset($data[$key]) ?
$data[$key] : 0)) or parent::allowEdit($data, $key);
	}
    
	/**
	 * Prepare and sanitise the table data prior to saving.
	 *
	 * @param   JTable  $table  A JTable object.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function prepareTable($table)
	{
		$date = JFactory::getDate();
		$user = JFactory::getUser();
		
		if (isset($table->name))
		{
			$table->name = htmlspecialchars_decode($table->name, ENT_QUOTES);
		}
		
		if (isset($table->alias) && empty($table->alias))
		{
			$table->generateAlias();
		}
		
		if (empty($table->id))
		{
			$table->created = $date->toSql();
			// set the user
			if ($table->created_by == 0 || empty($table->created_by))
			{
				$table->created_by = $user->id;
			}
			// Set ordering to the last item if not set
			if (empty($table->ordering))
			{
				$db = JFactory::getDbo();
				$query = $db->getQuery(true)
					->select('MAX(ordering)')
					->from($db->quoteName('#__reservation_capital'));
				$db->setQuery($query);
				$max = $db->loadResult();

				$table->ordering = $max + 1;
			}
		}
		else
		{
			$table->modified = $date->toSql();
			$table->modified_by = $user->id;
		}
        
		if (!empty($table->id))
		{
			// Increment the items version number.
			$table->version++;
		}
	}

	/**
	 * Method to get the data that should be injected in the form.
	 *
	 * @return  mixed  The data for the form.
	 *
	 * @since   1.6
	 */
	protected function loadFormData() 
	{
		// Check the session for previously entered form data.
		$data =
JFactory::getApplication()->getUserState('com_reservation.edit.capital.data',
array());

		if (empty($data))
		{
			$data = $this->getItem();
			// run the perprocess of the data
			$this->preprocessData('com_reservation.capital', $data);
		}

		return $data;
	}

	/**
	 * Method to get the unique fields of this table.
	 *
	 * @return  mixed  An array of field names, boolean false if none is set.
	 *
	 * @since   3.0
	 */
	protected function getUniqueFields()
	{
		return false;
	}
	
	/**
	 * Method to delete one or more records.
	 *
	 * @param   array  &$pks  An array of record primary keys.
	 *
	 * @return  boolean  True if successful, false if an error occurs.
	 *
	 * @since   12.2
	 */
	public function delete(&$pks)
	{
		if (!parent::delete($pks))
		{
			return false;
		}
		
		return true;
	}

	/**
	 * Method to change the published state of one or more records.
	 *
	 * @param   array    &$pks   A list of the primary keys to change.
	 * @param   integer  $value  The value of the published state.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   12.2
	 */
	public function publish(&$pks, $value = 1)
	{
		if (!parent::publish($pks, $value))
		{
			return false;
		}
		
		return true;
        }
    
	/**
	 * Method to perform batch operations on an item or a set of items.
	 *
	 * @param   array  $commands  An array of commands to perform.
	 * @param   array  $pks       An array of item ids.
	 * @param   array  $contexts  An array of item contexts.
	 *
	 * @return  boolean  Returns true on success, false on failure.
	 *
	 * @since   12.2
	 */
	public function batch($commands, $pks, $contexts)
	{
		// Sanitize ids.
		$pks = array_unique($pks);
		ArrayHelper::toInteger($pks);

		// Remove any values of zero.
		if (array_search(0, $pks, true))
		{
			unset($pks[array_search(0, $pks, true)]);
		}

		if (empty($pks))
		{
			$this->setError(JText::_('JGLOBAL_NO_ITEM_SELECTED'));
			return false;
		}

		$done = false;

		// Set some needed variables.
		$this->user			= JFactory::getUser();
		$this->table			= $this->getTable();
		$this->tableClassName		= get_class($this->table);
		$this->contentType		= new JUcmType;
		$this->type			=
$this->contentType->getTypeByTable($this->tableClassName);
		$this->canDo			= ReservationHelper::getActions('capital');
		$this->batchSet			= true;

		if (!$this->canDo->get('core.batch'))
		{
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_INSUFFICIENT_BATCH_INFORMATION'));
			return false;
		}
        
		if ($this->type == false)
		{
			$type = new JUcmType;
			$this->type = $type->getTypeByAlias($this->typeAlias);
		}

		$this->tagsObserver =
$this->table->getObserverOfClass('JTableObserverTags');

		if (!empty($commands['move_copy']))
		{
			$cmd = ArrayHelper::getValue($commands, 'move_copy',
'c');

			if ($cmd == 'c')
			{
				$result = $this->batchCopy($commands, $pks, $contexts);

				if (is_array($result))
				{
					foreach ($result as $old => $new)
					{
						$contexts[$new] = $contexts[$old];
					}
					$pks = array_values($result);
				}
				else
				{
					return false;
				}
			}
			elseif ($cmd == 'm' && !$this->batchMove($commands,
$pks, $contexts))
			{
				return false;
			}

			$done = true;
		}

		if (!$done)
		{
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_INSUFFICIENT_BATCH_INFORMATION'));

			return false;
		}

		// Clear the cache
		$this->cleanCache();

		return true;
	}

	/**
	 * Batch copy items to a new category or current.
	 *
	 * @param   integer  $values    The new values.
	 * @param   array    $pks       An array of row IDs.
	 * @param   array    $contexts  An array of item contexts.
	 *
	 * @return  mixed  An array of new IDs on success, boolean false on
failure.
	 *
	 * @since 12.2
	 */
	protected function batchCopy($values, $pks, $contexts)
	{
		if (empty($this->batchSet))
		{
			// Set some needed variables.
			$this->user 		= JFactory::getUser();
			$this->table 		= $this->getTable();
			$this->tableClassName	= get_class($this->table);
			$this->canDo		= ReservationHelper::getActions('capital');
		}

		if (!$this->canDo->get('core.create') ||
!$this->canDo->get('core.batch'))
		{
			return false;
		}

		// get list of unique fields
		$uniqueFields = $this->getUniqueFields();
		// remove move_copy from array
		unset($values['move_copy']);

		// make sure published is set
		if (!isset($values['published']))
		{
			$values['published'] = 0;
		}
		elseif (isset($values['published']) &&
!$this->canDo->get('core.edit.state'))
		{
				$values['published'] = 0;
		}

		$newIds = array();
		// Parent exists so let's proceed
		while (!empty($pks))
		{
			// Pop the first ID off the stack
			$pk = array_shift($pks);

			$this->table->reset();

			// only allow copy if user may edit this item.
			if (!$this->user->authorise('core.edit',
$contexts[$pk]))
			{
				// Not fatal error
				$this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND',
$pk));
				continue;
			}

			// Check that the row actually exists
			if (!$this->table->load($pk))
			{
				if ($error = $this->table->getError())
				{
					// Fatal error
					$this->setError($error);
					return false;
				}
				else
				{
					// Not fatal error
					$this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND',
$pk));
					continue;
				}
			}

			// Only for strings
			if (ReservationHelper::checkString($this->table->name) &&
!is_numeric($this->table->name))
			{
				$this->table->name =
$this->generateUnique('name',$this->table->name);
			}

			// insert all set values
			if (ReservationHelper::checkArray($values))
			{
				foreach ($values as $key => $value)
				{
					if (strlen($value) > 0 && isset($this->table->$key))
					{
						$this->table->$key = $value;
					}
				}
			}

			// update all unique fields
			if (ReservationHelper::checkArray($uniqueFields))
			{
				foreach ($uniqueFields as $uniqueField)
				{
					$this->table->$uniqueField =
$this->generateUnique($uniqueField,$this->table->$uniqueField);
				}
			}

			// Reset the ID because we are making a copy
			$this->table->id = 0;

			// TODO: Deal with ordering?
			// $this->table->ordering = 1;

			// Check the row.
			if (!$this->table->check())
			{
				$this->setError($this->table->getError());

				return false;
			}

			if (!empty($this->type))
			{
				$this->createTagsHelper($this->tagsObserver, $this->type, $pk,
$this->typeAlias, $this->table);
			}

			// Store the row.
			if (!$this->table->store())
			{
				$this->setError($this->table->getError());

				return false;
			}

			// Get the new item ID
			$newId = $this->table->get('id');

			// Add the new ID to the array
			$newIds[$pk] = $newId;
		}

		// Clean the cache
		$this->cleanCache();

		return $newIds;
	}

	/**
	 * Batch move items to a new category
	 *
	 * @param   integer  $value     The new category ID.
	 * @param   array    $pks       An array of row IDs.
	 * @param   array    $contexts  An array of item contexts.
	 *
	 * @return  boolean  True if successful, false otherwise and internal
error is set.
	 *
	 * @since 12.2
	 */
	protected function batchMove($values, $pks, $contexts)
	{
		if (empty($this->batchSet))
		{
			// Set some needed variables.
			$this->user		= JFactory::getUser();
			$this->table		= $this->getTable();
			$this->tableClassName	= get_class($this->table);
			$this->canDo		= ReservationHelper::getActions('capital');
		}

		if (!$this->canDo->get('core.edit') &&
!$this->canDo->get('core.batch'))
		{
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT'));
			return false;
		}

		// make sure published only updates if user has the permission.
		if (isset($values['published']) &&
!$this->canDo->get('core.edit.state'))
		{
			unset($values['published']);
		}
		// remove move_copy from array
		unset($values['move_copy']);

		// Parent exists so we proceed
		foreach ($pks as $pk)
		{
			if (!$this->user->authorise('core.edit',
$contexts[$pk]))
			{
				$this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT'));
				return false;
			}

			// Check that the row actually exists
			if (!$this->table->load($pk))
			{
				if ($error = $this->table->getError())
				{
					// Fatal error
					$this->setError($error);
					return false;
				}
				else
				{
					// Not fatal error
					$this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND',
$pk));
					continue;
				}
			}

			// insert all set values.
			if (ReservationHelper::checkArray($values))
			{
				foreach ($values as $key => $value)
				{
					// Do special action for access.
					if ('access' === $key && strlen($value) > 0)
					{
						$this->table->$key = $value;
					}
					elseif (strlen($value) > 0 &&
isset($this->table->$key))
					{
						$this->table->$key = $value;
					}
				}
			}


			// Check the row.
			if (!$this->table->check())
			{
				$this->setError($this->table->getError());

				return false;
			}

			if (!empty($this->type))
			{
				$this->createTagsHelper($this->tagsObserver, $this->type, $pk,
$this->typeAlias, $this->table);
			}

			// Store the row.
			if (!$this->table->store())
			{
				$this->setError($this->table->getError());

				return false;
			}
		}

		// Clean the cache
		$this->cleanCache();

		return true;
	}
	
	/**
	 * Method to save the form data.
	 *
	 * @param   array  $data  The form data.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   1.6
	 */
	public function save($data)
	{
		$input	= JFactory::getApplication()->input;
		$filter	= JFilterInput::getInstance();
        
		// set the metadata to the Item Data
		if (isset($data['metadata']) &&
isset($data['metadata']['author']))
		{
			$data['metadata']['author'] =
$filter->clean($data['metadata']['author'],
'TRIM');
            
			$metadata = new JRegistry;
			$metadata->loadArray($data['metadata']);
			$data['metadata'] = (string) $metadata;
		}
        
		// Set the Params Items to data
		if (isset($data['params']) &&
is_array($data['params']))
		{
			$params = new JRegistry;
			$params->loadArray($data['params']);
			$data['params'] = (string) $params;
		}

		// Alter the unique field for save as copy
		if ($input->get('task') === 'save2copy')
		{
			// Automatic handling of other unique fields
			$uniqueFields = $this->getUniqueFields();
			if (ReservationHelper::checkArray($uniqueFields))
			{
				foreach ($uniqueFields as $uniqueField)
				{
					$data[$uniqueField] =
$this->generateUnique($uniqueField,$data[$uniqueField]);
				}
			}
		}
		
		if (parent::save($data))
		{
			return true;
		}
		return false;
	}
	
	/**
	 * Method to generate a unique value.
	 *
	 * @param   string  $field name.
	 * @param   string  $value data.
	 *
	 * @return  string  New value.
	 *
	 * @since   3.0
	 */
	protected function generateUnique($field,$value)
	{

		// set field value unique
		$table = $this->getTable();

		while ($table->load(array($field => $value)))
		{
			$value = StringHelper::increment($value);
		}

		return $value;
	}

	/**
	 * Method to change the title
	 *
	 * @param   string   $title   The title.
	 *
	 * @return	array  Contains the modified title and alias.
	 *
	 */
	protected function _generateNewTitle($title)
	{

		// Alter the title
		$table = $this->getTable();

		while ($table->load(array('title' => $title)))
		{
			$title = StringHelper::increment($title);
		}

		return $title;
	}
}
PK4~�[��h�-�-models/capitals.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		capitals.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Utilities\ArrayHelper;

/**
 * Capitals Model
 */
class ReservationModelCapitals extends JModelList
{
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
        {
			$config['filter_fields'] = array(
				'a.id','id',
				'a.published','published',
				'a.access','access',
				'a.ordering','ordering',
				'a.created_by','created_by',
				'a.modified_by','modified_by',
				'a.name','name',
				'g.name','capitalid'
			);
		}

		parent::__construct($config);
	}

	/**
	 * Method to auto-populate the model state.
	 *
	 * Note. Calling getState in this method will result in recursion.
	 *
	 * @param   string  $ordering   An optional ordering field.
	 * @param   string  $direction  An optional direction (asc|desc).
	 *
	 * @return  void
	 *
	 */
	protected function populateState($ordering = null, $direction = null)
	{
		$app = JFactory::getApplication();

		// Adjust the context to support modal layouts.
		if ($layout = $app->input->get('layout'))
		{
			$this->context .= '.' . $layout;
		}

		// Check if the form was submitted
		$formSubmited =
$app->input->post->get('form_submited');

		$access = $this->getUserStateFromRequest($this->context .
'.filter.access', 'filter_access', 0, 'int');
		if ($formSubmited)
		{
			$access = $app->input->post->get('access');
			$this->setState('filter.access', $access);
		}

		$published = $this->getUserStateFromRequest($this->context .
'.filter.published', 'filter_published', '');
		$this->setState('filter.published', $published);

		$created_by = $this->getUserStateFromRequest($this->context .
'.filter.created_by', 'filter_created_by',
'');
		$this->setState('filter.created_by', $created_by);

		$created = $this->getUserStateFromRequest($this->context .
'.filter.created', 'filter_created');
		$this->setState('filter.created', $created);

		$sorting = $this->getUserStateFromRequest($this->context .
'.filter.sorting', 'filter_sorting', 0,
'int');
		$this->setState('filter.sorting', $sorting);

		$search = $this->getUserStateFromRequest($this->context .
'.filter.search', 'filter_search');
		$this->setState('filter.search', $search);

		$name = $this->getUserStateFromRequest($this->context .
'.filter.name', 'filter_name');
		if ($formSubmited)
		{
			$name = $app->input->post->get('name');
			$this->setState('filter.name', $name);
		}

		$capitalid = $this->getUserStateFromRequest($this->context .
'.filter.capitalid', 'filter_capitalid');
		if ($formSubmited)
		{
			$capitalid = $app->input->post->get('capitalid');
			$this->setState('filter.capitalid', $capitalid);
		}

		// List state information.
		parent::populateState($ordering, $direction);
	}
	
	/**
	 * Method to get an array of data items.
	 *
	 * @return  mixed  An array of data items on success, false on failure.
	 */
	public function getItems()
	{
		// check in items
		$this->checkInNow();

		// load parent items
		$items = parent::getItems();
        
		// return items
		return $items;
	}
	
	/**
	 * Method to build an SQL query to load the list data.
	 *
	 * @return	string	An SQL query
	 */
	protected function getListQuery()
	{
		// Get the user object.
		$user = JFactory::getUser();
		// Create a new query object.
		$db = JFactory::getDBO();
		$query = $db->getQuery(true);

		// Select some fields
		$query->select('a.*');

		// From the reservation_item table
		$query->from($db->quoteName('#__reservation_capital',
'a'));

		// From the reservation_capital table.
		$query->select($db->quoteName('g.name','capitalid_name'));
		$query->join('LEFT',
$db->quoteName('#__reservation_capital', 'g') .
' ON (' . $db->quoteName('a.capitalid') . ' =
' . $db->quoteName('g.id') . ')');

		// Filter by published state
		$published = $this->getState('filter.published');
		if (is_numeric($published))
		{
			$query->where('a.published = ' . (int) $published);
		}
		elseif ($published === '')
		{
			$query->where('(a.published = 0 OR a.published = 1)');
		}

		// Join over the asset groups.
		$query->select('ag.title AS access_level');
		$query->join('LEFT', '#__viewlevels AS ag ON ag.id =
a.access');
		// Filter by access level.
		$_access = $this->getState('filter.access');
		if ($_access && is_numeric($_access))
		{
			$query->where('a.access = ' . (int) $_access);
		}
		elseif (ReservationHelper::checkArray($_access))
		{
			// Secure the array for the query
			$_access = ArrayHelper::toInteger($_access);
			// Filter by the Access Array.
			$query->where('a.access IN (' . implode(',',
$_access) . ')');
		}
		// Implement View Level Access
		if (!$user->authorise('core.options',
'com_reservation'))
		{
			$groups = implode(',', $user->getAuthorisedViewLevels());
			$query->where('a.access IN (' . $groups . ')');
		}
		// Filter by search.
		$search = $this->getState('filter.search');
		if (!empty($search))
		{
			if (stripos($search, 'id:') === 0)
			{
				$query->where('a.id = ' . (int) substr($search, 3));
			}
			else
			{
				$search = $db->quote('%' . $db->escape($search) .
'%');
				$query->where('(a.name LIKE '.$search.' OR
a.capitalid LIKE '.$search.' OR g.name LIKE
'.$search.')');
			}
		}


		// Add the list ordering clause.
		$orderCol = $this->state->get('list.ordering',
'a.id');
		$orderDirn = $this->state->get('list.direction',
'desc');
		if ($orderCol != '')
		{
			$query->order($db->escape($orderCol . ' ' .
$orderDirn));
		}

		return $query;
	}

	/**
	 * Method to get list export data.
	 *
	 * @param   array  $pks  The ids of the items to get
	 * @param   JUser  $user  The user making the request
	 *
	 * @return mixed  An array of data items on success, false on failure.
	 */
	public function getExportData($pks, $user = null)
	{
		// setup the query
		if (($pks_size = ReservationHelper::checkArray($pks)) !== false ||
'bulk' === $pks)
		{
			// Set a value to know this is export method. (USE IN CUSTOM CODE TO
ALTER OUTCOME)
			$_export = true;
			// Get the user object if not set.
			if (!isset($user) || !ReservationHelper::checkObject($user))
			{
				$user = JFactory::getUser();
			}
			// Create a new query object.
			$db = JFactory::getDBO();
			$query = $db->getQuery(true);

			// Select some fields
			$query->select('a.*');

			// From the reservation_capital table
			$query->from($db->quoteName('#__reservation_capital',
'a'));
			// The bulk export path
			if ('bulk' === $pks)
			{
				$query->where('a.id > 0');
			}
			// A large array of ID's will not work out well
			elseif ($pks_size > 500)
			{
				// Use lowest ID
				$query->where('a.id >= ' . (int) min($pks));
				// Use highest ID
				$query->where('a.id <= ' . (int) max($pks));
			}
			// The normal default path
			else
			{
				$query->where('a.id IN (' . implode(',',$pks) .
')');
			}
			// Implement View Level Access
			if (!$user->authorise('core.options',
'com_reservation'))
			{
				$groups = implode(',', $user->getAuthorisedViewLevels());
				$query->where('a.access IN (' . $groups . ')');
			}

			// Order the results by ordering
			$query->order('a.ordering  ASC');

			// Load the items
			$db->setQuery($query);
			$db->execute();
			if ($db->getNumRows())
			{
				$items = $db->loadObjectList();

				// Set values to display correctly.
				if (ReservationHelper::checkArray($items))
				{
					foreach ($items as $nr => &$item)
					{
						// unset the values we don't want exported.
						unset($item->asset_id);
						unset($item->checked_out);
						unset($item->checked_out_time);
					}
				}
				// Add headers to items array.
				$headers = $this->getExImPortHeaders();
				if (ReservationHelper::checkObject($headers))
				{
					array_unshift($items,$headers);
				}
				return $items;
			}
		}
		return false;
	}

	/**
	* Method to get header.
	*
	* @return mixed  An array of data items on success, false on failure.
	*/
	public function getExImPortHeaders()
	{
		// Get a db connection.
		$db = JFactory::getDbo();
		// get the columns
		$columns = $db->getTableColumns("#__reservation_capital");
		if (ReservationHelper::checkArray($columns))
		{
			// remove the headers you don't import/export.
			unset($columns['asset_id']);
			unset($columns['checked_out']);
			unset($columns['checked_out_time']);
			$headers = new stdClass();
			foreach ($columns as $column => $type)
			{
				$headers->{$column} = $column;
			}
			return $headers;
		}
		return false;
	}
	
	/**
	 * Method to get a store id based on model configuration state.
	 *
	 * @return  string  A store id.
	 *
	 */
	protected function getStoreId($id = '')
	{
		// Compile the store id.
		$id .= ':' . $this->getState('filter.id');
		$id .= ':' . $this->getState('filter.search');
		$id .= ':' . $this->getState('filter.published');
		// Check if the value is an array
		$_access = $this->getState('filter.access');
		if (ReservationHelper::checkArray($_access))
		{
			$id .= ':' . implode(':', $_access);
		}
		// Check if this is only an number or string
		elseif (is_numeric($_access)
		 || ReservationHelper::checkString($_access))
		{
			$id .= ':' . $_access;
		}
		$id .= ':' . $this->getState('filter.ordering');
		$id .= ':' . $this->getState('filter.created_by');
		$id .= ':' .
$this->getState('filter.modified_by');
		$id .= ':' . $this->getState('filter.name');
		$id .= ':' . $this->getState('filter.capitalid');

		return parent::getStoreId($id);
	}

	/**
	 * Build an SQL query to checkin all items left checked out longer then a
set time.
	 *
	 * @return  a bool
	 *
	 */
	protected function checkInNow()
	{
		// Get set check in time
		$time =
JComponentHelper::getParams('com_reservation')->get('check_in');

		if ($time)
		{

			// Get a db connection.
			$db = JFactory::getDbo();
			// reset query
			$query = $db->getQuery(true);
			$query->select('*');
			$query->from($db->quoteName('#__reservation_capital'));
			$db->setQuery($query);
			$db->execute();
			if ($db->getNumRows())
			{
				// Get Yesterdays date
				$date = JFactory::getDate()->modify($time)->toSql();
				// reset query
				$query = $db->getQuery(true);

				// Fields to update.
				$fields = array(
					$db->quoteName('checked_out_time') .
'=\'0000-00-00 00:00:00\'',
					$db->quoteName('checked_out') . '=0'
				);

				// Conditions for which records should be updated.
				$conditions = array(
					$db->quoteName('checked_out') . '!=0', 
					$db->quoteName('checked_out_time') .
'<\''.$date.'\''
				);

				// Check table
				$query->update($db->quoteName('#__reservation_capital'))->set($fields)->where($conditions);


				$db->setQuery($query);

				$db->execute();
			}
		}

		return false;
	}
}
PK4~�[i��BUBUmodels/comment.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		comment.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Registry\Registry;
use Joomla\String\StringHelper;
use Joomla\Utilities\ArrayHelper;

/**
 * Reservation Comment Model
 */
class ReservationModelComment extends JModelAdmin
{
	/**
	 * The tab layout fields array.
	 *
	 * @var      array
	 */
	protected $tabLayoutFields = array(
		'details' => array(
			'left' => array(
				'consultantid',
				'seid',
				'rate'
			),
			'right' => array(
				'sickid',
				'token'
			),
			'fullwidth' => array(
				'text'
			)
		)
	);

	/**
	 * @var        string    The prefix to use with controller messages.
	 * @since   1.6
	 */
	protected $text_prefix = 'COM_RESERVATION';

	/**
	 * The type alias for this content type.
	 *
	 * @var      string
	 * @since    3.2
	 */
	public $typeAlias = 'com_reservation.comment';

	/**
	 * Returns a Table object, always creating it
	 *
	 * @param   type    $type    The table type to instantiate
	 * @param   string  $prefix  A prefix for the table class name. Optional.
	 * @param   array   $config  Configuration array for model. Optional.
	 *
	 * @return  JTable  A database object
	 *
	 * @since   1.6
	 */
	public function getTable($type = 'comment', $prefix =
'ReservationTable', $config = array())
	{
		// add table path for when model gets used from other component
		$this->addTablePath(JPATH_ADMINISTRATOR .
'/components/com_reservation/tables');
		// get instance of the table
		return JTable::getInstance($type, $prefix, $config);
	}
    
	/**
	 * Method to get a single record.
	 *
	 * @param   integer  $pk  The id of the primary key.
	 *
	 * @return  mixed  Object on success, false on failure.
	 *
	 * @since   1.6
	 */
	public function getItem($pk = null)
	{
		if ($item = parent::getItem($pk))
		{
			if (!empty($item->params) && !is_array($item->params))
			{
				// Convert the params field to an array.
				$registry = new Registry;
				$registry->loadString($item->params);
				$item->params = $registry->toArray();
			}

			if (!empty($item->metadata))
			{
				// Convert the metadata field to an array.
				$registry = new Registry;
				$registry->loadString($item->metadata);
				$item->metadata = $registry->toArray();
			}
		}

		return $item;
	}

	/**
	 * Method to get the record form.
	 *
	 * @param   array    $data      Data for the form.
	 * @param   boolean  $loadData  True if the form is to load its own data
(default case), false if not.
	 * @param   array    $options   Optional array of options for the form
creation.
	 *
	 * @return  mixed  A JForm object on success, false on failure
	 *
	 * @since   1.6
	 */
	public function getForm($data = array(), $loadData = true, $options =
array('control' => 'jform'))
	{
		// set load data option
		$options['load_data'] = $loadData;
		// check if xpath was set in options
		$xpath = false;
		if (isset($options['xpath']))
		{
			$xpath = $options['xpath'];
			unset($options['xpath']);
		}
		// check if clear form was set in options
		$clear = false;
		if (isset($options['clear']))
		{
			$clear = $options['clear'];
			unset($options['clear']);
		}

		// Get the form.
		$form = $this->loadForm('com_reservation.comment',
'comment', $options, $clear, $xpath);

		if (empty($form))
		{
			return false;
		}

		$jinput = JFactory::getApplication()->input;

		// The front end calls this model and uses a_id to avoid id clashes so we
need to check for that first.
		if ($jinput->get('a_id'))
		{
			$id = $jinput->get('a_id', 0, 'INT');
		}
		// The back end uses id so we use that the rest of the time and set it to
0 by default.
		else
		{
			$id = $jinput->get('id', 0, 'INT');
		}

		$user = JFactory::getUser();

		// Check for existing item.
		// Modify the form based on Edit State access controls.
		if ($id != 0 &&
(!$user->authorise('core.edit.state',
'com_reservation.comment.' . (int) $id))
			|| ($id == 0 &&
!$user->authorise('core.edit.state',
'com_reservation')))
		{
			// Disable fields for display.
			$form->setFieldAttribute('ordering', 'disabled',
'true');
			$form->setFieldAttribute('published', 'disabled',
'true');
			// Disable fields while saving.
			$form->setFieldAttribute('ordering', 'filter',
'unset');
			$form->setFieldAttribute('published', 'filter',
'unset');
		}
		// If this is a new item insure the greated by is set.
		if (0 == $id)
		{
			// Set the created_by to this user
			$form->setValue('created_by', null, $user->id);
		}
		// Modify the form based on Edit Creaded By access controls.
		if (!$user->authorise('core.edit.created_by',
'com_reservation'))
		{
			// Disable fields for display.
			$form->setFieldAttribute('created_by',
'disabled', 'true');
			// Disable fields for display.
			$form->setFieldAttribute('created_by',
'readonly', 'true');
			// Disable fields while saving.
			$form->setFieldAttribute('created_by', 'filter',
'unset');
		}
		// Modify the form based on Edit Creaded Date access controls.
		if (!$user->authorise('core.edit.created',
'com_reservation'))
		{
			// Disable fields for display.
			$form->setFieldAttribute('created', 'disabled',
'true');
			// Disable fields while saving.
			$form->setFieldAttribute('created', 'filter',
'unset');
		}
		// Only load these values if no id is found
		if (0 == $id)
		{
			// Set redirected view name
			$redirectedView = $jinput->get('ref', null,
'STRING');
			// Set field name (or fall back to view name)
			$redirectedField = $jinput->get('field', $redirectedView,
'STRING');
			// Set redirected view id
			$redirectedId = $jinput->get('refid', 0, 'INT');
			// Set field id (or fall back to redirected view id)
			$redirectedValue = $jinput->get('field_id', $redirectedId,
'INT');
			if (0 != $redirectedValue && $redirectedField)
			{
				// Now set the local-redirected field default value
				$form->setValue($redirectedField, null, $redirectedValue);
			}
		}
		return $form;
	}

	/**
	 * Method to get the script that have to be included on the form
	 *
	 * @return string	script files
	 */
	public function getScript()
	{
		return 'media/com_reservation/js/comment.js';
	}
    
	/**
	 * Method to test whether a record can be deleted.
	 *
	 * @param   object  $record  A record object.
	 *
	 * @return  boolean  True if allowed to delete the record. Defaults to the
permission set in the component.
	 *
	 * @since   1.6
	 */
	protected function canDelete($record)
	{
		if (!empty($record->id))
		{
			if ($record->published != -2)
			{
				return;
			}

			$user = JFactory::getUser();
			// The record has been set. Check the record permissions.
			return $user->authorise('core.delete',
'com_reservation.comment.' . (int) $record->id);
		}
		return false;
	}

	/**
	 * Method to test whether a record can have its state edited.
	 *
	 * @param   object  $record  A record object.
	 *
	 * @return  boolean  True if allowed to change the state of the record.
Defaults to the permission set in the component.
	 *
	 * @since   1.6
	 */
	protected function canEditState($record)
	{
		$user = JFactory::getUser();
		$recordId = (!empty($record->id)) ? $record->id : 0;

		if ($recordId)
		{
			// The record has been set. Check the record permissions.
			$permission = $user->authorise('core.edit.state',
'com_reservation.comment.' . (int) $recordId);
			if (!$permission && !is_null($permission))
			{
				return false;
			}
		}
		// In the absense of better information, revert to the component
permissions.
		return parent::canEditState($record);
	}
    
	/**
	 * Method override to check if you can edit an existing record.
	 *
	 * @param	array	$data	An array of input data.
	 * @param	string	$key	The name of the key for the primary key.
	 *
	 * @return	boolean
	 * @since	2.5
	 */
	protected function allowEdit($data = array(), $key = 'id')
	{
		// Check specific edit permission then general edit permission.

		return JFactory::getUser()->authorise('core.edit',
'com_reservation.comment.'. ((int) isset($data[$key]) ?
$data[$key] : 0)) or parent::allowEdit($data, $key);
	}
    
	/**
	 * Prepare and sanitise the table data prior to saving.
	 *
	 * @param   JTable  $table  A JTable object.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function prepareTable($table)
	{
		$date = JFactory::getDate();
		$user = JFactory::getUser();
		
		if (isset($table->name))
		{
			$table->name = htmlspecialchars_decode($table->name, ENT_QUOTES);
		}
		
		if (isset($table->alias) && empty($table->alias))
		{
			$table->generateAlias();
		}
		
		if (empty($table->id))
		{
			$table->created = $date->toSql();
			// set the user
			if ($table->created_by == 0 || empty($table->created_by))
			{
				$table->created_by = $user->id;
			}
			// Set ordering to the last item if not set
			if (empty($table->ordering))
			{
				$db = JFactory::getDbo();
				$query = $db->getQuery(true)
					->select('MAX(ordering)')
					->from($db->quoteName('#__reservation_comment'));
				$db->setQuery($query);
				$max = $db->loadResult();

				$table->ordering = $max + 1;
			}
		}
		else
		{
			$table->modified = $date->toSql();
			$table->modified_by = $user->id;
		}
        
		if (!empty($table->id))
		{
			// Increment the items version number.
			$table->version++;
		}
	}

	/**
	 * Method to get the data that should be injected in the form.
	 *
	 * @return  mixed  The data for the form.
	 *
	 * @since   1.6
	 */
	protected function loadFormData() 
	{
		// Check the session for previously entered form data.
		$data =
JFactory::getApplication()->getUserState('com_reservation.edit.comment.data',
array());

		if (empty($data))
		{
			$data = $this->getItem();
			// run the perprocess of the data
			$this->preprocessData('com_reservation.comment', $data);
		}

		return $data;
	}

	/**
	 * Method to get the unique fields of this table.
	 *
	 * @return  mixed  An array of field names, boolean false if none is set.
	 *
	 * @since   3.0
	 */
	protected function getUniqueFields()
	{
		return false;
	}
	
	/**
	 * Method to delete one or more records.
	 *
	 * @param   array  &$pks  An array of record primary keys.
	 *
	 * @return  boolean  True if successful, false if an error occurs.
	 *
	 * @since   12.2
	 */
	public function delete(&$pks)
	{
		if (!parent::delete($pks))
		{
			return false;
		}
		
		return true;
	}

	/**
	 * Method to change the published state of one or more records.
	 *
	 * @param   array    &$pks   A list of the primary keys to change.
	 * @param   integer  $value  The value of the published state.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   12.2
	 */
	public function publish(&$pks, $value = 1)
	{
		if (!parent::publish($pks, $value))
		{
			return false;
		}
		
		return true;
        }
    
	/**
	 * Method to perform batch operations on an item or a set of items.
	 *
	 * @param   array  $commands  An array of commands to perform.
	 * @param   array  $pks       An array of item ids.
	 * @param   array  $contexts  An array of item contexts.
	 *
	 * @return  boolean  Returns true on success, false on failure.
	 *
	 * @since   12.2
	 */
	public function batch($commands, $pks, $contexts)
	{
		// Sanitize ids.
		$pks = array_unique($pks);
		ArrayHelper::toInteger($pks);

		// Remove any values of zero.
		if (array_search(0, $pks, true))
		{
			unset($pks[array_search(0, $pks, true)]);
		}

		if (empty($pks))
		{
			$this->setError(JText::_('JGLOBAL_NO_ITEM_SELECTED'));
			return false;
		}

		$done = false;

		// Set some needed variables.
		$this->user			= JFactory::getUser();
		$this->table			= $this->getTable();
		$this->tableClassName		= get_class($this->table);
		$this->contentType		= new JUcmType;
		$this->type			=
$this->contentType->getTypeByTable($this->tableClassName);
		$this->canDo			= ReservationHelper::getActions('comment');
		$this->batchSet			= true;

		if (!$this->canDo->get('core.batch'))
		{
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_INSUFFICIENT_BATCH_INFORMATION'));
			return false;
		}
        
		if ($this->type == false)
		{
			$type = new JUcmType;
			$this->type = $type->getTypeByAlias($this->typeAlias);
		}

		$this->tagsObserver =
$this->table->getObserverOfClass('JTableObserverTags');

		if (!empty($commands['move_copy']))
		{
			$cmd = ArrayHelper::getValue($commands, 'move_copy',
'c');

			if ($cmd == 'c')
			{
				$result = $this->batchCopy($commands, $pks, $contexts);

				if (is_array($result))
				{
					foreach ($result as $old => $new)
					{
						$contexts[$new] = $contexts[$old];
					}
					$pks = array_values($result);
				}
				else
				{
					return false;
				}
			}
			elseif ($cmd == 'm' && !$this->batchMove($commands,
$pks, $contexts))
			{
				return false;
			}

			$done = true;
		}

		if (!$done)
		{
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_INSUFFICIENT_BATCH_INFORMATION'));

			return false;
		}

		// Clear the cache
		$this->cleanCache();

		return true;
	}

	/**
	 * Batch copy items to a new category or current.
	 *
	 * @param   integer  $values    The new values.
	 * @param   array    $pks       An array of row IDs.
	 * @param   array    $contexts  An array of item contexts.
	 *
	 * @return  mixed  An array of new IDs on success, boolean false on
failure.
	 *
	 * @since 12.2
	 */
	protected function batchCopy($values, $pks, $contexts)
	{
		if (empty($this->batchSet))
		{
			// Set some needed variables.
			$this->user 		= JFactory::getUser();
			$this->table 		= $this->getTable();
			$this->tableClassName	= get_class($this->table);
			$this->canDo		= ReservationHelper::getActions('comment');
		}

		if (!$this->canDo->get('core.create') ||
!$this->canDo->get('core.batch'))
		{
			return false;
		}

		// get list of unique fields
		$uniqueFields = $this->getUniqueFields();
		// remove move_copy from array
		unset($values['move_copy']);

		// make sure published is set
		if (!isset($values['published']))
		{
			$values['published'] = 0;
		}
		elseif (isset($values['published']) &&
!$this->canDo->get('core.edit.state'))
		{
				$values['published'] = 0;
		}

		$newIds = array();
		// Parent exists so let's proceed
		while (!empty($pks))
		{
			// Pop the first ID off the stack
			$pk = array_shift($pks);

			$this->table->reset();

			// only allow copy if user may edit this item.
			if (!$this->user->authorise('core.edit',
$contexts[$pk]))
			{
				// Not fatal error
				$this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND',
$pk));
				continue;
			}

			// Check that the row actually exists
			if (!$this->table->load($pk))
			{
				if ($error = $this->table->getError())
				{
					// Fatal error
					$this->setError($error);
					return false;
				}
				else
				{
					// Not fatal error
					$this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND',
$pk));
					continue;
				}
			}

			// Only for strings
			if (ReservationHelper::checkString($this->table->text) &&
!is_numeric($this->table->text))
			{
				$this->table->text =
$this->generateUnique('text',$this->table->text);
			}

			// insert all set values
			if (ReservationHelper::checkArray($values))
			{
				foreach ($values as $key => $value)
				{
					if (strlen($value) > 0 && isset($this->table->$key))
					{
						$this->table->$key = $value;
					}
				}
			}

			// update all unique fields
			if (ReservationHelper::checkArray($uniqueFields))
			{
				foreach ($uniqueFields as $uniqueField)
				{
					$this->table->$uniqueField =
$this->generateUnique($uniqueField,$this->table->$uniqueField);
				}
			}

			// Reset the ID because we are making a copy
			$this->table->id = 0;

			// TODO: Deal with ordering?
			// $this->table->ordering = 1;

			// Check the row.
			if (!$this->table->check())
			{
				$this->setError($this->table->getError());

				return false;
			}

			if (!empty($this->type))
			{
				$this->createTagsHelper($this->tagsObserver, $this->type, $pk,
$this->typeAlias, $this->table);
			}

			// Store the row.
			if (!$this->table->store())
			{
				$this->setError($this->table->getError());

				return false;
			}

			// Get the new item ID
			$newId = $this->table->get('id');

			// Add the new ID to the array
			$newIds[$pk] = $newId;
		}

		// Clean the cache
		$this->cleanCache();

		return $newIds;
	}

	/**
	 * Batch move items to a new category
	 *
	 * @param   integer  $value     The new category ID.
	 * @param   array    $pks       An array of row IDs.
	 * @param   array    $contexts  An array of item contexts.
	 *
	 * @return  boolean  True if successful, false otherwise and internal
error is set.
	 *
	 * @since 12.2
	 */
	protected function batchMove($values, $pks, $contexts)
	{
		if (empty($this->batchSet))
		{
			// Set some needed variables.
			$this->user		= JFactory::getUser();
			$this->table		= $this->getTable();
			$this->tableClassName	= get_class($this->table);
			$this->canDo		= ReservationHelper::getActions('comment');
		}

		if (!$this->canDo->get('core.edit') &&
!$this->canDo->get('core.batch'))
		{
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT'));
			return false;
		}

		// make sure published only updates if user has the permission.
		if (isset($values['published']) &&
!$this->canDo->get('core.edit.state'))
		{
			unset($values['published']);
		}
		// remove move_copy from array
		unset($values['move_copy']);

		// Parent exists so we proceed
		foreach ($pks as $pk)
		{
			if (!$this->user->authorise('core.edit',
$contexts[$pk]))
			{
				$this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT'));
				return false;
			}

			// Check that the row actually exists
			if (!$this->table->load($pk))
			{
				if ($error = $this->table->getError())
				{
					// Fatal error
					$this->setError($error);
					return false;
				}
				else
				{
					// Not fatal error
					$this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND',
$pk));
					continue;
				}
			}

			// insert all set values.
			if (ReservationHelper::checkArray($values))
			{
				foreach ($values as $key => $value)
				{
					// Do special action for access.
					if ('access' === $key && strlen($value) > 0)
					{
						$this->table->$key = $value;
					}
					elseif (strlen($value) > 0 &&
isset($this->table->$key))
					{
						$this->table->$key = $value;
					}
				}
			}


			// Check the row.
			if (!$this->table->check())
			{
				$this->setError($this->table->getError());

				return false;
			}

			if (!empty($this->type))
			{
				$this->createTagsHelper($this->tagsObserver, $this->type, $pk,
$this->typeAlias, $this->table);
			}

			// Store the row.
			if (!$this->table->store())
			{
				$this->setError($this->table->getError());

				return false;
			}
		}

		// Clean the cache
		$this->cleanCache();

		return true;
	}
	
	/**
	 * Method to save the form data.
	 *
	 * @param   array  $data  The form data.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   1.6
	 */
	public function save($data)
	{
		$input	= JFactory::getApplication()->input;
		$filter	= JFilterInput::getInstance();
        
		// set the metadata to the Item Data
		if (isset($data['metadata']) &&
isset($data['metadata']['author']))
		{
			$data['metadata']['author'] =
$filter->clean($data['metadata']['author'],
'TRIM');
            
			$metadata = new JRegistry;
			$metadata->loadArray($data['metadata']);
			$data['metadata'] = (string) $metadata;
		}
        
		// Set the Params Items to data
		if (isset($data['params']) &&
is_array($data['params']))
		{
			$params = new JRegistry;
			$params->loadArray($data['params']);
			$data['params'] = (string) $params;
		}

		// Alter the unique field for save as copy
		if ($input->get('task') === 'save2copy')
		{
			// Automatic handling of other unique fields
			$uniqueFields = $this->getUniqueFields();
			if (ReservationHelper::checkArray($uniqueFields))
			{
				foreach ($uniqueFields as $uniqueField)
				{
					$data[$uniqueField] =
$this->generateUnique($uniqueField,$data[$uniqueField]);
				}
			}
		}
		
		if (parent::save($data))
		{
			return true;
		}
		return false;
	}
	
	/**
	 * Method to generate a unique value.
	 *
	 * @param   string  $field name.
	 * @param   string  $value data.
	 *
	 * @return  string  New value.
	 *
	 * @since   3.0
	 */
	protected function generateUnique($field,$value)
	{

		// set field value unique
		$table = $this->getTable();

		while ($table->load(array($field => $value)))
		{
			$value = StringHelper::increment($value);
		}

		return $value;
	}

	/**
	 * Method to change the title
	 *
	 * @param   string   $title   The title.
	 *
	 * @return	array  Contains the modified title and alias.
	 *
	 */
	protected function _generateNewTitle($title)
	{

		// Alter the title
		$table = $this->getTable();

		while ($table->load(array('title' => $title)))
		{
			$title = StringHelper::increment($title);
		}

		return $title;
	}
}
PK4~�[��9i,,models/comments.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		comments.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Utilities\ArrayHelper;

/**
 * Comments Model
 */
class ReservationModelComments extends JModelList
{
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
        {
			$config['filter_fields'] = array(
				'a.id','id',
				'a.published','published',
				'a.access','access',
				'a.ordering','ordering',
				'a.created_by','created_by',
				'a.modified_by','modified_by'
			);
		}

		parent::__construct($config);
	}

	/**
	 * Method to auto-populate the model state.
	 *
	 * Note. Calling getState in this method will result in recursion.
	 *
	 * @param   string  $ordering   An optional ordering field.
	 * @param   string  $direction  An optional direction (asc|desc).
	 *
	 * @return  void
	 *
	 */
	protected function populateState($ordering = null, $direction = null)
	{
		$app = JFactory::getApplication();

		// Adjust the context to support modal layouts.
		if ($layout = $app->input->get('layout'))
		{
			$this->context .= '.' . $layout;
		}

		// Check if the form was submitted
		$formSubmited =
$app->input->post->get('form_submited');

		$access = $this->getUserStateFromRequest($this->context .
'.filter.access', 'filter_access', 0, 'int');
		if ($formSubmited)
		{
			$access = $app->input->post->get('access');
			$this->setState('filter.access', $access);
		}

		$published = $this->getUserStateFromRequest($this->context .
'.filter.published', 'filter_published', '');
		$this->setState('filter.published', $published);

		$created_by = $this->getUserStateFromRequest($this->context .
'.filter.created_by', 'filter_created_by',
'');
		$this->setState('filter.created_by', $created_by);

		$created = $this->getUserStateFromRequest($this->context .
'.filter.created', 'filter_created');
		$this->setState('filter.created', $created);

		$sorting = $this->getUserStateFromRequest($this->context .
'.filter.sorting', 'filter_sorting', 0,
'int');
		$this->setState('filter.sorting', $sorting);

		$search = $this->getUserStateFromRequest($this->context .
'.filter.search', 'filter_search');
		$this->setState('filter.search', $search);

		// List state information.
		parent::populateState($ordering, $direction);
	}
	
	/**
	 * Method to get an array of data items.
	 *
	 * @return  mixed  An array of data items on success, false on failure.
	 */
	public function getItems()
	{
		// check in items
		$this->checkInNow();

		// load parent items
		$items = parent::getItems();
        
		// return items
		return $items;
	}
	
	/**
	 * Method to build an SQL query to load the list data.
	 *
	 * @return	string	An SQL query
	 */
	protected function getListQuery()
	{
		// Get the user object.
		$user = JFactory::getUser();
		// Create a new query object.
		$db = JFactory::getDBO();
		$query = $db->getQuery(true);

		// Select some fields
		$query->select('a.*');

		// From the reservation_item table
		$query->from($db->quoteName('#__reservation_comment',
'a'));

		// From the reservation_consultant table.
		$query->select($db->quoteName('g.id','consultantid_id'));
		$query->join('LEFT',
$db->quoteName('#__reservation_consultant', 'g') .
' ON (' . $db->quoteName('a.consultantid') . '
= ' . $db->quoteName('g.id') . ')');

		// From the reservation_sick table.
		$query->select($db->quoteName('h.phonenumber','sickid_phonenumber'));
		$query->join('LEFT',
$db->quoteName('#__reservation_sick', 'h') . '
ON (' . $db->quoteName('a.sickid') . ' = ' .
$db->quoteName('h.id') . ')');

		// Filter by published state
		$published = $this->getState('filter.published');
		if (is_numeric($published))
		{
			$query->where('a.published = ' . (int) $published);
		}
		elseif ($published === '')
		{
			$query->where('(a.published = 0 OR a.published = 1)');
		}

		// Join over the asset groups.
		$query->select('ag.title AS access_level');
		$query->join('LEFT', '#__viewlevels AS ag ON ag.id =
a.access');
		// Filter by access level.
		$_access = $this->getState('filter.access');
		if ($_access && is_numeric($_access))
		{
			$query->where('a.access = ' . (int) $_access);
		}
		elseif (ReservationHelper::checkArray($_access))
		{
			// Secure the array for the query
			$_access = ArrayHelper::toInteger($_access);
			// Filter by the Access Array.
			$query->where('a.access IN (' . implode(',',
$_access) . ')');
		}
		// Implement View Level Access
		if (!$user->authorise('core.options',
'com_reservation'))
		{
			$groups = implode(',', $user->getAuthorisedViewLevels());
			$query->where('a.access IN (' . $groups . ')');
		}
		// Filter by search.
		$search = $this->getState('filter.search');
		if (!empty($search))
		{
			if (stripos($search, 'id:') === 0)
			{
				$query->where('a.id = ' . (int) substr($search, 3));
			}
			else
			{
				$search = $db->quote('%' . $db->escape($search) .
'%');
				$query->where('(a.text LIKE '.$search.')');
			}
		}


		// Add the list ordering clause.
		$orderCol = $this->state->get('list.ordering',
'a.id');
		$orderDirn = $this->state->get('list.direction',
'desc');
		if ($orderCol != '')
		{
			$query->order($db->escape($orderCol . ' ' .
$orderDirn));
		}

		return $query;
	}

	/**
	 * Method to get list export data.
	 *
	 * @param   array  $pks  The ids of the items to get
	 * @param   JUser  $user  The user making the request
	 *
	 * @return mixed  An array of data items on success, false on failure.
	 */
	public function getExportData($pks, $user = null)
	{
		// setup the query
		if (($pks_size = ReservationHelper::checkArray($pks)) !== false ||
'bulk' === $pks)
		{
			// Set a value to know this is export method. (USE IN CUSTOM CODE TO
ALTER OUTCOME)
			$_export = true;
			// Get the user object if not set.
			if (!isset($user) || !ReservationHelper::checkObject($user))
			{
				$user = JFactory::getUser();
			}
			// Create a new query object.
			$db = JFactory::getDBO();
			$query = $db->getQuery(true);

			// Select some fields
			$query->select('a.*');

			// From the reservation_comment table
			$query->from($db->quoteName('#__reservation_comment',
'a'));
			// The bulk export path
			if ('bulk' === $pks)
			{
				$query->where('a.id > 0');
			}
			// A large array of ID's will not work out well
			elseif ($pks_size > 500)
			{
				// Use lowest ID
				$query->where('a.id >= ' . (int) min($pks));
				// Use highest ID
				$query->where('a.id <= ' . (int) max($pks));
			}
			// The normal default path
			else
			{
				$query->where('a.id IN (' . implode(',',$pks) .
')');
			}
			// Implement View Level Access
			if (!$user->authorise('core.options',
'com_reservation'))
			{
				$groups = implode(',', $user->getAuthorisedViewLevels());
				$query->where('a.access IN (' . $groups . ')');
			}

			// Order the results by ordering
			$query->order('a.ordering  ASC');

			// Load the items
			$db->setQuery($query);
			$db->execute();
			if ($db->getNumRows())
			{
				$items = $db->loadObjectList();

				// Set values to display correctly.
				if (ReservationHelper::checkArray($items))
				{
					foreach ($items as $nr => &$item)
					{
						// unset the values we don't want exported.
						unset($item->asset_id);
						unset($item->checked_out);
						unset($item->checked_out_time);
					}
				}
				// Add headers to items array.
				$headers = $this->getExImPortHeaders();
				if (ReservationHelper::checkObject($headers))
				{
					array_unshift($items,$headers);
				}
				return $items;
			}
		}
		return false;
	}

	/**
	* Method to get header.
	*
	* @return mixed  An array of data items on success, false on failure.
	*/
	public function getExImPortHeaders()
	{
		// Get a db connection.
		$db = JFactory::getDbo();
		// get the columns
		$columns = $db->getTableColumns("#__reservation_comment");
		if (ReservationHelper::checkArray($columns))
		{
			// remove the headers you don't import/export.
			unset($columns['asset_id']);
			unset($columns['checked_out']);
			unset($columns['checked_out_time']);
			$headers = new stdClass();
			foreach ($columns as $column => $type)
			{
				$headers->{$column} = $column;
			}
			return $headers;
		}
		return false;
	}
	
	/**
	 * Method to get a store id based on model configuration state.
	 *
	 * @return  string  A store id.
	 *
	 */
	protected function getStoreId($id = '')
	{
		// Compile the store id.
		$id .= ':' . $this->getState('filter.id');
		$id .= ':' . $this->getState('filter.search');
		$id .= ':' . $this->getState('filter.published');
		// Check if the value is an array
		$_access = $this->getState('filter.access');
		if (ReservationHelper::checkArray($_access))
		{
			$id .= ':' . implode(':', $_access);
		}
		// Check if this is only an number or string
		elseif (is_numeric($_access)
		 || ReservationHelper::checkString($_access))
		{
			$id .= ':' . $_access;
		}
		$id .= ':' . $this->getState('filter.ordering');
		$id .= ':' . $this->getState('filter.created_by');
		$id .= ':' .
$this->getState('filter.modified_by');

		return parent::getStoreId($id);
	}

	/**
	 * Build an SQL query to checkin all items left checked out longer then a
set time.
	 *
	 * @return  a bool
	 *
	 */
	protected function checkInNow()
	{
		// Get set check in time
		$time =
JComponentHelper::getParams('com_reservation')->get('check_in');

		if ($time)
		{

			// Get a db connection.
			$db = JFactory::getDbo();
			// reset query
			$query = $db->getQuery(true);
			$query->select('*');
			$query->from($db->quoteName('#__reservation_comment'));
			$db->setQuery($query);
			$db->execute();
			if ($db->getNumRows())
			{
				// Get Yesterdays date
				$date = JFactory::getDate()->modify($time)->toSql();
				// reset query
				$query = $db->getQuery(true);

				// Fields to update.
				$fields = array(
					$db->quoteName('checked_out_time') .
'=\'0000-00-00 00:00:00\'',
					$db->quoteName('checked_out') . '=0'
				);

				// Conditions for which records should be updated.
				$conditions = array(
					$db->quoteName('checked_out') . '!=0', 
					$db->quoteName('checked_out_time') .
'<\''.$date.'\''
				);

				// Check table
				$query->update($db->quoteName('#__reservation_comment'))->set($fields)->where($conditions);


				$db->setQuery($query);

				$db->execute();
			}
		}

		return false;
	}
}
PK4~�[&vӘX�Xmodels/consultant.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		consultant.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Registry\Registry;
use Joomla\String\StringHelper;
use Joomla\Utilities\ArrayHelper;

/**
 * Reservation Consultant Model
 */
class ReservationModelConsultant extends JModelAdmin
{
	/**
	 * The tab layout fields array.
	 *
	 * @var      array
	 */
	protected $tabLayoutFields = array(
		'details' => array(
			'left' => array(
				'userid',
				'nationalnumber',
				'phonenumber',
				'officephone',
				'capitalid',
				'cityid',
				'account',
				'introduction'
			),
			'right' => array(
				'msn',
				'catid',
				'experience',
				'image',
				'alt',
				'video',
				'presence',
				'address',
				'shortlink'
			)
		)
	);

	/**
	 * @var        string    The prefix to use with controller messages.
	 * @since   1.6
	 */
	protected $text_prefix = 'COM_RESERVATION';

	/**
	 * The type alias for this content type.
	 *
	 * @var      string
	 * @since    3.2
	 */
	public $typeAlias = 'com_reservation.consultant';

	/**
	 * Returns a Table object, always creating it
	 *
	 * @param   type    $type    The table type to instantiate
	 * @param   string  $prefix  A prefix for the table class name. Optional.
	 * @param   array   $config  Configuration array for model. Optional.
	 *
	 * @return  JTable  A database object
	 *
	 * @since   1.6
	 */
	public function getTable($type = 'consultant', $prefix =
'ReservationTable', $config = array())
	{
		// add table path for when model gets used from other component
		$this->addTablePath(JPATH_ADMINISTRATOR .
'/components/com_reservation/tables');
		// get instance of the table
		return JTable::getInstance($type, $prefix, $config);
	}
    
	/**
	 * Method to get a single record.
	 *
	 * @param   integer  $pk  The id of the primary key.
	 *
	 * @return  mixed  Object on success, false on failure.
	 *
	 * @since   1.6
	 */
	public function getItem($pk = null)
	{
		if ($item = parent::getItem($pk))
		{
			if (!empty($item->params) && !is_array($item->params))
			{
				// Convert the params field to an array.
				$registry = new Registry;
				$registry->loadString($item->params);
				$item->params = $registry->toArray();
			}

			if (!empty($item->metadata))
			{
				// Convert the metadata field to an array.
				$registry = new Registry;
				$registry->loadString($item->metadata);
				$item->metadata = $registry->toArray();
			}
		}

		return $item;
	}

	/**
	 * Method to get the record form.
	 *
	 * @param   array    $data      Data for the form.
	 * @param   boolean  $loadData  True if the form is to load its own data
(default case), false if not.
	 * @param   array    $options   Optional array of options for the form
creation.
	 *
	 * @return  mixed  A JForm object on success, false on failure
	 *
	 * @since   1.6
	 */
	public function getForm($data = array(), $loadData = true, $options =
array('control' => 'jform'))
	{
		// set load data option
		$options['load_data'] = $loadData;
		// check if xpath was set in options
		$xpath = false;
		if (isset($options['xpath']))
		{
			$xpath = $options['xpath'];
			unset($options['xpath']);
		}
		// check if clear form was set in options
		$clear = false;
		if (isset($options['clear']))
		{
			$clear = $options['clear'];
			unset($options['clear']);
		}

		// Get the form.
		$form = $this->loadForm('com_reservation.consultant',
'consultant', $options, $clear, $xpath);

		if (empty($form))
		{
			return false;
		}

		$jinput = JFactory::getApplication()->input;

		// The front end calls this model and uses a_id to avoid id clashes so we
need to check for that first.
		if ($jinput->get('a_id'))
		{
			$id = $jinput->get('a_id', 0, 'INT');
		}
		// The back end uses id so we use that the rest of the time and set it to
0 by default.
		else
		{
			$id = $jinput->get('id', 0, 'INT');
		}

		$user = JFactory::getUser();

		// Check for existing item.
		// Modify the form based on Edit State access controls.
		if ($id != 0 &&
(!$user->authorise('core.edit.state',
'com_reservation.consultant.' . (int) $id))
			|| ($id == 0 &&
!$user->authorise('core.edit.state',
'com_reservation')))
		{
			// Disable fields for display.
			$form->setFieldAttribute('ordering', 'disabled',
'true');
			$form->setFieldAttribute('published', 'disabled',
'true');
			// Disable fields while saving.
			$form->setFieldAttribute('ordering', 'filter',
'unset');
			$form->setFieldAttribute('published', 'filter',
'unset');
		}
		// If this is a new item insure the greated by is set.
		if (0 == $id)
		{
			// Set the created_by to this user
			$form->setValue('created_by', null, $user->id);
		}
		// Modify the form based on Edit Creaded By access controls.
		if (!$user->authorise('core.edit.created_by',
'com_reservation'))
		{
			// Disable fields for display.
			$form->setFieldAttribute('created_by',
'disabled', 'true');
			// Disable fields for display.
			$form->setFieldAttribute('created_by',
'readonly', 'true');
			// Disable fields while saving.
			$form->setFieldAttribute('created_by', 'filter',
'unset');
		}
		// Modify the form based on Edit Creaded Date access controls.
		if (!$user->authorise('core.edit.created',
'com_reservation'))
		{
			// Disable fields for display.
			$form->setFieldAttribute('created', 'disabled',
'true');
			// Disable fields while saving.
			$form->setFieldAttribute('created', 'filter',
'unset');
		}
		// Only load these values if no id is found
		if (0 == $id)
		{
			// Set redirected view name
			$redirectedView = $jinput->get('ref', null,
'STRING');
			// Set field name (or fall back to view name)
			$redirectedField = $jinput->get('field', $redirectedView,
'STRING');
			// Set redirected view id
			$redirectedId = $jinput->get('refid', 0, 'INT');
			// Set field id (or fall back to redirected view id)
			$redirectedValue = $jinput->get('field_id', $redirectedId,
'INT');
			if (0 != $redirectedValue && $redirectedField)
			{
				// Now set the local-redirected field default value
				$form->setValue($redirectedField, null, $redirectedValue);
			}
		}
		return $form;
	}

	/**
	 * Method to get the script that have to be included on the form
	 *
	 * @return string	script files
	 */
	public function getScript()
	{
		return 'media/com_reservation/js/consultant.js';
	}
    
	/**
	 * Method to test whether a record can be deleted.
	 *
	 * @param   object  $record  A record object.
	 *
	 * @return  boolean  True if allowed to delete the record. Defaults to the
permission set in the component.
	 *
	 * @since   1.6
	 */
	protected function canDelete($record)
	{
		if (!empty($record->id))
		{
			if ($record->published != -2)
			{
				return;
			}

			$user = JFactory::getUser();
			// The record has been set. Check the record permissions.
			return $user->authorise('core.delete',
'com_reservation.consultant.' . (int) $record->id);
		}
		return false;
	}

	/**
	 * Method to test whether a record can have its state edited.
	 *
	 * @param   object  $record  A record object.
	 *
	 * @return  boolean  True if allowed to change the state of the record.
Defaults to the permission set in the component.
	 *
	 * @since   1.6
	 */
	protected function canEditState($record)
	{
		$user = JFactory::getUser();
		$recordId = (!empty($record->id)) ? $record->id : 0;

		if ($recordId)
		{
			// The record has been set. Check the record permissions.
			$permission = $user->authorise('core.edit.state',
'com_reservation.consultant.' . (int) $recordId);
			if (!$permission && !is_null($permission))
			{
				return false;
			}
		}
		// In the absense of better information, revert to the component
permissions.
		return parent::canEditState($record);
	}
    
	/**
	 * Method override to check if you can edit an existing record.
	 *
	 * @param	array	$data	An array of input data.
	 * @param	string	$key	The name of the key for the primary key.
	 *
	 * @return	boolean
	 * @since	2.5
	 */
	protected function allowEdit($data = array(), $key = 'id')
	{
		// Check specific edit permission then general edit permission.

		return JFactory::getUser()->authorise('core.edit',
'com_reservation.consultant.'. ((int) isset($data[$key]) ?
$data[$key] : 0)) or parent::allowEdit($data, $key);
	}
    
	/**
	 * Prepare and sanitise the table data prior to saving.
	 *
	 * @param   JTable  $table  A JTable object.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function prepareTable($table)
	{
		$date = JFactory::getDate();
		$user = JFactory::getUser();
		
		if (isset($table->name))
		{
			$table->name = htmlspecialchars_decode($table->name, ENT_QUOTES);
		}
		
		if (isset($table->alias) && empty($table->alias))
		{
			$table->generateAlias();
		}
		
		if (empty($table->id))
		{
			$table->created = $date->toSql();
			// set the user
			if ($table->created_by == 0 || empty($table->created_by))
			{
				$table->created_by = $user->id;
			}
			// Set ordering to the last item if not set
			if (empty($table->ordering))
			{
				$db = JFactory::getDbo();
				$query = $db->getQuery(true)
					->select('MAX(ordering)')
					->from($db->quoteName('#__reservation_consultant'));
				$db->setQuery($query);
				$max = $db->loadResult();

				$table->ordering = $max + 1;
			}
		}
		else
		{
			$table->modified = $date->toSql();
			$table->modified_by = $user->id;
		}
        
		if (!empty($table->id))
		{
			// Increment the items version number.
			$table->version++;
		}
	}

	/**
	 * Method to get the data that should be injected in the form.
	 *
	 * @return  mixed  The data for the form.
	 *
	 * @since   1.6
	 */
	protected function loadFormData() 
	{
		// Check the session for previously entered form data.
		$data =
JFactory::getApplication()->getUserState('com_reservation.edit.consultant.data',
array());

		if (empty($data))
		{
			$data = $this->getItem();
			// run the perprocess of the data
			$this->preprocessData('com_reservation.consultant', $data);
		}

		return $data;
	}

	/**
	 * Method to get the unique fields of this table.
	 *
	 * @return  mixed  An array of field names, boolean false if none is set.
	 *
	 * @since   3.0
	 */
	protected function getUniqueFields()
	{
		return false;
	}
	
	/**
	 * Method to delete one or more records.
	 *
	 * @param   array  &$pks  An array of record primary keys.
	 *
	 * @return  boolean  True if successful, false if an error occurs.
	 *
	 * @since   12.2
	 */
	public function delete(&$pks)
	{
		if (!parent::delete($pks))
		{
			return false;
		}
		
		return true;
	}

	/**
	 * Method to change the published state of one or more records.
	 *
	 * @param   array    &$pks   A list of the primary keys to change.
	 * @param   integer  $value  The value of the published state.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   12.2
	 */
	public function publish(&$pks, $value = 1)
	{
		if (!parent::publish($pks, $value))
		{
			return false;
		}
		
		return true;
        }
    
	/**
	 * Method to perform batch operations on an item or a set of items.
	 *
	 * @param   array  $commands  An array of commands to perform.
	 * @param   array  $pks       An array of item ids.
	 * @param   array  $contexts  An array of item contexts.
	 *
	 * @return  boolean  Returns true on success, false on failure.
	 *
	 * @since   12.2
	 */
	public function batch($commands, $pks, $contexts)
	{
		// Sanitize ids.
		$pks = array_unique($pks);
		ArrayHelper::toInteger($pks);

		// Remove any values of zero.
		if (array_search(0, $pks, true))
		{
			unset($pks[array_search(0, $pks, true)]);
		}

		if (empty($pks))
		{
			$this->setError(JText::_('JGLOBAL_NO_ITEM_SELECTED'));
			return false;
		}

		$done = false;

		// Set some needed variables.
		$this->user			= JFactory::getUser();
		$this->table			= $this->getTable();
		$this->tableClassName		= get_class($this->table);
		$this->contentType		= new JUcmType;
		$this->type			=
$this->contentType->getTypeByTable($this->tableClassName);
		$this->canDo			=
ReservationHelper::getActions('consultant');
		$this->batchSet			= true;

		if (!$this->canDo->get('core.batch'))
		{
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_INSUFFICIENT_BATCH_INFORMATION'));
			return false;
		}
        
		if ($this->type == false)
		{
			$type = new JUcmType;
			$this->type = $type->getTypeByAlias($this->typeAlias);
		}

		$this->tagsObserver =
$this->table->getObserverOfClass('JTableObserverTags');

		if (!empty($commands['move_copy']))
		{
			$cmd = ArrayHelper::getValue($commands, 'move_copy',
'c');

			if ($cmd == 'c')
			{
				$result = $this->batchCopy($commands, $pks, $contexts);

				if (is_array($result))
				{
					foreach ($result as $old => $new)
					{
						$contexts[$new] = $contexts[$old];
					}
					$pks = array_values($result);
				}
				else
				{
					return false;
				}
			}
			elseif ($cmd == 'm' && !$this->batchMove($commands,
$pks, $contexts))
			{
				return false;
			}

			$done = true;
		}

		if (!$done)
		{
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_INSUFFICIENT_BATCH_INFORMATION'));

			return false;
		}

		// Clear the cache
		$this->cleanCache();

		return true;
	}

	/**
	 * Batch copy items to a new category or current.
	 *
	 * @param   integer  $values    The new values.
	 * @param   array    $pks       An array of row IDs.
	 * @param   array    $contexts  An array of item contexts.
	 *
	 * @return  mixed  An array of new IDs on success, boolean false on
failure.
	 *
	 * @since 12.2
	 */
	protected function batchCopy($values, $pks, $contexts)
	{
		if (empty($this->batchSet))
		{
			// Set some needed variables.
			$this->user 		= JFactory::getUser();
			$this->table 		= $this->getTable();
			$this->tableClassName	= get_class($this->table);
			$this->canDo		=
ReservationHelper::getActions('consultant');
		}

		if (!$this->canDo->get('core.create') ||
!$this->canDo->get('core.batch'))
		{
			return false;
		}

		// get list of unique fields
		$uniqueFields = $this->getUniqueFields();
		// remove move_copy from array
		unset($values['move_copy']);

		// make sure published is set
		if (!isset($values['published']))
		{
			$values['published'] = 0;
		}
		elseif (isset($values['published']) &&
!$this->canDo->get('core.edit.state'))
		{
				$values['published'] = 0;
		}

		if (isset($values['category']) && (int)
$values['category'] > 0 &&
!static::checkCategoryId($values['category']))
		{
			return false;
		}
		elseif (isset($values['category']) && (int)
$values['category'] > 0)
		{
			// move the category value to correct field name
			$values['catid'] = $values['category'];
			unset($values['category']);
		}
		elseif (isset($values['category']))
		{
			unset($values['category']);
		}

		$newIds = array();
		// Parent exists so let's proceed
		while (!empty($pks))
		{
			// Pop the first ID off the stack
			$pk = array_shift($pks);

			$this->table->reset();

			// only allow copy if user may edit this item.
			if (!$this->user->authorise('core.edit',
$contexts[$pk]))
			{
				// Not fatal error
				$this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND',
$pk));
				continue;
			}

			// Check that the row actually exists
			if (!$this->table->load($pk))
			{
				if ($error = $this->table->getError())
				{
					// Fatal error
					$this->setError($error);
					return false;
				}
				else
				{
					// Not fatal error
					$this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND',
$pk));
					continue;
				}
			}

			// insert all set values
			if (ReservationHelper::checkArray($values))
			{
				foreach ($values as $key => $value)
				{
					if (strlen($value) > 0 && isset($this->table->$key))
					{
						$this->table->$key = $value;
					}
				}
			}

			// update all unique fields
			if (ReservationHelper::checkArray($uniqueFields))
			{
				foreach ($uniqueFields as $uniqueField)
				{
					$this->table->$uniqueField =
$this->generateUnique($uniqueField,$this->table->$uniqueField);
				}
			}

			// Reset the ID because we are making a copy
			$this->table->id = 0;

			// TODO: Deal with ordering?
			// $this->table->ordering = 1;

			// Check the row.
			if (!$this->table->check())
			{
				$this->setError($this->table->getError());

				return false;
			}

			if (!empty($this->type))
			{
				$this->createTagsHelper($this->tagsObserver, $this->type, $pk,
$this->typeAlias, $this->table);
			}

			// Store the row.
			if (!$this->table->store())
			{
				$this->setError($this->table->getError());

				return false;
			}

			// Get the new item ID
			$newId = $this->table->get('id');

			// Add the new ID to the array
			$newIds[$pk] = $newId;
		}

		// Clean the cache
		$this->cleanCache();

		return $newIds;
	}

	/**
	 * Batch move items to a new category
	 *
	 * @param   integer  $value     The new category ID.
	 * @param   array    $pks       An array of row IDs.
	 * @param   array    $contexts  An array of item contexts.
	 *
	 * @return  boolean  True if successful, false otherwise and internal
error is set.
	 *
	 * @since 12.2
	 */
	protected function batchMove($values, $pks, $contexts)
	{
		if (empty($this->batchSet))
		{
			// Set some needed variables.
			$this->user		= JFactory::getUser();
			$this->table		= $this->getTable();
			$this->tableClassName	= get_class($this->table);
			$this->canDo		=
ReservationHelper::getActions('consultant');
		}

		if (!$this->canDo->get('core.edit') &&
!$this->canDo->get('core.batch'))
		{
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT'));
			return false;
		}

		// make sure published only updates if user has the permission.
		if (isset($values['published']) &&
!$this->canDo->get('core.edit.state'))
		{
			unset($values['published']);
		}
		// remove move_copy from array
		unset($values['move_copy']);

		if (isset($values['category']) && (int)
$values['category'] > 0 &&
!static::checkCategoryId($values['category']))
		{
			return false;
		}
		elseif (isset($values['category']) && (int)
$values['category'] > 0)
		{
			// move the category value to correct field name
			$values['catid'] = $values['category'];
			unset($values['category']);
		}
		elseif (isset($values['category']))
		{
			unset($values['category']);
		}


		// Parent exists so we proceed
		foreach ($pks as $pk)
		{
			if (!$this->user->authorise('core.edit',
$contexts[$pk]))
			{
				$this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT'));
				return false;
			}

			// Check that the row actually exists
			if (!$this->table->load($pk))
			{
				if ($error = $this->table->getError())
				{
					// Fatal error
					$this->setError($error);
					return false;
				}
				else
				{
					// Not fatal error
					$this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND',
$pk));
					continue;
				}
			}

			// insert all set values.
			if (ReservationHelper::checkArray($values))
			{
				foreach ($values as $key => $value)
				{
					// Do special action for access.
					if ('access' === $key && strlen($value) > 0)
					{
						$this->table->$key = $value;
					}
					elseif (strlen($value) > 0 &&
isset($this->table->$key))
					{
						$this->table->$key = $value;
					}
				}
			}


			// Check the row.
			if (!$this->table->check())
			{
				$this->setError($this->table->getError());

				return false;
			}

			if (!empty($this->type))
			{
				$this->createTagsHelper($this->tagsObserver, $this->type, $pk,
$this->typeAlias, $this->table);
			}

			// Store the row.
			if (!$this->table->store())
			{
				$this->setError($this->table->getError());

				return false;
			}
		}

		// Clean the cache
		$this->cleanCache();

		return true;
	}
	
	/**
	 * Method to save the form data.
	 *
	 * @param   array  $data  The form data.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   1.6
	 */
	public function save($data)
	{
		$input	= JFactory::getApplication()->input;
		$filter	= JFilterInput::getInstance();
        
		// set the metadata to the Item Data
		if (isset($data['metadata']) &&
isset($data['metadata']['author']))
		{
			$data['metadata']['author'] =
$filter->clean($data['metadata']['author'],
'TRIM');
            
			$metadata = new JRegistry;
			$metadata->loadArray($data['metadata']);
			$data['metadata'] = (string) $metadata;
		}
        
		// Set the Params Items to data
		if (isset($data['params']) &&
is_array($data['params']))
		{
			$params = new JRegistry;
			$params->loadArray($data['params']);
			$data['params'] = (string) $params;
		}

		// Alter the unique field for save as copy
		if ($input->get('task') === 'save2copy')
		{
			// Automatic handling of other unique fields
			$uniqueFields = $this->getUniqueFields();
			if (ReservationHelper::checkArray($uniqueFields))
			{
				foreach ($uniqueFields as $uniqueField)
				{
					$data[$uniqueField] =
$this->generateUnique($uniqueField,$data[$uniqueField]);
				}
			}
		}
		
		if (parent::save($data))
		{
			return true;
		}
		return false;
	}
	
	/**
	 * Method to generate a unique value.
	 *
	 * @param   string  $field name.
	 * @param   string  $value data.
	 *
	 * @return  string  New value.
	 *
	 * @since   3.0
	 */
	protected function generateUnique($field,$value)
	{

		// set field value unique
		$table = $this->getTable();

		while ($table->load(array($field => $value)))
		{
			$value = StringHelper::increment($value);
		}

		return $value;
	}

	/**
	 * Method to change the title
	 *
	 * @param   string   $title   The title.
	 *
	 * @return	array  Contains the modified title and alias.
	 *
	 */
	protected function _generateNewTitle($title)
	{

		// Alter the title
		$table = $this->getTable();

		while ($table->load(array('title' => $title)))
		{
			$title = StringHelper::increment($title);
		}

		return $title;
	}
}
PK4~�[z<�<D0D0models/consultants.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		consultants.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Utilities\ArrayHelper;

/**
 * Consultants Model
 */
class ReservationModelConsultants extends JModelList
{
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
        {
			$config['filter_fields'] = array(
				'a.id','id',
				'a.published','published',
				'a.access','access',
				'a.ordering','ordering',
				'a.created_by','created_by',
				'a.modified_by','modified_by',
				'a.experience','experience'
			);
		}

		parent::__construct($config);
	}

	/**
	 * Method to auto-populate the model state.
	 *
	 * Note. Calling getState in this method will result in recursion.
	 *
	 * @param   string  $ordering   An optional ordering field.
	 * @param   string  $direction  An optional direction (asc|desc).
	 *
	 * @return  void
	 *
	 */
	protected function populateState($ordering = null, $direction = null)
	{
		$app = JFactory::getApplication();

		// Adjust the context to support modal layouts.
		if ($layout = $app->input->get('layout'))
		{
			$this->context .= '.' . $layout;
		}

		// Check if the form was submitted
		$formSubmited =
$app->input->post->get('form_submited');

		$access = $this->getUserStateFromRequest($this->context .
'.filter.access', 'filter_access', 0, 'int');
		if ($formSubmited)
		{
			$access = $app->input->post->get('access');
			$this->setState('filter.access', $access);
		}

		$published = $this->getUserStateFromRequest($this->context .
'.filter.published', 'filter_published', '');
		$this->setState('filter.published', $published);

		$created_by = $this->getUserStateFromRequest($this->context .
'.filter.created_by', 'filter_created_by',
'');
		$this->setState('filter.created_by', $created_by);

		$created = $this->getUserStateFromRequest($this->context .
'.filter.created', 'filter_created');
		$this->setState('filter.created', $created);

		$sorting = $this->getUserStateFromRequest($this->context .
'.filter.sorting', 'filter_sorting', 0,
'int');
		$this->setState('filter.sorting', $sorting);

		$search = $this->getUserStateFromRequest($this->context .
'.filter.search', 'filter_search');
		$this->setState('filter.search', $search);

		$experience = $this->getUserStateFromRequest($this->context .
'.filter.experience', 'filter_experience');
		if ($formSubmited)
		{
			$experience = $app->input->post->get('experience');
			$this->setState('filter.experience', $experience);
		}

		// List state information.
		parent::populateState($ordering, $direction);
	}
	
	/**
	 * Method to get an array of data items.
	 *
	 * @return  mixed  An array of data items on success, false on failure.
	 */
	public function getItems()
	{
		// check in items
		$this->checkInNow();

		// load parent items
		$items = parent::getItems();

		// set selection value to a translatable value
		if (ReservationHelper::checkArray($items))
		{
			foreach ($items as $nr => &$item)
			{
				// convert account
				$item->account = $this->selectionTranslation($item->account,
'account');
			}
		}

        
		// return items
		return $items;
	}

	/**
	 * Method to convert selection values to translatable string.
	 *
	 * @return translatable string
	 */
	public function selectionTranslation($value,$name)
	{
		// Array of account language strings
		if ($name === 'account')
		{
			$accountArray = array(
				'consultant' =>
'COM_RESERVATION_CONSULTANT_CONSULTANT',
				'doctor' => 'COM_RESERVATION_CONSULTANT_DOCTOR',
				'both' => 'COM_RESERVATION_CONSULTANT_BOTH'
			);
			// Now check if value is found in this array
			if (isset($accountArray[$value]) &&
ReservationHelper::checkString($accountArray[$value]))
			{
				return $accountArray[$value];
			}
		}
		return $value;
	}
	
	/**
	 * Method to build an SQL query to load the list data.
	 *
	 * @return	string	An SQL query
	 */
	protected function getListQuery()
	{
		// Get the user object.
		$user = JFactory::getUser();
		// Create a new query object.
		$db = JFactory::getDBO();
		$query = $db->getQuery(true);

		// Select some fields
		$query->select('a.*');
		$query->select($db->quoteName('c.title','category_title'));

		// From the reservation_item table
		$query->from($db->quoteName('#__reservation_consultant',
'a'));
		$query->join('LEFT',
$db->quoteName('#__categories', 'c') . ' ON
(' . $db->quoteName('a.catid') . ' = ' .
$db->quoteName('c.id') . ')');

		// Filter by published state
		$published = $this->getState('filter.published');
		if (is_numeric($published))
		{
			$query->where('a.published = ' . (int) $published);
		}
		elseif ($published === '')
		{
			$query->where('(a.published = 0 OR a.published = 1)');
		}

		// Join over the asset groups.
		$query->select('ag.title AS access_level');
		$query->join('LEFT', '#__viewlevels AS ag ON ag.id =
a.access');
		// Filter by access level.
		$_access = $this->getState('filter.access');
		if ($_access && is_numeric($_access))
		{
			$query->where('a.access = ' . (int) $_access);
		}
		elseif (ReservationHelper::checkArray($_access))
		{
			// Secure the array for the query
			$_access = ArrayHelper::toInteger($_access);
			// Filter by the Access Array.
			$query->where('a.access IN (' . implode(',',
$_access) . ')');
		}
		// Implement View Level Access
		if (!$user->authorise('core.options',
'com_reservation'))
		{
			$groups = implode(',', $user->getAuthorisedViewLevels());
			$query->where('a.access IN (' . $groups . ')');
		}
		// Filter by search.
		$search = $this->getState('filter.search');
		if (!empty($search))
		{
			if (stripos($search, 'id:') === 0)
			{
				$query->where('a.id = ' . (int) substr($search, 3));
			}
			else
			{
				$search = $db->quote('%' . $db->escape($search) .
'%');
				$query->where('(a.nationalnumber LIKE '.$search.' OR
a.catid LIKE '.$search.' OR a.msn LIKE '.$search.' OR
a.phonenumber LIKE '.$search.' OR a.introduction LIKE
'.$search.')');
			}
		}


		// Add the list ordering clause.
		$orderCol = $this->state->get('list.ordering',
'a.id');
		$orderDirn = $this->state->get('list.direction',
'desc');
		if ($orderCol != '')
		{
			$query->order($db->escape($orderCol . ' ' .
$orderDirn));
		}

		return $query;
	}

	/**
	 * Method to get list export data.
	 *
	 * @param   array  $pks  The ids of the items to get
	 * @param   JUser  $user  The user making the request
	 *
	 * @return mixed  An array of data items on success, false on failure.
	 */
	public function getExportData($pks, $user = null)
	{
		// setup the query
		if (($pks_size = ReservationHelper::checkArray($pks)) !== false ||
'bulk' === $pks)
		{
			// Set a value to know this is export method. (USE IN CUSTOM CODE TO
ALTER OUTCOME)
			$_export = true;
			// Get the user object if not set.
			if (!isset($user) || !ReservationHelper::checkObject($user))
			{
				$user = JFactory::getUser();
			}
			// Create a new query object.
			$db = JFactory::getDBO();
			$query = $db->getQuery(true);

			// Select some fields
			$query->select('a.*');

			// From the reservation_consultant table
			$query->from($db->quoteName('#__reservation_consultant',
'a'));
			// The bulk export path
			if ('bulk' === $pks)
			{
				$query->where('a.id > 0');
			}
			// A large array of ID's will not work out well
			elseif ($pks_size > 500)
			{
				// Use lowest ID
				$query->where('a.id >= ' . (int) min($pks));
				// Use highest ID
				$query->where('a.id <= ' . (int) max($pks));
			}
			// The normal default path
			else
			{
				$query->where('a.id IN (' . implode(',',$pks) .
')');
			}
			// Implement View Level Access
			if (!$user->authorise('core.options',
'com_reservation'))
			{
				$groups = implode(',', $user->getAuthorisedViewLevels());
				$query->where('a.access IN (' . $groups . ')');
			}

			// Order the results by ordering
			$query->order('a.ordering  ASC');

			// Load the items
			$db->setQuery($query);
			$db->execute();
			if ($db->getNumRows())
			{
				$items = $db->loadObjectList();

				// Set values to display correctly.
				if (ReservationHelper::checkArray($items))
				{
					foreach ($items as $nr => &$item)
					{
						// unset the values we don't want exported.
						unset($item->asset_id);
						unset($item->checked_out);
						unset($item->checked_out_time);
					}
				}
				// Add headers to items array.
				$headers = $this->getExImPortHeaders();
				if (ReservationHelper::checkObject($headers))
				{
					array_unshift($items,$headers);
				}
				return $items;
			}
		}
		return false;
	}

	/**
	* Method to get header.
	*
	* @return mixed  An array of data items on success, false on failure.
	*/
	public function getExImPortHeaders()
	{
		// Get a db connection.
		$db = JFactory::getDbo();
		// get the columns
		$columns =
$db->getTableColumns("#__reservation_consultant");
		if (ReservationHelper::checkArray($columns))
		{
			// remove the headers you don't import/export.
			unset($columns['asset_id']);
			unset($columns['checked_out']);
			unset($columns['checked_out_time']);
			$headers = new stdClass();
			foreach ($columns as $column => $type)
			{
				$headers->{$column} = $column;
			}
			return $headers;
		}
		return false;
	}
	
	/**
	 * Method to get a store id based on model configuration state.
	 *
	 * @return  string  A store id.
	 *
	 */
	protected function getStoreId($id = '')
	{
		// Compile the store id.
		$id .= ':' . $this->getState('filter.id');
		$id .= ':' . $this->getState('filter.search');
		$id .= ':' . $this->getState('filter.published');
		// Check if the value is an array
		$_access = $this->getState('filter.access');
		if (ReservationHelper::checkArray($_access))
		{
			$id .= ':' . implode(':', $_access);
		}
		// Check if this is only an number or string
		elseif (is_numeric($_access)
		 || ReservationHelper::checkString($_access))
		{
			$id .= ':' . $_access;
		}
		$id .= ':' . $this->getState('filter.ordering');
		$id .= ':' . $this->getState('filter.created_by');
		$id .= ':' .
$this->getState('filter.modified_by');
		$id .= ':' . $this->getState('filter.experience');

		return parent::getStoreId($id);
	}

	/**
	 * Build an SQL query to checkin all items left checked out longer then a
set time.
	 *
	 * @return  a bool
	 *
	 */
	protected function checkInNow()
	{
		// Get set check in time
		$time =
JComponentHelper::getParams('com_reservation')->get('check_in');

		if ($time)
		{

			// Get a db connection.
			$db = JFactory::getDbo();
			// reset query
			$query = $db->getQuery(true);
			$query->select('*');
			$query->from($db->quoteName('#__reservation_consultant'));
			$db->setQuery($query);
			$db->execute();
			if ($db->getNumRows())
			{
				// Get Yesterdays date
				$date = JFactory::getDate()->modify($time)->toSql();
				// reset query
				$query = $db->getQuery(true);

				// Fields to update.
				$fields = array(
					$db->quoteName('checked_out_time') .
'=\'0000-00-00 00:00:00\'',
					$db->quoteName('checked_out') . '=0'
				);

				// Conditions for which records should be updated.
				$conditions = array(
					$db->quoteName('checked_out') . '!=0', 
					$db->quoteName('checked_out_time') .
'<\''.$date.'\''
				);

				// Check table
				$query->update($db->quoteName('#__reservation_consultant'))->set($fields)->where($conditions);


				$db->setQuery($query);

				$db->execute();
			}
		}

		return false;
	}
}
PK4~�[���]XXmodels/doctor.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		doctor.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Registry\Registry;
use Joomla\String\StringHelper;
use Joomla\Utilities\ArrayHelper;

/**
 * Reservation Doctor Model
 */
class ReservationModelDoctor extends JModelAdmin
{
	/**
	 * The tab layout fields array.
	 *
	 * @var      array
	 */
	protected $tabLayoutFields = array(
		'details' => array(
			'left' => array(
				'userid',
				'phonenumber',
				'msn',
				'presence',
				'capitalid'
			),
			'right' => array(
				'catid',
				'officephone',
				'image',
				'alt',
				'cityid'
			),
			'fullwidth' => array(
				'address'
			)
		)
	);

	/**
	 * @var        string    The prefix to use with controller messages.
	 * @since   1.6
	 */
	protected $text_prefix = 'COM_RESERVATION';

	/**
	 * The type alias for this content type.
	 *
	 * @var      string
	 * @since    3.2
	 */
	public $typeAlias = 'com_reservation.doctor';

	/**
	 * Returns a Table object, always creating it
	 *
	 * @param   type    $type    The table type to instantiate
	 * @param   string  $prefix  A prefix for the table class name. Optional.
	 * @param   array   $config  Configuration array for model. Optional.
	 *
	 * @return  JTable  A database object
	 *
	 * @since   1.6
	 */
	public function getTable($type = 'doctor', $prefix =
'ReservationTable', $config = array())
	{
		// add table path for when model gets used from other component
		$this->addTablePath(JPATH_ADMINISTRATOR .
'/components/com_reservation/tables');
		// get instance of the table
		return JTable::getInstance($type, $prefix, $config);
	}
    
	/**
	 * Method to get a single record.
	 *
	 * @param   integer  $pk  The id of the primary key.
	 *
	 * @return  mixed  Object on success, false on failure.
	 *
	 * @since   1.6
	 */
	public function getItem($pk = null)
	{
		if ($item = parent::getItem($pk))
		{
			if (!empty($item->params) && !is_array($item->params))
			{
				// Convert the params field to an array.
				$registry = new Registry;
				$registry->loadString($item->params);
				$item->params = $registry->toArray();
			}

			if (!empty($item->metadata))
			{
				// Convert the metadata field to an array.
				$registry = new Registry;
				$registry->loadString($item->metadata);
				$item->metadata = $registry->toArray();
			}
		}

		return $item;
	}

	/**
	 * Method to get the record form.
	 *
	 * @param   array    $data      Data for the form.
	 * @param   boolean  $loadData  True if the form is to load its own data
(default case), false if not.
	 * @param   array    $options   Optional array of options for the form
creation.
	 *
	 * @return  mixed  A JForm object on success, false on failure
	 *
	 * @since   1.6
	 */
	public function getForm($data = array(), $loadData = true, $options =
array('control' => 'jform'))
	{
		// set load data option
		$options['load_data'] = $loadData;
		// check if xpath was set in options
		$xpath = false;
		if (isset($options['xpath']))
		{
			$xpath = $options['xpath'];
			unset($options['xpath']);
		}
		// check if clear form was set in options
		$clear = false;
		if (isset($options['clear']))
		{
			$clear = $options['clear'];
			unset($options['clear']);
		}

		// Get the form.
		$form = $this->loadForm('com_reservation.doctor',
'doctor', $options, $clear, $xpath);

		if (empty($form))
		{
			return false;
		}

		$jinput = JFactory::getApplication()->input;

		// The front end calls this model and uses a_id to avoid id clashes so we
need to check for that first.
		if ($jinput->get('a_id'))
		{
			$id = $jinput->get('a_id', 0, 'INT');
		}
		// The back end uses id so we use that the rest of the time and set it to
0 by default.
		else
		{
			$id = $jinput->get('id', 0, 'INT');
		}

		$user = JFactory::getUser();

		// Check for existing item.
		// Modify the form based on Edit State access controls.
		if ($id != 0 &&
(!$user->authorise('core.edit.state',
'com_reservation.doctor.' . (int) $id))
			|| ($id == 0 &&
!$user->authorise('core.edit.state',
'com_reservation')))
		{
			// Disable fields for display.
			$form->setFieldAttribute('ordering', 'disabled',
'true');
			$form->setFieldAttribute('published', 'disabled',
'true');
			// Disable fields while saving.
			$form->setFieldAttribute('ordering', 'filter',
'unset');
			$form->setFieldAttribute('published', 'filter',
'unset');
		}
		// If this is a new item insure the greated by is set.
		if (0 == $id)
		{
			// Set the created_by to this user
			$form->setValue('created_by', null, $user->id);
		}
		// Modify the form based on Edit Creaded By access controls.
		if (!$user->authorise('core.edit.created_by',
'com_reservation'))
		{
			// Disable fields for display.
			$form->setFieldAttribute('created_by',
'disabled', 'true');
			// Disable fields for display.
			$form->setFieldAttribute('created_by',
'readonly', 'true');
			// Disable fields while saving.
			$form->setFieldAttribute('created_by', 'filter',
'unset');
		}
		// Modify the form based on Edit Creaded Date access controls.
		if (!$user->authorise('core.edit.created',
'com_reservation'))
		{
			// Disable fields for display.
			$form->setFieldAttribute('created', 'disabled',
'true');
			// Disable fields while saving.
			$form->setFieldAttribute('created', 'filter',
'unset');
		}
		// Only load these values if no id is found
		if (0 == $id)
		{
			// Set redirected view name
			$redirectedView = $jinput->get('ref', null,
'STRING');
			// Set field name (or fall back to view name)
			$redirectedField = $jinput->get('field', $redirectedView,
'STRING');
			// Set redirected view id
			$redirectedId = $jinput->get('refid', 0, 'INT');
			// Set field id (or fall back to redirected view id)
			$redirectedValue = $jinput->get('field_id', $redirectedId,
'INT');
			if (0 != $redirectedValue && $redirectedField)
			{
				// Now set the local-redirected field default value
				$form->setValue($redirectedField, null, $redirectedValue);
			}
		}
		return $form;
	}

	/**
	 * Method to get the script that have to be included on the form
	 *
	 * @return string	script files
	 */
	public function getScript()
	{
		return 'media/com_reservation/js/doctor.js';
	}
    
	/**
	 * Method to test whether a record can be deleted.
	 *
	 * @param   object  $record  A record object.
	 *
	 * @return  boolean  True if allowed to delete the record. Defaults to the
permission set in the component.
	 *
	 * @since   1.6
	 */
	protected function canDelete($record)
	{
		if (!empty($record->id))
		{
			if ($record->published != -2)
			{
				return;
			}

			$user = JFactory::getUser();
			// The record has been set. Check the record permissions.
			return $user->authorise('core.delete',
'com_reservation.doctor.' . (int) $record->id);
		}
		return false;
	}

	/**
	 * Method to test whether a record can have its state edited.
	 *
	 * @param   object  $record  A record object.
	 *
	 * @return  boolean  True if allowed to change the state of the record.
Defaults to the permission set in the component.
	 *
	 * @since   1.6
	 */
	protected function canEditState($record)
	{
		$user = JFactory::getUser();
		$recordId = (!empty($record->id)) ? $record->id : 0;

		if ($recordId)
		{
			// The record has been set. Check the record permissions.
			$permission = $user->authorise('core.edit.state',
'com_reservation.doctor.' . (int) $recordId);
			if (!$permission && !is_null($permission))
			{
				return false;
			}
		}
		// In the absense of better information, revert to the component
permissions.
		return parent::canEditState($record);
	}
    
	/**
	 * Method override to check if you can edit an existing record.
	 *
	 * @param	array	$data	An array of input data.
	 * @param	string	$key	The name of the key for the primary key.
	 *
	 * @return	boolean
	 * @since	2.5
	 */
	protected function allowEdit($data = array(), $key = 'id')
	{
		// Check specific edit permission then general edit permission.

		return JFactory::getUser()->authorise('core.edit',
'com_reservation.doctor.'. ((int) isset($data[$key]) ?
$data[$key] : 0)) or parent::allowEdit($data, $key);
	}
    
	/**
	 * Prepare and sanitise the table data prior to saving.
	 *
	 * @param   JTable  $table  A JTable object.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function prepareTable($table)
	{
		$date = JFactory::getDate();
		$user = JFactory::getUser();
		
		if (isset($table->name))
		{
			$table->name = htmlspecialchars_decode($table->name, ENT_QUOTES);
		}
		
		if (isset($table->alias) && empty($table->alias))
		{
			$table->generateAlias();
		}
		
		if (empty($table->id))
		{
			$table->created = $date->toSql();
			// set the user
			if ($table->created_by == 0 || empty($table->created_by))
			{
				$table->created_by = $user->id;
			}
			// Set ordering to the last item if not set
			if (empty($table->ordering))
			{
				$db = JFactory::getDbo();
				$query = $db->getQuery(true)
					->select('MAX(ordering)')
					->from($db->quoteName('#__reservation_doctor'));
				$db->setQuery($query);
				$max = $db->loadResult();

				$table->ordering = $max + 1;
			}
		}
		else
		{
			$table->modified = $date->toSql();
			$table->modified_by = $user->id;
		}
        
		if (!empty($table->id))
		{
			// Increment the items version number.
			$table->version++;
		}
	}

	/**
	 * Method to get the data that should be injected in the form.
	 *
	 * @return  mixed  The data for the form.
	 *
	 * @since   1.6
	 */
	protected function loadFormData() 
	{
		// Check the session for previously entered form data.
		$data =
JFactory::getApplication()->getUserState('com_reservation.edit.doctor.data',
array());

		if (empty($data))
		{
			$data = $this->getItem();
			// run the perprocess of the data
			$this->preprocessData('com_reservation.doctor', $data);
		}

		return $data;
	}

	/**
	 * Method to get the unique fields of this table.
	 *
	 * @return  mixed  An array of field names, boolean false if none is set.
	 *
	 * @since   3.0
	 */
	protected function getUniqueFields()
	{
		return false;
	}
	
	/**
	 * Method to delete one or more records.
	 *
	 * @param   array  &$pks  An array of record primary keys.
	 *
	 * @return  boolean  True if successful, false if an error occurs.
	 *
	 * @since   12.2
	 */
	public function delete(&$pks)
	{
		if (!parent::delete($pks))
		{
			return false;
		}
		
		return true;
	}

	/**
	 * Method to change the published state of one or more records.
	 *
	 * @param   array    &$pks   A list of the primary keys to change.
	 * @param   integer  $value  The value of the published state.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   12.2
	 */
	public function publish(&$pks, $value = 1)
	{
		if (!parent::publish($pks, $value))
		{
			return false;
		}
		
		return true;
        }
    
	/**
	 * Method to perform batch operations on an item or a set of items.
	 *
	 * @param   array  $commands  An array of commands to perform.
	 * @param   array  $pks       An array of item ids.
	 * @param   array  $contexts  An array of item contexts.
	 *
	 * @return  boolean  Returns true on success, false on failure.
	 *
	 * @since   12.2
	 */
	public function batch($commands, $pks, $contexts)
	{
		// Sanitize ids.
		$pks = array_unique($pks);
		ArrayHelper::toInteger($pks);

		// Remove any values of zero.
		if (array_search(0, $pks, true))
		{
			unset($pks[array_search(0, $pks, true)]);
		}

		if (empty($pks))
		{
			$this->setError(JText::_('JGLOBAL_NO_ITEM_SELECTED'));
			return false;
		}

		$done = false;

		// Set some needed variables.
		$this->user			= JFactory::getUser();
		$this->table			= $this->getTable();
		$this->tableClassName		= get_class($this->table);
		$this->contentType		= new JUcmType;
		$this->type			=
$this->contentType->getTypeByTable($this->tableClassName);
		$this->canDo			= ReservationHelper::getActions('doctor');
		$this->batchSet			= true;

		if (!$this->canDo->get('core.batch'))
		{
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_INSUFFICIENT_BATCH_INFORMATION'));
			return false;
		}
        
		if ($this->type == false)
		{
			$type = new JUcmType;
			$this->type = $type->getTypeByAlias($this->typeAlias);
		}

		$this->tagsObserver =
$this->table->getObserverOfClass('JTableObserverTags');

		if (!empty($commands['move_copy']))
		{
			$cmd = ArrayHelper::getValue($commands, 'move_copy',
'c');

			if ($cmd == 'c')
			{
				$result = $this->batchCopy($commands, $pks, $contexts);

				if (is_array($result))
				{
					foreach ($result as $old => $new)
					{
						$contexts[$new] = $contexts[$old];
					}
					$pks = array_values($result);
				}
				else
				{
					return false;
				}
			}
			elseif ($cmd == 'm' && !$this->batchMove($commands,
$pks, $contexts))
			{
				return false;
			}

			$done = true;
		}

		if (!$done)
		{
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_INSUFFICIENT_BATCH_INFORMATION'));

			return false;
		}

		// Clear the cache
		$this->cleanCache();

		return true;
	}

	/**
	 * Batch copy items to a new category or current.
	 *
	 * @param   integer  $values    The new values.
	 * @param   array    $pks       An array of row IDs.
	 * @param   array    $contexts  An array of item contexts.
	 *
	 * @return  mixed  An array of new IDs on success, boolean false on
failure.
	 *
	 * @since 12.2
	 */
	protected function batchCopy($values, $pks, $contexts)
	{
		if (empty($this->batchSet))
		{
			// Set some needed variables.
			$this->user 		= JFactory::getUser();
			$this->table 		= $this->getTable();
			$this->tableClassName	= get_class($this->table);
			$this->canDo		= ReservationHelper::getActions('doctor');
		}

		if (!$this->canDo->get('core.create') ||
!$this->canDo->get('core.batch'))
		{
			return false;
		}

		// get list of unique fields
		$uniqueFields = $this->getUniqueFields();
		// remove move_copy from array
		unset($values['move_copy']);

		// make sure published is set
		if (!isset($values['published']))
		{
			$values['published'] = 0;
		}
		elseif (isset($values['published']) &&
!$this->canDo->get('core.edit.state'))
		{
				$values['published'] = 0;
		}

		if (isset($values['category']) && (int)
$values['category'] > 0 &&
!static::checkCategoryId($values['category']))
		{
			return false;
		}
		elseif (isset($values['category']) && (int)
$values['category'] > 0)
		{
			// move the category value to correct field name
			$values['catid'] = $values['category'];
			unset($values['category']);
		}
		elseif (isset($values['category']))
		{
			unset($values['category']);
		}

		$newIds = array();
		// Parent exists so let's proceed
		while (!empty($pks))
		{
			// Pop the first ID off the stack
			$pk = array_shift($pks);

			$this->table->reset();

			// only allow copy if user may edit this item.
			if (!$this->user->authorise('core.edit',
$contexts[$pk]))
			{
				// Not fatal error
				$this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND',
$pk));
				continue;
			}

			// Check that the row actually exists
			if (!$this->table->load($pk))
			{
				if ($error = $this->table->getError())
				{
					// Fatal error
					$this->setError($error);
					return false;
				}
				else
				{
					// Not fatal error
					$this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND',
$pk));
					continue;
				}
			}

			// insert all set values
			if (ReservationHelper::checkArray($values))
			{
				foreach ($values as $key => $value)
				{
					if (strlen($value) > 0 && isset($this->table->$key))
					{
						$this->table->$key = $value;
					}
				}
			}

			// update all unique fields
			if (ReservationHelper::checkArray($uniqueFields))
			{
				foreach ($uniqueFields as $uniqueField)
				{
					$this->table->$uniqueField =
$this->generateUnique($uniqueField,$this->table->$uniqueField);
				}
			}

			// Reset the ID because we are making a copy
			$this->table->id = 0;

			// TODO: Deal with ordering?
			// $this->table->ordering = 1;

			// Check the row.
			if (!$this->table->check())
			{
				$this->setError($this->table->getError());

				return false;
			}

			if (!empty($this->type))
			{
				$this->createTagsHelper($this->tagsObserver, $this->type, $pk,
$this->typeAlias, $this->table);
			}

			// Store the row.
			if (!$this->table->store())
			{
				$this->setError($this->table->getError());

				return false;
			}

			// Get the new item ID
			$newId = $this->table->get('id');

			// Add the new ID to the array
			$newIds[$pk] = $newId;
		}

		// Clean the cache
		$this->cleanCache();

		return $newIds;
	}

	/**
	 * Batch move items to a new category
	 *
	 * @param   integer  $value     The new category ID.
	 * @param   array    $pks       An array of row IDs.
	 * @param   array    $contexts  An array of item contexts.
	 *
	 * @return  boolean  True if successful, false otherwise and internal
error is set.
	 *
	 * @since 12.2
	 */
	protected function batchMove($values, $pks, $contexts)
	{
		if (empty($this->batchSet))
		{
			// Set some needed variables.
			$this->user		= JFactory::getUser();
			$this->table		= $this->getTable();
			$this->tableClassName	= get_class($this->table);
			$this->canDo		= ReservationHelper::getActions('doctor');
		}

		if (!$this->canDo->get('core.edit') &&
!$this->canDo->get('core.batch'))
		{
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT'));
			return false;
		}

		// make sure published only updates if user has the permission.
		if (isset($values['published']) &&
!$this->canDo->get('core.edit.state'))
		{
			unset($values['published']);
		}
		// remove move_copy from array
		unset($values['move_copy']);

		if (isset($values['category']) && (int)
$values['category'] > 0 &&
!static::checkCategoryId($values['category']))
		{
			return false;
		}
		elseif (isset($values['category']) && (int)
$values['category'] > 0)
		{
			// move the category value to correct field name
			$values['catid'] = $values['category'];
			unset($values['category']);
		}
		elseif (isset($values['category']))
		{
			unset($values['category']);
		}


		// Parent exists so we proceed
		foreach ($pks as $pk)
		{
			if (!$this->user->authorise('core.edit',
$contexts[$pk]))
			{
				$this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT'));
				return false;
			}

			// Check that the row actually exists
			if (!$this->table->load($pk))
			{
				if ($error = $this->table->getError())
				{
					// Fatal error
					$this->setError($error);
					return false;
				}
				else
				{
					// Not fatal error
					$this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND',
$pk));
					continue;
				}
			}

			// insert all set values.
			if (ReservationHelper::checkArray($values))
			{
				foreach ($values as $key => $value)
				{
					// Do special action for access.
					if ('access' === $key && strlen($value) > 0)
					{
						$this->table->$key = $value;
					}
					elseif (strlen($value) > 0 &&
isset($this->table->$key))
					{
						$this->table->$key = $value;
					}
				}
			}


			// Check the row.
			if (!$this->table->check())
			{
				$this->setError($this->table->getError());

				return false;
			}

			if (!empty($this->type))
			{
				$this->createTagsHelper($this->tagsObserver, $this->type, $pk,
$this->typeAlias, $this->table);
			}

			// Store the row.
			if (!$this->table->store())
			{
				$this->setError($this->table->getError());

				return false;
			}
		}

		// Clean the cache
		$this->cleanCache();

		return true;
	}
	
	/**
	 * Method to save the form data.
	 *
	 * @param   array  $data  The form data.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   1.6
	 */
	public function save($data)
	{
		$input	= JFactory::getApplication()->input;
		$filter	= JFilterInput::getInstance();
        
		// set the metadata to the Item Data
		if (isset($data['metadata']) &&
isset($data['metadata']['author']))
		{
			$data['metadata']['author'] =
$filter->clean($data['metadata']['author'],
'TRIM');
            
			$metadata = new JRegistry;
			$metadata->loadArray($data['metadata']);
			$data['metadata'] = (string) $metadata;
		}
        
		// Set the Params Items to data
		if (isset($data['params']) &&
is_array($data['params']))
		{
			$params = new JRegistry;
			$params->loadArray($data['params']);
			$data['params'] = (string) $params;
		}

		// Alter the unique field for save as copy
		if ($input->get('task') === 'save2copy')
		{
			// Automatic handling of other unique fields
			$uniqueFields = $this->getUniqueFields();
			if (ReservationHelper::checkArray($uniqueFields))
			{
				foreach ($uniqueFields as $uniqueField)
				{
					$data[$uniqueField] =
$this->generateUnique($uniqueField,$data[$uniqueField]);
				}
			}
		}
		
		if (parent::save($data))
		{
			return true;
		}
		return false;
	}
	
	/**
	 * Method to generate a unique value.
	 *
	 * @param   string  $field name.
	 * @param   string  $value data.
	 *
	 * @return  string  New value.
	 *
	 * @since   3.0
	 */
	protected function generateUnique($field,$value)
	{

		// set field value unique
		$table = $this->getTable();

		while ($table->load(array($field => $value)))
		{
			$value = StringHelper::increment($value);
		}

		return $value;
	}

	/**
	 * Method to change the title
	 *
	 * @param   string   $title   The title.
	 *
	 * @return	array  Contains the modified title and alias.
	 *
	 */
	protected function _generateNewTitle($title)
	{

		// Alter the title
		$table = $this->getTable();

		while ($table->load(array('title' => $title)))
		{
			$title = StringHelper::increment($title);
		}

		return $title;
	}
}
PK4~�[a&�c4646models/doctors.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		doctors.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Utilities\ArrayHelper;

/**
 * Doctors Model
 */
class ReservationModelDoctors extends JModelList
{
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
        {
			$config['filter_fields'] = array(
				'a.id','id',
				'a.published','published',
				'a.access','access',
				'a.ordering','ordering',
				'a.created_by','created_by',
				'a.modified_by','modified_by',
				'c.title','category_title',
				'c.id', 'category_id',
				'a.catid','catid'
			);
		}

		parent::__construct($config);
	}

	/**
	 * Method to auto-populate the model state.
	 *
	 * Note. Calling getState in this method will result in recursion.
	 *
	 * @param   string  $ordering   An optional ordering field.
	 * @param   string  $direction  An optional direction (asc|desc).
	 *
	 * @return  void
	 *
	 */
	protected function populateState($ordering = null, $direction = null)
	{
		$app = JFactory::getApplication();

		// Adjust the context to support modal layouts.
		if ($layout = $app->input->get('layout'))
		{
			$this->context .= '.' . $layout;
		}

		// Check if the form was submitted
		$formSubmited =
$app->input->post->get('form_submited');

		$access = $this->getUserStateFromRequest($this->context .
'.filter.access', 'filter_access', 0, 'int');
		if ($formSubmited)
		{
			$access = $app->input->post->get('access');
			$this->setState('filter.access', $access);
		}

		$published = $this->getUserStateFromRequest($this->context .
'.filter.published', 'filter_published', '');
		$this->setState('filter.published', $published);

		$created_by = $this->getUserStateFromRequest($this->context .
'.filter.created_by', 'filter_created_by',
'');
		$this->setState('filter.created_by', $created_by);

		$created = $this->getUserStateFromRequest($this->context .
'.filter.created', 'filter_created');
		$this->setState('filter.created', $created);

		$sorting = $this->getUserStateFromRequest($this->context .
'.filter.sorting', 'filter_sorting', 0,
'int');
		$this->setState('filter.sorting', $sorting);

		$search = $this->getUserStateFromRequest($this->context .
'.filter.search', 'filter_search');
		$this->setState('filter.search', $search);

		$category = $app->getUserStateFromRequest($this->context .
'.filter.category', 'filter_category');
		$this->setState('filter.category', $category);

		$categoryId = $this->getUserStateFromRequest($this->context .
'.filter.category_id', 'filter_category_id');
		$this->setState('filter.category_id', $categoryId);

		$catid = $this->getUserStateFromRequest($this->context .
'.filter.catid', 'filter_catid');
		if ($formSubmited)
		{
			$catid = $app->input->post->get('catid');
			$this->setState('filter.catid', $catid);
		}

		// List state information.
		parent::populateState($ordering, $direction);
	}
	
	/**
	 * Method to get an array of data items.
	 *
	 * @return  mixed  An array of data items on success, false on failure.
	 */
	public function getItems()
	{
		// check in items
		$this->checkInNow();

		// load parent items
		$items = parent::getItems();
        
		// return items
		return $items;
	}
	
	/**
	 * Method to build an SQL query to load the list data.
	 *
	 * @return	string	An SQL query
	 */
	protected function getListQuery()
	{
		// Get the user object.
		$user = JFactory::getUser();
		// Create a new query object.
		$db = JFactory::getDBO();
		$query = $db->getQuery(true);

		// Select some fields
		$query->select('a.*');
		$query->select($db->quoteName('c.title','category_title'));

		// From the reservation_item table
		$query->from($db->quoteName('#__reservation_doctor',
'a'));
		$query->join('LEFT',
$db->quoteName('#__categories', 'c') . ' ON
(' . $db->quoteName('a.catid') . ' = ' .
$db->quoteName('c.id') . ')');

		// From the reservation_capital table.
		$query->select($db->quoteName('g.name','capitalid_name'));
		$query->join('LEFT',
$db->quoteName('#__reservation_capital', 'g') .
' ON (' . $db->quoteName('a.capitalid') . ' =
' . $db->quoteName('g.id') . ')');

		// From the reservation_capital table.
		$query->select($db->quoteName('h.name','cityid_name'));
		$query->join('LEFT',
$db->quoteName('#__reservation_capital', 'h') .
' ON (' . $db->quoteName('a.cityid') . ' =
' . $db->quoteName('h.id') . ')');

		// Filter by published state
		$published = $this->getState('filter.published');
		if (is_numeric($published))
		{
			$query->where('a.published = ' . (int) $published);
		}
		elseif ($published === '')
		{
			$query->where('(a.published = 0 OR a.published = 1)');
		}

		// Join over the asset groups.
		$query->select('ag.title AS access_level');
		$query->join('LEFT', '#__viewlevels AS ag ON ag.id =
a.access');
		// Filter by access level.
		$_access = $this->getState('filter.access');
		if ($_access && is_numeric($_access))
		{
			$query->where('a.access = ' . (int) $_access);
		}
		elseif (ReservationHelper::checkArray($_access))
		{
			// Secure the array for the query
			$_access = ArrayHelper::toInteger($_access);
			// Filter by the Access Array.
			$query->where('a.access IN (' . implode(',',
$_access) . ')');
		}
		// Implement View Level Access
		if (!$user->authorise('core.options',
'com_reservation'))
		{
			$groups = implode(',', $user->getAuthorisedViewLevels());
			$query->where('a.access IN (' . $groups . ')');
		}
		// Filter by search.
		$search = $this->getState('filter.search');
		if (!empty($search))
		{
			if (stripos($search, 'id:') === 0)
			{
				$query->where('a.id = ' . (int) substr($search, 3));
			}
			else
			{
				$search = $db->quote('%' . $db->escape($search) .
'%');
				$query->where('(a.userid LIKE '.$search.' OR a.msn
LIKE '.$search.' OR a.phonenumber LIKE '.$search.' OR
a.officephone LIKE '.$search.' OR a.address LIKE
'.$search.')');
			}
		}


		// Filter by a single or group of categories.
		$baselevel = 1;
		$categoryId = $this->getState('filter.category_id');

		if (is_numeric($categoryId))
		{
			$cat_tbl = JTable::getInstance('Category',
'JTable');
			$cat_tbl->load($categoryId);
			$rgt = $cat_tbl->rgt;
			$lft = $cat_tbl->lft;
			$baselevel = (int) $cat_tbl->level;
			$query->where('c.lft >= ' . (int) $lft)
				->where('c.rgt <= ' . (int) $rgt);
		}
		elseif (is_array($categoryId))
		{
			$categoryId = ArrayHelper::toInteger($categoryId);
			$categoryId = implode(',', $categoryId);
			$query->where('a.catid IN (' . $categoryId .
')');
		}


		// Add the list ordering clause.
		$orderCol = $this->state->get('list.ordering',
'a.id');
		$orderDirn = $this->state->get('list.direction',
'desc');
		if ($orderCol != '')
		{
			$query->order($db->escape($orderCol . ' ' .
$orderDirn));
		}

		return $query;
	}

	/**
	 * Method to get list export data.
	 *
	 * @param   array  $pks  The ids of the items to get
	 * @param   JUser  $user  The user making the request
	 *
	 * @return mixed  An array of data items on success, false on failure.
	 */
	public function getExportData($pks, $user = null)
	{
		// setup the query
		if (($pks_size = ReservationHelper::checkArray($pks)) !== false ||
'bulk' === $pks)
		{
			// Set a value to know this is export method. (USE IN CUSTOM CODE TO
ALTER OUTCOME)
			$_export = true;
			// Get the user object if not set.
			if (!isset($user) || !ReservationHelper::checkObject($user))
			{
				$user = JFactory::getUser();
			}
			// Create a new query object.
			$db = JFactory::getDBO();
			$query = $db->getQuery(true);

			// Select some fields
			$query->select('a.*');

			// From the reservation_doctor table
			$query->from($db->quoteName('#__reservation_doctor',
'a'));
			// The bulk export path
			if ('bulk' === $pks)
			{
				$query->where('a.id > 0');
			}
			// A large array of ID's will not work out well
			elseif ($pks_size > 500)
			{
				// Use lowest ID
				$query->where('a.id >= ' . (int) min($pks));
				// Use highest ID
				$query->where('a.id <= ' . (int) max($pks));
			}
			// The normal default path
			else
			{
				$query->where('a.id IN (' . implode(',',$pks) .
')');
			}
			// Implement View Level Access
			if (!$user->authorise('core.options',
'com_reservation'))
			{
				$groups = implode(',', $user->getAuthorisedViewLevels());
				$query->where('a.access IN (' . $groups . ')');
			}

			// Order the results by ordering
			$query->order('a.ordering  ASC');

			// Load the items
			$db->setQuery($query);
			$db->execute();
			if ($db->getNumRows())
			{
				$items = $db->loadObjectList();

				// Set values to display correctly.
				if (ReservationHelper::checkArray($items))
				{
					foreach ($items as $nr => &$item)
					{
						// unset the values we don't want exported.
						unset($item->asset_id);
						unset($item->checked_out);
						unset($item->checked_out_time);
					}
				}
				// Add headers to items array.
				$headers = $this->getExImPortHeaders();
				if (ReservationHelper::checkObject($headers))
				{
					array_unshift($items,$headers);
				}
				return $items;
			}
		}
		return false;
	}

	/**
	* Method to get header.
	*
	* @return mixed  An array of data items on success, false on failure.
	*/
	public function getExImPortHeaders()
	{
		// Get a db connection.
		$db = JFactory::getDbo();
		// get the columns
		$columns = $db->getTableColumns("#__reservation_doctor");
		if (ReservationHelper::checkArray($columns))
		{
			// remove the headers you don't import/export.
			unset($columns['asset_id']);
			unset($columns['checked_out']);
			unset($columns['checked_out_time']);
			$headers = new stdClass();
			foreach ($columns as $column => $type)
			{
				$headers->{$column} = $column;
			}
			return $headers;
		}
		return false;
	}
	
	/**
	 * Method to get a store id based on model configuration state.
	 *
	 * @return  string  A store id.
	 *
	 */
	protected function getStoreId($id = '')
	{
		// Compile the store id.
		$id .= ':' . $this->getState('filter.id');
		$id .= ':' . $this->getState('filter.search');
		$id .= ':' . $this->getState('filter.published');
		// Check if the value is an array
		$_access = $this->getState('filter.access');
		if (ReservationHelper::checkArray($_access))
		{
			$id .= ':' . implode(':', $_access);
		}
		// Check if this is only an number or string
		elseif (is_numeric($_access)
		 || ReservationHelper::checkString($_access))
		{
			$id .= ':' . $_access;
		}
		$id .= ':' . $this->getState('filter.ordering');
		$id .= ':' . $this->getState('filter.created_by');
		$id .= ':' .
$this->getState('filter.modified_by');
		// Check if the value is an array
		$_category = $this->getState('filter.category');
		if (ReservationHelper::checkArray($_category))
		{
			$id .= ':' . implode(':', $_category);
		}
		// Check if this is only an number or string
		elseif (is_numeric($_category)
		 || ReservationHelper::checkString($_category))
		{
			$id .= ':' . $_category;
		}
		// Check if the value is an array
		$_category_id = $this->getState('filter.category_id');
		if (ReservationHelper::checkArray($_category_id))
		{
			$id .= ':' . implode(':', $_category_id);
		}
		// Check if this is only an number or string
		elseif (is_numeric($_category_id)
		 || ReservationHelper::checkString($_category_id))
		{
			$id .= ':' . $_category_id;
		}
		// Check if the value is an array
		$_catid = $this->getState('filter.catid');
		if (ReservationHelper::checkArray($_catid))
		{
			$id .= ':' . implode(':', $_catid);
		}
		// Check if this is only an number or string
		elseif (is_numeric($_catid)
		 || ReservationHelper::checkString($_catid))
		{
			$id .= ':' . $_catid;
		}

		return parent::getStoreId($id);
	}

	/**
	 * Build an SQL query to checkin all items left checked out longer then a
set time.
	 *
	 * @return  a bool
	 *
	 */
	protected function checkInNow()
	{
		// Get set check in time
		$time =
JComponentHelper::getParams('com_reservation')->get('check_in');

		if ($time)
		{

			// Get a db connection.
			$db = JFactory::getDbo();
			// reset query
			$query = $db->getQuery(true);
			$query->select('*');
			$query->from($db->quoteName('#__reservation_doctor'));
			$db->setQuery($query);
			$db->execute();
			if ($db->getNumRows())
			{
				// Get Yesterdays date
				$date = JFactory::getDate()->modify($time)->toSql();
				// reset query
				$query = $db->getQuery(true);

				// Fields to update.
				$fields = array(
					$db->quoteName('checked_out_time') .
'=\'0000-00-00 00:00:00\'',
					$db->quoteName('checked_out') . '=0'
				);

				// Conditions for which records should be updated.
				$conditions = array(
					$db->quoteName('checked_out') . '!=0', 
					$db->quoteName('checked_out_time') .
'<\''.$date.'\''
				);

				// Check table
				$query->update($db->quoteName('#__reservation_doctor'))->set($fields)->where($conditions);


				$db->setQuery($query);

				$db->execute();
			}
		}

		return false;
	}
}
PK4~�[y�?���models/fields/appointment.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		appointment.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// import the list field type
jimport('joomla.form.helper');
JFormHelper::loadFieldClass('list');

/**
 * Appointment Form Field class for the Reservation component
 */
class JFormFieldAppointment extends JFormFieldList
{
	/**
	 * The appointment field type.
	 *
	 * @var		string
	 */
	public $type = 'appointment';

	/**
	 * Method to get a list of options for a list input.
	 *
	 * @return	array    An array of JHtml options.
	 */
	protected function getOptions()
	{
		// Get the user object.
		$user = JFactory::getUser();
		// Get the databse object.
		$db = JFactory::getDBO();
		$query = $db->getQuery(true);
		$query->select($db->quoteName(array('a.id','a.appointment','c.title','u.name'),array('id','appointmentid_appointment','title','name')));
		$query->from($db->quoteName('#__reservation_appointment',
'a'));
$query->join('inner',$db->quoteName('#__reservation_consultant','co')
. ' on'
.$db->quoteName('a.doctorid').'='.$db->quoteName('co.id'));
		$query->join('inner',$db->quoteName('#__users','u')
. ' on'
.$db->quoteName('u.id').'='.$db->quoteName('co.userid'));
		$query->join('inner',$db->quoteName('#__categories','c')
. ' on'
.$db->quoteName('c.id').'='.$db->quoteName('co.catid'));
		$query->where($db->quoteName('a.published') . ' =
1');
		$query->order('a.appointment ASC');
		// Implement View Level Access (if set in table)
		if (!$user->authorise('core.options',
'com_reservation'))
		{
			$columns =
$db->getTableColumns('#__reservation_appointment');
			if(isset($columns['access']))
			{
				$groups = implode(',', $user->getAuthorisedViewLevels());
				$query->where('a.access IN (' . $groups . ')');
			}
		}
		$db->setQuery((string)$query);
		$items = $db->loadObjectList();
		$options = array();
		if ($items)
		{
			if ($this->multiple === false)
			{
				$options[] = JHtml::_('select.option', '',
JText::_('COM_RESERVATION_SELECT_AN_OPTION'));
			}
			foreach($items as $item)
			{
				$options[] = JHtml::_('select.option', $item->id,
$item->name.'('.$item->title.'-'.$item->appointmentid_appointment.')');
			}
		}
		return $options;
	}
}
PK4~�[Oht�
�
models/fields/capital.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		capital.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// import the list field type
jimport('joomla.form.helper');
JFormHelper::loadFieldClass('list');

/**
 * Capital Form Field class for the Reservation component
 */
class JFormFieldCapital extends JFormFieldList
{
	/**
	 * The capital field type.
	 *
	 * @var		string
	 */
	public $type = 'capital';

	/**
	 * Method to get a list of options for a list input.
	 *
	 * @return	array    An array of JHtml options.
	 */
	protected function getOptions()
	{
		// Get the user object.
		$user = JFactory::getUser();
		// Get the databse object.
		$db = JFactory::getDBO();
		$query = $db->getQuery(true);
		$query->select($db->quoteName(array('a.id','a.name'),array('id','capitalid_name')));
		$query->from($db->quoteName('#__reservation_capital',
'a'));
		$query->where($db->quoteName('a.published') . ' =
1');
                $query->where($db->quoteName('a.capitalId')
. ' = 0');
		$query->order('a.name ASC');
		// Implement View Level Access (if set in table)
		if (!$user->authorise('core.options',
'com_reservation'))
		{
			$columns = $db->getTableColumns('#__reservation_capital');
			if(isset($columns['access']))
			{
				$groups = implode(',', $user->getAuthorisedViewLevels());
				$query->where('a.access IN (' . $groups . ')');
			}
		}
		$db->setQuery((string)$query);
		$items = $db->loadObjectList();
		$options = array();
		if ($items)
		{
			if ($this->multiple === false)
			{
				$options[] = JHtml::_('select.option', '',
JText::_('COM_RESERVATION_SELECT_AN_OPTION'));
			}
			foreach($items as $item)
			{
				$options[] = JHtml::_('select.option', $item->id,
$item->capitalid_name);
			}
		}
		return $options;
	}
}
PK4~�[*��jjmodels/fields/city.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		city.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// import the list field type
jimport('joomla.form.helper');
JFormHelper::loadFieldClass('list');

/**
 * City Form Field class for the Reservation component
 */
class JFormFieldCity extends JFormFieldList
{
	/**
	 * The city field type.
	 *
	 * @var		string
	 */
	public $type = 'city';

	/**
	 * Method to get a list of options for a list input.
	 *
	 * @return	array    An array of JHtml options.
	 */
	protected function getOptions()
	{
		                $capitalid = 
JFactory::getApplication()->getUserState('capitalid','-1');
               // Get the user object.
  		$user = JFactory::getUser();
		// Get the databse object.
		$db = JFactory::getDBO();
		$query = $db->getQuery(true);
		$query->select($db->quoteName(array('a.id','a.name'),array('id','cityid_name')));
		$query->from($db->quoteName('#__reservation_capital',
'a'));
		$query->where($db->quoteName('a.published') . ' =
1');
                $query->where($db->quoteName('a.capitalid')
. ' = '. $capitalid);
            
		$query->order('a.name ASC');
		// Implement View Level Access (if set in table)
		if (!$user->authorise('core.options',
'com_reservation'))
		{
 			$columns =
$db->getTableColumns('#__reservation_capital');
			if(isset($columns['access']))
			{
				$groups = implode(',', $user->getAuthorisedViewLevels());
				$query->where('a.access IN (' . $groups . ')');
			}
		}
		$db->setQuery((string)$query);
		$items = $db->loadObjectList();
		$options = array();
		if ($items)
		{
			if ($this->multiple === false)
			{
				$options[] = JHtml::_('select.option', '',
JText::_('COM_RESERVATION_SELECT_AN_OPTION'));
			}
			foreach($items as $item)
			{
				$options[] = JHtml::_('select.option', $item->id,
$item->cityid_name);
			}
		}
		return $options;
	}
}
PK4~�[�c�,��models/fields/consultant.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		consultant.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// import the list field type
jimport('joomla.form.helper');
JFormHelper::loadFieldClass('list');

/**
 * Consultant Form Field class for the Reservation component
 */
class JFormFieldConsultant extends JFormFieldList
{
	/**
	 * The consultant field type.
	 *
	 * @var		string
	 */
	public $type = 'consultant';

	/**
	 * Method to get a list of options for a list input.
	 *
	 * @return	array    An array of JHtml options.
	 */
	protected function getOptions()
	{
		// Get the user object.
		$user = JFactory::getUser();
		// Get the databse object.
		$db = JFactory::getDBO();
		$query = $db->getQuery(true);
		$query->select($db->quoteName(array('a.id','b.name','c.title'),array('id','name','specialty')));
		$query->from($db->quoteName('#__reservation_consultant',
'a'));
                $query->join('INNER',
$db->quoteName('#__users', 'b') . ' ON ' .
$db->quoteName('a.userId') . ' = ' .
$db->quoteName('b.id'));
                $query->join('INNER',
$db->quoteName('#__categories', 'c') . ' ON
' . $db->quoteName('a.catid') . ' = ' .
$db->quoteName('c.id'));

                
		$query->where('('.$db->quoteName('a.account') .
' = '.$db->quote('consultant').' or
'.$db->quoteName('a.account') . ' =
'.$db->quote('both').')');
                $query->where($db->quoteName('a.published')
. ' = 1');
		$query->order('b.name ASC');
		// Implement View Level Access (if set in table)
		if (!$user->authorise('core.options',
'com_reservation'))
		{
			$columns =
$db->getTableColumns('#__reservation_consultant');
			if(isset($columns['access']))
			{
				$groups = implode(',', $user->getAuthorisedViewLevels());
				$query->where('a.access IN (' . $groups . ')');
			}
		}
		$db->setQuery((string)$query);
		$items = $db->loadObjectList();
		$options = array();
		if ($items)
		{
			if ($this->multiple === false)
			{
				$options[] = JHtml::_('select.option', '',
JText::_('COM_RESERVATION_SELECT_AN_OPTION'));
			}
			foreach($items as $item)
			{
				$options[] = JHtml::_('select.option', $item->id,
$item->name."(".$item->specialty.")");
			}
		}
		return $options;
	}
}
PK4~�[&�d���models/fields/doctor.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		doctor.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// import the list field type
jimport('joomla.form.helper');
JFormHelper::loadFieldClass('list');

/**
 * Doctor Form Field class for the Reservation component
 */
class JFormFieldDoctor extends JFormFieldList
{
	/**
	 * The doctor field type.
	 *
	 * @var		string
	 */
	public $type = 'doctor';

	/**
	 * Method to get a list of options for a list input.
	 *
	 * @return	array    An array of JHtml options.
	 */
	protected function getOptions()
	{
		// Get the user object.
		$user = JFactory::getUser();
		// Get the databse object.
		$db = JFactory::getDBO();
		$query = $db->getQuery(true);
		$query->select($db->quoteName(array('a.id','u.name'),array('id','doctorid_id')));
		$query->from($db->quoteName('#__reservation_consultant',
'a'));
               
$query->join('inner',$db->quoteName('#__users',
'u').'on'.$db->quoteName('u.id').'='.$db->quoteName('a.userid'));
		$query->where($db->quoteName('a.published') . ' =
1');
               
$query->where('('.$db->quoteName('a.account') .
' =  '. $db->quote('doctor').' or
'.$db->quoteName('a.account') . ' =  '.
$db->quote('both').')');
		$query->order('a.id ASC');
		// Implement View Level Access (if set in table)
		if (!$user->authorise('core.options',
'com_reservation'))
		{
			$columns =
$db->getTableColumns('#__reservation_consultant');
			if(isset($columns['access']))
			{
				$groups = implode(',', $user->getAuthorisedViewLevels());
				$query->where('a.access IN (' . $groups . ')');
			}
		}
		$db->setQuery((string)$query);
		$items = $db->loadObjectList();
		$options = array();
		if ($items)
		{
			if ($this->multiple === false)
			{
				$options[] = JHtml::_('select.option', '',
JText::_('COM_RESERVATION_SELECT_AN_OPTION'));
			}
			foreach($items as $item)
			{
				$options[] = JHtml::_('select.option', $item->id,
$item->doctorid_id);
			}
		}
		return $options;
	}
}
PK4~�[�#o,,models/fields/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK4~�[���~
~
models/fields/plan.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		plan.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// import the list field type
jimport('joomla.form.helper');
JFormHelper::loadFieldClass('list');

/**
 * Plan Form Field class for the Reservation component
 */
class JFormFieldPlan extends JFormFieldList
{
	/**
	 * The plan field type.
	 *
	 * @var		string
	 */
	public $type = 'plan';

	/**
	 * Method to get a list of options for a list input.
	 *
	 * @return	array    An array of JHtml options.
	 */
	protected function getOptions()
	{
		// Get the user object.
		$user = JFactory::getUser();
		// Get the databse object.
		$db = JFactory::getDBO();
		$query = $db->getQuery(true);
		$query->select($db->quoteName(array('a.id','a.time','a.price','a.plantype','b.name','c.title'),array('id','time','price','plantype','name','specialty')));
		$query->from($db->quoteName('#__reservation_plan',
'a'));
                $query->join('INNER',
$db->quoteName('#__reservation_consultant', 'co') .
' ON ' . $db->quoteName('a.consultantid') . ' =
' . $db->quoteName('co.id'));
                $query->join('INNER',
$db->quoteName('#__users', 'b') . ' ON ' .
$db->quoteName('co.userId') . ' = ' .
$db->quoteName('b.id'));
                $query->join('INNER',
$db->quoteName('#__categories', 'c') . ' ON
' . $db->quoteName('co.catid') . ' = ' .
$db->quoteName('c.id'));
 		$query->where($db->quoteName('a.published') . ' =
1');
		$query->order('a.id ASC');
		// Implement View Level Access (if set in table)
		if (!$user->authorise('core.options',
'com_reservation'))
		{
			$columns = $db->getTableColumns('#__reservation_plan');
			if(isset($columns['access']))
			{
				$groups = implode(',', $user->getAuthorisedViewLevels());
				$query->where('a.access IN (' . $groups . ')');
			}
		}
		$db->setQuery((string)$query);
		$items = $db->loadObjectList();
		$options = array();
		if ($items)
		{
                        $pt= array(
				1 => 'COM_RESERVATION_PLAN_TEL',
				2 => 'COM_RESERVATION_PLAN_CHAT'
			);

			if ($this->multiple === false)
			{
				$options[] = JHtml::_('select.option', '',
JText::_('COM_RESERVATION_SELECT_AN_OPTION'));
			}
			foreach($items as $item)
			{
				$options[] = JHtml::_('select.option', $item->id,
JText::_($pt[$item->plantype])."-".$item->time."m-".$item->price."-".$item->name."(".$item->specialty.")");
			}
		}
		return $options;
	}
}
PK4~�[�F��models/fields/reply.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		reply.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// import the list field type
jimport('joomla.form.helper');
JFormHelper::loadFieldClass('list');

/**
 * Reply Form Field class for the Reservation component
 */
class JFormFieldReply extends JFormFieldList
{
	/**
	 * The reply field type.
	 *
	 * @var		string
	 */
	public $type = 'reply';

	/**
	 * Override to add new button
	 *
	 * @return  string  The field input markup.
	 *
	 * @since   3.2
	 */
	protected function getInput()
	{
		// see if we should add buttons
		$set_button = $this->getAttribute('button');
		// get html
		$html = parent::getInput();
		// if true set button
		if ($set_button === 'true')
		{
			$button = array();
			$script = array();
			$button_code_name = $this->getAttribute('name');
			// get the input from url
			$app = JFactory::getApplication();
			$jinput = $app->input;
			// get the view name & id
			$values = $jinput->getArray(array(
				'id' => 'int',
				'view' => 'word'
			));
			// check if new item
			$ref = '';
			$refJ = '';
			if (!is_null($values['id']) &&
strlen($values['view']))
			{
				// only load referral if not new item.
				$ref = '&amp;ref=' . $values['view'] .
'&amp;refid=' . $values['id'];
				$refJ = '&ref=' . $values['view'] .
'&refid=' . $values['id'];
				// get the return value.
				$_uri = (string) JUri::getInstance();
				$_return = urlencode(base64_encode($_uri));
				// load return value.
				$ref .= '&amp;return=' . $_return;
				$refJ .= '&return=' . $_return;
			}
			// get button label
			$button_label = trim($button_code_name);
			$button_label = preg_replace('/_+/', ' ',
$button_label);
			$button_label = preg_replace('/\s+/', ' ',
$button_label);
			$button_label = preg_replace("/[^A-Za-z ]/", '',
$button_label);
			$button_label = ucfirst(strtolower($button_label));
			// get user object
			$user = JFactory::getUser();
			// only add if user allowed to create message
			if ($user->authorise('core.create',
'com_reservation') && $app->isAdmin()) // TODO for now
only in admin area.
			{
				// build Create button
				$button[] = '<a
id="'.$button_code_name.'Create" class="btn
btn-small btn-success hasTooltip"
title="'.JText::sprintf('COM_RESERVATION_CREATE_NEW_S',
$button_label).'" style="border-radius: 0px 4px 4px 0px;
padding: 4px 4px 4px 7px;"
					href="index.php?option=com_reservation&amp;view=message&amp;layout=edit'.$ref.'"
>
					<span class="icon-new
icon-white"></span></a>';
			}
			// only add if user allowed to edit message
			if ($user->authorise('core.edit',
'com_reservation') && $app->isAdmin()) // TODO for now
only in admin area.
			{
				// build edit button
				$button[] = '<a
id="'.$button_code_name.'Edit" class="btn
btn-small hasTooltip"
title="'.JText::sprintf('COM_RESERVATION_EDIT_S',
$button_label).'" style="display: none; padding: 4px 4px 4px
7px;" href="#" >
					<span class="icon-edit"></span></a>';
				// build script
				$script[] = "
					jQuery(document).ready(function() {
						jQuery('#adminForm').on('change',
'#jform_".$button_code_name."',function (e) {
							e.preventDefault();
							var ".$button_code_name."Value =
jQuery('#jform_".$button_code_name."').val();
							".$button_code_name."Button(".$button_code_name."Value);
						});
						var ".$button_code_name."Value =
jQuery('#jform_".$button_code_name."').val();
						".$button_code_name."Button(".$button_code_name."Value);
					});
					function ".$button_code_name."Button(value) {
						if (value > 0) {
							// hide the create button
							jQuery('#".$button_code_name."Create').hide();
							// show edit button
							jQuery('#".$button_code_name."Edit').show();
							var url =
'index.php?option=com_reservation&view=messages&task=message.edit&id='+value+'".$refJ."';
							jQuery('#".$button_code_name."Edit').attr('href',
url);
						} else {
							// show the create button
							jQuery('#".$button_code_name."Create').show();
							// hide edit button
							jQuery('#".$button_code_name."Edit').hide();
						}
					}";
			}
			// check if button was created for message field.
			if (is_array($button) && count($button) > 0)
			{
				// Load the needed script.
				$document = JFactory::getDocument();
				$document->addScriptDeclaration(implode(' ',$script));
				// return the button attached to input field.
				return '<div class="input-append">' .$html .
implode('',$button).'</div>';
			}
		}
		return $html;
	}

	/**
	 * Method to get a list of options for a list input.
	 *
	 * @return	array    An array of JHtml options.
	 */
	protected function getOptions()
	{
		// Get the user object.
		$user = JFactory::getUser();
		// Get the databse object.
		$db = JFactory::getDBO();
		$query = $db->getQuery(true);
		$query->select($db->quoteName(array('a.id','a.message'),array('id','reply_message')));
		$query->from($db->quoteName('#__reservation_message',
'a'));
		$query->where($db->quoteName('a.published') . ' =
1');
		$query->order('a.message ASC');
		// Implement View Level Access (if set in table)
		if (!$user->authorise('core.options',
'com_reservation'))
		{
			$columns = $db->getTableColumns('#__reservation_message');
			if(isset($columns['access']))
			{
				$groups = implode(',', $user->getAuthorisedViewLevels());
				$query->where('a.access IN (' . $groups . ')');
			}
		}
		$db->setQuery((string)$query);
		$items = $db->loadObjectList();
		$options = array();
		if ($items)
		{
			if ($this->multiple === false)
			{
				$options[] = JHtml::_('select.option', '',
JText::_('COM_RESERVATION_SELECT_AN_OPTION'));
			}
			foreach($items as $item)
			{
				$options[] = JHtml::_('select.option', $item->id,
$item->reply_message);
			}
		}
		return $options;
	}
}
PK4~�[Y�d[44models/fields/sick.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		sick.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// import the list field type
jimport('joomla.form.helper');
JFormHelper::loadFieldClass('list');

/**
 * Sick Form Field class for the Reservation component
 */
class JFormFieldSick extends JFormFieldList
{
	/**
	 * The sick field type.
	 *
	 * @var		string
	 */
	public $type = 'sick';

	/**
	 * Method to get a list of options for a list input.
	 *
	 * @return	array    An array of JHtml options.
	 */
	protected function getOptions()
	{
		// Get the user object.
		$user = JFactory::getUser();
		// Get the databse object.
		$db = JFactory::getDBO();
		$query = $db->getQuery(true);
		$query->select($db->quoteName(array('a.id','b.name'),array('id','sickid_phonenumber')));
		$query->from($db->quoteName('#__reservation_sick',
'a'));
                $query->join('INNER',
$db->quoteName('#__users', 'b') . ' ON ' .
$db->quoteName('a.userId') . ' = ' .
$db->quoteName('b.id'));
		$query->where($db->quoteName('a.published') . ' =
1');
		$query->order('b.name ASC');
		// Implement View Level Access (if set in table)
		if (!$user->authorise('core.options',
'com_reservation'))
		{
			$columns = $db->getTableColumns('#__reservation_sick');
			if(isset($columns['access']))
			{
				$groups = implode(',', $user->getAuthorisedViewLevels());
				$query->where('a.access IN (' . $groups . ')');
			}
		}
		$db->setQuery((string)$query);
		$items = $db->loadObjectList();
		$options = array();
		if ($items)
		{
			if ($this->multiple === false)
			{
				$options[] = JHtml::_('select.option', '',
JText::_('COM_RESERVATION_SELECT_AN_OPTION'));
			}
			foreach($items as $item)
			{
				$options[] = JHtml::_('select.option', $item->id,
$item->sickid_phonenumber);
			}
		}
		return $options;
	}
}
PK4~�[�L�C!models/fields/adminjsprovider.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		adminjsprovider.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// import the list field type
jimport('joomla.form.helper');
JFormHelper::loadFieldClass('list');

/**
 * Adminjsprovider Form Field class for the Reservation component
 */
class JFormFieldAdminjsprovider extends JFormFieldList
{
	/**
	 * The adminjsprovider field type.
	 *
	 * @var		string
	 */
	public $type = 'adminjsprovider';

	/**
	 * Method to get a list of options for a list input.
	 *
	 * @return	array    An array of JHtml options.
	 */
	protected function getOptions()
	{
		// Get the user object.
		$document = JFactory::getDocument();
		$document->addScript('components/com_reservation/assets/js/admin.js');
		$options = array();
		return $options;
	}
}
PK4~�[�7N466models/forms/appointment.jsnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.36
	@build			26th July, 2021
	@created		17th December, 2020
	@package		Reservation
	@subpackage		appointment.js
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

 
PK4~�[[j2���models/forms/appointment.xmlnu�[���<?xml
version="1.0" encoding="utf-8"?>
<form
	addrulepath="/administrator/components/com_reservation/models/rules"
	addfieldpath="/administrator/components/com_reservation/models/fields"
>
	<fieldset name="details">
                <!-- Default Fields.-->
                <!-- Id Field. Type: Text (joomla)-->
                <field name="id"
                       type="text"
                       class="readonly"
                       readonly="true"
                       label="JGLOBAL_FIELD_ID_LABEL"
                       description="JGLOBAL_FIELD_ID_DESC"
                       size="10"
                       default="0" />
                <!-- Date Created Field. Type: Calendar (joomla)-->
                <field name="created"
                       type="calendar"
                      
label="COM_RESERVATION_APPOINTMENT_CREATED_DATE_LABEL"
                      
description="COM_RESERVATION_APPOINTMENT_CREATED_DATE_DESC"
                       size="22"
                       format="%Y-%m-%d %H:%M:%S"
                       filter="user_utc" />
                <!-- User Created Field. Type: User (joomla)-->
                <field name="created_by"
                       type="user"
                      
label="COM_RESERVATION_APPOINTMENT_CREATED_BY_LABEL"
                      
description="COM_RESERVATION_APPOINTMENT_CREATED_BY_DESC" />
                <!-- Published Field. Type: List (joomla)-->
                <field name="published"
                       type="list"
                       label="JSTATUS">
                        <option
value="1">JPUBLISHED</option>
                        <option
value="0">JUNPUBLISHED</option>
                        <option
value="2">JARCHIVED</option>
                        <option
value="-2">JTRASHED</option>
                </field>
                <!-- Date Modified Field. Type: Calendar (joomla)-->
                <field name="modified"
                       type="calendar"
                       class="readonly"
                      
label="COM_RESERVATION_APPOINTMENT_MODIFIED_DATE_LABEL"
                      
description="COM_RESERVATION_APPOINTMENT_MODIFIED_DATE_DESC"
                       size="22"
                       readonly="true"
                       format="%Y-%m-%d %H:%M:%S"
                       filter="user_utc" />
                <!-- User Modified Field. Type: User (joomla)-->
                <field name="modified_by"
                       type="user"
                      
label="COM_RESERVATION_APPOINTMENT_MODIFIED_BY_LABEL"
                      
description="COM_RESERVATION_APPOINTMENT_MODIFIED_BY_DESC"
                       class="readonly"
                       readonly="true"
                       filter="unset" />
                <!-- Access Field. Type: Accesslevel (joomla)-->
                <field name="access"
                       type="accesslevel"
                       label="JFIELD_ACCESS_LABEL"
                       description="JFIELD_ACCESS_DESC"
                       default="1"
                       required="false" />
                <!-- Ordering Field. Type: Numbers (joomla)-->
                <field name="ordering"
                       type="number"
                       class="inputbox validate-ordering"
                      
label="COM_RESERVATION_APPOINTMENT_ORDERING_LABEL"
                       description=""
                       default="0"
                       size="6"
                       required="false" />
                <!-- Version Field. Type: Text (joomla)-->
                <field name="version"
                       type="text"
                       class="readonly"
                      
label="COM_RESERVATION_APPOINTMENT_VERSION_LABEL"
                      
description="COM_RESERVATION_APPOINTMENT_VERSION_DESC"
                       size="6"
                       readonly="true"
                       filter="unset" />
                <!-- Dynamic Fields.-->
                <!-- Title Field. Type: Text. (joomla)-->
                <field type="text"
                       name="title"
                      
label="COM_RESERVATION_APPOINTMENT_TITLE_LABEL"
                       size="10"
                       maxlength="50"
                       default=""
                      
description="COM_RESERVATION_APPOINTMENT_TITLE_DESCRIPTION"
                       class="text_area form-control"
                       readonly="false"
                       disabled="false"
                       required="true"
                       filter="STRING"
                      
message="COM_RESERVATION_APPOINTMENT_TITLE_MESSAGE"
                       autocomplete="on" />
                <!-- Appointment Field. Type: Calendar. (joomla)-->
                <field type="calendar"
                       name="appointment"
                      
label="COM_RESERVATION_APPOINTMENT_APPOINTMENT_LABEL"
                       default="NOW"
                       format="%d-%m-%Y %H:%M"
                       filter="user_utc"
                      
message="COM_RESERVATION_APPOINTMENT_APPOINTMENT_MESSAGE"
                       required="true"
                       showtime="true" />
                <!-- Doctorid Field. Type: Doctor. (custom)-->
                <field type="doctor"
                       name="doctorid"
                      
label="COM_RESERVATION_APPOINTMENT_DOCTORID_LABEL"
                       class="list_class"
                       multiple="false"
                       default=""
                       required="true" />
        </fieldset>
	
	<!-- Access Control Fields. -->
	<fieldset name="accesscontrol">
		<!-- Asset Id Field. Type: Hidden (joomla) -->
		<field
			name="asset_id"
			type="hidden"
			filter="unset"
		/>
		<!-- Rules Field. Type: Rules (joomla) -->
		<field
			name="rules"
			type="rules"
			label="Permissions in relation to this appointment"
			translate_label="false"
			filter="rules"
			validate="rules"
			class="inputbox"
			component="com_reservation"
			section="appointment"
		/>
	</fieldset>
</form>PK4~�[�S(b�%�%models/forms/bbbclass.xmlnu�[���<?xml
version="1.0" encoding="utf-8"?>
<form
	addrulepath="/administrator/components/com_reservation/models/rules"
	addfieldpath="/administrator/components/com_reservation/models/fields"
>
	<fieldset name="details">
                <!-- Default Fields.-->
                <!-- Id Field. Type: Text (joomla)-->
                <field name="id"
                       type="text"
                       class="readonly"
                       readonly="true"
                       label="JGLOBAL_FIELD_ID_LABEL"
                       description="JGLOBAL_FIELD_ID_DESC"
                       size="10"
                       default="0" />
                <!-- Date Created Field. Type: Calendar (joomla)-->
                <field name="created"
                       type="calendar"
                      
label="COM_RESERVATION_BBBCLASS_CREATED_DATE_LABEL"
                      
description="COM_RESERVATION_BBBCLASS_CREATED_DATE_DESC"
                       size="22"
                       format="%Y-%m-%d %H:%M:%S"
                       filter="user_utc" />
                <!-- User Created Field. Type: User (joomla)-->
                <field name="created_by"
                       type="user"
                      
label="COM_RESERVATION_BBBCLASS_CREATED_BY_LABEL"
                      
description="COM_RESERVATION_BBBCLASS_CREATED_BY_DESC" />
                <!-- Published Field. Type: List (joomla)-->
                <field name="published"
                       type="list"
                       label="JSTATUS">
                        <option
value="1">JPUBLISHED</option>
                        <option
value="0">JUNPUBLISHED</option>
                        <option
value="2">JARCHIVED</option>
                        <option
value="-2">JTRASHED</option>
                </field>
                <!-- Date Modified Field. Type: Calendar (joomla)-->
                <field name="modified"
                       type="calendar"
                       class="readonly"
                      
label="COM_RESERVATION_BBBCLASS_MODIFIED_DATE_LABEL"
                      
description="COM_RESERVATION_BBBCLASS_MODIFIED_DATE_DESC"
                       size="22"
                       readonly="true"
                       format="%Y-%m-%d %H:%M:%S"
                       filter="user_utc" />
                <!-- User Modified Field. Type: User (joomla)-->
                <field name="modified_by"
                       type="user"
                      
label="COM_RESERVATION_BBBCLASS_MODIFIED_BY_LABEL"
                      
description="COM_RESERVATION_BBBCLASS_MODIFIED_BY_DESC"
                       class="readonly"
                       readonly="true"
                       filter="unset" />
                <!-- Access Field. Type: Accesslevel (joomla)-->
                <field name="access"
                       type="accesslevel"
                       label="JFIELD_ACCESS_LABEL"
                       description="JFIELD_ACCESS_DESC"
                       default="1"
                       required="false" />
                <!-- Ordering Field. Type: Numbers (joomla)-->
                <field name="ordering"
                       type="number"
                       class="inputbox validate-ordering"
                      
label="COM_RESERVATION_BBBCLASS_ORDERING_LABEL"
                       description=""
                       default="0"
                       size="6"
                       required="false" />
                <!-- Version Field. Type: Text (joomla)-->
                <field name="version"
                       type="text"
                       class="readonly"
                      
label="COM_RESERVATION_BBBCLASS_VERSION_LABEL"
                      
description="COM_RESERVATION_BBBCLASS_VERSION_DESC"
                       size="6"
                       readonly="true"
                       filter="unset" />
                <!-- Was added due to Permissions JS needing a Title
field-->
                <!-- Let us know at gh-629 should this change-->
                <!--
https://github.com/vdm-io/Joomla-Component-Builder/issues/629#issuecomment-750117235-->
                <field name="title"
                       type="hidden"
                       default="reservation bbbclass" />
                <!-- Dynamic Fields.-->
                <!-- Name Field. Type: Text. (joomla)-->
                <field type="text"
                       name="name"
                      
label="COM_RESERVATION_BBBCLASS_NAME_LABEL"
                       size="255"
                       maxlength="255"
                       default=""
                      
description="COM_RESERVATION_BBBCLASS_NAME_DESCRIPTION"
                       class="text_area"
                       readonly="false"
                       disabled="false"
                       required="false"
                       filter="STRING"
                      
message="COM_RESERVATION_BBBCLASS_NAME_MESSAGE"
                       hint="COM_RESERVATION_BBBCLASS_NAME_HINT"
                       autocomplete="on" />
                <!-- Planid Field. Type: Plan. (custom)-->
                <field type="plan"
                       name="planid"
                      
label="COM_RESERVATION_BBBCLASS_PLANID_LABEL"
                       class="list_class"
                       multiple="false"
                       default="0"
                       required="true" />
                <!-- Seid Field. Type: Text. (joomla)-->
                <field type="text"
                       name="seid"
                      
label="COM_RESERVATION_BBBCLASS_SEID_LABEL"
                       size="10"
                       maxlength="50"
                       default=""
                      
description="COM_RESERVATION_BBBCLASS_SEID_DESCRIPTION"
                       class="text_area"
                       readonly="false"
                       disabled="false"
                       required="true"
                       filter="INT"
                      
message="COM_RESERVATION_BBBCLASS_SEID_MESSAGE"
                       autocomplete="on" />
                <!-- Exmid Field. Type: Text. (joomla)-->
                <field type="text"
                       name="exmid"
                      
label="COM_RESERVATION_BBBCLASS_EXMID_LABEL"
                       size="255"
                       maxlength="255"
                       default=""
                      
description="COM_RESERVATION_BBBCLASS_EXMID_DESCRIPTION"
                       class="text_area"
                       readonly="false"
                       disabled="false"
                       required="false"
                       filter="STRING"
                      
message="COM_RESERVATION_BBBCLASS_EXMID_MESSAGE"
                       hint="COM_RESERVATION_BBBCLASS_EXMID_HINT"
                       autocomplete="on" />
                <!-- Inmid Field. Type: Text. (joomla)-->
                <field type="text"
                       name="inmid"
                      
label="COM_RESERVATION_BBBCLASS_INMID_LABEL"
                       size="255"
                       maxlength="255"
                       default=""
                      
description="COM_RESERVATION_BBBCLASS_INMID_DESCRIPTION"
                       class="text_area"
                       readonly="false"
                       disabled="false"
                       required="false"
                       filter="STRING"
                      
message="COM_RESERVATION_BBBCLASS_INMID_MESSAGE"
                       hint="COM_RESERVATION_BBBCLASS_INMID_HINT"
                       autocomplete="on" />
                <!-- Mpass Field. Type: Text. (joomla)-->
                <field type="text"
                       name="mpass"
                      
label="COM_RESERVATION_BBBCLASS_MPASS_LABEL"
                       size="255"
                       maxlength="255"
                       default=""
                      
description="COM_RESERVATION_BBBCLASS_MPASS_DESCRIPTION"
                       class="text_area"
                       readonly="false"
                       disabled="false"
                       required="false"
                       filter="STRING"
                      
message="COM_RESERVATION_BBBCLASS_MPASS_MESSAGE"
                       hint="COM_RESERVATION_BBBCLASS_MPASS_HINT"
                       autocomplete="on" />
                <!-- Vpass Field. Type: Text. (joomla)-->
                <field type="text"
                       name="vpass"
                      
label="COM_RESERVATION_BBBCLASS_VPASS_LABEL"
                       size="255"
                       maxlength="255"
                       default=""
                      
description="COM_RESERVATION_BBBCLASS_VPASS_DESCRIPTION"
                       class="text_area"
                       readonly="false"
                       disabled="false"
                       required="false"
                       filter="STRING"
                      
message="COM_RESERVATION_BBBCLASS_VPASS_MESSAGE"
                       hint="COM_RESERVATION_BBBCLASS_VPASS_HINT"
                       autocomplete="on" />
        </fieldset>
	
	<!-- Access Control Fields. -->
	<fieldset name="accesscontrol">
		<!-- Asset Id Field. Type: Hidden (joomla) -->
		<field
			name="asset_id"
			type="hidden"
			filter="unset"
		/>
		<!-- Rules Field. Type: Rules (joomla) -->
		<field
			name="rules"
			type="rules"
			label="Permissions in relation to this bbbclass"
			translate_label="false"
			filter="rules"
			validate="rules"
			class="inputbox"
			component="com_reservation"
			section="bbbclass"
		/>
	</fieldset>
</form>PK4~�[r@�k22models/forms/capital.jsnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.36
	@build			26th July, 2021
	@created		17th December, 2020
	@package		Reservation
	@subpackage		capital.js
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

 
PK4~�[~�M���models/forms/capital.xmlnu�[���<?xml
version="1.0" encoding="utf-8"?>
<form
	addrulepath="/administrator/components/com_reservation/models/rules"
	addfieldpath="/administrator/components/com_reservation/models/fields"
>
	<fieldset name="details">
                <!-- Default Fields.-->
                <!-- Id Field. Type: Text (joomla)-->
                <field name="id"
                       type="text"
                       class="readonly"
                       readonly="true"
                       label="JGLOBAL_FIELD_ID_LABEL"
                       description="JGLOBAL_FIELD_ID_DESC"
                       size="10"
                       default="0" />
                <!-- Date Created Field. Type: Calendar (joomla)-->
                <field name="created"
                       type="calendar"
                      
label="COM_RESERVATION_CAPITAL_CREATED_DATE_LABEL"
                      
description="COM_RESERVATION_CAPITAL_CREATED_DATE_DESC"
                       size="22"
                       format="%Y-%m-%d %H:%M:%S"
                       filter="user_utc" />
                <!-- User Created Field. Type: User (joomla)-->
                <field name="created_by"
                       type="user"
                      
label="COM_RESERVATION_CAPITAL_CREATED_BY_LABEL"
                      
description="COM_RESERVATION_CAPITAL_CREATED_BY_DESC" />
                <!-- Published Field. Type: List (joomla)-->
                <field name="published"
                       type="list"
                       label="JSTATUS">
                        <option
value="1">JPUBLISHED</option>
                        <option
value="0">JUNPUBLISHED</option>
                        <option
value="2">JARCHIVED</option>
                        <option
value="-2">JTRASHED</option>
                </field>
                <!-- Date Modified Field. Type: Calendar (joomla)-->
                <field name="modified"
                       type="calendar"
                       class="readonly"
                      
label="COM_RESERVATION_CAPITAL_MODIFIED_DATE_LABEL"
                      
description="COM_RESERVATION_CAPITAL_MODIFIED_DATE_DESC"
                       size="22"
                       readonly="true"
                       format="%Y-%m-%d %H:%M:%S"
                       filter="user_utc" />
                <!-- User Modified Field. Type: User (joomla)-->
                <field name="modified_by"
                       type="user"
                      
label="COM_RESERVATION_CAPITAL_MODIFIED_BY_LABEL"
                      
description="COM_RESERVATION_CAPITAL_MODIFIED_BY_DESC"
                       class="readonly"
                       readonly="true"
                       filter="unset" />
                <!-- Access Field. Type: Accesslevel (joomla)-->
                <field name="access"
                       type="accesslevel"
                       label="JFIELD_ACCESS_LABEL"
                       description="JFIELD_ACCESS_DESC"
                       default="1"
                       required="false" />
                <!-- Ordering Field. Type: Numbers (joomla)-->
                <field name="ordering"
                       type="number"
                       class="inputbox validate-ordering"
                      
label="COM_RESERVATION_CAPITAL_ORDERING_LABEL"
                       description=""
                       default="0"
                       size="6"
                       required="false" />
                <!-- Version Field. Type: Text (joomla)-->
                <field name="version"
                       type="text"
                       class="readonly"
                      
label="COM_RESERVATION_CAPITAL_VERSION_LABEL"
                      
description="COM_RESERVATION_CAPITAL_VERSION_DESC"
                       size="6"
                       readonly="true"
                       filter="unset" />
                <!-- Was added due to Permissions JS needing a Title
field-->
                <!-- Let us know at gh-629 should this change-->
                <!--
https://github.com/vdm-io/Joomla-Component-Builder/issues/629#issuecomment-750117235-->
                <field name="title"
                       type="hidden"
                       default="reservation capital" />
                <!-- Dynamic Fields.-->
                <!-- Name Field. Type: Text. (joomla)-->
                <field type="text"
                       name="name"
                       label="COM_RESERVATION_CAPITAL_NAME_LABEL"
                       size="40"
                       maxlength="150"
                      
description="COM_RESERVATION_CAPITAL_NAME_DESCRIPTION"
                       class="text_area"
                       readonly="false"
                       disabled="false"
                       required="true"
                       filter="STRING"
                      
message="COM_RESERVATION_CAPITAL_NAME_MESSAGE"
                       hint="COM_RESERVATION_CAPITAL_NAME_HINT"
/>
                <!-- Capitalid Field. Type: Capital. (custom)-->
                <field type="capital"
                       name="capitalid"
                      
label="COM_RESERVATION_CAPITAL_CAPITALID_LABEL"
                       class="list_class"
                       multiple="false"
                       default="0" />
        </fieldset>
	
	<!-- Access Control Fields. -->
	<fieldset name="accesscontrol">
		<!-- Asset Id Field. Type: Hidden (joomla) -->
		<field
			name="asset_id"
			type="hidden"
			filter="unset"
		/>
		<!-- Rules Field. Type: Rules (joomla) -->
		<field
			name="rules"
			type="rules"
			label="Permissions in relation to this capital"
			translate_label="false"
			filter="rules"
			validate="rules"
			class="inputbox"
			component="com_reservation"
			section="capital"
		/>
	</fieldset>
</form>PK4~�[M���22models/forms/comment.jsnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.36
	@build			26th July, 2021
	@created		17th December, 2020
	@package		Reservation
	@subpackage		comment.js
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

 
PK4~�[:RV�3 3 models/forms/comment.xmlnu�[���<?xml
version="1.0" encoding="utf-8"?>
<form
	addrulepath="/administrator/components/com_reservation/models/rules"
	addfieldpath="/administrator/components/com_reservation/models/fields"
>
	<fieldset name="details">
                <!-- Default Fields.-->
                <!-- Id Field. Type: Text (joomla)-->
                <field name="id"
                       type="text"
                       class="readonly"
                       readonly="true"
                       label="JGLOBAL_FIELD_ID_LABEL"
                       description="JGLOBAL_FIELD_ID_DESC"
                       size="10"
                       default="0" />
                <!-- Date Created Field. Type: Calendar (joomla)-->
                <field name="created"
                       type="calendar"
                      
label="COM_RESERVATION_COMMENT_CREATED_DATE_LABEL"
                      
description="COM_RESERVATION_COMMENT_CREATED_DATE_DESC"
                       size="22"
                       format="%Y-%m-%d %H:%M:%S"
                       filter="user_utc" />
                <!-- User Created Field. Type: User (joomla)-->
                <field name="created_by"
                       type="user"
                      
label="COM_RESERVATION_COMMENT_CREATED_BY_LABEL"
                      
description="COM_RESERVATION_COMMENT_CREATED_BY_DESC" />
                <!-- Published Field. Type: List (joomla)-->
                <field name="published"
                       type="list"
                       label="JSTATUS">
                        <option
value="1">JPUBLISHED</option>
                        <option
value="0">JUNPUBLISHED</option>
                        <option
value="2">JARCHIVED</option>
                        <option
value="-2">JTRASHED</option>
                </field>
                <!-- Date Modified Field. Type: Calendar (joomla)-->
                <field name="modified"
                       type="calendar"
                       class="readonly"
                      
label="COM_RESERVATION_COMMENT_MODIFIED_DATE_LABEL"
                      
description="COM_RESERVATION_COMMENT_MODIFIED_DATE_DESC"
                       size="22"
                       readonly="true"
                       format="%Y-%m-%d %H:%M:%S"
                       filter="user_utc" />
                <!-- User Modified Field. Type: User (joomla)-->
                <field name="modified_by"
                       type="user"
                      
label="COM_RESERVATION_COMMENT_MODIFIED_BY_LABEL"
                      
description="COM_RESERVATION_COMMENT_MODIFIED_BY_DESC"
                       class="readonly"
                       readonly="true"
                       filter="unset" />
                <!-- Access Field. Type: Accesslevel (joomla)-->
                <field name="access"
                       type="accesslevel"
                       label="JFIELD_ACCESS_LABEL"
                       description="JFIELD_ACCESS_DESC"
                       default="1"
                       required="false" />
                <!-- Ordering Field. Type: Numbers (joomla)-->
                <field name="ordering"
                       type="number"
                       class="inputbox validate-ordering"
                      
label="COM_RESERVATION_COMMENT_ORDERING_LABEL"
                       description=""
                       default="0"
                       size="6"
                       required="false" />
                <!-- Version Field. Type: Text (joomla)-->
                <field name="version"
                       type="text"
                       class="readonly"
                      
label="COM_RESERVATION_COMMENT_VERSION_LABEL"
                      
description="COM_RESERVATION_COMMENT_VERSION_DESC"
                       size="6"
                       readonly="true"
                       filter="unset" />
                <!-- Was added due to Permissions JS needing a Title
field-->
                <!-- Let us know at gh-629 should this change-->
                <!--
https://github.com/vdm-io/Joomla-Component-Builder/issues/629#issuecomment-750117235-->
                <field name="title"
                       type="hidden"
                       default="reservation comment" />
                <!-- Dynamic Fields.-->
                <!-- Text Field. Type: Textarea. (joomla)-->
                <field type="textarea"
                       name="text"
                       label="COM_RESERVATION_COMMENT_TEXT_LABEL"
                       rows="10"
                       cols="5"
                       default=""
                      
description="COM_RESERVATION_COMMENT_TEXT_DESCRIPTION"
                       class="text_area form-control"
                       filter="STRING"
                       required="true"
                       readonly="false"
                       disabled="false" />
                <!-- Consultantid Field. Type: Consultant.
(custom)-->
                <field type="consultant"
                       name="consultantid"
                      
label="COM_RESERVATION_COMMENT_CONSULTANTID_LABEL"
                      
description="COM_RESERVATION_COMMENT_CONSULTANTID_DESCRIPTION"
                       class="list_class"
                       multiple="false"
                       default=""
                       required="true"
                       button="false" />
                <!-- Sickid Field. Type: Sick. (custom)-->
                <field type="sick"
                       name="sickid"
                      
label="COM_RESERVATION_COMMENT_SICKID_LABEL"
                       class="list_class"
                       multiple="false"
                       default="0"
                       required="true" />
                <!-- Rate Field. Type: Number. (joomla)-->
                <field type="number"
                       name="rate"
                       label="COM_RESERVATION_COMMENT_RATE_LABEL"
                       default=""
                      
description="COM_RESERVATION_COMMENT_RATE_DESCRIPTION"
                       class="text_area form-control"
                       required="true"
                       min="1"
                       max="5"
                       step="1"
                       filter="UINT"
                       validate="number" />
                <!-- Seid Field. Type: Text. (joomla)-->
                <field type="text"
                       name="seid"
                       label="COM_RESERVATION_COMMENT_SEID_LABEL"
                       size="10"
                       maxlength="50"
                       default=""
                      
description="COM_RESERVATION_COMMENT_SEID_DESCRIPTION"
                       class="text_area"
                       readonly="false"
                       disabled="false"
                       required="true"
                       filter="INT"
                      
message="COM_RESERVATION_COMMENT_SEID_MESSAGE"
                       autocomplete="on" />
                <!-- Token Field. Type: Text. (joomla)-->
                <field type="text"
                       name="token"
                      
label="COM_RESERVATION_COMMENT_TOKEN_LABEL"
                       size="10"
                       maxlength="50"
                       default=""
                      
description="COM_RESERVATION_COMMENT_TOKEN_DESCRIPTION"
                       class="text_area"
                       readonly="false"
                       disabled="false"
                       required="true"
                       filter="STRING"
                      
message="COM_RESERVATION_COMMENT_TOKEN_MESSAGE"
                       autocomplete="on" />
        </fieldset>
	
	<!-- Access Control Fields. -->
	<fieldset name="accesscontrol">
		<!-- Asset Id Field. Type: Hidden (joomla) -->
		<field
			name="asset_id"
			type="hidden"
			filter="unset"
		/>
		<!-- Rules Field. Type: Rules (joomla) -->
		<field
			name="rules"
			type="rules"
			label="Permissions in relation to this comment"
			translate_label="false"
			filter="rules"
			validate="rules"
			class="inputbox"
			component="com_reservation"
			section="comment"
		/>
	</fieldset>
</form>PK4~�[��	55models/forms/consultant.jsnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.36
	@build			26th July, 2021
	@created		17th December, 2020
	@package		Reservation
	@subpackage		consultant.js
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

 
PK4~�[�Y�e<7<7models/forms/consultant.xmlnu�[���<?xml
version="1.0" encoding="utf-8"?>
<form
	addrulepath="/administrator/components/com_reservation/models/rules"
	addfieldpath="/administrator/components/com_reservation/models/fields"
>
	<fieldset name="details">
                <!-- Default Fields.-->
                <!-- Id Field. Type: Text (joomla)-->
                <field name="id"
                       type="text"
                       class="readonly"
                       readonly="true"
                       label="JGLOBAL_FIELD_ID_LABEL"
                       description="JGLOBAL_FIELD_ID_DESC"
                       size="10"
                       default="0" />
                <!-- Date Created Field. Type: Calendar (joomla)-->
                <field name="created"
                       type="calendar"
                      
label="COM_RESERVATION_CONSULTANT_CREATED_DATE_LABEL"
                      
description="COM_RESERVATION_CONSULTANT_CREATED_DATE_DESC"
                       size="22"
                       format="%Y-%m-%d %H:%M:%S"
                       filter="user_utc" />
                <!-- User Created Field. Type: User (joomla)-->
                <field name="created_by"
                       type="user"
                      
label="COM_RESERVATION_CONSULTANT_CREATED_BY_LABEL"
                      
description="COM_RESERVATION_CONSULTANT_CREATED_BY_DESC" />
                <!-- Published Field. Type: List (joomla)-->
                <field name="published"
                       type="list"
                       label="JSTATUS">
                        <option
value="1">JPUBLISHED</option>
                        <option
value="0">JUNPUBLISHED</option>
                        <option
value="2">JARCHIVED</option>
                        <option
value="-2">JTRASHED</option>
                </field>
                <!-- Date Modified Field. Type: Calendar (joomla)-->
                <field name="modified"
                       type="calendar"
                       class="readonly"
                      
label="COM_RESERVATION_CONSULTANT_MODIFIED_DATE_LABEL"
                      
description="COM_RESERVATION_CONSULTANT_MODIFIED_DATE_DESC"
                       size="22"
                       readonly="true"
                       format="%Y-%m-%d %H:%M:%S"
                       filter="user_utc" />
                <!-- User Modified Field. Type: User (joomla)-->
                <field name="modified_by"
                       type="user"
                      
label="COM_RESERVATION_CONSULTANT_MODIFIED_BY_LABEL"
                      
description="COM_RESERVATION_CONSULTANT_MODIFIED_BY_DESC"
                       class="readonly"
                       readonly="true"
                       filter="unset" />
                <!-- Access Field. Type: Accesslevel (joomla)-->
                <field name="access"
                       type="accesslevel"
                       label="JFIELD_ACCESS_LABEL"
                       description="JFIELD_ACCESS_DESC"
                       default="1"
                       required="false" />
                <!-- Ordering Field. Type: Numbers (joomla)-->
                <field name="ordering"
                       type="number"
                       class="inputbox validate-ordering"
                      
label="COM_RESERVATION_CONSULTANT_ORDERING_LABEL"
                       description=""
                       default="0"
                       size="6"
                       required="false" />
                <!-- Version Field. Type: Text (joomla)-->
                <field name="version"
                       type="text"
                       class="readonly"
                      
label="COM_RESERVATION_CONSULTANT_VERSION_LABEL"
                      
description="COM_RESERVATION_CONSULTANT_VERSION_DESC"
                       size="6"
                       readonly="true"
                       filter="unset" />
                <!-- Was added due to Permissions JS needing a Title
field-->
                <!-- Let us know at gh-629 should this change-->
                <!--
https://github.com/vdm-io/Joomla-Component-Builder/issues/629#issuecomment-750117235-->
                <field name="title"
                       type="hidden"
                       default="reservation consultant" />
                <!-- Dynamic Fields.-->
                <!-- Userid Field. Type: User. (joomla)-->
                <field type="user"
                       name="userid"
                      
label="COM_RESERVATION_CONSULTANT_USERID_LABEL"
                      
description="COM_RESERVATION_CONSULTANT_USERID_DESCRIPTION"
                       class="form-control"
                       required="true" />
                <!-- Nationalnumber Field. Type: Text. (joomla)-->
                <field type="text"
                       name="nationalnumber"
                      
label="COM_RESERVATION_CONSULTANT_NATIONALNUMBER_LABEL"
                       size="10"
                       maxlength="50"
                       default=""
                      
description="COM_RESERVATION_CONSULTANT_NATIONALNUMBER_DESCRIPTION"
                       class="text_area form-control"
                       readonly="false"
                       disabled="false"
                       required="true"
                       filter="INTEGER"
                      
message="COM_RESERVATION_CONSULTANT_NATIONALNUMBER_MESSAGE"
                       autocomplete="on" />
                <!-- Catid Field. Type: Category. (joomla)-->
                <field type="category"
                       name="catid"
                      
label="COM_RESERVATION_CONSULTANT_CATID_LABEL"
                       extension="com_reservation"
                       required="true"
                       show_root="false"
                       default=""
                      
description="COM_RESERVATION_CONSULTANT_CATID_DESCRIPTION"
                       class="inputbox form-control"
                       published="1"
                       multiple="false"
                       exists_table="#__categories"
                       validate="exists" />
                <!-- Image Field. Type: Media. (joomla)-->
                <field type="media"
                       name="image"
                      
label="COM_RESERVATION_CONSULTANT_IMAGE_LABEL"
                       directory="" />
                <!-- Experience Field. Type: Text. (joomla)-->
                <field type="text"
                       name="experience"
                      
label="COM_RESERVATION_CONSULTANT_EXPERIENCE_LABEL"
                       size="10"
                       maxlength="50"
                       default=""
                      
description="COM_RESERVATION_CONSULTANT_EXPERIENCE_DESCRIPTION"
                       class="text_area form-control"
                       readonly="false"
                       disabled="false"
                       required="true"
                       filter="INTEGER"
                      
message="COM_RESERVATION_CONSULTANT_EXPERIENCE_MESSAGE"
                       autocomplete="on" />
                <!-- Msn Field. Type: Text. (joomla)-->
                <field type="text"
                       name="msn"
                      
label="COM_RESERVATION_CONSULTANT_MSN_LABEL"
                       size="10"
                       maxlength="50"
                       default=""
                      
description="COM_RESERVATION_CONSULTANT_MSN_DESCRIPTION"
                       class="text_area form-control"
                       readonly="false"
                       disabled="false"
                       required="true"
                       filter="INTEGER"
                      
message="COM_RESERVATION_CONSULTANT_MSN_MESSAGE"
                       autocomplete="on" />
                <!-- Phonenumber Field. Type: Text. (joomla)-->
                <field type="text"
                       name="phonenumber"
                      
label="COM_RESERVATION_CONSULTANT_PHONENUMBER_LABEL"
                       size="10"
                       maxlength="50"
                       default=""
                      
description="COM_RESERVATION_CONSULTANT_PHONENUMBER_DESCRIPTION"
                       class="text_area form-control"
                       readonly="false"
                       disabled="false"
                       required="true"
                       validated="tel"
                      
message="COM_RESERVATION_CONSULTANT_PHONENUMBER_MESSAGE"
                       validate="mobile" />
                <!-- Shortlink Field. Type: Text. (joomla)-->
                <field type="text"
                       name="shortlink"
                      
label="COM_RESERVATION_CONSULTANT_SHORTLINK_LABEL"
                       size="255"
                       maxlength="255"
                      
description="COM_RESERVATION_CONSULTANT_SHORTLINK_DESCRIPTION"
                       class="text_area"
                       readonly="false"
                       disabled="false"
                       required="false"
                       filter="STRING"
                      
message="COM_RESERVATION_CONSULTANT_SHORTLINK_MESSAGE"
                      
hint="COM_RESERVATION_CONSULTANT_SHORTLINK_HINT"
                       autocomplete="on" />
                <!-- Account Field. Type: List. (joomla)-->
                <field type="list"
                       name="account"
                      
label="COM_RESERVATION_CONSULTANT_ACCOUNT_LABEL"
                       class="list_class"
                       multiple="false"
                       default="0">
                        <!-- Option Set.-->
                        <option
value="consultant">COM_RESERVATION_CONSULTANT_CONSULTANT</option>
                        <option
value="doctor">COM_RESERVATION_CONSULTANT_DOCTOR</option>
                        <option
value="both">COM_RESERVATION_CONSULTANT_BOTH</option>
                </field>
                <!-- Address Field. Type: Editor. (joomla)-->
                <field type="editor"
                       name="address"
                      
label="COM_RESERVATION_CONSULTANT_ADDRESS_LABEL"
                       default=""
                       buttons="no"
                       editor="codemirror|none"
                       filter="safehtml" />
                <!-- Presence Field. Type: Editor. (joomla)-->
                <field type="editor"
                       name="presence"
                      
label="COM_RESERVATION_CONSULTANT_PRESENCE_LABEL"
                       default=""
                      
description="COM_RESERVATION_CONSULTANT_PRESENCE_DESCRIPTION"
                       buttons="no"
                       editor="codemirror|none"
                       filter="safehtml" />
                <!-- Video Field. Type: Media. (joomla)-->
                <field type="media"
                       name="video"
                      
label="COM_RESERVATION_CONSULTANT_VIDEO_LABEL"
                      
description="COM_RESERVATION_CONSULTANT_VIDEO_DESCRIPTION"
                       directory=""
                       preview="false" />
                <!-- Alt Field. Type: Text. (joomla)-->
                <field type="text"
                       name="alt"
                      
label="COM_RESERVATION_CONSULTANT_ALT_LABEL"
                       size="10"
                       maxlength="50"
                       default=""
                      
description="COM_RESERVATION_CONSULTANT_ALT_DESCRIPTION"
                       class="text_area"
                       readonly="false"
                       disabled="false"
                       required="false"
                       filter="STRING"
                      
message="COM_RESERVATION_CONSULTANT_ALT_MESSAGE"
                       autocomplete="on" />
                <!-- Officephone Field. Type: Text. (joomla)-->
                <field type="text"
                       name="officephone"
                      
label="COM_RESERVATION_CONSULTANT_OFFICEPHONE_LABEL"
                       size="10"
                       maxlength="50"
                       default=""
                      
description="COM_RESERVATION_CONSULTANT_OFFICEPHONE_DESCRIPTION"
                       class="text_area form-control"
                       readonly="false"
                       disabled="false"
                       validated="tel"
                      
message="COM_RESERVATION_CONSULTANT_OFFICEPHONE_MESSAGE" />
                <!-- Capitalid Field. Type: Capital. (custom)-->
                <field type="capital"
                       name="capitalid"
                      
label="COM_RESERVATION_CONSULTANT_CAPITALID_LABEL"
                       class="list_class"
                       multiple="false"
                       default="0" />
                <!-- Cityid Field. Type: City. (custom)-->
                <field type="city"
                       name="cityid"
                      
label="COM_RESERVATION_CONSULTANT_CITYID_LABEL"
                       class="list_class"
                       multiple="false"
                       default="0" />
                <!-- Introduction Field. Type: Editor. (joomla)-->
                <field type="editor"
                       name="introduction"
                      
label="COM_RESERVATION_CONSULTANT_INTRODUCTION_LABEL"
                       default=""
                       buttons="no"
                       editor="codemirror|none"
                       filter="safehtml" />
        </fieldset>
	
	<!-- Access Control Fields. -->
	<fieldset name="accesscontrol">
		<!-- Asset Id Field. Type: Hidden (joomla) -->
		<field
			name="asset_id"
			type="hidden"
			filter="unset"
		/>
		<!-- Rules Field. Type: Rules (joomla) -->
		<field
			name="rules"
			type="rules"
			label="Permissions in relation to this consultant"
			translate_label="false"
			filter="rules"
			validate="rules"
			class="inputbox"
			component="com_reservation"
			section="consultant"
		/>
	</fieldset>
</form>PK4~�[K�Y(''models/forms/doctor.jsnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.36
	@build			26th July, 2021
	@created		17th December, 2020
	@package		Reservation
	@subpackage		doctor.js
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/




/***[JCBGUI.admin_view.javascript_view_file.121.$$$$]***/
jQuery(document).ready(function($){

   var gettoken= Joomla.getOptions('token');


   $('select#jform_capitalid').change(function () {

      var capitalid= $(this).val();
      var token= gettoken;

      $.ajax({
         url: 'index.php?option=com_reservation',
         method: 'post',
         dataType: 'json',
         data: {[token] : '1',task:'ajax.getCity',
format: 'json' , raw: 'true' , capitalid: capitalid},
         success: function (msg) {

            var temp='<option value="">Select an
option</option>';
            msg.each(function(value, index){

               temp += '<option
value="'+value.id+'">'+value.name+'</option>';

            });

            $('select#jform_cityid').html(temp);
            $( "select#jform_cityid" ).trigger(
"liszt:updated" );
         },
         error: function (err) {
            console.log(err);
         }
      });


   });


});/***[/JCBGUI$$$$]***/
 
PK4~�[���-K(K(models/forms/doctor.xmlnu�[���<?xml
version="1.0" encoding="utf-8"?>
<form
	addrulepath="/administrator/components/com_reservation/models/rules"
	addfieldpath="/administrator/components/com_reservation/models/fields"
>
	<fieldset name="details">
                <!-- Default Fields.-->
                <!-- Id Field. Type: Text (joomla)-->
                <field name="id"
                       type="text"
                       class="readonly"
                       readonly="true"
                       label="JGLOBAL_FIELD_ID_LABEL"
                       description="JGLOBAL_FIELD_ID_DESC"
                       size="10"
                       default="0" />
                <!-- Date Created Field. Type: Calendar (joomla)-->
                <field name="created"
                       type="calendar"
                      
label="COM_RESERVATION_DOCTOR_CREATED_DATE_LABEL"
                      
description="COM_RESERVATION_DOCTOR_CREATED_DATE_DESC"
                       size="22"
                       format="%Y-%m-%d %H:%M:%S"
                       filter="user_utc" />
                <!-- User Created Field. Type: User (joomla)-->
                <field name="created_by"
                       type="user"
                      
label="COM_RESERVATION_DOCTOR_CREATED_BY_LABEL"
                      
description="COM_RESERVATION_DOCTOR_CREATED_BY_DESC" />
                <!-- Published Field. Type: List (joomla)-->
                <field name="published"
                       type="list"
                       label="JSTATUS">
                        <option
value="1">JPUBLISHED</option>
                        <option
value="0">JUNPUBLISHED</option>
                        <option
value="2">JARCHIVED</option>
                        <option
value="-2">JTRASHED</option>
                </field>
                <!-- Date Modified Field. Type: Calendar (joomla)-->
                <field name="modified"
                       type="calendar"
                       class="readonly"
                      
label="COM_RESERVATION_DOCTOR_MODIFIED_DATE_LABEL"
                      
description="COM_RESERVATION_DOCTOR_MODIFIED_DATE_DESC"
                       size="22"
                       readonly="true"
                       format="%Y-%m-%d %H:%M:%S"
                       filter="user_utc" />
                <!-- User Modified Field. Type: User (joomla)-->
                <field name="modified_by"
                       type="user"
                      
label="COM_RESERVATION_DOCTOR_MODIFIED_BY_LABEL"
                      
description="COM_RESERVATION_DOCTOR_MODIFIED_BY_DESC"
                       class="readonly"
                       readonly="true"
                       filter="unset" />
                <!-- Access Field. Type: Accesslevel (joomla)-->
                <field name="access"
                       type="accesslevel"
                       label="JFIELD_ACCESS_LABEL"
                       description="JFIELD_ACCESS_DESC"
                       default="1"
                       required="false" />
                <!-- Ordering Field. Type: Numbers (joomla)-->
                <field name="ordering"
                       type="number"
                       class="inputbox validate-ordering"
                      
label="COM_RESERVATION_DOCTOR_ORDERING_LABEL"
                       description=""
                       default="0"
                       size="6"
                       required="false" />
                <!-- Version Field. Type: Text (joomla)-->
                <field name="version"
                       type="text"
                       class="readonly"
                      
label="COM_RESERVATION_DOCTOR_VERSION_LABEL"
                      
description="COM_RESERVATION_DOCTOR_VERSION_DESC"
                       size="6"
                       readonly="true"
                       filter="unset" />
                <!-- Was added due to Permissions JS needing a Title
field-->
                <!-- Let us know at gh-629 should this change-->
                <!--
https://github.com/vdm-io/Joomla-Component-Builder/issues/629#issuecomment-750117235-->
                <field name="title"
                       type="hidden"
                       default="reservation doctor" />
                <!-- Dynamic Fields.-->
                <!-- Userid Field. Type: User. (joomla)-->
                <field type="user"
                       name="userid"
                      
label="COM_RESERVATION_DOCTOR_USERID_LABEL"
                      
description="COM_RESERVATION_DOCTOR_USERID_DESCRIPTION"
                       class="form-control"
                       required="true" />
                <!-- Msn Field. Type: Text. (joomla)-->
                <field type="text"
                       name="msn"
                       label="COM_RESERVATION_DOCTOR_MSN_LABEL"
                       size="10"
                       maxlength="50"
                       default=""
                      
description="COM_RESERVATION_DOCTOR_MSN_DESCRIPTION"
                       class="text_area form-control"
                       readonly="false"
                       disabled="false"
                       required="true"
                       filter="INTEGER"
                      
message="COM_RESERVATION_DOCTOR_MSN_MESSAGE"
                       autocomplete="on" />
                <!-- Catid Field. Type: Category. (joomla)-->
                <field type="category"
                       name="catid"
                       label="COM_RESERVATION_DOCTOR_CATID_LABEL"
                       extension="com_reservation"
                       required="true"
                       show_root="false"
                       default=""
                      
description="COM_RESERVATION_DOCTOR_CATID_DESCRIPTION"
                       class="inputbox form-control"
                       published="1"
                       multiple="false"
                       exists_table="#__categories"
                       validate="exists" />
                <!-- Phonenumber Field. Type: Text. (joomla)-->
                <field type="text"
                       name="phonenumber"
                      
label="COM_RESERVATION_DOCTOR_PHONENUMBER_LABEL"
                       size="10"
                       maxlength="50"
                       default=""
                      
description="COM_RESERVATION_DOCTOR_PHONENUMBER_DESCRIPTION"
                       class="text_area form-control"
                       readonly="false"
                       disabled="false"
                       required="true"
                       validated="tel"
                      
message="COM_RESERVATION_DOCTOR_PHONENUMBER_MESSAGE"
                       validate="mobile" />
                <!-- Officephone Field. Type: Text. (joomla)-->
                <field type="text"
                       name="officephone"
                      
label="COM_RESERVATION_DOCTOR_OFFICEPHONE_LABEL"
                       size="10"
                       maxlength="50"
                       default=""
                      
description="COM_RESERVATION_DOCTOR_OFFICEPHONE_DESCRIPTION"
                       class="text_area form-control"
                       readonly="false"
                       disabled="false"
                       validated="tel"
                      
message="COM_RESERVATION_DOCTOR_OFFICEPHONE_MESSAGE" />
                <!-- Address Field. Type: Editor. (joomla)-->
                <field type="editor"
                       name="address"
                      
label="COM_RESERVATION_DOCTOR_ADDRESS_LABEL"
                       default=""
                       buttons="no"
                       editor="codemirror|none"
                       filter="safehtml" />
                <!-- Presence Field. Type: Editor. (joomla)-->
                <field type="editor"
                       name="presence"
                      
label="COM_RESERVATION_DOCTOR_PRESENCE_LABEL"
                       default=""
                      
description="COM_RESERVATION_DOCTOR_PRESENCE_DESCRIPTION"
                       buttons="no"
                       editor="codemirror|none"
                       filter="safehtml" />
                <!-- Image Field. Type: Media. (joomla)-->
                <field type="media"
                       name="image"
                       label="COM_RESERVATION_DOCTOR_IMAGE_LABEL"
                       directory="" />
                <!-- Capitalid Field. Type: Capital. (custom)-->
                <field type="capital"
                       name="capitalid"
                      
label="COM_RESERVATION_DOCTOR_CAPITALID_LABEL"
                       class="list_class"
                       multiple="false"
                       default="0" />
                <!-- Cityid Field. Type: City. (custom)-->
                <field type="city"
                       name="cityid"
                      
label="COM_RESERVATION_DOCTOR_CITYID_LABEL"
                       class="list_class"
                       multiple="false"
                       default="0" />
                <!-- Alt Field. Type: Text. (joomla)-->
                <field type="text"
                       name="alt"
                       label="COM_RESERVATION_DOCTOR_ALT_LABEL"
                       size="10"
                       maxlength="50"
                       default=""
                      
description="COM_RESERVATION_DOCTOR_ALT_DESCRIPTION"
                       class="text_area"
                       readonly="false"
                       disabled="false"
                       required="false"
                       filter="STRING"
                      
message="COM_RESERVATION_DOCTOR_ALT_MESSAGE"
                       autocomplete="on" />
        </fieldset>
	
	<!-- Access Control Fields. -->
	<fieldset name="accesscontrol">
		<!-- Asset Id Field. Type: Hidden (joomla) -->
		<field
			name="asset_id"
			type="hidden"
			filter="unset"
		/>
		<!-- Rules Field. Type: Rules (joomla) -->
		<field
			name="rules"
			type="rules"
			label="Permissions in relation to this doctor"
			translate_label="false"
			filter="rules"
			validate="rules"
			class="inputbox"
			component="com_reservation"
			section="doctor"
		/>
	</fieldset>
</form>PK4~�[>�ˢ��$models/forms/filter_appointments.xmlnu�[���<?xml
version="1.0" encoding="utf-8"?>
<form
	addrulepath="/administrator/components/com_reservation/models/rules"
	addfieldpath="/administrator/components/com_reservation/models/fields"
>
	<fields name="filter">
		<field
			type="text"
			name="search"
			inputmode="search"
			label="COM_RESERVATION_FILTER_SEARCH"
			description="COM_RESERVATION_FILTER_SEARCH_APPOINTMENTS"
			hint="JSEARCH_FILTER"
		/>
		<field
			type="status"
			name="published"
			label="COM_RESERVATION_FILTER_PUBLISHED"
			description="COM_RESERVATION_FILTER_PUBLISHED_APPOINTMENTS"
			onchange="this.form.submit();"
		>
			<option value="">JOPTION_SELECT_PUBLISHED</option>
		</field>
		<field
			type="accesslevel"
			name="access"
			label="JFIELD_ACCESS_LABEL"
			description="JFIELD_ACCESS_DESC"
			multiple="true"
			class="multipleAccessLevels"
			onchange="this.form.submit();"
		/>
		<input type="hidden" name="form_submited"
value="1"/>
	</fields>

	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="COM_CONTENT_LIST_FULL_ORDERING"
			description="COM_CONTENT_LIST_FULL_ORDERING_DESC"
			onchange="this.form.submit();"
			default="a.id DESC"
			validate="options"
		>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="a.ordering
ASC">JGRID_HEADING_ORDERING_ASC</option>
			<option value="a.ordering
DESC">JGRID_HEADING_ORDERING_DESC</option>
			<option value="a.published
ASC">JSTATUS_ASC</option>
			<option value="a.published
DESC">JSTATUS_DESC</option>
			<option value="a.appointment
ASC">COM_RESERVATION_FILTER_APPOINTMENT_ASCENDING</option>
			<option value="a.appointment
DESC">COM_RESERVATION_FILTER_APPOINTMENT_DESCENDING</option>
			<option value="a.id
ASC">JGRID_HEADING_ID_ASC</option>
			<option value="a.id
DESC">JGRID_HEADING_ID_DESC</option>
		</field>

		<field
			name="limit"
			type="limitbox"
			label="COM_CONTENT_LIST_LIMIT"
			description="COM_CONTENT_LIST_LIMIT_DESC"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>PK4~�[t�Y�dd"models/forms/filter_bbbclasses.xmlnu�[���<?xml
version="1.0" encoding="utf-8"?>
<form
	addrulepath="/administrator/components/com_reservation/models/rules"
	addfieldpath="/administrator/components/com_reservation/models/fields"
>
	<fields name="filter">
		<field
			type="text"
			name="search"
			inputmode="search"
			label="COM_RESERVATION_FILTER_SEARCH"
			description="COM_RESERVATION_FILTER_SEARCH_BBBCLASSES"
			hint="JSEARCH_FILTER"
		/>
		<field
			type="status"
			name="published"
			label="COM_RESERVATION_FILTER_PUBLISHED"
			description="COM_RESERVATION_FILTER_PUBLISHED_BBBCLASSES"
			onchange="this.form.submit();"
		>
			<option value="">JOPTION_SELECT_PUBLISHED</option>
		</field>
		<field
			type="accesslevel"
			name="access"
			label="JFIELD_ACCESS_LABEL"
			description="JFIELD_ACCESS_DESC"
			multiple="true"
			class="multipleAccessLevels"
			onchange="this.form.submit();"
		/>
		<input type="hidden" name="form_submited"
value="1"/>
	</fields>

	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="COM_CONTENT_LIST_FULL_ORDERING"
			description="COM_CONTENT_LIST_FULL_ORDERING_DESC"
			onchange="this.form.submit();"
			default="a.id DESC"
			validate="options"
		>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="a.ordering
ASC">JGRID_HEADING_ORDERING_ASC</option>
			<option value="a.ordering
DESC">JGRID_HEADING_ORDERING_DESC</option>
			<option value="a.published
ASC">JSTATUS_ASC</option>
			<option value="a.published
DESC">JSTATUS_DESC</option>
			<option value="a.name
ASC">COM_RESERVATION_FILTER_CLASS_NAME_ASCENDING</option>
			<option value="a.name
DESC">COM_RESERVATION_FILTER_CLASS_NAME_DESCENDING</option>
			<option value="g.id
ASC">COM_RESERVATION_FILTER_PLAN_ASCENDING</option>
			<option value="g.id
DESC">COM_RESERVATION_FILTER_PLAN_DESCENDING</option>
			<option value="a.id
ASC">JGRID_HEADING_ID_ASC</option>
			<option value="a.id
DESC">JGRID_HEADING_ID_DESC</option>
		</field>

		<field
			name="limit"
			type="limitbox"
			label="COM_CONTENT_LIST_LIMIT"
			description="COM_CONTENT_LIST_LIMIT_DESC"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>PK4~�[QP�pp
models/forms/filter_capitals.xmlnu�[���<?xml
version="1.0" encoding="utf-8"?>
<form
	addrulepath="/administrator/components/com_reservation/models/rules"
	addfieldpath="/administrator/components/com_reservation/models/fields"
>
	<fields name="filter">
		<field
			type="text"
			name="search"
			inputmode="search"
			label="COM_RESERVATION_FILTER_SEARCH"
			description="COM_RESERVATION_FILTER_SEARCH_CAPITALS"
			hint="JSEARCH_FILTER"
		/>
		<field
			type="status"
			name="published"
			label="COM_RESERVATION_FILTER_PUBLISHED"
			description="COM_RESERVATION_FILTER_PUBLISHED_CAPITALS"
			onchange="this.form.submit();"
		>
			<option value="">JOPTION_SELECT_PUBLISHED</option>
		</field>
		<field
			type="accesslevel"
			name="access"
			label="JFIELD_ACCESS_LABEL"
			description="JFIELD_ACCESS_DESC"
			multiple="true"
			class="multipleAccessLevels"
			onchange="this.form.submit();"
		/>
		<input type="hidden" name="form_submited"
value="1"/>
	</fields>

	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="COM_CONTENT_LIST_FULL_ORDERING"
			description="COM_CONTENT_LIST_FULL_ORDERING_DESC"
			onchange="this.form.submit();"
			default="a.id DESC"
			validate="options"
		>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="a.ordering
ASC">JGRID_HEADING_ORDERING_ASC</option>
			<option value="a.ordering
DESC">JGRID_HEADING_ORDERING_DESC</option>
			<option value="a.published
ASC">JSTATUS_ASC</option>
			<option value="a.published
DESC">JSTATUS_DESC</option>
			<option value="a.name
ASC">COM_RESERVATION_FILTER_NAME_ASCENDING</option>
			<option value="a.name
DESC">COM_RESERVATION_FILTER_NAME_DESCENDING</option>
			<option value="g.name
ASC">COM_RESERVATION_FILTER_SELECT_A_CAPITAL_ASCENDING</option>
			<option value="g.name
DESC">COM_RESERVATION_FILTER_SELECT_A_CAPITAL_DESCENDING</option>
			<option value="a.id
ASC">JGRID_HEADING_ID_ASC</option>
			<option value="a.id
DESC">JGRID_HEADING_ID_DESC</option>
		</field>

		<field
			name="limit"
			type="limitbox"
			label="COM_CONTENT_LIST_LIMIT"
			description="COM_CONTENT_LIST_LIMIT_DESC"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>PK4~�[�>�  
models/forms/filter_comments.xmlnu�[���<?xml
version="1.0" encoding="utf-8"?>
<form
	addrulepath="/administrator/components/com_reservation/models/rules"
	addfieldpath="/administrator/components/com_reservation/models/fields"
>
	<fields name="filter">
		<field
			type="text"
			name="search"
			inputmode="search"
			label="COM_RESERVATION_FILTER_SEARCH"
			description="COM_RESERVATION_FILTER_SEARCH_COMMENTS"
			hint="JSEARCH_FILTER"
		/>
		<field
			type="status"
			name="published"
			label="COM_RESERVATION_FILTER_PUBLISHED"
			description="COM_RESERVATION_FILTER_PUBLISHED_COMMENTS"
			onchange="this.form.submit();"
		>
			<option value="">JOPTION_SELECT_PUBLISHED</option>
		</field>
		<field
			type="accesslevel"
			name="access"
			label="JFIELD_ACCESS_LABEL"
			description="JFIELD_ACCESS_DESC"
			multiple="true"
			class="multipleAccessLevels"
			onchange="this.form.submit();"
		/>
		<input type="hidden" name="form_submited"
value="1"/>
	</fields>

	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="COM_CONTENT_LIST_FULL_ORDERING"
			description="COM_CONTENT_LIST_FULL_ORDERING_DESC"
			onchange="this.form.submit();"
			default="a.id DESC"
			validate="options"
		>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="a.ordering
ASC">JGRID_HEADING_ORDERING_ASC</option>
			<option value="a.ordering
DESC">JGRID_HEADING_ORDERING_DESC</option>
			<option value="a.published
ASC">JSTATUS_ASC</option>
			<option value="a.published
DESC">JSTATUS_DESC</option>
			<option value="a.id
ASC">JGRID_HEADING_ID_ASC</option>
			<option value="a.id
DESC">JGRID_HEADING_ID_DESC</option>
		</field>

		<field
			name="limit"
			type="limitbox"
			label="COM_CONTENT_LIST_LIMIT"
			description="COM_CONTENT_LIST_LIMIT_DESC"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>PK4~�[t�@��#models/forms/filter_consultants.xmlnu�[���<?xml
version="1.0" encoding="utf-8"?>
<form
	addrulepath="/administrator/components/com_reservation/models/rules"
	addfieldpath="/administrator/components/com_reservation/models/fields"
>
	<fields name="filter">
		<field
			type="text"
			name="search"
			inputmode="search"
			label="COM_RESERVATION_FILTER_SEARCH"
			description="COM_RESERVATION_FILTER_SEARCH_CONSULTANTS"
			hint="JSEARCH_FILTER"
		/>
		<field
			type="status"
			name="published"
			label="COM_RESERVATION_FILTER_PUBLISHED"
			description="COM_RESERVATION_FILTER_PUBLISHED_CONSULTANTS"
			onchange="this.form.submit();"
		>
			<option value="">JOPTION_SELECT_PUBLISHED</option>
		</field>
		<field
			type="accesslevel"
			name="access"
			label="JFIELD_ACCESS_LABEL"
			description="JFIELD_ACCESS_DESC"
			multiple="true"
			class="multipleAccessLevels"
			onchange="this.form.submit();"
		/>
		<input type="hidden" name="form_submited"
value="1"/>
	</fields>

	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="COM_CONTENT_LIST_FULL_ORDERING"
			description="COM_CONTENT_LIST_FULL_ORDERING_DESC"
			onchange="this.form.submit();"
			default="a.id DESC"
			validate="options"
		>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="a.ordering
ASC">JGRID_HEADING_ORDERING_ASC</option>
			<option value="a.ordering
DESC">JGRID_HEADING_ORDERING_DESC</option>
			<option value="a.published
ASC">JSTATUS_ASC</option>
			<option value="a.published
DESC">JSTATUS_DESC</option>
			<option value="a.experience
ASC">COM_RESERVATION_FILTER_EXPERIENCE_ASCENDING</option>
			<option value="a.experience
DESC">COM_RESERVATION_FILTER_EXPERIENCE_DESCENDING</option>
			<option value="a.id
ASC">JGRID_HEADING_ID_ASC</option>
			<option value="a.id
DESC">JGRID_HEADING_ID_DESC</option>
		</field>

		<field
			name="limit"
			type="limitbox"
			label="COM_CONTENT_LIST_LIMIT"
			description="COM_CONTENT_LIST_LIMIT_DESC"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>PK4~�[$)U??models/forms/filter_doctors.xmlnu�[���<?xml
version="1.0" encoding="utf-8"?>
<form
	addrulepath="/administrator/components/com_reservation/models/rules"
	addfieldpath="/administrator/components/com_reservation/models/fields"
>
	<fields name="filter">
		<field
			type="text"
			name="search"
			inputmode="search"
			label="COM_RESERVATION_FILTER_SEARCH"
			description="COM_RESERVATION_FILTER_SEARCH_DOCTORS"
			hint="JSEARCH_FILTER"
		/>
		<field
			type="status"
			name="published"
			label="COM_RESERVATION_FILTER_PUBLISHED"
			description="COM_RESERVATION_FILTER_PUBLISHED_DOCTORS"
			onchange="this.form.submit();"
		>
			<option value="">JOPTION_SELECT_PUBLISHED</option>
		</field>
		<field
			type="category"
			name="category_id"
			label="COM_RESERVATION_DOCTOR_DOCTORS_CATEGORIES"
			description="JOPTION_FILTER_CATEGORY_DESC"
			multiple="true"
			class="multipleCategories"
			extension="com_reservation"
			onchange="this.form.submit();"
			published="0,1,2"
		/>
		<field
			type="accesslevel"
			name="access"
			label="JFIELD_ACCESS_LABEL"
			description="JFIELD_ACCESS_DESC"
			multiple="true"
			class="multipleAccessLevels"
			onchange="this.form.submit();"
		/>
		<input type="hidden" name="form_submited"
value="1"/>
	</fields>

	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="COM_CONTENT_LIST_FULL_ORDERING"
			description="COM_CONTENT_LIST_FULL_ORDERING_DESC"
			onchange="this.form.submit();"
			default="a.id DESC"
			validate="options"
		>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="a.ordering
ASC">JGRID_HEADING_ORDERING_ASC</option>
			<option value="a.ordering
DESC">JGRID_HEADING_ORDERING_DESC</option>
			<option value="a.published
ASC">JSTATUS_ASC</option>
			<option value="a.published
DESC">JSTATUS_DESC</option>
			<option value="a.id
ASC">JGRID_HEADING_ID_ASC</option>
			<option value="a.id
DESC">JGRID_HEADING_ID_DESC</option>
		</field>

		<field
			name="limit"
			type="limitbox"
			label="COM_CONTENT_LIST_LIMIT"
			description="COM_CONTENT_LIST_LIMIT_DESC"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>PK4~�[�{  
models/forms/filter_messages.xmlnu�[���<?xml
version="1.0" encoding="utf-8"?>
<form
	addrulepath="/administrator/components/com_reservation/models/rules"
	addfieldpath="/administrator/components/com_reservation/models/fields"
>
	<fields name="filter">
		<field
			type="text"
			name="search"
			inputmode="search"
			label="COM_RESERVATION_FILTER_SEARCH"
			description="COM_RESERVATION_FILTER_SEARCH_MESSAGES"
			hint="JSEARCH_FILTER"
		/>
		<field
			type="status"
			name="published"
			label="COM_RESERVATION_FILTER_PUBLISHED"
			description="COM_RESERVATION_FILTER_PUBLISHED_MESSAGES"
			onchange="this.form.submit();"
		>
			<option value="">JOPTION_SELECT_PUBLISHED</option>
		</field>
		<field
			type="accesslevel"
			name="access"
			label="JFIELD_ACCESS_LABEL"
			description="JFIELD_ACCESS_DESC"
			multiple="true"
			class="multipleAccessLevels"
			onchange="this.form.submit();"
		/>
		<input type="hidden" name="form_submited"
value="1"/>
	</fields>

	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="COM_CONTENT_LIST_FULL_ORDERING"
			description="COM_CONTENT_LIST_FULL_ORDERING_DESC"
			onchange="this.form.submit();"
			default="a.id DESC"
			validate="options"
		>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="a.ordering
ASC">JGRID_HEADING_ORDERING_ASC</option>
			<option value="a.ordering
DESC">JGRID_HEADING_ORDERING_DESC</option>
			<option value="a.published
ASC">JSTATUS_ASC</option>
			<option value="a.published
DESC">JSTATUS_DESC</option>
			<option value="a.id
ASC">JGRID_HEADING_ID_ASC</option>
			<option value="a.id
DESC">JGRID_HEADING_ID_DESC</option>
		</field>

		<field
			name="limit"
			type="limitbox"
			label="COM_CONTENT_LIST_LIMIT"
			description="COM_CONTENT_LIST_LIMIT_DESC"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>PK4~�[o
�rrmodels/forms/filter_orders.xmlnu�[���<?xml
version="1.0" encoding="utf-8"?>
<form
	addrulepath="/administrator/components/com_reservation/models/rules"
	addfieldpath="/administrator/components/com_reservation/models/fields"
>
	<fields name="filter">
		<field
			type="text"
			name="search"
			inputmode="search"
			label="COM_RESERVATION_FILTER_SEARCH"
			description="COM_RESERVATION_FILTER_SEARCH_ORDERS"
			hint="JSEARCH_FILTER"
		/>
		<field
			type="status"
			name="published"
			label="COM_RESERVATION_FILTER_PUBLISHED"
			description="COM_RESERVATION_FILTER_PUBLISHED_ORDERS"
			onchange="this.form.submit();"
		>
			<option value="">JOPTION_SELECT_PUBLISHED</option>
		</field>
		<field
			type="accesslevel"
			name="access"
			label="JFIELD_ACCESS_LABEL"
			description="JFIELD_ACCESS_DESC"
			multiple="true"
			class="multipleAccessLevels"
			onchange="this.form.submit();"
		/>
		<input type="hidden" name="form_submited"
value="1"/>
	</fields>

	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="COM_CONTENT_LIST_FULL_ORDERING"
			description="COM_CONTENT_LIST_FULL_ORDERING_DESC"
			onchange="this.form.submit();"
			default="a.id DESC"
			validate="options"
		>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="a.ordering
ASC">JGRID_HEADING_ORDERING_ASC</option>
			<option value="a.ordering
DESC">JGRID_HEADING_ORDERING_DESC</option>
			<option value="a.published
ASC">JSTATUS_ASC</option>
			<option value="a.published
DESC">JSTATUS_DESC</option>
			<option value="a.full_price
ASC">COM_RESERVATION_FILTER_PRICE_ASCENDING</option>
			<option value="a.full_price
DESC">COM_RESERVATION_FILTER_PRICE_DESCENDING</option>
			<option value="a.status
ASC">COM_RESERVATION_FILTER_STATUS_ASCENDING</option>
			<option value="a.status
DESC">COM_RESERVATION_FILTER_STATUS_DESCENDING</option>
			<option value="a.id
ASC">JGRID_HEADING_ID_ASC</option>
			<option value="a.id
DESC">JGRID_HEADING_ID_DESC</option>
		</field>

		<field
			name="limit"
			type="limitbox"
			label="COM_CONTENT_LIST_LIMIT"
			description="COM_CONTENT_LIST_LIMIT_DESC"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>PK4~�[��E		models/forms/filter_plans.xmlnu�[���<?xml
version="1.0" encoding="utf-8"?>
<form
	addrulepath="/administrator/components/com_reservation/models/rules"
	addfieldpath="/administrator/components/com_reservation/models/fields"
>
	<fields name="filter">
		<field
			type="text"
			name="search"
			inputmode="search"
			label="COM_RESERVATION_FILTER_SEARCH"
			description="COM_RESERVATION_FILTER_SEARCH_PLANS"
			hint="JSEARCH_FILTER"
		/>
		<field
			type="status"
			name="published"
			label="COM_RESERVATION_FILTER_PUBLISHED"
			description="COM_RESERVATION_FILTER_PUBLISHED_PLANS"
			onchange="this.form.submit();"
		>
			<option value="">JOPTION_SELECT_PUBLISHED</option>
		</field>
		<field
			type="accesslevel"
			name="access"
			label="JFIELD_ACCESS_LABEL"
			description="JFIELD_ACCESS_DESC"
			multiple="true"
			class="multipleAccessLevels"
			onchange="this.form.submit();"
		/>
		<input type="hidden" name="form_submited"
value="1"/>
	</fields>

	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="COM_CONTENT_LIST_FULL_ORDERING"
			description="COM_CONTENT_LIST_FULL_ORDERING_DESC"
			onchange="this.form.submit();"
			default="a.id DESC"
			validate="options"
		>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="a.ordering
ASC">JGRID_HEADING_ORDERING_ASC</option>
			<option value="a.ordering
DESC">JGRID_HEADING_ORDERING_DESC</option>
			<option value="a.published
ASC">JSTATUS_ASC</option>
			<option value="a.published
DESC">JSTATUS_DESC</option>
			<option value="a.time
ASC">COM_RESERVATION_FILTER_TIME_ASCENDING</option>
			<option value="a.time
DESC">COM_RESERVATION_FILTER_TIME_DESCENDING</option>
			<option value="a.price
ASC">COM_RESERVATION_FILTER_PRICE_ASCENDING</option>
			<option value="a.price
DESC">COM_RESERVATION_FILTER_PRICE_DESCENDING</option>
			<option value="a.waitingtime
ASC">COM_RESERVATION_FILTER_WAITINGTIME_ASCENDING</option>
			<option value="a.waitingtime
DESC">COM_RESERVATION_FILTER_WAITINGTIME_DESCENDING</option>
			<option value="a.id
ASC">JGRID_HEADING_ID_ASC</option>
			<option value="a.id
DESC">JGRID_HEADING_ID_DESC</option>
		</field>

		<field
			name="limit"
			type="limitbox"
			label="COM_CONTENT_LIST_LIMIT"
			description="COM_CONTENT_LIST_LIMIT_DESC"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>PK4~�[�$�LB	B	
models/forms/filter_reserves.xmlnu�[���<?xml
version="1.0" encoding="utf-8"?>
<form
	addrulepath="/administrator/components/com_reservation/models/rules"
	addfieldpath="/administrator/components/com_reservation/models/fields"
>
	<fields name="filter">
		<field
			type="text"
			name="search"
			inputmode="search"
			label="COM_RESERVATION_FILTER_SEARCH"
			description="COM_RESERVATION_FILTER_SEARCH_RESERVES"
			hint="JSEARCH_FILTER"
		/>
		<field
			type="status"
			name="published"
			label="COM_RESERVATION_FILTER_PUBLISHED"
			description="COM_RESERVATION_FILTER_PUBLISHED_RESERVES"
			onchange="this.form.submit();"
		>
			<option value="">JOPTION_SELECT_PUBLISHED</option>
		</field>
		<field
			type="accesslevel"
			name="access"
			label="JFIELD_ACCESS_LABEL"
			description="JFIELD_ACCESS_DESC"
			multiple="true"
			class="multipleAccessLevels"
			onchange="this.form.submit();"
		/>
		<input type="hidden" name="form_submited"
value="1"/>
	</fields>

	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="COM_CONTENT_LIST_FULL_ORDERING"
			description="COM_CONTENT_LIST_FULL_ORDERING_DESC"
			onchange="this.form.submit();"
			default="a.id DESC"
			validate="options"
		>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="a.ordering
ASC">JGRID_HEADING_ORDERING_ASC</option>
			<option value="a.ordering
DESC">JGRID_HEADING_ORDERING_DESC</option>
			<option value="a.published
ASC">JSTATUS_ASC</option>
			<option value="a.published
DESC">JSTATUS_DESC</option>
			<option value="a.full_price
ASC">COM_RESERVATION_FILTER_PRICE_ASCENDING</option>
			<option value="a.full_price
DESC">COM_RESERVATION_FILTER_PRICE_DESCENDING</option>
			<option value="a.doctor_quota
ASC">COM_RESERVATION_FILTER_DOCTOR_QUOTA_ASCENDING</option>
			<option value="a.doctor_quota
DESC">COM_RESERVATION_FILTER_DOCTOR_QUOTA_DESCENDING</option>
			<option value="a.system_quota
ASC">COM_RESERVATION_FILTER_SYSTEM_QUOTA_ASCENDING</option>
			<option value="a.system_quota
DESC">COM_RESERVATION_FILTER_SYSTEM_QUOTA_DESCENDING</option>
			<option value="a.id
ASC">JGRID_HEADING_ID_ASC</option>
			<option value="a.id
DESC">JGRID_HEADING_ID_DESC</option>
		</field>

		<field
			name="limit"
			type="limitbox"
			label="COM_CONTENT_LIST_LIMIT"
			description="COM_CONTENT_LIST_LIMIT_DESC"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>PK4~�[�93q  
models/forms/filter_sessions.xmlnu�[���<?xml
version="1.0" encoding="utf-8"?>
<form
	addrulepath="/administrator/components/com_reservation/models/rules"
	addfieldpath="/administrator/components/com_reservation/models/fields"
>
	<fields name="filter">
		<field
			type="text"
			name="search"
			inputmode="search"
			label="COM_RESERVATION_FILTER_SEARCH"
			description="COM_RESERVATION_FILTER_SEARCH_SESSIONS"
			hint="JSEARCH_FILTER"
		/>
		<field
			type="status"
			name="published"
			label="COM_RESERVATION_FILTER_PUBLISHED"
			description="COM_RESERVATION_FILTER_PUBLISHED_SESSIONS"
			onchange="this.form.submit();"
		>
			<option value="">JOPTION_SELECT_PUBLISHED</option>
		</field>
		<field
			type="accesslevel"
			name="access"
			label="JFIELD_ACCESS_LABEL"
			description="JFIELD_ACCESS_DESC"
			multiple="true"
			class="multipleAccessLevels"
			onchange="this.form.submit();"
		/>
		<input type="hidden" name="form_submited"
value="1"/>
	</fields>

	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="COM_CONTENT_LIST_FULL_ORDERING"
			description="COM_CONTENT_LIST_FULL_ORDERING_DESC"
			onchange="this.form.submit();"
			default="a.id DESC"
			validate="options"
		>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="a.ordering
ASC">JGRID_HEADING_ORDERING_ASC</option>
			<option value="a.ordering
DESC">JGRID_HEADING_ORDERING_DESC</option>
			<option value="a.published
ASC">JSTATUS_ASC</option>
			<option value="a.published
DESC">JSTATUS_DESC</option>
			<option value="a.id
ASC">JGRID_HEADING_ID_ASC</option>
			<option value="a.id
DESC">JGRID_HEADING_ID_DESC</option>
		</field>

		<field
			name="limit"
			type="limitbox"
			label="COM_CONTENT_LIST_LIMIT"
			description="COM_CONTENT_LIST_LIMIT_DESC"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>PK4~�[��qimodels/forms/filter_sicks.xmlnu�[���<?xml
version="1.0" encoding="utf-8"?>
<form
	addrulepath="/administrator/components/com_reservation/models/rules"
	addfieldpath="/administrator/components/com_reservation/models/fields"
>
	<fields name="filter">
		<field
			type="text"
			name="search"
			inputmode="search"
			label="COM_RESERVATION_FILTER_SEARCH"
			description="COM_RESERVATION_FILTER_SEARCH_SICKS"
			hint="JSEARCH_FILTER"
		/>
		<field
			type="status"
			name="published"
			label="COM_RESERVATION_FILTER_PUBLISHED"
			description="COM_RESERVATION_FILTER_PUBLISHED_SICKS"
			onchange="this.form.submit();"
		>
			<option value="">JOPTION_SELECT_PUBLISHED</option>
		</field>
		<field
			type="accesslevel"
			name="access"
			label="JFIELD_ACCESS_LABEL"
			description="JFIELD_ACCESS_DESC"
			multiple="true"
			class="multipleAccessLevels"
			onchange="this.form.submit();"
		/>
		<input type="hidden" name="form_submited"
value="1"/>
	</fields>

	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="COM_CONTENT_LIST_FULL_ORDERING"
			description="COM_CONTENT_LIST_FULL_ORDERING_DESC"
			onchange="this.form.submit();"
			default="a.id DESC"
			validate="options"
		>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="a.ordering
ASC">JGRID_HEADING_ORDERING_ASC</option>
			<option value="a.ordering
DESC">JGRID_HEADING_ORDERING_DESC</option>
			<option value="a.published
ASC">JSTATUS_ASC</option>
			<option value="a.published
DESC">JSTATUS_DESC</option>
			<option value="a.id
ASC">JGRID_HEADING_ID_ASC</option>
			<option value="a.id
DESC">JGRID_HEADING_ID_DESC</option>
		</field>

		<field
			name="limit"
			type="limitbox"
			label="COM_CONTENT_LIST_LIMIT"
			description="COM_CONTENT_LIST_LIMIT_DESC"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>PK4~�[�#o,,models/forms/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK4~�[��922models/forms/message.jsnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.36
	@build			26th July, 2021
	@created		17th December, 2020
	@package		Reservation
	@subpackage		message.js
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

 
PK4~�[p����models/forms/message.xmlnu�[���<?xml
version="1.0" encoding="utf-8"?>
<form
	addrulepath="/administrator/components/com_reservation/models/rules"
	addfieldpath="/administrator/components/com_reservation/models/fields"
>
	<fieldset name="details">
                <!-- Default Fields.-->
                <!-- Id Field. Type: Text (joomla)-->
                <field name="id"
                       type="text"
                       class="readonly"
                       readonly="true"
                       label="JGLOBAL_FIELD_ID_LABEL"
                       description="JGLOBAL_FIELD_ID_DESC"
                       size="10"
                       default="0" />
                <!-- Date Created Field. Type: Calendar (joomla)-->
                <field name="created"
                       type="calendar"
                      
label="COM_RESERVATION_MESSAGE_CREATED_DATE_LABEL"
                      
description="COM_RESERVATION_MESSAGE_CREATED_DATE_DESC"
                       size="22"
                       format="%Y-%m-%d %H:%M:%S"
                       filter="user_utc" />
                <!-- User Created Field. Type: User (joomla)-->
                <field name="created_by"
                       type="user"
                      
label="COM_RESERVATION_MESSAGE_CREATED_BY_LABEL"
                      
description="COM_RESERVATION_MESSAGE_CREATED_BY_DESC" />
                <!-- Published Field. Type: List (joomla)-->
                <field name="published"
                       type="list"
                       label="JSTATUS">
                        <option
value="1">JPUBLISHED</option>
                        <option
value="0">JUNPUBLISHED</option>
                        <option
value="2">JARCHIVED</option>
                        <option
value="-2">JTRASHED</option>
                </field>
                <!-- Date Modified Field. Type: Calendar (joomla)-->
                <field name="modified"
                       type="calendar"
                       class="readonly"
                      
label="COM_RESERVATION_MESSAGE_MODIFIED_DATE_LABEL"
                      
description="COM_RESERVATION_MESSAGE_MODIFIED_DATE_DESC"
                       size="22"
                       readonly="true"
                       format="%Y-%m-%d %H:%M:%S"
                       filter="user_utc" />
                <!-- User Modified Field. Type: User (joomla)-->
                <field name="modified_by"
                       type="user"
                      
label="COM_RESERVATION_MESSAGE_MODIFIED_BY_LABEL"
                      
description="COM_RESERVATION_MESSAGE_MODIFIED_BY_DESC"
                       class="readonly"
                       readonly="true"
                       filter="unset" />
                <!-- Access Field. Type: Accesslevel (joomla)-->
                <field name="access"
                       type="accesslevel"
                       label="JFIELD_ACCESS_LABEL"
                       description="JFIELD_ACCESS_DESC"
                       default="1"
                       required="false" />
                <!-- Ordering Field. Type: Numbers (joomla)-->
                <field name="ordering"
                       type="number"
                       class="inputbox validate-ordering"
                      
label="COM_RESERVATION_MESSAGE_ORDERING_LABEL"
                       description=""
                       default="0"
                       size="6"
                       required="false" />
                <!-- Version Field. Type: Text (joomla)-->
                <field name="version"
                       type="text"
                       class="readonly"
                      
label="COM_RESERVATION_MESSAGE_VERSION_LABEL"
                      
description="COM_RESERVATION_MESSAGE_VERSION_DESC"
                       size="6"
                       readonly="true"
                       filter="unset" />
                <!-- Was added due to Permissions JS needing a Title
field-->
                <!-- Let us know at gh-629 should this change-->
                <!--
https://github.com/vdm-io/Joomla-Component-Builder/issues/629#issuecomment-750117235-->
                <field name="title"
                       type="hidden"
                       default="reservation message" />
                <!-- Dynamic Fields.-->
                <!-- From Field. Type: User. (joomla)-->
                <field type="user"
                       name="from"
                       label="COM_RESERVATION_MESSAGE_FROM_LABEL"
/>
                <!-- To Field. Type: User. (joomla)-->
                <field type="user"
                       name="to"
                       label="COM_RESERVATION_MESSAGE_TO_LABEL"
/>
                <!-- Reply Field. Type: Reply. (custom)-->
                <field type="reply"
                       name="reply"
                      
label="COM_RESERVATION_MESSAGE_REPLY_LABEL"
                       class="list_class"
                       multiple="false"
                       default="0"
                       button="true" />
                <!-- Message Field. Type: Textarea. (joomla)-->
                <field type="textarea"
                       name="message"
                      
label="COM_RESERVATION_MESSAGE_MESSAGE_LABEL"
                       rows="10"
                       cols="5"
                       default="default text"
                      
description="COM_RESERVATION_MESSAGE_MESSAGE_DESCRIPTION"
                       class="text_area"
                       filter="raw"
                       required="true"
                       readonly="false"
                       disabled="false" />
                <!-- Read Field. Type: Checkbox. (joomla)-->
                <field type="checkbox"
                       name="read"
                       label="COM_RESERVATION_MESSAGE_READ_LABEL"
                       value="1"
                       default=""
                      
description="COM_RESERVATION_MESSAGE_READ_DESCRIPTION"
                       class="inputbox" />
                <!-- Seen Field. Type: Checkbox. (joomla)-->
                <field type="checkbox"
                       name="seen"
                       label="COM_RESERVATION_MESSAGE_SEEN_LABEL"
                       value="1"
                       default=""
                      
description="COM_RESERVATION_MESSAGE_SEEN_DESCRIPTION"
                       class="inputbox" />
                <!-- Seid Field. Type: Text. (joomla)-->
                <field type="text"
                       name="seid"
                       label="COM_RESERVATION_MESSAGE_SEID_LABEL"
                       size="10"
                       maxlength="50"
                       default=""
                      
description="COM_RESERVATION_MESSAGE_SEID_DESCRIPTION"
                       class="text_area"
                       readonly="false"
                       disabled="false"
                       required="true"
                       filter="INT"
                      
message="COM_RESERVATION_MESSAGE_SEID_MESSAGE"
                       autocomplete="on" />
        </fieldset>
	
	<!-- Access Control Fields. -->
	<fieldset name="accesscontrol">
		<!-- Asset Id Field. Type: Hidden (joomla) -->
		<field
			name="asset_id"
			type="hidden"
			filter="unset"
		/>
		<!-- Rules Field. Type: Rules (joomla) -->
		<field
			name="rules"
			type="rules"
			label="Permissions in relation to this message"
			translate_label="false"
			filter="rules"
			validate="rules"
			class="inputbox"
			component="com_reservation"
			section="message"
		/>
	</fieldset>
</form>PK4~�[��..models/forms/order.jsnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.31
	@build			8th May, 2021
	@created		17th December, 2020
	@package		Reservation
	@subpackage		order.js
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

 
PK4~�[J��??models/forms/order.xmlnu�[���<?xml
version="1.0" encoding="utf-8"?>
<form
	addrulepath="/administrator/components/com_reservation/models/rules"
	addfieldpath="/administrator/components/com_reservation/models/fields"
>
	<fieldset name="details">
                <!-- Default Fields.-->
                <!-- Id Field. Type: Text (joomla)-->
                <field name="id"
                       type="text"
                       class="readonly"
                       readonly="true"
                       label="JGLOBAL_FIELD_ID_LABEL"
                       description="JGLOBAL_FIELD_ID_DESC"
                       size="10"
                       default="0" />
                <!-- Date Created Field. Type: Calendar (joomla)-->
                <field name="created"
                       type="calendar"
                      
label="COM_RESERVATION_ORDER_CREATED_DATE_LABEL"
                      
description="COM_RESERVATION_ORDER_CREATED_DATE_DESC"
                       size="22"
                       format="%Y-%m-%d %H:%M:%S"
                       filter="user_utc" />
                <!-- User Created Field. Type: User (joomla)-->
                <field name="created_by"
                       type="user"
                      
label="COM_RESERVATION_ORDER_CREATED_BY_LABEL"
                      
description="COM_RESERVATION_ORDER_CREATED_BY_DESC" />
                <!-- Published Field. Type: List (joomla)-->
                <field name="published"
                       type="list"
                       label="JSTATUS">
                        <option
value="1">JPUBLISHED</option>
                        <option
value="0">JUNPUBLISHED</option>
                        <option
value="2">JARCHIVED</option>
                        <option
value="-2">JTRASHED</option>
                </field>
                <!-- Date Modified Field. Type: Calendar (joomla)-->
                <field name="modified"
                       type="calendar"
                       class="readonly"
                      
label="COM_RESERVATION_ORDER_MODIFIED_DATE_LABEL"
                      
description="COM_RESERVATION_ORDER_MODIFIED_DATE_DESC"
                       size="22"
                       readonly="true"
                       format="%Y-%m-%d %H:%M:%S"
                       filter="user_utc" />
                <!-- User Modified Field. Type: User (joomla)-->
                <field name="modified_by"
                       type="user"
                      
label="COM_RESERVATION_ORDER_MODIFIED_BY_LABEL"
                      
description="COM_RESERVATION_ORDER_MODIFIED_BY_DESC"
                       class="readonly"
                       readonly="true"
                       filter="unset" />
                <!-- Access Field. Type: Accesslevel (joomla)-->
                <field name="access"
                       type="accesslevel"
                       label="JFIELD_ACCESS_LABEL"
                       description="JFIELD_ACCESS_DESC"
                       default="1"
                       required="false" />
                <!-- Ordering Field. Type: Numbers (joomla)-->
                <field name="ordering"
                       type="number"
                       class="inputbox validate-ordering"
                      
label="COM_RESERVATION_ORDER_ORDERING_LABEL"
                       description=""
                       default="0"
                       size="6"
                       required="false" />
                <!-- Version Field. Type: Text (joomla)-->
                <field name="version"
                       type="text"
                       class="readonly"
                      
label="COM_RESERVATION_ORDER_VERSION_LABEL"
                      
description="COM_RESERVATION_ORDER_VERSION_DESC"
                       size="6"
                       readonly="true"
                       filter="unset" />
                <!-- Was added due to Permissions JS needing a Title
field-->
                <!-- Let us know at gh-629 should this change-->
                <!--
https://github.com/vdm-io/Joomla-Component-Builder/issues/629#issuecomment-750117235-->
                <field name="title"
                       type="hidden"
                       default="reservation order" />
                <!-- Dynamic Fields.-->
                <!-- Sickid Field. Type: Sick. (custom)-->
                <field type="sick"
                       name="sickid"
                       label="COM_RESERVATION_ORDER_SICKID_LABEL"
                       class="list_class"
                       multiple="false"
                       default="0"
                       required="true" />
                <!-- Full_price Field. Type: Text. (joomla)-->
                <field type="text"
                       name="full_price"
                      
label="COM_RESERVATION_ORDER_FULL_PRICE_LABEL"
                       size="10"
                       maxlength="100"
                       default=""
                      
description="COM_RESERVATION_ORDER_FULL_PRICE_DESCRIPTION"
                       class="text_area"
                       readonly="false"
                       disabled="false"
                       required="false"
                       filter="INT"
                       validate="number"
                      
message="COM_RESERVATION_ORDER_FULL_PRICE_MESSAGE"
                       autocomplete="on" />
                <!-- Doctor_quota Field. Type: Text. (joomla)-->
                <field type="text"
                       name="doctor_quota"
                      
label="COM_RESERVATION_ORDER_DOCTOR_QUOTA_LABEL"
                       size="10"
                       maxlength="50"
                       default=""
                      
description="COM_RESERVATION_ORDER_DOCTOR_QUOTA_DESCRIPTION"
                       class="text_area"
                       readonly="false"
                       disabled="false"
                       required="false"
                       filter="int"
                       validate="number"
                      
message="COM_RESERVATION_ORDER_DOCTOR_QUOTA_MESSAGE"
                       autocomplete="on" />
                <!-- System_quota Field. Type: Text. (joomla)-->
                <field type="text"
                       name="system_quota"
                      
label="COM_RESERVATION_ORDER_SYSTEM_QUOTA_LABEL"
                       size="10"
                       maxlength="50"
                       default=""
                      
description="COM_RESERVATION_ORDER_SYSTEM_QUOTA_DESCRIPTION"
                       class="text_area"
                       readonly="false"
                       disabled="false"
                       required="false"
                       filter="int"
                       validate="number"
                      
message="COM_RESERVATION_ORDER_SYSTEM_QUOTA_MESSAGE"
                       autocomplete="on" />
                <!-- Status Field. Type: List. (joomla)-->
                <field type="list"
                       name="status"
                       label="COM_RESERVATION_ORDER_STATUS_LABEL"
                       class="list_class"
                       multiple="false"
                       default="0">
                        <!-- Option Set.-->
                        <option
value="confirmed">COM_RESERVATION_ORDER_CONFIRMED</option>
                        <option
value="created">COM_RESERVATION_ORDER_CREATED</option>
                </field>
        </fieldset>
	
	<!-- Access Control Fields. -->
	<fieldset name="accesscontrol">
		<!-- Asset Id Field. Type: Hidden (joomla) -->
		<field
			name="asset_id"
			type="hidden"
			filter="unset"
		/>
		<!-- Rules Field. Type: Rules (joomla) -->
		<field
			name="rules"
			type="rules"
			label="Permissions in relation to this order"
			translate_label="false"
			filter="rules"
			validate="rules"
			class="inputbox"
			component="com_reservation"
			section="order"
		/>
	</fieldset>
</form>PK4~�[>�O�//models/forms/plan.jsnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.36
	@build			26th July, 2021
	@created		17th December, 2020
	@package		Reservation
	@subpackage		plan.js
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

 
PK4~�[5�JJmodels/forms/plan.xmlnu�[���<?xml
version="1.0" encoding="utf-8"?>
<form
	addrulepath="/administrator/components/com_reservation/models/rules"
	addfieldpath="/administrator/components/com_reservation/models/fields"
>
	<fieldset name="details">
                <!-- Default Fields.-->
                <!-- Id Field. Type: Text (joomla)-->
                <field name="id"
                       type="text"
                       class="readonly"
                       readonly="true"
                       label="JGLOBAL_FIELD_ID_LABEL"
                       description="JGLOBAL_FIELD_ID_DESC"
                       size="10"
                       default="0" />
                <!-- Date Created Field. Type: Calendar (joomla)-->
                <field name="created"
                       type="calendar"
                      
label="COM_RESERVATION_PLAN_CREATED_DATE_LABEL"
                      
description="COM_RESERVATION_PLAN_CREATED_DATE_DESC"
                       size="22"
                       format="%Y-%m-%d %H:%M:%S"
                       filter="user_utc" />
                <!-- User Created Field. Type: User (joomla)-->
                <field name="created_by"
                       type="user"
                      
label="COM_RESERVATION_PLAN_CREATED_BY_LABEL"
                      
description="COM_RESERVATION_PLAN_CREATED_BY_DESC" />
                <!-- Published Field. Type: List (joomla)-->
                <field name="published"
                       type="list"
                       label="JSTATUS">
                        <option
value="1">JPUBLISHED</option>
                        <option
value="0">JUNPUBLISHED</option>
                        <option
value="2">JARCHIVED</option>
                        <option
value="-2">JTRASHED</option>
                </field>
                <!-- Date Modified Field. Type: Calendar (joomla)-->
                <field name="modified"
                       type="calendar"
                       class="readonly"
                      
label="COM_RESERVATION_PLAN_MODIFIED_DATE_LABEL"
                      
description="COM_RESERVATION_PLAN_MODIFIED_DATE_DESC"
                       size="22"
                       readonly="true"
                       format="%Y-%m-%d %H:%M:%S"
                       filter="user_utc" />
                <!-- User Modified Field. Type: User (joomla)-->
                <field name="modified_by"
                       type="user"
                      
label="COM_RESERVATION_PLAN_MODIFIED_BY_LABEL"
                      
description="COM_RESERVATION_PLAN_MODIFIED_BY_DESC"
                       class="readonly"
                       readonly="true"
                       filter="unset" />
                <!-- Access Field. Type: Accesslevel (joomla)-->
                <field name="access"
                       type="accesslevel"
                       label="JFIELD_ACCESS_LABEL"
                       description="JFIELD_ACCESS_DESC"
                       default="1"
                       required="false" />
                <!-- Ordering Field. Type: Numbers (joomla)-->
                <field name="ordering"
                       type="number"
                       class="inputbox validate-ordering"
                      
label="COM_RESERVATION_PLAN_ORDERING_LABEL"
                       description=""
                       default="0"
                       size="6"
                       required="false" />
                <!-- Version Field. Type: Text (joomla)-->
                <field name="version"
                       type="text"
                       class="readonly"
                       label="COM_RESERVATION_PLAN_VERSION_LABEL"
                      
description="COM_RESERVATION_PLAN_VERSION_DESC"
                       size="6"
                       readonly="true"
                       filter="unset" />
                <!-- Was added due to Permissions JS needing a Title
field-->
                <!-- Let us know at gh-629 should this change-->
                <!--
https://github.com/vdm-io/Joomla-Component-Builder/issues/629#issuecomment-750117235-->
                <field name="title"
                       type="hidden"
                       default="reservation plan" />
                <!-- Dynamic Fields.-->
                <!-- Plantype Field. Type: List. (joomla)-->
                <field type="list"
                       name="plantype"
                      
label="COM_RESERVATION_PLAN_PLANTYPE_LABEL"
                      
description="COM_RESERVATION_PLAN_PLANTYPE_DESCRIPTION"
                       class="list_class form-control"
                       multiple="false"
                       required="true"
                       default="0">
                        <!-- Option Set.-->
                        <option
value="1">COM_RESERVATION_PLAN_TEL</option>
                        <option
value="2">COM_RESERVATION_PLAN_CHAT</option>
                        <option
value="3">COM_RESERVATION_PLAN_VIDEO</option>
                </field>
                <!-- Time Field. Type: Number. (joomla)-->
                <field type="number"
                       name="time"
                       label="COM_RESERVATION_PLAN_TIME_LABEL"
                       default=""
                      
description="COM_RESERVATION_PLAN_TIME_DESCRIPTION"
                       class="text_area form-control"
                       required="true"
                       min="1"
                       max="120"
                       step="5" />
                <!-- Price Field. Type: Text. (joomla)-->
                <field type="text"
                       name="price"
                       label="COM_RESERVATION_PLAN_PRICE_LABEL"
                       size="10"
                       maxlength="50"
                       default=""
                      
description="COM_RESERVATION_PLAN_PRICE_DESCRIPTION"
                       class="text_area form-control"
                       readonly="false"
                       disabled="false"
                       required="true"
                       filter="INTEGER"
                      
message="COM_RESERVATION_PLAN_PRICE_MESSAGE"
                       autocomplete="on" />
                <!-- Waitingtime Field. Type: Number. (joomla)-->
                <field type="number"
                       name="waitingtime"
                      
label="COM_RESERVATION_PLAN_WAITINGTIME_LABEL"
                       default=""
                      
description="COM_RESERVATION_PLAN_WAITINGTIME_DESCRIPTION"
                       class="text_area form-control"
                       required="true"
                       min="1"
                       max="40"
                       step="1" />
                <!-- Consultantid Field. Type: Consultant.
(custom)-->
                <field type="consultant"
                       name="consultantid"
                      
label="COM_RESERVATION_PLAN_CONSULTANTID_LABEL"
                      
description="COM_RESERVATION_PLAN_CONSULTANTID_DESCRIPTION"
                       class="list_class"
                       multiple="false"
                       default=""
                       required="true"
                       button="false" />
        </fieldset>
	
	<!-- Access Control Fields. -->
	<fieldset name="accesscontrol">
		<!-- Asset Id Field. Type: Hidden (joomla) -->
		<field
			name="asset_id"
			type="hidden"
			filter="unset"
		/>
		<!-- Rules Field. Type: Rules (joomla) -->
		<field
			name="rules"
			type="rules"
			label="Permissions in relation to this plan"
			translate_label="false"
			filter="rules"
			validate="rules"
			class="inputbox"
			component="com_reservation"
			section="plan"
		/>
	</fieldset>
</form>PK4~�[!�/�22models/forms/reserve.jsnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.36
	@build			26th July, 2021
	@created		17th December, 2020
	@package		Reservation
	@subpackage		reserve.js
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

 
PK4~�[����&�&models/forms/reserve.xmlnu�[���<?xml
version="1.0" encoding="utf-8"?>
<form
	addrulepath="/administrator/components/com_reservation/models/rules"
	addfieldpath="/administrator/components/com_reservation/models/fields"
>
	<fieldset name="details">
                <!-- Default Fields.-->
                <!-- Id Field. Type: Text (joomla)-->
                <field name="id"
                       type="text"
                       class="readonly"
                       readonly="true"
                       label="JGLOBAL_FIELD_ID_LABEL"
                       description="JGLOBAL_FIELD_ID_DESC"
                       size="10"
                       default="0" />
                <!-- Date Created Field. Type: Calendar (joomla)-->
                <field name="created"
                       type="calendar"
                      
label="COM_RESERVATION_RESERVE_CREATED_DATE_LABEL"
                      
description="COM_RESERVATION_RESERVE_CREATED_DATE_DESC"
                       size="22"
                       format="%Y-%m-%d %H:%M:%S"
                       filter="user_utc" />
                <!-- User Created Field. Type: User (joomla)-->
                <field name="created_by"
                       type="user"
                      
label="COM_RESERVATION_RESERVE_CREATED_BY_LABEL"
                      
description="COM_RESERVATION_RESERVE_CREATED_BY_DESC" />
                <!-- Published Field. Type: List (joomla)-->
                <field name="published"
                       type="list"
                       label="JSTATUS">
                        <option
value="1">JPUBLISHED</option>
                        <option
value="0">JUNPUBLISHED</option>
                        <option
value="2">JARCHIVED</option>
                        <option
value="-2">JTRASHED</option>
                </field>
                <!-- Date Modified Field. Type: Calendar (joomla)-->
                <field name="modified"
                       type="calendar"
                       class="readonly"
                      
label="COM_RESERVATION_RESERVE_MODIFIED_DATE_LABEL"
                      
description="COM_RESERVATION_RESERVE_MODIFIED_DATE_DESC"
                       size="22"
                       readonly="true"
                       format="%Y-%m-%d %H:%M:%S"
                       filter="user_utc" />
                <!-- User Modified Field. Type: User (joomla)-->
                <field name="modified_by"
                       type="user"
                      
label="COM_RESERVATION_RESERVE_MODIFIED_BY_LABEL"
                      
description="COM_RESERVATION_RESERVE_MODIFIED_BY_DESC"
                       class="readonly"
                       readonly="true"
                       filter="unset" />
                <!-- Access Field. Type: Accesslevel (joomla)-->
                <field name="access"
                       type="accesslevel"
                       label="JFIELD_ACCESS_LABEL"
                       description="JFIELD_ACCESS_DESC"
                       default="1"
                       required="false" />
                <!-- Ordering Field. Type: Numbers (joomla)-->
                <field name="ordering"
                       type="number"
                       class="inputbox validate-ordering"
                      
label="COM_RESERVATION_RESERVE_ORDERING_LABEL"
                       description=""
                       default="0"
                       size="6"
                       required="false" />
                <!-- Version Field. Type: Text (joomla)-->
                <field name="version"
                       type="text"
                       class="readonly"
                      
label="COM_RESERVATION_RESERVE_VERSION_LABEL"
                      
description="COM_RESERVATION_RESERVE_VERSION_DESC"
                       size="6"
                       readonly="true"
                       filter="unset" />
                <!-- Was added due to Permissions JS needing a Title
field-->
                <!-- Let us know at gh-629 should this change-->
                <!--
https://github.com/vdm-io/Joomla-Component-Builder/issues/629#issuecomment-750117235-->
                <field name="title"
                       type="hidden"
                       default="reservation reserve" />
                <!-- Dynamic Fields.-->
                <!-- Appointmentid Field. Type: Appointment.
(custom)-->
                <field type="appointment"
                       name="appointmentid"
                      
label="COM_RESERVATION_RESERVE_APPOINTMENTID_LABEL"
                      
description="COM_RESERVATION_RESERVE_APPOINTMENTID_DESCRIPTION"
                       class="list_class"
                       multiple="false"
                       default="0"
                       required="true" />
                <!-- Sickid Field. Type: Sick. (custom)-->
                <field type="sick"
                       name="sickid"
                      
label="COM_RESERVATION_RESERVE_SICKID_LABEL"
                       class="list_class"
                       multiple="false"
                       default="0"
                       required="true" />
                <!-- Full_price Field. Type: Text. (joomla)-->
                <field type="text"
                       name="full_price"
                      
label="COM_RESERVATION_RESERVE_FULL_PRICE_LABEL"
                       size="10"
                       maxlength="100"
                       default=""
                      
description="COM_RESERVATION_RESERVE_FULL_PRICE_DESCRIPTION"
                       class="text_area"
                       readonly="false"
                       disabled="false"
                       required="true"
                       filter="UINT"
                       validate="number"
                      
message="COM_RESERVATION_RESERVE_FULL_PRICE_MESSAGE"
                       autocomplete="on" />
                <!-- Doctor_quota Field. Type: Text. (joomla)-->
                <field type="text"
                       name="doctor_quota"
                      
label="COM_RESERVATION_RESERVE_DOCTOR_QUOTA_LABEL"
                       size="10"
                       maxlength="50"
                       default=""
                      
description="COM_RESERVATION_RESERVE_DOCTOR_QUOTA_DESCRIPTION"
                       class="text_area"
                       readonly="false"
                       disabled="false"
                       required="true"
                       filter="UINT"
                       validate="number"
                      
message="COM_RESERVATION_RESERVE_DOCTOR_QUOTA_MESSAGE"
                       autocomplete="on" />
                <!-- System_quota Field. Type: Text. (joomla)-->
                <field type="text"
                       name="system_quota"
                      
label="COM_RESERVATION_RESERVE_SYSTEM_QUOTA_LABEL"
                       size="10"
                       maxlength="50"
                       default=""
                      
description="COM_RESERVATION_RESERVE_SYSTEM_QUOTA_DESCRIPTION"
                       class="text_area"
                       readonly="false"
                       disabled="false"
                       required="true"
                       filter="UINT"
                       validate="number"
                      
message="COM_RESERVATION_RESERVE_SYSTEM_QUOTA_MESSAGE"
                       autocomplete="on" />
                <!-- Status Field. Type: List. (joomla)-->
                <field type="list"
                       name="status"
                      
label="COM_RESERVATION_RESERVE_STATUS_LABEL"
                       class="list_class"
                       multiple="false"
                       required="true"
                       default="0">
                        <!-- Option Set.-->
                        <option
value="confirmed">COM_RESERVATION_RESERVE_CONFIRMED</option>
                        <option
value="created">COM_RESERVATION_RESERVE_CREATED</option>
                </field>
                <!-- Payment_method Field. Type: Text. (joomla)-->
                <field type="text"
                       name="payment_method"
                      
label="COM_RESERVATION_RESERVE_PAYMENT_METHOD_LABEL"
                       size="10"
                       maxlength="50"
                       default=""
                      
description="COM_RESERVATION_RESERVE_PAYMENT_METHOD_DESCRIPTION"
                       class="text_area"
                       readonly="false"
                       disabled="false"
                       required="false"
                       filter="STRING"
                      
message="COM_RESERVATION_RESERVE_PAYMENT_METHOD_MESSAGE"
                       autocomplete="on" />
                <!-- Tracking_code Field. Type: Text. (joomla)-->
                <field type="text"
                       name="tracking_code"
                      
label="COM_RESERVATION_RESERVE_TRACKING_CODE_LABEL"
                       size="10"
                       maxlength="50"
                       default=""
                       class="text_area"
                       readonly="false"
                       disabled="false"
                       required="false"
                       filter="STRING"
                      
message="COM_RESERVATION_RESERVE_TRACKING_CODE_MESSAGE"
                       autocomplete="on" />
        </fieldset>
	
	<!-- Access Control Fields. -->
	<fieldset name="accesscontrol">
		<!-- Asset Id Field. Type: Hidden (joomla) -->
		<field
			name="asset_id"
			type="hidden"
			filter="unset"
		/>
		<!-- Rules Field. Type: Rules (joomla) -->
		<field
			name="rules"
			type="rules"
			label="Permissions in relation to this reserve"
			translate_label="false"
			filter="rules"
			validate="rules"
			class="inputbox"
			component="com_reservation"
			section="reserve"
		/>
	</fieldset>
</form>PK4~�[��Vn22models/forms/session.jsnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.36
	@build			26th July, 2021
	@created		17th December, 2020
	@package		Reservation
	@subpackage		session.js
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

 
PK4~�[�6 �NNmodels/forms/session.xmlnu�[���<?xml
version="1.0" encoding="utf-8"?>
<form
	addrulepath="/administrator/components/com_reservation/models/rules"
	addfieldpath="/administrator/components/com_reservation/models/fields"
>
	<fieldset name="details">
                <!-- Default Fields.-->
                <!-- Id Field. Type: Text (joomla)-->
                <field name="id"
                       type="text"
                       class="readonly"
                       readonly="true"
                       label="JGLOBAL_FIELD_ID_LABEL"
                       description="JGLOBAL_FIELD_ID_DESC"
                       size="10"
                       default="0" />
                <!-- Date Created Field. Type: Calendar (joomla)-->
                <field name="created"
                       type="calendar"
                      
label="COM_RESERVATION_SESSION_CREATED_DATE_LABEL"
                      
description="COM_RESERVATION_SESSION_CREATED_DATE_DESC"
                       size="22"
                       format="%Y-%m-%d %H:%M:%S"
                       filter="user_utc" />
                <!-- User Created Field. Type: User (joomla)-->
                <field name="created_by"
                       type="user"
                      
label="COM_RESERVATION_SESSION_CREATED_BY_LABEL"
                      
description="COM_RESERVATION_SESSION_CREATED_BY_DESC" />
                <!-- Published Field. Type: List (joomla)-->
                <field name="published"
                       type="list"
                       label="JSTATUS">
                        <option
value="1">JPUBLISHED</option>
                        <option
value="0">JUNPUBLISHED</option>
                        <option
value="2">JARCHIVED</option>
                        <option
value="-2">JTRASHED</option>
                </field>
                <!-- Date Modified Field. Type: Calendar (joomla)-->
                <field name="modified"
                       type="calendar"
                       class="readonly"
                      
label="COM_RESERVATION_SESSION_MODIFIED_DATE_LABEL"
                      
description="COM_RESERVATION_SESSION_MODIFIED_DATE_DESC"
                       size="22"
                       readonly="true"
                       format="%Y-%m-%d %H:%M:%S"
                       filter="user_utc" />
                <!-- User Modified Field. Type: User (joomla)-->
                <field name="modified_by"
                       type="user"
                      
label="COM_RESERVATION_SESSION_MODIFIED_BY_LABEL"
                      
description="COM_RESERVATION_SESSION_MODIFIED_BY_DESC"
                       class="readonly"
                       readonly="true"
                       filter="unset" />
                <!-- Access Field. Type: Accesslevel (joomla)-->
                <field name="access"
                       type="accesslevel"
                       label="JFIELD_ACCESS_LABEL"
                       description="JFIELD_ACCESS_DESC"
                       default="1"
                       required="false" />
                <!-- Ordering Field. Type: Numbers (joomla)-->
                <field name="ordering"
                       type="number"
                       class="inputbox validate-ordering"
                      
label="COM_RESERVATION_SESSION_ORDERING_LABEL"
                       description=""
                       default="0"
                       size="6"
                       required="false" />
                <!-- Version Field. Type: Text (joomla)-->
                <field name="version"
                       type="text"
                       class="readonly"
                      
label="COM_RESERVATION_SESSION_VERSION_LABEL"
                      
description="COM_RESERVATION_SESSION_VERSION_DESC"
                       size="6"
                       readonly="true"
                       filter="unset" />
                <!-- Was added due to Permissions JS needing a Title
field-->
                <!-- Let us know at gh-629 should this change-->
                <!--
https://github.com/vdm-io/Joomla-Component-Builder/issues/629#issuecomment-750117235-->
                <field name="title"
                       type="hidden"
                       default="reservation session" />
                <!-- Dynamic Fields.-->
                <!-- Sickid Field. Type: Sick. (custom)-->
                <field type="sick"
                       name="sickid"
                      
label="COM_RESERVATION_SESSION_SICKID_LABEL"
                       class="list_class"
                       multiple="false"
                       default="0"
                       required="true" />
                <!-- Planid Field. Type: Plan. (custom)-->
                <field type="plan"
                       name="planid"
                      
label="COM_RESERVATION_SESSION_PLANID_LABEL"
                       class="list_class"
                       multiple="false"
                       default="0"
                       required="true" />
                <!-- Pay Field. Type: Checkbox. (joomla)-->
                <field type="checkbox"
                       name="pay"
                       label="COM_RESERVATION_SESSION_PAY_LABEL"
                       value="1"
                       default=""
                      
description="COM_RESERVATION_SESSION_PAY_DESCRIPTION"
                       class="inputbox" />
                <!-- Finish Field. Type: Checkbox. (joomla)-->
                <field type="checkbox"
                       name="finish"
                      
label="COM_RESERVATION_SESSION_FINISH_LABEL"
                       value="1"
                       default=""
                      
description="COM_RESERVATION_SESSION_FINISH_DESCRIPTION"
                       class="inputbox" />
                <!-- Channel_token Field. Type: Text. (joomla)-->
                <field type="text"
                       name="channel_token"
                      
label="COM_RESERVATION_SESSION_CHANNEL_TOKEN_LABEL"
                       size="10"
                       maxlength="200"
                       default=""
                       class="text_area"
                       readonly="false"
                       disabled="false"
                       required="false"
                       filter="STRING"
                      
message="COM_RESERVATION_SESSION_CHANNEL_TOKEN_MESSAGE"
                      
hint="COM_RESERVATION_SESSION_CHANNEL_TOKEN_HINT"
                       autocomplete="on" />
                <!-- Firsttext Field. Type: Text. (joomla)-->
                <field type="text"
                       name="firsttext"
                      
label="COM_RESERVATION_SESSION_FIRSTTEXT_LABEL"
                       size="10"
                       maxlength="50"
                       default=""
                      
description="COM_RESERVATION_SESSION_FIRSTTEXT_DESCRIPTION"
                       class="text_area"
                       readonly="false"
                       disabled="false"
                       required="true"
                       filter="STRING"
                      
message="COM_RESERVATION_SESSION_FIRSTTEXT_MESSAGE"
                       autocomplete="on" />
        </fieldset>
	
	<!-- Access Control Fields. -->
	<fieldset name="accesscontrol">
		<!-- Asset Id Field. Type: Hidden (joomla) -->
		<field
			name="asset_id"
			type="hidden"
			filter="unset"
		/>
		<!-- Rules Field. Type: Rules (joomla) -->
		<field
			name="rules"
			type="rules"
			label="Permissions in relation to this session"
			translate_label="false"
			filter="rules"
			validate="rules"
			class="inputbox"
			component="com_reservation"
			section="session"
		/>
	</fieldset>
</form>PK4~�[g�\�33models/forms/sick.jsnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.36
	@build			26th July, 2021
	@created		17th December, 2020
	@package		Reservation
	@subpackage		sick.js
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/




/***[JCBGUI.admin_view.javascript_view_file.113.$$$$]***/
jQuery(document).ready(function($){

   var gettoken= Joomla.getOptions('token');
   var route= Joomla.getOptions('route');


   $('select#jform_capitalid').change(function () {

      var capitalid= $(this).val();
      var token= gettoken;

      $.ajax({
         url: route,
         method: 'post',
         dataType: 'json',
         data: {[token] : '1',task:'ajax.getCity',
format: 'json' , raw: 'true' , capitalid: capitalid},
         success: function (msg) {

            var temp='<option value="">Select an
option</option>';
            msg.each(function(value, index){

               temp += '<option
value="'+value.id+'">'+value.name+'</option>';

            });

            $('select#jform_cityid').html(temp);
            $( "select#jform_cityid" ).trigger(
"liszt:updated" );
         },
         error: function (err) {
            console.log(err);
         }
      });


   });


});/***[/JCBGUI$$$$]***/
 
PK4~�[@{Y���models/forms/sick.xmlnu�[���<?xml
version="1.0" encoding="utf-8"?>
<form
	addrulepath="/administrator/components/com_reservation/models/rules"
	addfieldpath="/administrator/components/com_reservation/models/fields"
>
	<fieldset name="details">
                <!-- Default Fields.-->
                <!-- Id Field. Type: Text (joomla)-->
                <field name="id"
                       type="text"
                       class="readonly"
                       readonly="true"
                       label="JGLOBAL_FIELD_ID_LABEL"
                       description="JGLOBAL_FIELD_ID_DESC"
                       size="10"
                       default="0" />
                <!-- Date Created Field. Type: Calendar (joomla)-->
                <field name="created"
                       type="calendar"
                      
label="COM_RESERVATION_SICK_CREATED_DATE_LABEL"
                      
description="COM_RESERVATION_SICK_CREATED_DATE_DESC"
                       size="22"
                       format="%Y-%m-%d %H:%M:%S"
                       filter="user_utc" />
                <!-- User Created Field. Type: User (joomla)-->
                <field name="created_by"
                       type="user"
                      
label="COM_RESERVATION_SICK_CREATED_BY_LABEL"
                      
description="COM_RESERVATION_SICK_CREATED_BY_DESC" />
                <!-- Published Field. Type: List (joomla)-->
                <field name="published"
                       type="list"
                       label="JSTATUS">
                        <option
value="1">JPUBLISHED</option>
                        <option
value="0">JUNPUBLISHED</option>
                        <option
value="2">JARCHIVED</option>
                        <option
value="-2">JTRASHED</option>
                </field>
                <!-- Date Modified Field. Type: Calendar (joomla)-->
                <field name="modified"
                       type="calendar"
                       class="readonly"
                      
label="COM_RESERVATION_SICK_MODIFIED_DATE_LABEL"
                      
description="COM_RESERVATION_SICK_MODIFIED_DATE_DESC"
                       size="22"
                       readonly="true"
                       format="%Y-%m-%d %H:%M:%S"
                       filter="user_utc" />
                <!-- User Modified Field. Type: User (joomla)-->
                <field name="modified_by"
                       type="user"
                      
label="COM_RESERVATION_SICK_MODIFIED_BY_LABEL"
                      
description="COM_RESERVATION_SICK_MODIFIED_BY_DESC"
                       class="readonly"
                       readonly="true"
                       filter="unset" />
                <!-- Access Field. Type: Accesslevel (joomla)-->
                <field name="access"
                       type="accesslevel"
                       label="JFIELD_ACCESS_LABEL"
                       description="JFIELD_ACCESS_DESC"
                       default="1"
                       required="false" />
                <!-- Ordering Field. Type: Numbers (joomla)-->
                <field name="ordering"
                       type="number"
                       class="inputbox validate-ordering"
                      
label="COM_RESERVATION_SICK_ORDERING_LABEL"
                       description=""
                       default="0"
                       size="6"
                       required="false" />
                <!-- Version Field. Type: Text (joomla)-->
                <field name="version"
                       type="text"
                       class="readonly"
                       label="COM_RESERVATION_SICK_VERSION_LABEL"
                      
description="COM_RESERVATION_SICK_VERSION_DESC"
                       size="6"
                       readonly="true"
                       filter="unset" />
                <!-- Was added due to Permissions JS needing a Title
field-->
                <!-- Let us know at gh-629 should this change-->
                <!--
https://github.com/vdm-io/Joomla-Component-Builder/issues/629#issuecomment-750117235-->
                <field name="title"
                       type="hidden"
                       default="reservation sick" />
                <!-- Dynamic Fields.-->
                <!-- Userid Field. Type: User. (joomla)-->
                <field type="user"
                       name="userid"
                       label="COM_RESERVATION_SICK_USERID_LABEL"
                      
description="COM_RESERVATION_SICK_USERID_DESCRIPTION"
                       class="form-control"
                       required="true" />
                <!-- Phonenumber Field. Type: Text. (joomla)-->
                <field type="text"
                       name="phonenumber"
                      
label="COM_RESERVATION_SICK_PHONENUMBER_LABEL"
                       size="10"
                       maxlength="50"
                       default=""
                      
description="COM_RESERVATION_SICK_PHONENUMBER_DESCRIPTION"
                       class="text_area form-control"
                       readonly="false"
                       disabled="false"
                       required="true"
                       validated="tel"
                      
message="COM_RESERVATION_SICK_PHONENUMBER_MESSAGE"
                       validate="mobile" />
                <!-- Capitalid Field. Type: Capital. (custom)-->
                <field type="capital"
                       name="capitalid"
                      
label="COM_RESERVATION_SICK_CAPITALID_LABEL"
                       class="list_class"
                       multiple="false"
                       default="0" />
                <!-- Cityid Field. Type: City. (custom)-->
                <field type="city"
                       name="cityid"
                       label="COM_RESERVATION_SICK_CITYID_LABEL"
                       class="list_class"
                       multiple="false"
                       default="0" />
                <!-- Image Field. Type: Media. (joomla)-->
                <field type="media"
                       name="image"
                       label="COM_RESERVATION_SICK_IMAGE_LABEL"
                       directory="" />
                <!-- Cardnumber Field. Type: Text. (joomla)-->
                <field type="text"
                       name="cardnumber"
                      
label="COM_RESERVATION_SICK_CARDNUMBER_LABEL"
                       size="10"
                       maxlength="50"
                       default=""
                      
description="COM_RESERVATION_SICK_CARDNUMBER_DESCRIPTION"
                       class="text_area"
                       readonly="false"
                       disabled="false"
                       required="false"
                       filter="INTEGER"
                      
message="COM_RESERVATION_SICK_CARDNUMBER_MESSAGE"
                       autocomplete="on" />
                <!-- Alt Field. Type: Text. (joomla)-->
                <field type="text"
                       name="alt"
                       label="COM_RESERVATION_SICK_ALT_LABEL"
                       size="10"
                       maxlength="50"
                       default=""
                      
description="COM_RESERVATION_SICK_ALT_DESCRIPTION"
                       class="text_area"
                       readonly="false"
                       disabled="false"
                       required="false"
                       filter="STRING"
                       message="COM_RESERVATION_SICK_ALT_MESSAGE"
                       autocomplete="on" />
        </fieldset>
	
	<!-- Access Control Fields. -->
	<fieldset name="accesscontrol">
		<!-- Asset Id Field. Type: Hidden (joomla) -->
		<field
			name="asset_id"
			type="hidden"
			filter="unset"
		/>
		<!-- Rules Field. Type: Rules (joomla) -->
		<field
			name="rules"
			type="rules"
			label="Permissions in relation to this sick"
			translate_label="false"
			filter="rules"
			validate="rules"
			class="inputbox"
			component="com_reservation"
			section="sick"
		/>
	</fieldset>
</form>PK4~�[�X�2O2Omodels/import.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		import.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Filesystem\File;
use Joomla\CMS\Filesystem\Folder;
use Joomla\Utilities\ArrayHelper;
use PhpOffice\PhpSpreadsheet\IOFactory;

/**
 * Reservation Import Model
 */
class ReservationModelImport extends JModelLegacy
{
	// set uploading values
	protected $use_streams = false;
	protected $allow_unsafe = false;
	protected $safeFileOptions = array();
	
	/**
	 * @var object JTable object
	 */
	protected $_table = null;

	/**
	 * @var object JTable object
	 */
	protected $_url = null;

	/**
	 * Model context string.
	 *
	 * @var        string
	 */
	protected $_context = 'com_reservation.import';
	
	/**
	 * Import Settings
	 */
	protected $getType 	= NULL;
	protected $dataType	= NULL;
	
	/**
	 * Method to auto-populate the model state.
	 *
	 * Note. Calling getState in this method will result in recursion.
	 *
	 * @return  void
	 *
	 */
	protected function populateState()
	{
		$app = JFactory::getApplication('administrator');

		$this->setState('message',
$app->getUserState('com_reservation.message'));
		$app->setUserState('com_reservation.message', '');

		// Recall the 'Import from Directory' path.
		$path = $app->getUserStateFromRequest($this->_context .
'.import_directory', 'import_directory',
$app->get('tmp_path'));
		$this->setState('import.directory', $path);
		parent::populateState();
	}

	/**
	 * Import an spreadsheet from either folder, url or upload.
	 *
	 * @return  boolean result of import
	 *
	 */
	public function import()
	{
		$this->setState('action', 'import');
		$app = JFactory::getApplication();
		$session = JFactory::getSession();
		$package = null;
		$continue = false;
		// get import type
		$this->getType = $app->input->getString('gettype',
NULL);
		// get import type
		$this->dataType	=
$session->get('dataType_VDM_IMPORTINTO', NULL);

		if ($package === null)
		{
			switch ($this->getType)
			{
				case 'folder':
					// Remember the 'Import from Directory' path.
					$app->getUserStateFromRequest($this->_context .
'.import_directory', 'import_directory');
					$package = $this->_getPackageFromFolder();
					break;

				case 'upload':
					$package = $this->_getPackageFromUpload();
					break;

				case 'url':
					$package = $this->_getPackageFromUrl();
					break;

				case 'continue':
					$continue 	= true;
					$package	= $session->get('package', null);
					$package	= json_decode($package, true);
					// clear session
					$session->clear('package');
					$session->clear('dataType');
					$session->clear('hasPackage');
					break;

				default:
					$app->setUserState('com_reservation.message',
JText::_('COM_RESERVATION_IMPORT_NO_IMPORT_TYPE_FOUND'));

					return false;
					break;
			}
		}
		// Was the package valid?
		if (!$package || !$package['type'])
		{
			if (in_array($this->getType, array('upload',
'url')))
			{
				$this->remove($package['packagename']);
			}

			$app->setUserState('com_reservation.message',
JText::_('COM_RESERVATION_IMPORT_UNABLE_TO_FIND_IMPORT_PACKAGE'));
			return false;
		}
		
		// first link data to table headers
		if(!$continue){
			$package = json_encode($package);
			$session->set('package', $package);
			$session->set('dataType', $this->dataType);
			$session->set('hasPackage', true);
			return true;
		}
        
		// set the data
		$headerList =
json_decode($session->get($this->dataType.'_VDM_IMPORTHEADERS',
false), true);
		if (!$this->setData($package,$this->dataType,$headerList))
		{
			// There was an error importing the package
			$msg = JText::_('COM_RESERVATION_IMPORT_ERROR');
			$back = $session->get('backto_VDM_IMPORT', NULL);
			if ($back)
			{
				$app->setUserState('com_reservation.redirect_url',
'index.php?option=com_reservation&view='.$back);
				$session->clear('backto_VDM_IMPORT');
			}
			$result = false;
		}
		else
		{
			// Package imported sucessfully
			$msg = JText::sprintf('COM_RESERVATION_IMPORT_SUCCESS',
$package['packagename']);
			$back = $session->get('backto_VDM_IMPORT', NULL);
			if ($back)
			{
			    $app->setUserState('com_reservation.redirect_url',
'index.php?option=com_reservation&view='.$back);
			    $session->clear('backto_VDM_IMPORT');
			}
			$result = true;
		}

		// Set some model state values
		$app->enqueueMessage($msg);

		// remove file after import
		$this->remove($package['packagename']);
		$session->clear($this->getType.'_VDM_IMPORTHEADERS');
        
		return $result;
	}

	/**
	 * Works out an importation spreadsheet from a HTTP upload
	 *
	 * @return spreadsheet definition or false on failure
	 */
	protected function _getPackageFromUpload()
	{		
		// Get the uploaded file information
		$app = JFactory::getApplication();
		$input = $app->input;

		// Do not change the filter type 'raw'. We need this to let
files containing PHP code to upload. See JInputFiles::get.
		$userfile = $input->files->get('import_package', null,
'raw');
		
		// Make sure that file uploads are enabled in php
		if (!(bool) ini_get('file_uploads'))
		{
			$app->enqueueMessage(JText::_('COM_RESERVATION_IMPORT_MSG_WARNIMPORTFILE'),
'warning');
			return false;
		}

		// If there is no uploaded file, we have a problem...
		if (!is_array($userfile))
		{
			$app->enqueueMessage(JText::_('COM_RESERVATION_IMPORT_MSG_NO_FILE_SELECTED'),
'warning');
			return false;
		}

		// Check if there was a problem uploading the file.
		if ($userfile['error'] || $userfile['size'] < 1)
		{
			$app->enqueueMessage(JText::_('COM_RESERVATION_IMPORT_MSG_WARNIMPORTUPLOADERROR'),
'warning');
			return false;
		}

		// Build the appropriate paths
		$config = JFactory::getConfig();
		$tmp_dest = $config->get('tmp_path') . '/' .
$userfile['name'];
		$tmp_src = $userfile['tmp_name'];

		// Move uploaded file
		jimport('joomla.filesystem.file');
		$p_file = File::upload($tmp_src, $tmp_dest, $this->use_streams,
$this->allow_unsafe, $this->safeFileOptions);

		// Was the package downloaded?
		if (!$p_file)
		{
			$session = JFactory::getSession();
			$session->clear('package');
			$session->clear('dataType');
			$session->clear('hasPackage');
			// was not uploaded
			return false;
		}

		// check that this is a valid spreadsheet
		$package = $this->check($userfile['name']);

		return $package;
	}

	/**
	 * Import an spreadsheet from a directory
	 *
	 * @return  array  Spreadsheet details or false on failure
	 *
	 */
	protected function _getPackageFromFolder()
	{
		$app = JFactory::getApplication();
		$input = $app->input;

		// Get the path to the package to import
		$p_dir = $input->getString('import_directory');
		$p_dir = JPath::clean($p_dir);
		// Did you give us a valid path?
		if (!file_exists($p_dir))
		{
			$app->enqueueMessage(JText::_('COM_RESERVATION_IMPORT_MSG_PLEASE_ENTER_A_PACKAGE_DIRECTORY'),
'warning');
			return false;
		}

		// Detect the package type
		$type = $this->getType;

		// Did you give us a valid package?
		if (!$type)
		{
			$app->enqueueMessage(JText::_('COM_RESERVATION_IMPORT_MSG_PATH_DOES_NOT_HAVE_A_VALID_PACKAGE'),
'warning');
		}
		
		// check the extention
		if(!$this->checkExtension($p_dir))
		{
			// set error message
			$app->enqueueMessage(JText::_('COM_RESERVATION_IMPORT_MSG_DOES_NOT_HAVE_A_VALID_FILE_TYPE'),
'warning');
			return false;
		}
		
		$package['packagename'] = null;
		$package['dir'] = $p_dir;
		$package['type'] = $type;

		return $package;
	}

	/**
	 * Import an spreadsheet from a URL
	 *
	 * @return  Package details or false on failure
	 *
	 */
	protected function _getPackageFromUrl()
	{
		$app = JFactory::getApplication();
		$input = $app->input;
		
		// Get the URL of the package to import
		$url = $input->getString('import_url');

		// Did you give us a URL?
		if (!$url)
		{
			$app->enqueueMessage(JText::_('COM_RESERVATION_IMPORT_MSG_ENTER_A_URL'),
'warning');
			return false;
		}

		// Download the package at the URL given
		$p_file = JInstallerHelper::downloadPackage($url);

		// Was the package downloaded?
		if (!$p_file)
		{
			$app->enqueueMessage(JText::_('COM_RESERVATION_IMPORT_MSG_INVALID_URL'),
'warning');
			return false;
		}

		// check that this is a valid spreadsheet
		$package = $this->check($p_file);

		return $package;
	}
	
	/**
	 * Check a file and verifies it as a spreadsheet file
	 * Supports .csv .xlsx .xls and .ods
	 *
	 * @param   string  $p_filename  The uploaded package filename or import
directory
	 *
	 * @return  array  of elements
	 *
	 */
	protected function check($archivename)
	{
		$app = JFactory::getApplication();
		// Clean the name
		$archivename = JPath::clean($archivename);
		
		// check the extention
		if(!$this->checkExtension($archivename))
		{
			// Cleanup the import files
			$this->remove($archivename);
			$app->enqueueMessage(JText::_('COM_RESERVATION_IMPORT_MSG_DOES_NOT_HAVE_A_VALID_FILE_TYPE'),
'warning');
			return false;
		}
		
		$config = JFactory::getConfig();
		// set Package Name
		$check['packagename'] = $archivename;
		
		// set directory
		$check['dir'] = $config->get('tmp_path').
'/' .$archivename;
		
		// set type
		$check['type'] = $this->getType;
		
		return $check;
	}

	/**
	 * Check the extension
	 *
	 * @param   string  $file    Name of the uploaded file
	 *
	 * @return  boolean  True on success
	 *
	 */
	protected function checkExtension($file)
	{
		// check the extention
		switch(strtolower(pathinfo($file, PATHINFO_EXTENSION)))
		{
			case 'xls':
			case 'ods':
			case 'csv':
			return true;
			break;
		}
		return false;
	}

	/**
	 * Clean up temporary uploaded spreadsheet
	 *
	 * @param   string  $package    Name of the uploaded spreadsheet file
	 *
	 * @return  boolean  True on success
	 *
	 */
	protected function remove($package)
	{
		jimport('joomla.filesystem.file');
		
		$config = JFactory::getConfig();
		$package = $config->get('tmp_path'). '/'
.$package;

		// Is the package file a valid file?
		if (is_file($package))
		{
			File::delete($package);
		}
		elseif (is_file(JPath::clean($package)))
		{
			// It might also be just a base filename
			File::delete(JPath::clean($package));
		}
	}

	/**
	* Set the data from the spreadsheet to the database
	*
	* @param string  $package Paths to the uploaded package file
	*
	* @return  boolean false on failure
	*
	**/
	protected function setData($package,$table,$target_headers)
	{
		if (ReservationHelper::checkArray($target_headers))
		{
			// make sure the file is loaded
			ReservationHelper::composerAutoload('phpspreadsheet');
			$jinput = JFactory::getApplication()->input;
			foreach($target_headers as $header)
			{
				if (($column = $jinput->getString($header, false)) !== false ||
					($column = $jinput->getString(strtolower($header), false)) !==
false)
				{
					$data['target_headers'][$header] = $column;
				}
				else
				{
					$data['target_headers'][$header] = null;
				}
			}
			// set the data
			if(isset($package['dir']))
			{
				$inputFileType = IOFactory::identify($package['dir']);
				$excelReader = IOFactory::createReader($inputFileType);
				$excelReader->setReadDataOnly(true);
				$excelObj = $excelReader->load($package['dir']);
				$data['array'] =
$excelObj->getActiveSheet()->toArray(null, true,true,true);
				$excelObj->disconnectWorksheets();
				unset($excelObj);
				return $this->save($data, $table);
			}
		}
		return false;
	}

	/**
	* Save the data from the file to the database
	*
	* @param string  $package Paths to the uploaded package file
	*
	* @return  boolean false on failure
	*
	**/
	protected function save($data,$table)
	{
		// import the data if there is any
		if(ReservationHelper::checkArray($data['array']))
		{
			// get user object
			$user		= JFactory::getUser();
			// remove header if it has headers
			$id_key	= $data['target_headers']['id'];
			$published_key	=
$data['target_headers']['published'];
			$ordering_key	= $data['target_headers']['ordering'];
			// get the first array set
			$firstSet = reset($data['array']);

			// check if first array is a header array and remove if true
			if($firstSet[$id_key] == 'id' || $firstSet[$published_key] ==
'published' || $firstSet[$ordering_key] == 'ordering')
			{
				array_shift($data['array']);
			}
			
			// make sure there is still values in array and that it was not only
headers
			if(ReservationHelper::checkArray($data['array']) &&
$user->authorise($table.'.import',
'com_reservation') &&
$user->authorise('core.import', 'com_reservation'))
			{
				// set target.
				$target	= array_flip($data['target_headers']);
				// Get a db connection.
				$db = JFactory::getDbo();
				// set some defaults
				$todayDate		= JFactory::getDate()->toSql();
				// get global action permissions
				$canDo			= ReservationHelper::getActions($table);
				$canEdit		= $canDo->get('core.edit');
				$canState		= $canDo->get('core.edit.state');
				$canCreate		= $canDo->get('core.create');
				$hasAlias		= $this->getAliasesUsed($table);
				// prosses the data
				foreach($data['array'] as $row)
				{
					$found = false;
					if (isset($row[$id_key]) && is_numeric($row[$id_key])
&& $row[$id_key] > 0)
					{
						// raw items import & update!
						$query = $db->getQuery(true);
						$query
							->select('version')
							->from($db->quoteName('#__reservation_'.$table))
							->where($db->quoteName('id') . ' = '.
$db->quote($row[$id_key]));
						// Reset the query using our newly populated query object.
						$db->setQuery($query);
						$db->execute();
						$found = $db->getNumRows();
					}
					
					if($found && $canEdit)
					{
						// update item
						$id		= $row[$id_key];
						$version	= $db->loadResult();
						// reset all buckets
						$query		= $db->getQuery(true);
						$fields	= array();
						// Fields to update.
						foreach($row as $key => $cell)
						{
							// ignore column
							if ('IGNORE' == $target[$key])
							{
								continue;
							}
							// update modified
							if ('modified_by' == $target[$key])
							{
								continue;
							}
							// update modified
							if ('modified' == $target[$key])
							{
								continue;
							}
							// update version
							if ('version' == $target[$key])
							{
								$cell = (int) $version + 1;
							}
							// verify publish authority
							if ('published' == $target[$key] && !$canState)
							{
								continue;
							}
							// set to update array
							if(in_array($key, $data['target_headers']) &&
is_numeric($cell))
							{
								$fields[] = $db->quoteName($target[$key]) . ' = ' .
$cell;
							}
							elseif(in_array($key, $data['target_headers']) &&
is_string($cell))
							{
								$fields[] = $db->quoteName($target[$key]) . ' = ' .
$db->quote($cell);
							}
							elseif(in_array($key, $data['target_headers']) &&
is_null($cell))
							{
								// if import data is null then set empty
								$fields[] = $db->quoteName($target[$key]) . " =
''";
							}
						}
						// load the defaults
						$fields[]	= $db->quoteName('modified_by') . ' =
' . $db->quote($user->id);
						$fields[]	= $db->quoteName('modified') . ' = '
. $db->quote($todayDate);
						// Conditions for which records should be updated.
						$conditions = array(
							$db->quoteName('id') . ' = ' . $id
						);
						
						$query->update($db->quoteName('#__reservation_'.$table))->set($fields)->where($conditions);
						$db->setQuery($query);
						$db->execute();
					}
					elseif ($canCreate)
					{
						// insert item
						$query = $db->getQuery(true);
						// reset all buckets
						$columns	= array();
						$values	= array();
						$version	= false;
						// Insert columns. Insert values.
						foreach($row as $key => $cell)
						{
							// ignore column
							if ('IGNORE' == $target[$key])
							{
								continue;
							}
							// remove id
							if ('id' == $target[$key])
							{
								continue;
							}
							// update created
							if ('created_by' == $target[$key])
							{
								continue;
							}
							// update created
							if ('created' == $target[$key])
							{
								continue;
							}
							// Make sure the alias is incremented
							if ('alias' == $target[$key])
							{
								$cell = $this->getAlias($cell,$table);
							}
							// update version
							if ('version' == $target[$key])
							{
								$cell = 1;
								$version = true;
							}
							// set to insert array
							if(in_array($key, $data['target_headers']) &&
is_numeric($cell))
							{
								$columns[]	= $target[$key];
								$values[]	= $cell;
							}
							elseif(in_array($key, $data['target_headers']) &&
is_string($cell))
							{
								$columns[]	= $target[$key];
								$values[]	= $db->quote($cell);
							}
							elseif(in_array($key, $data['target_headers']) &&
is_null($cell))
							{
								// if import data is null then set empty
								$columns[]	= $target[$key];
								$values[]	= "''";
							}
						}
						// load the defaults
						$columns[]	= 'created_by';
						$values[]	= $db->quote($user->id);
						$columns[]	= 'created';
						$values[]	= $db->quote($todayDate);
						if (!$version)
						{
							$columns[]	= 'version';
							$values[]	= 1;
						}
						// Prepare the insert query.
						$query
							->insert($db->quoteName('#__reservation_'.$table))
							->columns($db->quoteName($columns))
							->values(implode(',', $values));
						// Set the query using our newly populated query object and execute
it.
						$db->setQuery($query);
						$done = $db->execute();
						if ($done)
						{
							$aId = $db->insertid();
							// make sure the access of asset is set
							ReservationHelper::setAsset($aId,$table);
						}
					}
					else
					{
						return false;
					}
				}
				return true;
			}
		}
		return false;
	}

	protected function getAlias($name,$type = false)
	{
		// sanitize the name to an alias
		if (JFactory::getConfig()->get('unicodeslugs') == 1)
		{
			$alias = JFilterOutput::stringURLUnicodeSlug($name);
		}
		else
		{
			$alias = JFilterOutput::stringURLSafe($name);
		}
		// must be a uniqe alias
		if ($type)
		{
			return $this->getUniqe($alias,'alias',$type);
		}
		return $alias;
	}
	
	/**
	 * Method to generate a uniqe value.
	 *
	 * @param   string  $field name.
	 * @param   string  $value data.
	 * @param   string  $type table.
	 *
	 * @return  string  New value.
	 */
	protected function getUniqe($value,$field,$type)
	{
		// insure the filed is always uniqe
		while (isset($this->uniqeValueArray[$type][$field][$value]))
		{
			$value = JString::increment($value, 'dash');
		}
		$this->uniqeValueArray[$type][$field][$value] = $value;
		return $value;
	}
	
	protected function getAliasesUsed($table)
	{
		// Get a db connection.
		$db = JFactory::getDbo();
		// first we check if there is a alias column
		$columns = $db->getTableColumns('#__reservation_'.$table);
		if(isset($columns['alias'])){
			// Create a new query object.
			$query = $db->getQuery(true);
			$query->select($db->quoteName(array('alias')));
			$query->from($db->quoteName('#__reservation_'.$table));
			$db->setQuery($query);
			$db->execute();
			if ($db->getNumRows())
			{
				$aliases = $db->loadColumn();
				foreach($aliases as $alias)
				{
					$this->uniqeValueArray[$table]['alias'][$alias] = $alias;
				}
			}
			return true;
		}
		return false;
	}
}
PK4~�[�c�SSmodels/import_reserves.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.30
	@build			6th March, 2021
	@created		17th December, 2020
	@package		Reservation
	@subpackage		import_reserves.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Utilities\ArrayHelper;
use PhpOffice\PhpSpreadsheet\IOFactory;

/**
 * Reservation Import_reserves Model
 */
class ReservationModelImport_reserves extends JModelLegacy
{
	// set uploading values
	protected $use_streams = false;
	protected $allow_unsafe = false;
	protected $safeFileOptions = array();
	
	/**
	 * @var object JTable object
	 */
	protected $_table = null;

	/**
	 * @var object JTable object
	 */
	protected $_url = null;

	/**
	 * Model context string.
	 *
	 * @var        string
	 */
	protected $_context = 'com_reservation.import_reserves';
	
	/**
	 * Import Settings
	 */
	protected $getType = NULL;
	protected $dataType = NULL;
	
	/**
	 * Method to auto-populate the model state.
	 *
	 * Note. Calling getState in this method will result in recursion.
	 *
	 * @return  void
	 *
	 */
	protected function populateState()
	{
		$app = JFactory::getApplication('administrator');

		$this->setState('message',
$app->getUserState('com_reservation.message'));
		$app->setUserState('com_reservation.message',
'');

		// Recall the 'Import from Directory' path.
		$path = $app->getUserStateFromRequest($this->_context .
'.import_directory', 'import_directory',
$app->get('tmp_path'));
		$this->setState('import.directory', $path);
		parent::populateState();
	}
	

/***[JCBGUI.admin_view.php_import.127.$$$$]***/
	/**
	 * Import an spreadsheet from either folder, url or upload.
	 *
	 * @return  boolean result of import
	 *
	 */
	public function import()
	{
		$this->setState('action', 'import');
		$app		= JFactory::getApplication();
		$session	= JFactory::getSession();
		$package	= null;
		$continue	= false;
		// get import type
		$this->getType = $app->input->getString('gettype',
NULL);
		// get import type
		$this->dataType	=
$session->get('dataType_VDM_IMPORTINTO', NULL);

		if ($package === null)
		{
			switch ($this->getType)
			{
				case 'folder':
					// Remember the 'Import from Directory' path.
					$app->getUserStateFromRequest($this->_context .
'.import_directory', 'import_directory');
					$package = $this->_getPackageFromFolder();
					break;

				case 'upload':
					$package = $this->_getPackageFromUpload();
					break;

				case 'url':
					$package = $this->_getPackageFromUrl();
					break;

				case 'continue':
					$continue	= true;
					$package	= $session->get('package', null);
					$package	= json_decode($package, true);
					// clear session
					$session->clear('package');
					$session->clear('dataType');
					$session->clear('hasPackage');
					break;

				default:
					$app->setUserState('com_reservation.message',
JText::_('COM_RESERVATION_IMPORT_NO_IMPORT_TYPE_FOUND'));

					return false;
					break;
			}
		}
		// Was the package valid?
		if (!$package || !$package['type'])
		{
			if (in_array($this->getType, array('upload',
'url')))
			{
				$this->remove($package['packagename']);
			}

			$app->setUserState('com_reservation.message',
JText::_('COM_RESERVATION_IMPORT_UNABLE_TO_FIND_IMPORT_PACKAGE'));
			return false;
		}
		
		// first link data to table headers
		if(!$continue){
			$package	= json_encode($package);
			$session->set('package', $package);
			$session->set('dataType', $this->dataType);
			$session->set('hasPackage', true);
			return true;
		}
		// set the data
		$headerList =
json_decode($session->get($this->dataType.'_VDM_IMPORTHEADERS',
false), true);
		if (!$this->setData($package,$this->dataType,$headerList))
		{
			// There was an error importing the package
			$msg = JText::_('COM_RESERVATION_IMPORT_ERROR');
			$back = $session->get('backto_VDM_IMPORT', NULL);
			if ($back)
			{
				$app->setUserState('com_reservation.redirect_url',
'index.php?option=com_reservation&view='.$back);
				$session->clear('backto_VDM_IMPORT');
			}
			$result = false;
		}
		else
		{
			// Package imported sucessfully
			$msg = JText::sprintf('COM_RESERVATION_IMPORT_SUCCESS',
$package['packagename']);
			$back = $session->get('backto_VDM_IMPORT', NULL);
			if ($back)
			{
				$app->setUserState('com_reservation.redirect_url',
'index.php?option=com_reservation&view='.$back);
				$session->clear('backto_VDM_IMPORT');
			}
			$result = true;
		}

		// Set some model state values
		$app->enqueueMessage($msg);

		// remove file after import
		$this->remove($package['packagename']);
		$session->clear($this->getType.'_VDM_IMPORTHEADERS');
		return $result;
	}/***[/JCBGUI$$$$]***/
 

	/**
	 * Works out an importation spreadsheet from a HTTP upload
	 *
	 * @return spreadsheet definition or false on failure
	 */
	protected function _getPackageFromUpload()
	{		
		// Get the uploaded file information
		$app = JFactory::getApplication();
		$input = $app->input;

		// Do not change the filter type 'raw'. We need this to let
files containing PHP code to upload. See JInputFiles::get.
		$userfile = $input->files->get('import_package', null,
'raw');
		
		// Make sure that file uploads are enabled in php
		if (!(bool) ini_get('file_uploads'))
		{
			$app->enqueueMessage(JText::_('COM_RESERVATION_IMPORT_MSG_WARNIMPORTFILE'),
'warning');
			return false;
		}

		// If there is no uploaded file, we have a problem...
		if (!is_array($userfile))
		{
			$app->enqueueMessage(JText::_('COM_RESERVATION_IMPORT_MSG_NO_FILE_SELECTED'),
'warning');
			return false;
		}

		// Check if there was a problem uploading the file.
		if ($userfile['error'] || $userfile['size'] < 1)
		{
			$app->enqueueMessage(JText::_('COM_RESERVATION_IMPORT_MSG_WARNIMPORTUPLOADERROR'),
'warning');
			return false;
		}

		// Build the appropriate paths
		$config = JFactory::getConfig();
		$tmp_dest = $config->get('tmp_path') . '/' .
$userfile['name'];
		$tmp_src = $userfile['tmp_name'];

		// Move uploaded file
		jimport('joomla.filesystem.file');
		$p_file = JFile::upload($tmp_src, $tmp_dest, $this->use_streams,
$this->allow_unsafe, $this->safeFileOptions);

		// Was the package downloaded?
		if (!$p_file)
		{
			$session = JFactory::getSession();
			$session->clear('package');
			$session->clear('dataType');
			$session->clear('hasPackage');
			// was not uploaded
			return false;
		}

		// check that this is a valid spreadsheet
		$package = $this->check($userfile['name']);

		return $package;
	}

	/**
	 * Import an spreadsheet from a directory
	 *
	 * @return  array  Spreadsheet details or false on failure
	 *
	 */
	protected function _getPackageFromFolder()
	{
		$app = JFactory::getApplication();
		$input = $app->input;

		// Get the path to the package to import
		$p_dir = $input->getString('import_directory');
		$p_dir = JPath::clean($p_dir);
		// Did you give us a valid path?
		if (!file_exists($p_dir))
		{
			$app->enqueueMessage(JText::_('COM_RESERVATION_IMPORT_MSG_PLEASE_ENTER_A_PACKAGE_DIRECTORY'),
'warning');
			return false;
		}

		// Detect the package type
		$type = $this->getType;

		// Did you give us a valid package?
		if (!$type)
		{
			$app->enqueueMessage(JText::_('COM_RESERVATION_IMPORT_MSG_PATH_DOES_NOT_HAVE_A_VALID_PACKAGE'),
'warning');
		}
		
		// check the extention
		if(!$this->checkExtension($p_dir))
		{
			// set error message
			$app->enqueueMessage(JText::_('COM_RESERVATION_IMPORT_MSG_DOES_NOT_HAVE_A_VALID_FILE_TYPE'),
'warning');
			return false;
		}
		
		$package['packagename'] = null;
		$package['dir'] = $p_dir;
		$package['type'] = $type;

		return $package;
	}

	/**
	 * Import an spreadsheet from a URL
	 *
	 * @return  Package details or false on failure
	 *
	 */
	protected function _getPackageFromUrl()
	{
		$app = JFactory::getApplication();
		$input = $app->input;

		// Get the URL of the package to import
		$url = $input->getString('import_url');

		// Did you give us a URL?
		if (!$url)
		{
			$app->enqueueMessage(JText::_('COM_RESERVATION_IMPORT_MSG_ENTER_A_URL'),
'warning');
			return false;
		}

		// Download the package at the URL given
		$p_file = JInstallerHelper::downloadPackage($url);

		// Was the package downloaded?
		if (!$p_file)
		{
			$app->enqueueMessage(JText::_('COM_RESERVATION_IMPORT_MSG_INVALID_URL'),
'warning');
			return false;
		}

		// check that this is a valid spreadsheet
		$package = $this->check($p_file);

		return $package;
	}
	
	/**
	 * Check a file and verifies it as a spreadsheet file
	 * Supports .csv .xlsx .xls and .ods
	 *
	 * @param   string  $p_filename  The uploaded package filename or import
directory
	 *
	 * @return  array  of elements
	 *
	 */
	protected function check($archivename)
	{
		$app = JFactory::getApplication();
		// Clean the name
		$archivename = JPath::clean($archivename);
		
		// check the extention
		if(!$this->checkExtension($archivename))
		{
			// Cleanup the import files
			$this->remove($archivename);
			$app->enqueueMessage(JText::_('COM_RESERVATION_IMPORT_MSG_DOES_NOT_HAVE_A_VALID_FILE_TYPE'),
'warning');
			return false;
		}
		
		$config = JFactory::getConfig();
		// set Package Name
		$check['packagename'] = $archivename;
		
		// set directory
		$check['dir'] = $config->get('tmp_path').
'/' .$archivename;
		
		// set type
		$check['type'] = $this->getType;
		
		return $check;
	}
	

/***[JCBGUI.admin_view.php_import_ext.127.$$$$]***/
	/**
	 * Check the extension
	 *
	 * @param   string  $file    Name of the uploaded file
	 *
	 * @return  boolean  True on success
	 *
	 */
	protected function checkExtension($file)
	{
		// check the extention
		switch(strtolower(pathinfo($file, PATHINFO_EXTENSION)))
		{
			case 'xls':
			case 'ods':
			case 'csv':
			return true;
			break;
		}
		return false;
	}/***[/JCBGUI$$$$]***/


	/**
	 * Clean up temporary uploaded spreadsheet
	 *
	 * @param   string  $package    Name of the uploaded spreadsheet file
	 *
	 * @return  boolean  True on success
	 *
	 */
	protected function remove($package)
	{
		jimport('joomla.filesystem.file');
		
		$config = JFactory::getConfig();
		$package = $config->get('tmp_path'). '/'
.$package;

		// Is the package file a valid file?
		if (is_file($package))
		{
			JFile::delete($package);
		}
		elseif (is_file(JPath::clean($package)))
		{
			// It might also be just a base filename
			JFile::delete(JPath::clean($package));
		}
	}
	

/***[JCBGUI.admin_view.php_import_setdata.127.$$$$]***/
	/**
	* Set the data from the spreadsheet to the database
	*
	* @param string  $package Paths to the uploaded package file
	*
	* @return  boolean false on failure
	*
	**/
	protected function setData($package,$table,$target_headers)
	{
		if (ReservationHelper::checkArray($target_headers))
		{
			// make sure the file is loaded
			ReservationHelper::composerAutoload('phpspreadsheet');
			$jinput = JFactory::getApplication()->input;
			foreach($target_headers as $header)
			{
				if (($column = $jinput->getString($header, false)) !== false ||
					($column = $jinput->getString(strtolower($header), false)) !==
false)
				{
					$data['target_headers'][$header] = $column;
				}
				else
				{
					$data['target_headers'][$header] = null;
				}
			}
			// set the data
			if(isset($package['dir']))
			{
				$inputFileType = IOFactory::identify($package['dir']);
				$excelReader = IOFactory::createReader($inputFileType);
				$excelReader->setReadDataOnly(true);
				$excelObj = $excelReader->load($package['dir']);
				$data['array'] =
$excelObj->getActiveSheet()->toArray(null, true,true,true);
				$excelObj->disconnectWorksheets();
				unset($excelObj);
				return $this->save($data, $table);
			}
		}
		return false;
	}/***[/JCBGUI$$$$]***/

	

/***[JCBGUI.admin_view.php_import_save.127.$$$$]***/
	/**
	* Save the data from the file to the database
	*
	* @param string  $package Paths to the uploaded package file
	*
	* @return  boolean false on failure
	*
	**/
	protected function save($data,$table)
	{
		// import the data if there is any
		if(ReservationHelper::checkArray($data['array']))
		{
			// get user object
			$user		= JFactory::getUser();
			// remove header if it has headers
			$id_key	= $data['target_headers']['id'];
			$published_key	=
$data['target_headers']['published'];
			$ordering_key	=
$data['target_headers']['ordering'];
			// get the first array set
			$firstSet = reset($data['array']);

			// check if first array is a header array and remove if true
			if($firstSet[$id_key] == 'id' || $firstSet[$published_key] ==
'published' || $firstSet[$ordering_key] == 'ordering')
			{
				array_shift($data['array']);
			}
			
			// make sure there is still values in array and that it was not only
headers
			if(ReservationHelper::checkArray($data['array']) &&
$user->authorise($table.'.import',
'com_reservation') &&
$user->authorise('core.import', 'com_reservation'))
			{
				// set target.
				$target	= array_flip($data['target_headers']);
				// Get a db connection.
				$db = JFactory::getDbo();
				// set some defaults
				$todayDate		= JFactory::getDate()->toSql();
				// get global action permissions
				$canDo			= ReservationHelper::getActions($table);
				$canEdit		= $canDo->get('core.edit');
				$canState		= $canDo->get('core.edit.state');
				$canCreate		= $canDo->get('core.create');
				$hasAlias		= $this->getAliasesUsed($table);
				// prosses the data
				foreach($data['array'] as $row)
				{
					$found = false;
					if (isset($row[$id_key]) && is_numeric($row[$id_key])
&& $row[$id_key] > 0)
					{
						// raw items import & update!
						$query = $db->getQuery(true);
						$query
							->select('version')
							->from($db->quoteName('#__reservation_'.$table))
							->where($db->quoteName('id') . ' = '.
$db->quote($row[$id_key]));
						// Reset the query using our newly populated query object.
						$db->setQuery($query);
						$db->execute();
						$found = $db->getNumRows();
					}
					
					if($found && $canEdit)
					{
						// update item
						$id		= $row[$id_key];
						$version	= $db->loadResult();
						// reset all buckets
						$query		= $db->getQuery(true);
						$fields	= array();
						// Fields to update.
						foreach($row as $key => $cell)
						{
							// ignore column
							if ('IGNORE' == $target[$key])
							{
								continue;
							}
							// update modified
							if ('modified_by' == $target[$key])
							{
								continue;
							}
							// update modified
							if ('modified' == $target[$key])
							{
								continue;
							}
							// update version
							if ('version' == $target[$key])
							{
								$cell = (int) $version + 1;
							}
							// verify publish authority
							if ('published' == $target[$key] && !$canState)
							{
								continue;
							}
							// set to update array
							if(in_array($key, $data['target_headers']) &&
is_numeric($cell))
							{
								$fields[] = $db->quoteName($target[$key]) . ' = ' .
$cell;
							}
							elseif(in_array($key, $data['target_headers']) &&
is_string($cell))
							{
								$fields[] = $db->quoteName($target[$key]) . ' = ' .
$db->quote($cell);
							}
							elseif(in_array($key, $data['target_headers']) &&
is_null($cell))
							{
								// if import data is null then set empty
								$fields[] = $db->quoteName($target[$key]) . " =
''";
							}
						}
						// load the defaults
						$fields[]	= $db->quoteName('modified_by') . ' =
' . $db->quote($user->id);
						$fields[]	= $db->quoteName('modified') . ' = '
. $db->quote($todayDate);
						// Conditions for which records should be updated.
						$conditions = array(
							$db->quoteName('id') . ' = ' . $id
						);
						
						$query->update($db->quoteName('#__reservation_'.$table))->set($fields)->where($conditions);
						$db->setQuery($query);
						$db->execute();
					}
					elseif ($canCreate)
					{
						// insert item
						$query = $db->getQuery(true);
						// reset all buckets
						$columns	= array();
						$values	= array();
						$version	= false;
						// Insert columns. Insert values.
						foreach($row as $key => $cell)
						{
							// ignore column
							if ('IGNORE' == $target[$key])
							{
								continue;
							}
							// remove id
							if ('id' == $target[$key])
							{
								continue;
							}
							// update created
							if ('created_by' == $target[$key])
							{
								continue;
							}
							// update created
							if ('created' == $target[$key])
							{
								continue;
							}
							// Make sure the alias is incremented
							if ('alias' == $target[$key])
							{
								$cell = $this->getAlias($cell,$table);
							}
							// update version
							if ('version' == $target[$key])
							{
								$cell = 1;
								$version = true;
							}
							// set to insert array
							if(in_array($key, $data['target_headers']) &&
is_numeric($cell))
							{
								$columns[]	= $target[$key];
								$values[]	= $cell;
							}
							elseif(in_array($key, $data['target_headers']) &&
is_string($cell))
							{
								$columns[]	= $target[$key];
								$values[]	= $db->quote($cell);
							}
							elseif(in_array($key, $data['target_headers']) &&
is_null($cell))
							{
								// if import data is null then set empty
								$columns[]	= $target[$key];
								$values[]	= "''";
							}
						}
						// load the defaults
						$columns[]	= 'created_by';
						$values[]	= $db->quote($user->id);
						$columns[]	= 'created';
						$values[]	= $db->quote($todayDate);
						if (!$version)
						{
							$columns[]	= 'version';
							$values[]	= 1;
						}
						// Prepare the insert query.
						$query
							->insert($db->quoteName('#__reservation_'.$table))
							->columns($db->quoteName($columns))
							->values(implode(',', $values));
						// Set the query using our newly populated query object and execute
it.
						$db->setQuery($query);
						$done = $db->execute();
						if ($done)
						{
							$aId = $db->insertid();
							// make sure the access of asset is set
							ReservationHelper::setAsset($aId,$table);
						}
					}
					else
					{
						return false;
					}
				}
				return true;
			}
		}
		return false;
	}/***[/JCBGUI$$$$]***/


	protected function getAlias($name,$type = false)
	{
		// sanitize the name to an alias
		if (JFactory::getConfig()->get('unicodeslugs') == 1)
		{
			$alias = JFilterOutput::stringURLUnicodeSlug($name);
		}
		else
		{
			$alias = JFilterOutput::stringURLSafe($name);
		}
		// must be a uniqe alias
		if ($type)
		{
			return $this->getUniqe($alias,'alias',$type);
		}
		return $alias;
	}
	
	/**
	 * Method to generate a uniqe value.
	 *
	 * @param   string  $field name.
	 * @param   string  $value data.
	 * @param   string  $type table.
	 *
	 * @return  string  New value.
	 */
	protected function getUniqe($value,$field,$type)
	{
		// insure the filed is always uniqe
		while (isset($this->uniqeValueArray[$type][$field][$value]))
		{
			$value = JString::increment($value, 'dash');
		}
		$this->uniqeValueArray[$type][$field][$value] = $value;
		return $value;
	}
	
	protected function getAliasesUsed($table)
	{
		// Get a db connection.
		$db = JFactory::getDbo();
		// first we check if there is a alias column
		$columns = $db->getTableColumns('#__reservation_'.$table);
		if(isset($columns['alias'])){
			// Create a new query object.
			$query = $db->getQuery(true);
			$query->select($db->quoteName(array('alias')));
			$query->from($db->quoteName('#__reservation_'.$table));
			$db->setQuery($query);
			$db->execute();
			if ($db->getNumRows())
			{
				$aliases = $db->loadColumn();
				foreach($aliases as $alias)
				{
					$this->uniqeValueArray[$table]['alias'][$alias] =
$alias;
				}
			}
			return true;
		}
		return false;
	}
}
PK4~�[�#o,,models/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK4~�[C�qҥS�Smodels/message.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		message.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Registry\Registry;
use Joomla\String\StringHelper;
use Joomla\Utilities\ArrayHelper;

/**
 * Reservation Message Model
 */
class ReservationModelMessage extends JModelAdmin
{
	/**
	 * The tab layout fields array.
	 *
	 * @var      array
	 */
	protected $tabLayoutFields = array(
		'details' => array(
			'left' => array(
				'from',
				'reply',
				'message',
				'seid'
			),
			'right' => array(
				'to',
				'read',
				'seen'
			)
		)
	);

	/**
	 * @var        string    The prefix to use with controller messages.
	 * @since   1.6
	 */
	protected $text_prefix = 'COM_RESERVATION';

	/**
	 * The type alias for this content type.
	 *
	 * @var      string
	 * @since    3.2
	 */
	public $typeAlias = 'com_reservation.message';

	/**
	 * Returns a Table object, always creating it
	 *
	 * @param   type    $type    The table type to instantiate
	 * @param   string  $prefix  A prefix for the table class name. Optional.
	 * @param   array   $config  Configuration array for model. Optional.
	 *
	 * @return  JTable  A database object
	 *
	 * @since   1.6
	 */
	public function getTable($type = 'message', $prefix =
'ReservationTable', $config = array())
	{
		// add table path for when model gets used from other component
		$this->addTablePath(JPATH_ADMINISTRATOR .
'/components/com_reservation/tables');
		// get instance of the table
		return JTable::getInstance($type, $prefix, $config);
	}
    
	/**
	 * Method to get a single record.
	 *
	 * @param   integer  $pk  The id of the primary key.
	 *
	 * @return  mixed  Object on success, false on failure.
	 *
	 * @since   1.6
	 */
	public function getItem($pk = null)
	{
		if ($item = parent::getItem($pk))
		{
			if (!empty($item->params) && !is_array($item->params))
			{
				// Convert the params field to an array.
				$registry = new Registry;
				$registry->loadString($item->params);
				$item->params = $registry->toArray();
			}

			if (!empty($item->metadata))
			{
				// Convert the metadata field to an array.
				$registry = new Registry;
				$registry->loadString($item->metadata);
				$item->metadata = $registry->toArray();
			}
		}

		return $item;
	}

	/**
	 * Method to get the record form.
	 *
	 * @param   array    $data      Data for the form.
	 * @param   boolean  $loadData  True if the form is to load its own data
(default case), false if not.
	 * @param   array    $options   Optional array of options for the form
creation.
	 *
	 * @return  mixed  A JForm object on success, false on failure
	 *
	 * @since   1.6
	 */
	public function getForm($data = array(), $loadData = true, $options =
array('control' => 'jform'))
	{
		// set load data option
		$options['load_data'] = $loadData;
		// check if xpath was set in options
		$xpath = false;
		if (isset($options['xpath']))
		{
			$xpath = $options['xpath'];
			unset($options['xpath']);
		}
		// check if clear form was set in options
		$clear = false;
		if (isset($options['clear']))
		{
			$clear = $options['clear'];
			unset($options['clear']);
		}

		// Get the form.
		$form = $this->loadForm('com_reservation.message',
'message', $options, $clear, $xpath);

		if (empty($form))
		{
			return false;
		}

		$jinput = JFactory::getApplication()->input;

		// The front end calls this model and uses a_id to avoid id clashes so we
need to check for that first.
		if ($jinput->get('a_id'))
		{
			$id = $jinput->get('a_id', 0, 'INT');
		}
		// The back end uses id so we use that the rest of the time and set it to
0 by default.
		else
		{
			$id = $jinput->get('id', 0, 'INT');
		}

		$user = JFactory::getUser();

		// Check for existing item.
		// Modify the form based on Edit State access controls.
		if ($id != 0 &&
(!$user->authorise('core.edit.state',
'com_reservation.message.' . (int) $id))
			|| ($id == 0 &&
!$user->authorise('core.edit.state',
'com_reservation')))
		{
			// Disable fields for display.
			$form->setFieldAttribute('ordering', 'disabled',
'true');
			$form->setFieldAttribute('published', 'disabled',
'true');
			// Disable fields while saving.
			$form->setFieldAttribute('ordering', 'filter',
'unset');
			$form->setFieldAttribute('published', 'filter',
'unset');
		}
		// If this is a new item insure the greated by is set.
		if (0 == $id)
		{
			// Set the created_by to this user
			$form->setValue('created_by', null, $user->id);
		}
		// Modify the form based on Edit Creaded By access controls.
		if (!$user->authorise('core.edit.created_by',
'com_reservation'))
		{
			// Disable fields for display.
			$form->setFieldAttribute('created_by',
'disabled', 'true');
			// Disable fields for display.
			$form->setFieldAttribute('created_by',
'readonly', 'true');
			// Disable fields while saving.
			$form->setFieldAttribute('created_by', 'filter',
'unset');
		}
		// Modify the form based on Edit Creaded Date access controls.
		if (!$user->authorise('core.edit.created',
'com_reservation'))
		{
			// Disable fields for display.
			$form->setFieldAttribute('created', 'disabled',
'true');
			// Disable fields while saving.
			$form->setFieldAttribute('created', 'filter',
'unset');
		}
		// Only load these values if no id is found
		if (0 == $id)
		{
			// Set redirected view name
			$redirectedView = $jinput->get('ref', null,
'STRING');
			// Set field name (or fall back to view name)
			$redirectedField = $jinput->get('field', $redirectedView,
'STRING');
			// Set redirected view id
			$redirectedId = $jinput->get('refid', 0, 'INT');
			// Set field id (or fall back to redirected view id)
			$redirectedValue = $jinput->get('field_id', $redirectedId,
'INT');
			if (0 != $redirectedValue && $redirectedField)
			{
				// Now set the local-redirected field default value
				$form->setValue($redirectedField, null, $redirectedValue);
			}
		}
		return $form;
	}

	/**
	 * Method to get the script that have to be included on the form
	 *
	 * @return string	script files
	 */
	public function getScript()
	{
		return 'media/com_reservation/js/message.js';
	}
    
	/**
	 * Method to test whether a record can be deleted.
	 *
	 * @param   object  $record  A record object.
	 *
	 * @return  boolean  True if allowed to delete the record. Defaults to the
permission set in the component.
	 *
	 * @since   1.6
	 */
	protected function canDelete($record)
	{
		if (!empty($record->id))
		{
			if ($record->published != -2)
			{
				return;
			}

			$user = JFactory::getUser();
			// The record has been set. Check the record permissions.
			return $user->authorise('core.delete',
'com_reservation.message.' . (int) $record->id);
		}
		return false;
	}

	/**
	 * Method to test whether a record can have its state edited.
	 *
	 * @param   object  $record  A record object.
	 *
	 * @return  boolean  True if allowed to change the state of the record.
Defaults to the permission set in the component.
	 *
	 * @since   1.6
	 */
	protected function canEditState($record)
	{
		$user = JFactory::getUser();
		$recordId = (!empty($record->id)) ? $record->id : 0;

		if ($recordId)
		{
			// The record has been set. Check the record permissions.
			$permission = $user->authorise('core.edit.state',
'com_reservation.message.' . (int) $recordId);
			if (!$permission && !is_null($permission))
			{
				return false;
			}
		}
		// In the absense of better information, revert to the component
permissions.
		return parent::canEditState($record);
	}
    
	/**
	 * Method override to check if you can edit an existing record.
	 *
	 * @param	array	$data	An array of input data.
	 * @param	string	$key	The name of the key for the primary key.
	 *
	 * @return	boolean
	 * @since	2.5
	 */
	protected function allowEdit($data = array(), $key = 'id')
	{
		// Check specific edit permission then general edit permission.

		return JFactory::getUser()->authorise('core.edit',
'com_reservation.message.'. ((int) isset($data[$key]) ?
$data[$key] : 0)) or parent::allowEdit($data, $key);
	}
    
	/**
	 * Prepare and sanitise the table data prior to saving.
	 *
	 * @param   JTable  $table  A JTable object.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function prepareTable($table)
	{
		$date = JFactory::getDate();
		$user = JFactory::getUser();
		
		if (isset($table->name))
		{
			$table->name = htmlspecialchars_decode($table->name, ENT_QUOTES);
		}
		
		if (isset($table->alias) && empty($table->alias))
		{
			$table->generateAlias();
		}
		
		if (empty($table->id))
		{
			$table->created = $date->toSql();
			// set the user
			if ($table->created_by == 0 || empty($table->created_by))
			{
				$table->created_by = $user->id;
			}
			// Set ordering to the last item if not set
			if (empty($table->ordering))
			{
				$db = JFactory::getDbo();
				$query = $db->getQuery(true)
					->select('MAX(ordering)')
					->from($db->quoteName('#__reservation_message'));
				$db->setQuery($query);
				$max = $db->loadResult();

				$table->ordering = $max + 1;
			}
		}
		else
		{
			$table->modified = $date->toSql();
			$table->modified_by = $user->id;
		}
        
		if (!empty($table->id))
		{
			// Increment the items version number.
			$table->version++;
		}
	}

	/**
	 * Method to get the data that should be injected in the form.
	 *
	 * @return  mixed  The data for the form.
	 *
	 * @since   1.6
	 */
	protected function loadFormData() 
	{
		// Check the session for previously entered form data.
		$data =
JFactory::getApplication()->getUserState('com_reservation.edit.message.data',
array());

		if (empty($data))
		{
			$data = $this->getItem();
			// run the perprocess of the data
			$this->preprocessData('com_reservation.message', $data);
		}

		return $data;
	}

	/**
	 * Method to get the unique fields of this table.
	 *
	 * @return  mixed  An array of field names, boolean false if none is set.
	 *
	 * @since   3.0
	 */
	protected function getUniqueFields()
	{
		return false;
	}
	
	/**
	 * Method to delete one or more records.
	 *
	 * @param   array  &$pks  An array of record primary keys.
	 *
	 * @return  boolean  True if successful, false if an error occurs.
	 *
	 * @since   12.2
	 */
	public function delete(&$pks)
	{
		if (!parent::delete($pks))
		{
			return false;
		}
		
		return true;
	}

	/**
	 * Method to change the published state of one or more records.
	 *
	 * @param   array    &$pks   A list of the primary keys to change.
	 * @param   integer  $value  The value of the published state.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   12.2
	 */
	public function publish(&$pks, $value = 1)
	{
		if (!parent::publish($pks, $value))
		{
			return false;
		}
		
		return true;
        }
    
	/**
	 * Method to perform batch operations on an item or a set of items.
	 *
	 * @param   array  $commands  An array of commands to perform.
	 * @param   array  $pks       An array of item ids.
	 * @param   array  $contexts  An array of item contexts.
	 *
	 * @return  boolean  Returns true on success, false on failure.
	 *
	 * @since   12.2
	 */
	public function batch($commands, $pks, $contexts)
	{
		// Sanitize ids.
		$pks = array_unique($pks);
		ArrayHelper::toInteger($pks);

		// Remove any values of zero.
		if (array_search(0, $pks, true))
		{
			unset($pks[array_search(0, $pks, true)]);
		}

		if (empty($pks))
		{
			$this->setError(JText::_('JGLOBAL_NO_ITEM_SELECTED'));
			return false;
		}

		$done = false;

		// Set some needed variables.
		$this->user			= JFactory::getUser();
		$this->table			= $this->getTable();
		$this->tableClassName		= get_class($this->table);
		$this->contentType		= new JUcmType;
		$this->type			=
$this->contentType->getTypeByTable($this->tableClassName);
		$this->canDo			= ReservationHelper::getActions('message');
		$this->batchSet			= true;

		if (!$this->canDo->get('core.batch'))
		{
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_INSUFFICIENT_BATCH_INFORMATION'));
			return false;
		}
        
		if ($this->type == false)
		{
			$type = new JUcmType;
			$this->type = $type->getTypeByAlias($this->typeAlias);
		}

		$this->tagsObserver =
$this->table->getObserverOfClass('JTableObserverTags');

		if (!empty($commands['move_copy']))
		{
			$cmd = ArrayHelper::getValue($commands, 'move_copy',
'c');

			if ($cmd == 'c')
			{
				$result = $this->batchCopy($commands, $pks, $contexts);

				if (is_array($result))
				{
					foreach ($result as $old => $new)
					{
						$contexts[$new] = $contexts[$old];
					}
					$pks = array_values($result);
				}
				else
				{
					return false;
				}
			}
			elseif ($cmd == 'm' && !$this->batchMove($commands,
$pks, $contexts))
			{
				return false;
			}

			$done = true;
		}

		if (!$done)
		{
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_INSUFFICIENT_BATCH_INFORMATION'));

			return false;
		}

		// Clear the cache
		$this->cleanCache();

		return true;
	}

	/**
	 * Batch copy items to a new category or current.
	 *
	 * @param   integer  $values    The new values.
	 * @param   array    $pks       An array of row IDs.
	 * @param   array    $contexts  An array of item contexts.
	 *
	 * @return  mixed  An array of new IDs on success, boolean false on
failure.
	 *
	 * @since 12.2
	 */
	protected function batchCopy($values, $pks, $contexts)
	{
		if (empty($this->batchSet))
		{
			// Set some needed variables.
			$this->user 		= JFactory::getUser();
			$this->table 		= $this->getTable();
			$this->tableClassName	= get_class($this->table);
			$this->canDo		= ReservationHelper::getActions('message');
		}

		if (!$this->canDo->get('core.create') ||
!$this->canDo->get('core.batch'))
		{
			return false;
		}

		// get list of unique fields
		$uniqueFields = $this->getUniqueFields();
		// remove move_copy from array
		unset($values['move_copy']);

		// make sure published is set
		if (!isset($values['published']))
		{
			$values['published'] = 0;
		}
		elseif (isset($values['published']) &&
!$this->canDo->get('core.edit.state'))
		{
				$values['published'] = 0;
		}

		$newIds = array();
		// Parent exists so let's proceed
		while (!empty($pks))
		{
			// Pop the first ID off the stack
			$pk = array_shift($pks);

			$this->table->reset();

			// only allow copy if user may edit this item.
			if (!$this->user->authorise('core.edit',
$contexts[$pk]))
			{
				// Not fatal error
				$this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND',
$pk));
				continue;
			}

			// Check that the row actually exists
			if (!$this->table->load($pk))
			{
				if ($error = $this->table->getError())
				{
					// Fatal error
					$this->setError($error);
					return false;
				}
				else
				{
					// Not fatal error
					$this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND',
$pk));
					continue;
				}
			}

			// insert all set values
			if (ReservationHelper::checkArray($values))
			{
				foreach ($values as $key => $value)
				{
					if (strlen($value) > 0 && isset($this->table->$key))
					{
						$this->table->$key = $value;
					}
				}
			}

			// update all unique fields
			if (ReservationHelper::checkArray($uniqueFields))
			{
				foreach ($uniqueFields as $uniqueField)
				{
					$this->table->$uniqueField =
$this->generateUnique($uniqueField,$this->table->$uniqueField);
				}
			}

			// Reset the ID because we are making a copy
			$this->table->id = 0;

			// TODO: Deal with ordering?
			// $this->table->ordering = 1;

			// Check the row.
			if (!$this->table->check())
			{
				$this->setError($this->table->getError());

				return false;
			}

			if (!empty($this->type))
			{
				$this->createTagsHelper($this->tagsObserver, $this->type, $pk,
$this->typeAlias, $this->table);
			}

			// Store the row.
			if (!$this->table->store())
			{
				$this->setError($this->table->getError());

				return false;
			}

			// Get the new item ID
			$newId = $this->table->get('id');

			// Add the new ID to the array
			$newIds[$pk] = $newId;
		}

		// Clean the cache
		$this->cleanCache();

		return $newIds;
	}

	/**
	 * Batch move items to a new category
	 *
	 * @param   integer  $value     The new category ID.
	 * @param   array    $pks       An array of row IDs.
	 * @param   array    $contexts  An array of item contexts.
	 *
	 * @return  boolean  True if successful, false otherwise and internal
error is set.
	 *
	 * @since 12.2
	 */
	protected function batchMove($values, $pks, $contexts)
	{
		if (empty($this->batchSet))
		{
			// Set some needed variables.
			$this->user		= JFactory::getUser();
			$this->table		= $this->getTable();
			$this->tableClassName	= get_class($this->table);
			$this->canDo		= ReservationHelper::getActions('message');
		}

		if (!$this->canDo->get('core.edit') &&
!$this->canDo->get('core.batch'))
		{
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT'));
			return false;
		}

		// make sure published only updates if user has the permission.
		if (isset($values['published']) &&
!$this->canDo->get('core.edit.state'))
		{
			unset($values['published']);
		}
		// remove move_copy from array
		unset($values['move_copy']);

		// Parent exists so we proceed
		foreach ($pks as $pk)
		{
			if (!$this->user->authorise('core.edit',
$contexts[$pk]))
			{
				$this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT'));
				return false;
			}

			// Check that the row actually exists
			if (!$this->table->load($pk))
			{
				if ($error = $this->table->getError())
				{
					// Fatal error
					$this->setError($error);
					return false;
				}
				else
				{
					// Not fatal error
					$this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND',
$pk));
					continue;
				}
			}

			// insert all set values.
			if (ReservationHelper::checkArray($values))
			{
				foreach ($values as $key => $value)
				{
					// Do special action for access.
					if ('access' === $key && strlen($value) > 0)
					{
						$this->table->$key = $value;
					}
					elseif (strlen($value) > 0 &&
isset($this->table->$key))
					{
						$this->table->$key = $value;
					}
				}
			}


			// Check the row.
			if (!$this->table->check())
			{
				$this->setError($this->table->getError());

				return false;
			}

			if (!empty($this->type))
			{
				$this->createTagsHelper($this->tagsObserver, $this->type, $pk,
$this->typeAlias, $this->table);
			}

			// Store the row.
			if (!$this->table->store())
			{
				$this->setError($this->table->getError());

				return false;
			}
		}

		// Clean the cache
		$this->cleanCache();

		return true;
	}
	
	/**
	 * Method to save the form data.
	 *
	 * @param   array  $data  The form data.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   1.6
	 */
	public function save($data)
	{
		$input	= JFactory::getApplication()->input;
		$filter	= JFilterInput::getInstance();
        
		// set the metadata to the Item Data
		if (isset($data['metadata']) &&
isset($data['metadata']['author']))
		{
			$data['metadata']['author'] =
$filter->clean($data['metadata']['author'],
'TRIM');
            
			$metadata = new JRegistry;
			$metadata->loadArray($data['metadata']);
			$data['metadata'] = (string) $metadata;
		}

		// Set the empty read item to data
		if (!isset($data['read']))
		{
			$data['read'] = '';
		}

		// Set the empty seen item to data
		if (!isset($data['seen']))
		{
			$data['seen'] = '';
		}
        
		// Set the Params Items to data
		if (isset($data['params']) &&
is_array($data['params']))
		{
			$params = new JRegistry;
			$params->loadArray($data['params']);
			$data['params'] = (string) $params;
		}

		// Alter the unique field for save as copy
		if ($input->get('task') === 'save2copy')
		{
			// Automatic handling of other unique fields
			$uniqueFields = $this->getUniqueFields();
			if (ReservationHelper::checkArray($uniqueFields))
			{
				foreach ($uniqueFields as $uniqueField)
				{
					$data[$uniqueField] =
$this->generateUnique($uniqueField,$data[$uniqueField]);
				}
			}
		}
		
		if (parent::save($data))
		{
			return true;
		}
		return false;
	}
	
	/**
	 * Method to generate a unique value.
	 *
	 * @param   string  $field name.
	 * @param   string  $value data.
	 *
	 * @return  string  New value.
	 *
	 * @since   3.0
	 */
	protected function generateUnique($field,$value)
	{

		// set field value unique
		$table = $this->getTable();

		while ($table->load(array($field => $value)))
		{
			$value = StringHelper::increment($value);
		}

		return $value;
	}
}
PK4~�[3�[-�<�<models/messages.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		messages.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Utilities\ArrayHelper;

/**
 * Messages Model
 */
class ReservationModelMessages extends JModelList
{
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
        {
			$config['filter_fields'] = array(
				'a.id','id',
				'a.published','published',
				'a.access','access',
				'a.ordering','ordering',
				'a.created_by','created_by',
				'a.modified_by','modified_by'
			);
		}

		parent::__construct($config);
	}

	/**
	 * Method to auto-populate the model state.
	 *
	 * Note. Calling getState in this method will result in recursion.
	 *
	 * @param   string  $ordering   An optional ordering field.
	 * @param   string  $direction  An optional direction (asc|desc).
	 *
	 * @return  void
	 *
	 */
	protected function populateState($ordering = null, $direction = null)
	{
		$app = JFactory::getApplication();

		// Adjust the context to support modal layouts.
		if ($layout = $app->input->get('layout'))
		{
			$this->context .= '.' . $layout;
		}

		// Check if the form was submitted
		$formSubmited =
$app->input->post->get('form_submited');

		$access = $this->getUserStateFromRequest($this->context .
'.filter.access', 'filter_access', 0, 'int');
		if ($formSubmited)
		{
			$access = $app->input->post->get('access');
			$this->setState('filter.access', $access);
		}

		$published = $this->getUserStateFromRequest($this->context .
'.filter.published', 'filter_published', '');
		$this->setState('filter.published', $published);

		$created_by = $this->getUserStateFromRequest($this->context .
'.filter.created_by', 'filter_created_by',
'');
		$this->setState('filter.created_by', $created_by);

		$created = $this->getUserStateFromRequest($this->context .
'.filter.created', 'filter_created');
		$this->setState('filter.created', $created);

		$sorting = $this->getUserStateFromRequest($this->context .
'.filter.sorting', 'filter_sorting', 0,
'int');
		$this->setState('filter.sorting', $sorting);

		$search = $this->getUserStateFromRequest($this->context .
'.filter.search', 'filter_search');
		$this->setState('filter.search', $search);

		// List state information.
		parent::populateState($ordering, $direction);
	}
	
	/**
	 * Method to get an array of data items.
	 *
	 * @return  mixed  An array of data items on success, false on failure.
	 */
	public function getItems()
	{
		// check in items
		$this->checkInNow();

		// load parent items
		$items = parent::getItems();

/***[JCBGUI.admin_view.php_getitems_after_all.111.$$$$]***/
 // Get a db connection.
        $db = JFactory::getDbo();

        // Create a new query object.
        $query = $db->getQuery(true);

        $query
           
->select($db->quoteName(array('a.phoneNumber','b.name'),array('phoneNumber','name')))
            ->from($db->quoteName('#__reservation_sick',
'a'))
            ->join('INNER',
$db->quoteName('#__users', 'b') . ' ON ' .
$db->quoteName('a.userId') . ' = ' .
$db->quoteName('b.id'));

        $db->setQuery($query);


        $result = $db->loadAssocList('phoneNumber');

        foreach ($items as &$item) {
            $item->sickid_phonenumber=
$result[$item->sickid_phonenumber]['name'];
        }


        $db = JFactory::getDbo();
        $query = $db->getQuery(true);
        $query
           
->select($db->quoteName(array('a.id','a.planType','a.time','a.price','a.plantype','u.name','c.title'),array('planId','planType','time','price','plantype','consultantName','specialty')))
            ->from($db->quoteName('#__reservation_plan',
'a'))
            ->join('INNER',
$db->quoteName('#__reservation_consultant', 'b') .
' ON ' . $db->quoteName('a.consultantId') . ' =
' . $db->quoteName('b.id'))
            ->join('INNER',
$db->quoteName('#__users', 'u') . ' ON ' .
$db->quoteName('b.userId') . ' = ' .
$db->quoteName('u.id'))
            ->join('INNER',
$db->quoteName('#__categories', 'c') . ' ON
' . $db->quoteName('b.catid') . ' = ' .
$db->quoteName('c.id'));

        $db->setQuery($query);

        $result = $db->loadAssocList('planId');


        $pt = array(
            1 => 'COM_RESERVATION_PLAN_TEL',
            2 => 'COM_RESERVATION_PLAN_CHAT'
        );

        $plan='';
        foreach ($items as &$item) {
            $plan .=
JText::_($pt[$result[$item->planid_id]['plantype']]);
            $plan .=
'-'.$result[$item->planid_id]['time'].'m';
            $plan .=
'-'.$result[$item->planid_id]['price'];
            $plan .=
'-'.$result[$item->planid_id]['consultantName'];
            $plan .=
'-'.$result[$item->planid_id]['specialty'];
            $item->planid_id= $plan;
           $plan='';
        }/***[/JCBGUI$$$$]***/

        
		// return items
		return $items;
	}
	
	/**
	 * Method to build an SQL query to load the list data.
	 *
	 * @return	string	An SQL query
	 */
	protected function getListQuery()
	{
		// Get the user object.
		$user = JFactory::getUser();
		// Create a new query object.
		$db = JFactory::getDBO();
		$query = $db->getQuery(true);

		// Select some fields
		$query->select('a.*');

		// From the reservation_item table
		$query->from($db->quoteName('#__reservation_message',
'a'));

		// From the reservation_message table.
		$query->select($db->quoteName('g.message','reply_message'));
		$query->join('LEFT',
$db->quoteName('#__reservation_message', 'g') .
' ON (' . $db->quoteName('a.reply') . ' =
' . $db->quoteName('g.id') . ')');

		// Filter by published state
		$published = $this->getState('filter.published');
		if (is_numeric($published))
		{
			$query->where('a.published = ' . (int) $published);
		}
		elseif ($published === '')
		{
			$query->where('(a.published = 0 OR a.published = 1)');
		}

		// Join over the asset groups.
		$query->select('ag.title AS access_level');
		$query->join('LEFT', '#__viewlevels AS ag ON ag.id =
a.access');
		// Filter by access level.
		$_access = $this->getState('filter.access');
		if ($_access && is_numeric($_access))
		{
			$query->where('a.access = ' . (int) $_access);
		}
		elseif (ReservationHelper::checkArray($_access))
		{
			// Secure the array for the query
			$_access = ArrayHelper::toInteger($_access);
			// Filter by the Access Array.
			$query->where('a.access IN (' . implode(',',
$_access) . ')');
		}
		// Implement View Level Access
		if (!$user->authorise('core.options',
'com_reservation'))
		{
			$groups = implode(',', $user->getAuthorisedViewLevels());
			$query->where('a.access IN (' . $groups . ')');
		}
		// Filter by search.
		$search = $this->getState('filter.search');
		if (!empty($search))
		{
			if (stripos($search, 'id:') === 0)
			{
				$query->where('a.id = ' . (int) substr($search, 3));
			}
			else
			{
				$search = $db->quote('%' . $db->escape($search) .
'%');
				$query->where('(a.message LIKE '.$search.')');
			}
		}


		// Add the list ordering clause.
		$orderCol = $this->state->get('list.ordering',
'a.id');
		$orderDirn = $this->state->get('list.direction',
'desc');
		if ($orderCol != '')
		{
			$query->order($db->escape($orderCol . ' ' .
$orderDirn));
		}

		return $query;
	}

	/**
	 * Method to get list export data.
	 *
	 * @param   array  $pks  The ids of the items to get
	 * @param   JUser  $user  The user making the request
	 *
	 * @return mixed  An array of data items on success, false on failure.
	 */
	public function getExportData($pks, $user = null)
	{
		// setup the query
		if (($pks_size = ReservationHelper::checkArray($pks)) !== false ||
'bulk' === $pks)
		{
			// Set a value to know this is export method. (USE IN CUSTOM CODE TO
ALTER OUTCOME)
			$_export = true;
			// Get the user object if not set.
			if (!isset($user) || !ReservationHelper::checkObject($user))
			{
				$user = JFactory::getUser();
			}
			// Create a new query object.
			$db = JFactory::getDBO();
			$query = $db->getQuery(true);

			// Select some fields
			$query->select('a.*');

			// From the reservation_message table
			$query->from($db->quoteName('#__reservation_message',
'a'));
			// The bulk export path
			if ('bulk' === $pks)
			{
				$query->where('a.id > 0');
			}
			// A large array of ID's will not work out well
			elseif ($pks_size > 500)
			{
				// Use lowest ID
				$query->where('a.id >= ' . (int) min($pks));
				// Use highest ID
				$query->where('a.id <= ' . (int) max($pks));
			}
			// The normal default path
			else
			{
				$query->where('a.id IN (' . implode(',',$pks) .
')');
			}
			// Implement View Level Access
			if (!$user->authorise('core.options',
'com_reservation'))
			{
				$groups = implode(',', $user->getAuthorisedViewLevels());
				$query->where('a.access IN (' . $groups . ')');
			}

			// Order the results by ordering
			$query->order('a.ordering  ASC');

			// Load the items
			$db->setQuery($query);
			$db->execute();
			if ($db->getNumRows())
			{
				$items = $db->loadObjectList();

				// Set values to display correctly.
				if (ReservationHelper::checkArray($items))
				{
					foreach ($items as $nr => &$item)
					{
						// unset the values we don't want exported.
						unset($item->asset_id);
						unset($item->checked_out);
						unset($item->checked_out_time);
					}
				}
				// Add headers to items array.
				$headers = $this->getExImPortHeaders();
				if (ReservationHelper::checkObject($headers))
				{
					array_unshift($items,$headers);
				}

		
/***[JCBGUI.admin_view.php_getitems_after_all.111.$$$$]***/
 // Get a db connection.
        $db = JFactory::getDbo();

        // Create a new query object.
        $query = $db->getQuery(true);

        $query
           
->select($db->quoteName(array('a.phoneNumber','b.name'),array('phoneNumber','name')))
            ->from($db->quoteName('#__reservation_sick',
'a'))
            ->join('INNER',
$db->quoteName('#__users', 'b') . ' ON ' .
$db->quoteName('a.userId') . ' = ' .
$db->quoteName('b.id'));

        $db->setQuery($query);


        $result = $db->loadAssocList('phoneNumber');

        foreach ($items as &$item) {
            $item->sickid_phonenumber=
$result[$item->sickid_phonenumber]['name'];
        }


        $db = JFactory::getDbo();
        $query = $db->getQuery(true);
        $query
           
->select($db->quoteName(array('a.id','a.planType','a.time','a.price','a.plantype','u.name','c.title'),array('planId','planType','time','price','plantype','consultantName','specialty')))
            ->from($db->quoteName('#__reservation_plan',
'a'))
            ->join('INNER',
$db->quoteName('#__reservation_consultant', 'b') .
' ON ' . $db->quoteName('a.consultantId') . ' =
' . $db->quoteName('b.id'))
            ->join('INNER',
$db->quoteName('#__users', 'u') . ' ON ' .
$db->quoteName('b.userId') . ' = ' .
$db->quoteName('u.id'))
            ->join('INNER',
$db->quoteName('#__categories', 'c') . ' ON
' . $db->quoteName('b.catid') . ' = ' .
$db->quoteName('c.id'));

        $db->setQuery($query);

        $result = $db->loadAssocList('planId');


        $pt = array(
            1 => 'COM_RESERVATION_PLAN_TEL',
            2 => 'COM_RESERVATION_PLAN_CHAT'
        );

        $plan='';
        foreach ($items as &$item) {
            $plan .=
JText::_($pt[$result[$item->planid_id]['plantype']]);
            $plan .=
'-'.$result[$item->planid_id]['time'].'m';
            $plan .=
'-'.$result[$item->planid_id]['price'];
            $plan .=
'-'.$result[$item->planid_id]['consultantName'];
            $plan .=
'-'.$result[$item->planid_id]['specialty'];
            $item->planid_id= $plan;
           $plan='';
        }/***[/JCBGUI$$$$]***/

				return $items;
			}
		}
		return false;
	}

	/**
	* Method to get header.
	*
	* @return mixed  An array of data items on success, false on failure.
	*/
	public function getExImPortHeaders()
	{
		// Get a db connection.
		$db = JFactory::getDbo();
		// get the columns
		$columns = $db->getTableColumns("#__reservation_message");
		if (ReservationHelper::checkArray($columns))
		{
			// remove the headers you don't import/export.
			unset($columns['asset_id']);
			unset($columns['checked_out']);
			unset($columns['checked_out_time']);
			$headers = new stdClass();
			foreach ($columns as $column => $type)
			{
				$headers->{$column} = $column;
			}
			return $headers;
		}
		return false;
	}
	
	/**
	 * Method to get a store id based on model configuration state.
	 *
	 * @return  string  A store id.
	 *
	 */
	protected function getStoreId($id = '')
	{
		// Compile the store id.
		$id .= ':' . $this->getState('filter.id');
		$id .= ':' . $this->getState('filter.search');
		$id .= ':' . $this->getState('filter.published');
		// Check if the value is an array
		$_access = $this->getState('filter.access');
		if (ReservationHelper::checkArray($_access))
		{
			$id .= ':' . implode(':', $_access);
		}
		// Check if this is only an number or string
		elseif (is_numeric($_access)
		 || ReservationHelper::checkString($_access))
		{
			$id .= ':' . $_access;
		}
		$id .= ':' . $this->getState('filter.ordering');
		$id .= ':' . $this->getState('filter.created_by');
		$id .= ':' .
$this->getState('filter.modified_by');

		return parent::getStoreId($id);
	}

	/**
	 * Build an SQL query to checkin all items left checked out longer then a
set time.
	 *
	 * @return  a bool
	 *
	 */
	protected function checkInNow()
	{
		// Get set check in time
		$time =
JComponentHelper::getParams('com_reservation')->get('check_in');

		if ($time)
		{

			// Get a db connection.
			$db = JFactory::getDbo();
			// reset query
			$query = $db->getQuery(true);
			$query->select('*');
			$query->from($db->quoteName('#__reservation_message'));
			$db->setQuery($query);
			$db->execute();
			if ($db->getNumRows())
			{
				// Get Yesterdays date
				$date = JFactory::getDate()->modify($time)->toSql();
				// reset query
				$query = $db->getQuery(true);

				// Fields to update.
				$fields = array(
					$db->quoteName('checked_out_time') .
'=\'0000-00-00 00:00:00\'',
					$db->quoteName('checked_out') . '=0'
				);

				// Conditions for which records should be updated.
				$conditions = array(
					$db->quoteName('checked_out') . '!=0', 
					$db->quoteName('checked_out_time') .
'<\''.$date.'\''
				);

				// Check table
				$query->update($db->quoteName('#__reservation_message'))->set($fields)->where($conditions);


				$db->setQuery($query);

				$db->execute();
			}
		}

		return false;
	}
}
PK4~�[�\�#wWwWmodels/order.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.31
	@build			8th May, 2021
	@created		17th December, 2020
	@package		Reservation
	@subpackage		order.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Registry\Registry;
use Joomla\String\StringHelper;
use Joomla\Utilities\ArrayHelper;

/**
 * Reservation Order Model
 */
class ReservationModelOrder extends JModelAdmin
{
	/**
	 * The tab layout fields array.
	 *
	 * @var      array
	 */
	protected $tabLayoutFields = array(
		'details' => array(
			'left' => array(
				'sickid',
				'full_price'
			),
			'right' => array(
				'doctor_quota',
				'system_quota',
				'status'
			)
		)
	);

	/**
	 * @var        string    The prefix to use with controller messages.
	 * @since   1.6
	 */
	protected $text_prefix = 'COM_RESERVATION';

	/**
	 * The type alias for this content type.
	 *
	 * @var      string
	 * @since    3.2
	 */
	public $typeAlias = 'com_reservation.order';

	/**
	 * Returns a Table object, always creating it
	 *
	 * @param   type    $type    The table type to instantiate
	 * @param   string  $prefix  A prefix for the table class name. Optional.
	 * @param   array   $config  Configuration array for model. Optional.
	 *
	 * @return  JTable  A database object
	 *
	 * @since   1.6
	 */
	public function getTable($type = 'order', $prefix =
'ReservationTable', $config = array())
	{
		// add table path for when model gets used from other component
		$this->addTablePath(JPATH_ADMINISTRATOR .
'/components/com_reservation/tables');
		// get instance of the table
		return JTable::getInstance($type, $prefix, $config);
	}
    
	/**
	 * Method to get a single record.
	 *
	 * @param   integer  $pk  The id of the primary key.
	 *
	 * @return  mixed  Object on success, false on failure.
	 *
	 * @since   1.6
	 */
	public function getItem($pk = null)
	{
		if ($item = parent::getItem($pk))
		{
			if (!empty($item->params) && !is_array($item->params))
			{
				// Convert the params field to an array.
				$registry = new Registry;
				$registry->loadString($item->params);
				$item->params = $registry->toArray();
			}

			if (!empty($item->metadata))
			{
				// Convert the metadata field to an array.
				$registry = new Registry;
				$registry->loadString($item->metadata);
				$item->metadata = $registry->toArray();
			}
			
			if (!empty($item->id))
			{
				$item->tags = new JHelperTags;
				$item->tags->getTagIds($item->id,
'com_reservation.order');
			}
		}

		return $item;
	}

	/**
	 * Method to get the record form.
	 *
	 * @param   array    $data      Data for the form.
	 * @param   boolean  $loadData  True if the form is to load its own data
(default case), false if not.
	 * @param   array    $options   Optional array of options for the form
creation.
	 *
	 * @return  mixed  A JForm object on success, false on failure
	 *
	 * @since   1.6
	 */
	public function getForm($data = array(), $loadData = true, $options =
array('control' => 'jform'))
	{
		// set load data option
		$options['load_data'] = $loadData;
		// check if xpath was set in options
		$xpath = false;
		if (isset($options['xpath']))
		{
			$xpath = $options['xpath'];
			unset($options['xpath']);
		}
		// check if clear form was set in options
		$clear = false;
		if (isset($options['clear']))
		{
			$clear = $options['clear'];
			unset($options['clear']);
		}

		// Get the form.
		$form = $this->loadForm('com_reservation.order',
'order', $options, $clear, $xpath);

		if (empty($form))
		{
			return false;
		}

		$jinput = JFactory::getApplication()->input;

		// The front end calls this model and uses a_id to avoid id clashes so we
need to check for that first.
		if ($jinput->get('a_id'))
		{
			$id = $jinput->get('a_id', 0, 'INT');
		}
		// The back end uses id so we use that the rest of the time and set it to
0 by default.
		else
		{
			$id = $jinput->get('id', 0, 'INT');
		}

		$user = JFactory::getUser();

		// Check for existing item.
		// Modify the form based on Edit State access controls.
		if ($id != 0 &&
(!$user->authorise('core.edit.state',
'com_reservation.order.' . (int) $id))
			|| ($id == 0 &&
!$user->authorise('core.edit.state',
'com_reservation')))
		{
			// Disable fields for display.
			$form->setFieldAttribute('ordering', 'disabled',
'true');
			$form->setFieldAttribute('published', 'disabled',
'true');
			// Disable fields while saving.
			$form->setFieldAttribute('ordering', 'filter',
'unset');
			$form->setFieldAttribute('published', 'filter',
'unset');
		}
		// If this is a new item insure the greated by is set.
		if (0 == $id)
		{
			// Set the created_by to this user
			$form->setValue('created_by', null, $user->id);
		}
		// Modify the form based on Edit Creaded By access controls.
		if (!$user->authorise('core.edit.created_by',
'com_reservation'))
		{
			// Disable fields for display.
			$form->setFieldAttribute('created_by',
'disabled', 'true');
			// Disable fields for display.
			$form->setFieldAttribute('created_by',
'readonly', 'true');
			// Disable fields while saving.
			$form->setFieldAttribute('created_by', 'filter',
'unset');
		}
		// Modify the form based on Edit Creaded Date access controls.
		if (!$user->authorise('core.edit.created',
'com_reservation'))
		{
			// Disable fields for display.
			$form->setFieldAttribute('created', 'disabled',
'true');
			// Disable fields while saving.
			$form->setFieldAttribute('created', 'filter',
'unset');
		}
		// Only load these values if no id is found
		if (0 == $id)
		{
			// Set redirected view name
			$redirectedView = $jinput->get('ref', null,
'STRING');
			// Set field name (or fall back to view name)
			$redirectedField = $jinput->get('field', $redirectedView,
'STRING');
			// Set redirected view id
			$redirectedId = $jinput->get('refid', 0, 'INT');
			// Set field id (or fall back to redirected view id)
			$redirectedValue = $jinput->get('field_id', $redirectedId,
'INT');
			if (0 != $redirectedValue && $redirectedField)
			{
				// Now set the local-redirected field default value
				$form->setValue($redirectedField, null, $redirectedValue);
			}
		}
		return $form;
	}

	/**
	 * Method to get the script that have to be included on the form
	 *
	 * @return string	script files
	 */
	public function getScript()
	{
		return
'administrator/components/com_reservation/models/forms/order.js';
	}
    
	/**
	 * Method to test whether a record can be deleted.
	 *
	 * @param   object  $record  A record object.
	 *
	 * @return  boolean  True if allowed to delete the record. Defaults to the
permission set in the component.
	 *
	 * @since   1.6
	 */
	protected function canDelete($record)
	{
		if (!empty($record->id))
		{
			if ($record->published != -2)
			{
				return;
			}

			$user = JFactory::getUser();
			// The record has been set. Check the record permissions.
			return $user->authorise('core.delete',
'com_reservation.order.' . (int) $record->id);
		}
		return false;
	}

	/**
	 * Method to test whether a record can have its state edited.
	 *
	 * @param   object  $record  A record object.
	 *
	 * @return  boolean  True if allowed to change the state of the record.
Defaults to the permission set in the component.
	 *
	 * @since   1.6
	 */
	protected function canEditState($record)
	{
		$user = JFactory::getUser();
		$recordId = (!empty($record->id)) ? $record->id : 0;

		if ($recordId)
		{
			// The record has been set. Check the record permissions.
			$permission = $user->authorise('core.edit.state',
'com_reservation.order.' . (int) $recordId);
			if (!$permission && !is_null($permission))
			{
				return false;
			}
		}
		// In the absense of better information, revert to the component
permissions.
		return parent::canEditState($record);
	}
    
	/**
	 * Method override to check if you can edit an existing record.
	 *
	 * @param	array	$data	An array of input data.
	 * @param	string	$key	The name of the key for the primary key.
	 *
	 * @return	boolean
	 * @since	2.5
	 */
	protected function allowEdit($data = array(), $key = 'id')
	{
		// Check specific edit permission then general edit permission.

		return JFactory::getUser()->authorise('core.edit',
'com_reservation.order.'. ((int) isset($data[$key]) ? $data[$key]
: 0)) or parent::allowEdit($data, $key);
	}
    
	/**
	 * Prepare and sanitise the table data prior to saving.
	 *
	 * @param   JTable  $table  A JTable object.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function prepareTable($table)
	{
		$date = JFactory::getDate();
		$user = JFactory::getUser();
		
		if (isset($table->name))
		{
			$table->name = htmlspecialchars_decode($table->name, ENT_QUOTES);
		}
		
		if (isset($table->alias) && empty($table->alias))
		{
			$table->generateAlias();
		}
		
		if (empty($table->id))
		{
			$table->created = $date->toSql();
			// set the user
			if ($table->created_by == 0 || empty($table->created_by))
			{
				$table->created_by = $user->id;
			}
			// Set ordering to the last item if not set
			if (empty($table->ordering))
			{
				$db = JFactory::getDbo();
				$query = $db->getQuery(true)
					->select('MAX(ordering)')
					->from($db->quoteName('#__reservation_order'));
				$db->setQuery($query);
				$max = $db->loadResult();

				$table->ordering = $max + 1;
			}
		}
		else
		{
			$table->modified = $date->toSql();
			$table->modified_by = $user->id;
		}
        
		if (!empty($table->id))
		{
			// Increment the items version number.
			$table->version++;
		}
	}

	/**
	 * Method to get the data that should be injected in the form.
	 *
	 * @return  mixed  The data for the form.
	 *
	 * @since   1.6
	 */
	protected function loadFormData() 
	{
		// Check the session for previously entered form data.
		$data =
JFactory::getApplication()->getUserState('com_reservation.edit.order.data',
array());

		if (empty($data))
		{
			$data = $this->getItem();
			// run the perprocess of the data
			$this->preprocessData('com_reservation.order', $data);
		}

		return $data;
	}

	/**
	 * Method to get the unique fields of this table.
	 *
	 * @return  mixed  An array of field names, boolean false if none is set.
	 *
	 * @since   3.0
	 */
	protected function getUniqueFields()
	{
		return false;
	}
	
	/**
	 * Method to delete one or more records.
	 *
	 * @param   array  &$pks  An array of record primary keys.
	 *
	 * @return  boolean  True if successful, false if an error occurs.
	 *
	 * @since   12.2
	 */
	public function delete(&$pks)
	{
		if (!parent::delete($pks))
		{
			return false;
		}
		
		return true;
	}

	/**
	 * Method to change the published state of one or more records.
	 *
	 * @param   array    &$pks   A list of the primary keys to change.
	 * @param   integer  $value  The value of the published state.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   12.2
	 */
	public function publish(&$pks, $value = 1)
	{
		if (!parent::publish($pks, $value))
		{
			return false;
		}
		
		return true;
        }
    
	/**
	 * Method to perform batch operations on an item or a set of items.
	 *
	 * @param   array  $commands  An array of commands to perform.
	 * @param   array  $pks       An array of item ids.
	 * @param   array  $contexts  An array of item contexts.
	 *
	 * @return  boolean  Returns true on success, false on failure.
	 *
	 * @since   12.2
	 */
	public function batch($commands, $pks, $contexts)
	{
		// Sanitize ids.
		$pks = array_unique($pks);
		ArrayHelper::toInteger($pks);

		// Remove any values of zero.
		if (array_search(0, $pks, true))
		{
			unset($pks[array_search(0, $pks, true)]);
		}

		if (empty($pks))
		{
			$this->setError(JText::_('JGLOBAL_NO_ITEM_SELECTED'));
			return false;
		}

		$done = false;

		// Set some needed variables.
		$this->user			= JFactory::getUser();
		$this->table			= $this->getTable();
		$this->tableClassName		= get_class($this->table);
		$this->contentType		= new JUcmType;
		$this->type			=
$this->contentType->getTypeByTable($this->tableClassName);
		$this->canDo			= ReservationHelper::getActions('order');
		$this->batchSet			= true;

		if (!$this->canDo->get('core.batch'))
		{
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_INSUFFICIENT_BATCH_INFORMATION'));
			return false;
		}
        
		if ($this->type == false)
		{
			$type = new JUcmType;
			$this->type = $type->getTypeByAlias($this->typeAlias);
		}

		$this->tagsObserver =
$this->table->getObserverOfClass('JTableObserverTags');

		if (!empty($commands['move_copy']))
		{
			$cmd = ArrayHelper::getValue($commands, 'move_copy',
'c');

			if ($cmd == 'c')
			{
				$result = $this->batchCopy($commands, $pks, $contexts);

				if (is_array($result))
				{
					foreach ($result as $old => $new)
					{
						$contexts[$new] = $contexts[$old];
					}
					$pks = array_values($result);
				}
				else
				{
					return false;
				}
			}
			elseif ($cmd == 'm' && !$this->batchMove($commands,
$pks, $contexts))
			{
				return false;
			}

			$done = true;
		}

		if (!$done)
		{
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_INSUFFICIENT_BATCH_INFORMATION'));

			return false;
		}

		// Clear the cache
		$this->cleanCache();

		return true;
	}

	/**
	 * Batch copy items to a new category or current.
	 *
	 * @param   integer  $values    The new values.
	 * @param   array    $pks       An array of row IDs.
	 * @param   array    $contexts  An array of item contexts.
	 *
	 * @return  mixed  An array of new IDs on success, boolean false on
failure.
	 *
	 * @since 12.2
	 */
	protected function batchCopy($values, $pks, $contexts)
	{
		if (empty($this->batchSet))
		{
			// Set some needed variables.
			$this->user 		= JFactory::getUser();
			$this->table 		= $this->getTable();
			$this->tableClassName	= get_class($this->table);
			$this->canDo		= ReservationHelper::getActions('order');
		}

		if (!$this->canDo->get('core.create') ||
!$this->canDo->get('core.batch'))
		{
			return false;
		}

		// get list of unique fields
		$uniqueFields = $this->getUniqueFields();
		// remove move_copy from array
		unset($values['move_copy']);

		// make sure published is set
		if (!isset($values['published']))
		{
			$values['published'] = 0;
		}
		elseif (isset($values['published']) &&
!$this->canDo->get('core.edit.state'))
		{
				$values['published'] = 0;
		}

		$newIds = array();
		// Parent exists so let's proceed
		while (!empty($pks))
		{
			// Pop the first ID off the stack
			$pk = array_shift($pks);

			$this->table->reset();

			// only allow copy if user may edit this item.
			if (!$this->user->authorise('core.edit',
$contexts[$pk]))
			{
				// Not fatal error
				$this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND',
$pk));
				continue;
			}

			// Check that the row actually exists
			if (!$this->table->load($pk))
			{
				if ($error = $this->table->getError())
				{
					// Fatal error
					$this->setError($error);
					return false;
				}
				else
				{
					// Not fatal error
					$this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND',
$pk));
					continue;
				}
			}

			// Only for strings
			if (ReservationHelper::checkString($this->table->sickid)
&& !is_numeric($this->table->sickid))
			{
				$this->table->sickid =
$this->generateUnique('sickid',$this->table->sickid);
			}

			// insert all set values
			if (ReservationHelper::checkArray($values))
			{
				foreach ($values as $key => $value)
				{
					if (strlen($value) > 0 && isset($this->table->$key))
					{
						$this->table->$key = $value;
					}
				}
			}

			// update all unique fields
			if (ReservationHelper::checkArray($uniqueFields))
			{
				foreach ($uniqueFields as $uniqueField)
				{
					$this->table->$uniqueField =
$this->generateUnique($uniqueField,$this->table->$uniqueField);
				}
			}

			// Reset the ID because we are making a copy
			$this->table->id = 0;

			// TODO: Deal with ordering?
			// $this->table->ordering = 1;

			// Check the row.
			if (!$this->table->check())
			{
				$this->setError($this->table->getError());

				return false;
			}

			if (!empty($this->type))
			{
				$this->createTagsHelper($this->tagsObserver, $this->type, $pk,
$this->typeAlias, $this->table);
			}

			// Store the row.
			if (!$this->table->store())
			{
				$this->setError($this->table->getError());

				return false;
			}

			// Get the new item ID
			$newId = $this->table->get('id');

			// Add the new ID to the array
			$newIds[$pk] = $newId;
		}

		// Clean the cache
		$this->cleanCache();

		return $newIds;
	}

	/**
	 * Batch move items to a new category
	 *
	 * @param   integer  $value     The new category ID.
	 * @param   array    $pks       An array of row IDs.
	 * @param   array    $contexts  An array of item contexts.
	 *
	 * @return  boolean  True if successful, false otherwise and internal
error is set.
	 *
	 * @since 12.2
	 */
	protected function batchMove($values, $pks, $contexts)
	{
		if (empty($this->batchSet))
		{
			// Set some needed variables.
			$this->user		= JFactory::getUser();
			$this->table		= $this->getTable();
			$this->tableClassName	= get_class($this->table);
			$this->canDo		= ReservationHelper::getActions('order');
		}

		if (!$this->canDo->get('core.edit') &&
!$this->canDo->get('core.batch'))
		{
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT'));
			return false;
		}

		// make sure published only updates if user has the permission.
		if (isset($values['published']) &&
!$this->canDo->get('core.edit.state'))
		{
			unset($values['published']);
		}
		// remove move_copy from array
		unset($values['move_copy']);

		// Parent exists so we proceed
		foreach ($pks as $pk)
		{
			if (!$this->user->authorise('core.edit',
$contexts[$pk]))
			{
				$this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT'));
				return false;
			}

			// Check that the row actually exists
			if (!$this->table->load($pk))
			{
				if ($error = $this->table->getError())
				{
					// Fatal error
					$this->setError($error);
					return false;
				}
				else
				{
					// Not fatal error
					$this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND',
$pk));
					continue;
				}
			}

			// insert all set values.
			if (ReservationHelper::checkArray($values))
			{
				foreach ($values as $key => $value)
				{
					// Do special action for access.
					if ('access' === $key && strlen($value) > 0)
					{
						$this->table->$key = $value;
					}
					elseif (strlen($value) > 0 &&
isset($this->table->$key))
					{
						$this->table->$key = $value;
					}
				}
			}


			// Check the row.
			if (!$this->table->check())
			{
				$this->setError($this->table->getError());

				return false;
			}

			if (!empty($this->type))
			{
				$this->createTagsHelper($this->tagsObserver, $this->type, $pk,
$this->typeAlias, $this->table);
			}

			// Store the row.
			if (!$this->table->store())
			{
				$this->setError($this->table->getError());

				return false;
			}
		}

		// Clean the cache
		$this->cleanCache();

		return true;
	}
	
	/**
	 * Method to save the form data.
	 *
	 * @param   array  $data  The form data.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   1.6
	 */
	public function save($data)
	{
		$input	= JFactory::getApplication()->input;
		$filter	= JFilterInput::getInstance();
        
		// set the metadata to the Item Data
		if (isset($data['metadata']) &&
isset($data['metadata']['author']))
		{
			$data['metadata']['author'] =
$filter->clean($data['metadata']['author'],
'TRIM');
            
			$metadata = new JRegistry;
			$metadata->loadArray($data['metadata']);
			$data['metadata'] = (string) $metadata;
		}
        
		// Set the Params Items to data
		if (isset($data['params']) &&
is_array($data['params']))
		{
			$params = new JRegistry;
			$params->loadArray($data['params']);
			$data['params'] = (string) $params;
		}

		// Alter the unique field for save as copy
		if ($input->get('task') === 'save2copy')
		{
			// Automatic handling of other unique fields
			$uniqueFields = $this->getUniqueFields();
			if (ReservationHelper::checkArray($uniqueFields))
			{
				foreach ($uniqueFields as $uniqueField)
				{
					$data[$uniqueField] =
$this->generateUnique($uniqueField,$data[$uniqueField]);
				}
			}
		}
		
		if (parent::save($data))
		{
			return true;
		}
		return false;
	}
	
	/**
	 * Method to generate a unique value.
	 *
	 * @param   string  $field name.
	 * @param   string  $value data.
	 *
	 * @return  string  New value.
	 *
	 * @since   3.0
	 */
	protected function generateUnique($field,$value)
	{

		// set field value unique
		$table = $this->getTable();

		while ($table->load(array($field => $value)))
		{
			$value = StringHelper::increment($value);
		}

		return $value;
	}

	/**
	 * Method to change the title
	 *
	 * @param   string   $title   The title.
	 *
	 * @return	array  Contains the modified title and alias.
	 *
	 */
	protected function _generateNewTitle($title)
	{

		// Alter the title
		$table = $this->getTable();

		while ($table->load(array('title' => $title)))
		{
			$title = StringHelper::increment($title);
		}

		return $title;
	}
}
PK4~�[��b��/�/models/orders.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.31
	@build			8th May, 2021
	@created		17th December, 2020
	@package		Reservation
	@subpackage		orders.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Utilities\ArrayHelper;

/**
 * Orders Model
 */
class ReservationModelOrders extends JModelList
{
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
        {
			$config['filter_fields'] = array(
				'a.id','id',
				'a.published','published',
				'a.access','access',
				'a.ordering','ordering',
				'a.created_by','created_by',
				'a.modified_by','modified_by',
				'a.full_price','full_price',
				'a.status','status'
			);
		}

		parent::__construct($config);
	}

	/**
	 * Method to auto-populate the model state.
	 *
	 * Note. Calling getState in this method will result in recursion.
	 *
	 * @param   string  $ordering   An optional ordering field.
	 * @param   string  $direction  An optional direction (asc|desc).
	 *
	 * @return  void
	 *
	 */
	protected function populateState($ordering = null, $direction = null)
	{
		$app = JFactory::getApplication();

		// Adjust the context to support modal layouts.
		if ($layout = $app->input->get('layout'))
		{
			$this->context .= '.' . $layout;
		}

		// Check if the form was submitted
		$formSubmited =
$app->input->post->get('form_submited');

		$access = $this->getUserStateFromRequest($this->context .
'.filter.access', 'filter_access', 0, 'int');
		if ($formSubmited)
		{
			$access = $app->input->post->get('access');
			$this->setState('filter.access', $access);
		}

		$published = $this->getUserStateFromRequest($this->context .
'.filter.published', 'filter_published', '');
		$this->setState('filter.published', $published);

		$created_by = $this->getUserStateFromRequest($this->context .
'.filter.created_by', 'filter_created_by',
'');
		$this->setState('filter.created_by', $created_by);

		$created = $this->getUserStateFromRequest($this->context .
'.filter.created', 'filter_created');
		$this->setState('filter.created', $created);

		$sorting = $this->getUserStateFromRequest($this->context .
'.filter.sorting', 'filter_sorting', 0,
'int');
		$this->setState('filter.sorting', $sorting);

		$search = $this->getUserStateFromRequest($this->context .
'.filter.search', 'filter_search');
		$this->setState('filter.search', $search);

		$full_price = $this->getUserStateFromRequest($this->context .
'.filter.full_price', 'filter_full_price');
		if ($formSubmited)
		{
			$full_price = $app->input->post->get('full_price');
			$this->setState('filter.full_price', $full_price);
		}

		$status = $this->getUserStateFromRequest($this->context .
'.filter.status', 'filter_status');
		if ($formSubmited)
		{
			$status = $app->input->post->get('status');
			$this->setState('filter.status', $status);
		}

		// List state information.
		parent::populateState($ordering, $direction);
	}
	
	/**
	 * Method to get an array of data items.
	 *
	 * @return  mixed  An array of data items on success, false on failure.
	 */
	public function getItems()
	{
		// check in items
		$this->checkInNow();

		// load parent items
		$items = parent::getItems();

		// set selection value to a translatable value
		if (ReservationHelper::checkArray($items))
		{
			foreach ($items as $nr => &$item)
			{
				// convert status
				$item->status = $this->selectionTranslation($item->status,
'status');
			}
		}

        
		// return items
		return $items;
	}

	/**
	 * Method to convert selection values to translatable string.
	 *
	 * @return translatable string
	 */
	public function selectionTranslation($value,$name)
	{
		// Array of status language strings
		if ($name === 'status')
		{
			$statusArray = array(
				'confirmed' =>
'COM_RESERVATION_ORDER_CONFIRMED',
				'created' => 'COM_RESERVATION_ORDER_CREATED'
			);
			// Now check if value is found in this array
			if (isset($statusArray[$value]) &&
ReservationHelper::checkString($statusArray[$value]))
			{
				return $statusArray[$value];
			}
		}
		return $value;
	}
	
	/**
	 * Method to build an SQL query to load the list data.
	 *
	 * @return	string	An SQL query
	 */
	protected function getListQuery()
	{
		// Get the user object.
		$user = JFactory::getUser();
		// Create a new query object.
		$db = JFactory::getDBO();
		$query = $db->getQuery(true);

		// Select some fields
		$query->select('a.*');

		// From the reservation_item table
		$query->from($db->quoteName('#__reservation_order',
'a'));

		// From the reservation_sick table.
		$query->select($db->quoteName('g.phonenumber','sickid_phonenumber'));
		$query->join('LEFT',
$db->quoteName('#__reservation_sick', 'g') . '
ON (' . $db->quoteName('a.sickid') . ' = ' .
$db->quoteName('g.id') . ')');

		// Filter by published state
		$published = $this->getState('filter.published');
		if (is_numeric($published))
		{
			$query->where('a.published = ' . (int) $published);
		}
		elseif ($published === '')
		{
			$query->where('(a.published = 0 OR a.published = 1)');
		}

		// Join over the asset groups.
		$query->select('ag.title AS access_level');
		$query->join('LEFT', '#__viewlevels AS ag ON ag.id =
a.access');
		// Filter by access level.
		$_access = $this->getState('filter.access');
		if ($_access && is_numeric($_access))
		{
			$query->where('a.access = ' . (int) $_access);
		}
		elseif (ReservationHelper::checkArray($_access))
		{
			// Secure the array for the query
			$_access = ArrayHelper::toInteger($_access);
			// Filter by the Access Array.
			$query->where('a.access IN (' . implode(',',
$_access) . ')');
		}
		// Implement View Level Access
		if (!$user->authorise('core.options',
'com_reservation'))
		{
			$groups = implode(',', $user->getAuthorisedViewLevels());
			$query->where('a.access IN (' . $groups . ')');
		}

		// Add the list ordering clause.
		$orderCol = $this->state->get('list.ordering',
'a.id');
		$orderDirn = $this->state->get('list.direction',
'desc');
		if ($orderCol != '')
		{
			$query->order($db->escape($orderCol . ' ' .
$orderDirn));
		}

		return $query;
	}

	/**
	 * Method to get list export data.
	 *
	 * @param   array  $pks  The ids of the items to get
	 * @param   JUser  $user  The user making the request
	 *
	 * @return mixed  An array of data items on success, false on failure.
	 */
	public function getExportData($pks, $user = null)
	{
		// setup the query
		if (($pks_size = ReservationHelper::checkArray($pks)) !== false ||
'bulk' === $pks)
		{
			// Set a value to know this is export method. (USE IN CUSTOM CODE TO
ALTER OUTCOME)
			$_export = true;
			// Get the user object if not set.
			if (!isset($user) || !ReservationHelper::checkObject($user))
			{
				$user = JFactory::getUser();
			}
			// Create a new query object.
			$db = JFactory::getDBO();
			$query = $db->getQuery(true);

			// Select some fields
			$query->select('a.*');

			// From the reservation_order table
			$query->from($db->quoteName('#__reservation_order',
'a'));
			// The bulk export path
			if ('bulk' === $pks)
			{
				$query->where('a.id > 0');
			}
			// A large array of ID's will not work out well
			elseif ($pks_size > 500)
			{
				// Use lowest ID
				$query->where('a.id >= ' . (int) min($pks));
				// Use highest ID
				$query->where('a.id <= ' . (int) max($pks));
			}
			// The normal default path
			else
			{
				$query->where('a.id IN (' . implode(',',$pks) .
')');
			}
			// Implement View Level Access
			if (!$user->authorise('core.options',
'com_reservation'))
			{
				$groups = implode(',', $user->getAuthorisedViewLevels());
				$query->where('a.access IN (' . $groups . ')');
			}

			// Order the results by ordering
			$query->order('a.ordering  ASC');

			// Load the items
			$db->setQuery($query);
			$db->execute();
			if ($db->getNumRows())
			{
				$items = $db->loadObjectList();

				// Set values to display correctly.
				if (ReservationHelper::checkArray($items))
				{
					foreach ($items as $nr => &$item)
					{
						// unset the values we don't want exported.
						unset($item->asset_id);
						unset($item->checked_out);
						unset($item->checked_out_time);
					}
				}
				// Add headers to items array.
				$headers = $this->getExImPortHeaders();
				if (ReservationHelper::checkObject($headers))
				{
					array_unshift($items,$headers);
				}
				return $items;
			}
		}
		return false;
	}

	/**
	* Method to get header.
	*
	* @return mixed  An array of data items on success, false on failure.
	*/
	public function getExImPortHeaders()
	{
		// Get a db connection.
		$db = JFactory::getDbo();
		// get the columns
		$columns = $db->getTableColumns("#__reservation_order");
		if (ReservationHelper::checkArray($columns))
		{
			// remove the headers you don't import/export.
			unset($columns['asset_id']);
			unset($columns['checked_out']);
			unset($columns['checked_out_time']);
			$headers = new stdClass();
			foreach ($columns as $column => $type)
			{
				$headers->{$column} = $column;
			}
			return $headers;
		}
		return false;
	}
	
	/**
	 * Method to get a store id based on model configuration state.
	 *
	 * @return  string  A store id.
	 *
	 */
	protected function getStoreId($id = '')
	{
		// Compile the store id.
		$id .= ':' . $this->getState('filter.id');
		$id .= ':' . $this->getState('filter.search');
		$id .= ':' . $this->getState('filter.published');
		// Check if the value is an array
		$_access = $this->getState('filter.access');
		if (ReservationHelper::checkArray($_access))
		{
			$id .= ':' . implode(':', $_access);
		}
		// Check if this is only an number or string
		elseif (is_numeric($_access)
		 || ReservationHelper::checkString($_access))
		{
			$id .= ':' . $_access;
		}
		$id .= ':' . $this->getState('filter.ordering');
		$id .= ':' . $this->getState('filter.created_by');
		$id .= ':' .
$this->getState('filter.modified_by');
		$id .= ':' . $this->getState('filter.full_price');
		$id .= ':' . $this->getState('filter.status');

		return parent::getStoreId($id);
	}

	/**
	 * Build an SQL query to checkin all items left checked out longer then a
set time.
	 *
	 * @return  a bool
	 *
	 */
	protected function checkInNow()
	{
		// Get set check in time
		$time =
JComponentHelper::getParams('com_reservation')->get('check_in');

		if ($time)
		{

			// Get a db connection.
			$db = JFactory::getDbo();
			// reset query
			$query = $db->getQuery(true);
			$query->select('*');
			$query->from($db->quoteName('#__reservation_order'));
			$db->setQuery($query);
			$db->execute();
			if ($db->getNumRows())
			{
				// Get Yesterdays date
				$date = JFactory::getDate()->modify($time)->toSql();
				// reset query
				$query = $db->getQuery(true);

				// Fields to update.
				$fields = array(
					$db->quoteName('checked_out_time') .
'=\'0000-00-00 00:00:00\'',
					$db->quoteName('checked_out') . '=0'
				);

				// Conditions for which records should be updated.
				$conditions = array(
					$db->quoteName('checked_out') . '!=0', 
					$db->quoteName('checked_out_time') .
'<\''.$date.'\''
				);

				// Check table
				$query->update($db->quoteName('#__reservation_order'))->set($fields)->where($conditions);


				$db->setQuery($query);

				$db->execute();
			}
		}

		return false;
	}
}
PK4~�[��
DVVmodels/plan.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		plan.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Registry\Registry;
use Joomla\String\StringHelper;
use Joomla\Utilities\ArrayHelper;

/**
 * Reservation Plan Model
 */
class ReservationModelPlan extends JModelAdmin
{
	/**
	 * The tab layout fields array.
	 *
	 * @var      array
	 */
	protected $tabLayoutFields = array(
		'details' => array(
			'left' => array(
				'plantype',
				'consultantid',
				'price'
			),
			'right' => array(
				'time',
				'waitingtime'
			)
		)
	);

	/**
	 * @var        string    The prefix to use with controller messages.
	 * @since   1.6
	 */
	protected $text_prefix = 'COM_RESERVATION';

	/**
	 * The type alias for this content type.
	 *
	 * @var      string
	 * @since    3.2
	 */
	public $typeAlias = 'com_reservation.plan';

	/**
	 * Returns a Table object, always creating it
	 *
	 * @param   type    $type    The table type to instantiate
	 * @param   string  $prefix  A prefix for the table class name. Optional.
	 * @param   array   $config  Configuration array for model. Optional.
	 *
	 * @return  JTable  A database object
	 *
	 * @since   1.6
	 */
	public function getTable($type = 'plan', $prefix =
'ReservationTable', $config = array())
	{
		// add table path for when model gets used from other component
		$this->addTablePath(JPATH_ADMINISTRATOR .
'/components/com_reservation/tables');
		// get instance of the table
		return JTable::getInstance($type, $prefix, $config);
	}
    
	/**
	 * Method to get a single record.
	 *
	 * @param   integer  $pk  The id of the primary key.
	 *
	 * @return  mixed  Object on success, false on failure.
	 *
	 * @since   1.6
	 */
	public function getItem($pk = null)
	{
		if ($item = parent::getItem($pk))
		{
			if (!empty($item->params) && !is_array($item->params))
			{
				// Convert the params field to an array.
				$registry = new Registry;
				$registry->loadString($item->params);
				$item->params = $registry->toArray();
			}

			if (!empty($item->metadata))
			{
				// Convert the metadata field to an array.
				$registry = new Registry;
				$registry->loadString($item->metadata);
				$item->metadata = $registry->toArray();
			}
		}

		return $item;
	}

	/**
	 * Method to get the record form.
	 *
	 * @param   array    $data      Data for the form.
	 * @param   boolean  $loadData  True if the form is to load its own data
(default case), false if not.
	 * @param   array    $options   Optional array of options for the form
creation.
	 *
	 * @return  mixed  A JForm object on success, false on failure
	 *
	 * @since   1.6
	 */
	public function getForm($data = array(), $loadData = true, $options =
array('control' => 'jform'))
	{
		// set load data option
		$options['load_data'] = $loadData;
		// check if xpath was set in options
		$xpath = false;
		if (isset($options['xpath']))
		{
			$xpath = $options['xpath'];
			unset($options['xpath']);
		}
		// check if clear form was set in options
		$clear = false;
		if (isset($options['clear']))
		{
			$clear = $options['clear'];
			unset($options['clear']);
		}

		// Get the form.
		$form = $this->loadForm('com_reservation.plan',
'plan', $options, $clear, $xpath);

		if (empty($form))
		{
			return false;
		}

		$jinput = JFactory::getApplication()->input;

		// The front end calls this model and uses a_id to avoid id clashes so we
need to check for that first.
		if ($jinput->get('a_id'))
		{
			$id = $jinput->get('a_id', 0, 'INT');
		}
		// The back end uses id so we use that the rest of the time and set it to
0 by default.
		else
		{
			$id = $jinput->get('id', 0, 'INT');
		}

		$user = JFactory::getUser();

		// Check for existing item.
		// Modify the form based on Edit State access controls.
		if ($id != 0 &&
(!$user->authorise('core.edit.state',
'com_reservation.plan.' . (int) $id))
			|| ($id == 0 &&
!$user->authorise('core.edit.state',
'com_reservation')))
		{
			// Disable fields for display.
			$form->setFieldAttribute('ordering', 'disabled',
'true');
			$form->setFieldAttribute('published', 'disabled',
'true');
			// Disable fields while saving.
			$form->setFieldAttribute('ordering', 'filter',
'unset');
			$form->setFieldAttribute('published', 'filter',
'unset');
		}
		// If this is a new item insure the greated by is set.
		if (0 == $id)
		{
			// Set the created_by to this user
			$form->setValue('created_by', null, $user->id);
		}
		// Modify the form based on Edit Creaded By access controls.
		if (!$user->authorise('core.edit.created_by',
'com_reservation'))
		{
			// Disable fields for display.
			$form->setFieldAttribute('created_by',
'disabled', 'true');
			// Disable fields for display.
			$form->setFieldAttribute('created_by',
'readonly', 'true');
			// Disable fields while saving.
			$form->setFieldAttribute('created_by', 'filter',
'unset');
		}
		// Modify the form based on Edit Creaded Date access controls.
		if (!$user->authorise('core.edit.created',
'com_reservation'))
		{
			// Disable fields for display.
			$form->setFieldAttribute('created', 'disabled',
'true');
			// Disable fields while saving.
			$form->setFieldAttribute('created', 'filter',
'unset');
		}
		// Only load these values if no id is found
		if (0 == $id)
		{
			// Set redirected view name
			$redirectedView = $jinput->get('ref', null,
'STRING');
			// Set field name (or fall back to view name)
			$redirectedField = $jinput->get('field', $redirectedView,
'STRING');
			// Set redirected view id
			$redirectedId = $jinput->get('refid', 0, 'INT');
			// Set field id (or fall back to redirected view id)
			$redirectedValue = $jinput->get('field_id', $redirectedId,
'INT');
			if (0 != $redirectedValue && $redirectedField)
			{
				// Now set the local-redirected field default value
				$form->setValue($redirectedField, null, $redirectedValue);
			}
		}
		return $form;
	}

	/**
	 * Method to get the script that have to be included on the form
	 *
	 * @return string	script files
	 */
	public function getScript()
	{
		return 'media/com_reservation/js/plan.js';
	}
    
	/**
	 * Method to test whether a record can be deleted.
	 *
	 * @param   object  $record  A record object.
	 *
	 * @return  boolean  True if allowed to delete the record. Defaults to the
permission set in the component.
	 *
	 * @since   1.6
	 */
	protected function canDelete($record)
	{
		if (!empty($record->id))
		{
			if ($record->published != -2)
			{
				return;
			}

			$user = JFactory::getUser();
			// The record has been set. Check the record permissions.
			return $user->authorise('core.delete',
'com_reservation.plan.' . (int) $record->id);
		}
		return false;
	}

	/**
	 * Method to test whether a record can have its state edited.
	 *
	 * @param   object  $record  A record object.
	 *
	 * @return  boolean  True if allowed to change the state of the record.
Defaults to the permission set in the component.
	 *
	 * @since   1.6
	 */
	protected function canEditState($record)
	{
		$user = JFactory::getUser();
		$recordId = (!empty($record->id)) ? $record->id : 0;

		if ($recordId)
		{
			// The record has been set. Check the record permissions.
			$permission = $user->authorise('core.edit.state',
'com_reservation.plan.' . (int) $recordId);
			if (!$permission && !is_null($permission))
			{
				return false;
			}
		}
		// In the absense of better information, revert to the component
permissions.
		return parent::canEditState($record);
	}
    
	/**
	 * Method override to check if you can edit an existing record.
	 *
	 * @param	array	$data	An array of input data.
	 * @param	string	$key	The name of the key for the primary key.
	 *
	 * @return	boolean
	 * @since	2.5
	 */
	protected function allowEdit($data = array(), $key = 'id')
	{
		// Check specific edit permission then general edit permission.

		return JFactory::getUser()->authorise('core.edit',
'com_reservation.plan.'. ((int) isset($data[$key]) ? $data[$key]
: 0)) or parent::allowEdit($data, $key);
	}
    
	/**
	 * Prepare and sanitise the table data prior to saving.
	 *
	 * @param   JTable  $table  A JTable object.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function prepareTable($table)
	{
		$date = JFactory::getDate();
		$user = JFactory::getUser();
		
		if (isset($table->name))
		{
			$table->name = htmlspecialchars_decode($table->name, ENT_QUOTES);
		}
		
		if (isset($table->alias) && empty($table->alias))
		{
			$table->generateAlias();
		}
		
		if (empty($table->id))
		{
			$table->created = $date->toSql();
			// set the user
			if ($table->created_by == 0 || empty($table->created_by))
			{
				$table->created_by = $user->id;
			}
			// Set ordering to the last item if not set
			if (empty($table->ordering))
			{
				$db = JFactory::getDbo();
				$query = $db->getQuery(true)
					->select('MAX(ordering)')
					->from($db->quoteName('#__reservation_plan'));
				$db->setQuery($query);
				$max = $db->loadResult();

				$table->ordering = $max + 1;
			}
		}
		else
		{
			$table->modified = $date->toSql();
			$table->modified_by = $user->id;
		}
        
		if (!empty($table->id))
		{
			// Increment the items version number.
			$table->version++;
		}
	}

	/**
	 * Method to get the data that should be injected in the form.
	 *
	 * @return  mixed  The data for the form.
	 *
	 * @since   1.6
	 */
	protected function loadFormData() 
	{
		// Check the session for previously entered form data.
		$data =
JFactory::getApplication()->getUserState('com_reservation.edit.plan.data',
array());

		if (empty($data))
		{
			$data = $this->getItem();
			// run the perprocess of the data
			$this->preprocessData('com_reservation.plan', $data);
		}

		return $data;
	}

	/**
	 * Method to get the unique fields of this table.
	 *
	 * @return  mixed  An array of field names, boolean false if none is set.
	 *
	 * @since   3.0
	 */
	protected function getUniqueFields()
	{
		return false;
	}
	
	/**
	 * Method to delete one or more records.
	 *
	 * @param   array  &$pks  An array of record primary keys.
	 *
	 * @return  boolean  True if successful, false if an error occurs.
	 *
	 * @since   12.2
	 */
	public function delete(&$pks)
	{
		if (!parent::delete($pks))
		{
			return false;
		}
		
		return true;
	}

	/**
	 * Method to change the published state of one or more records.
	 *
	 * @param   array    &$pks   A list of the primary keys to change.
	 * @param   integer  $value  The value of the published state.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   12.2
	 */
	public function publish(&$pks, $value = 1)
	{
		if (!parent::publish($pks, $value))
		{
			return false;
		}


/***[JCBGUI.admin_view.php_after_publish.112.$$$$]***/
        JPluginHelper::importPlugin('reservation');
        $dispatcher = JEventDispatcher::getInstance();
        $dispatcher->trigger('onReservationPlanStateChanged',
array($pks, $value));
/***[/JCBGUI$$$$]***/

		
		return true;
        }
    
	/**
	 * Method to perform batch operations on an item or a set of items.
	 *
	 * @param   array  $commands  An array of commands to perform.
	 * @param   array  $pks       An array of item ids.
	 * @param   array  $contexts  An array of item contexts.
	 *
	 * @return  boolean  Returns true on success, false on failure.
	 *
	 * @since   12.2
	 */
	public function batch($commands, $pks, $contexts)
	{
		// Sanitize ids.
		$pks = array_unique($pks);
		ArrayHelper::toInteger($pks);

		// Remove any values of zero.
		if (array_search(0, $pks, true))
		{
			unset($pks[array_search(0, $pks, true)]);
		}

		if (empty($pks))
		{
			$this->setError(JText::_('JGLOBAL_NO_ITEM_SELECTED'));
			return false;
		}

		$done = false;

		// Set some needed variables.
		$this->user			= JFactory::getUser();
		$this->table			= $this->getTable();
		$this->tableClassName		= get_class($this->table);
		$this->contentType		= new JUcmType;
		$this->type			=
$this->contentType->getTypeByTable($this->tableClassName);
		$this->canDo			= ReservationHelper::getActions('plan');
		$this->batchSet			= true;

		if (!$this->canDo->get('core.batch'))
		{
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_INSUFFICIENT_BATCH_INFORMATION'));
			return false;
		}
        
		if ($this->type == false)
		{
			$type = new JUcmType;
			$this->type = $type->getTypeByAlias($this->typeAlias);
		}

		$this->tagsObserver =
$this->table->getObserverOfClass('JTableObserverTags');

		if (!empty($commands['move_copy']))
		{
			$cmd = ArrayHelper::getValue($commands, 'move_copy',
'c');

			if ($cmd == 'c')
			{
				$result = $this->batchCopy($commands, $pks, $contexts);

				if (is_array($result))
				{
					foreach ($result as $old => $new)
					{
						$contexts[$new] = $contexts[$old];
					}
					$pks = array_values($result);
				}
				else
				{
					return false;
				}
			}
			elseif ($cmd == 'm' && !$this->batchMove($commands,
$pks, $contexts))
			{
				return false;
			}

			$done = true;
		}

		if (!$done)
		{
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_INSUFFICIENT_BATCH_INFORMATION'));

			return false;
		}

		// Clear the cache
		$this->cleanCache();

		return true;
	}

	/**
	 * Batch copy items to a new category or current.
	 *
	 * @param   integer  $values    The new values.
	 * @param   array    $pks       An array of row IDs.
	 * @param   array    $contexts  An array of item contexts.
	 *
	 * @return  mixed  An array of new IDs on success, boolean false on
failure.
	 *
	 * @since 12.2
	 */
	protected function batchCopy($values, $pks, $contexts)
	{
		if (empty($this->batchSet))
		{
			// Set some needed variables.
			$this->user 		= JFactory::getUser();
			$this->table 		= $this->getTable();
			$this->tableClassName	= get_class($this->table);
			$this->canDo		= ReservationHelper::getActions('plan');
		}

		if (!$this->canDo->get('core.create') ||
!$this->canDo->get('core.batch'))
		{
			return false;
		}

		// get list of unique fields
		$uniqueFields = $this->getUniqueFields();
		// remove move_copy from array
		unset($values['move_copy']);

		// make sure published is set
		if (!isset($values['published']))
		{
			$values['published'] = 0;
		}
		elseif (isset($values['published']) &&
!$this->canDo->get('core.edit.state'))
		{
				$values['published'] = 0;
		}

		$newIds = array();
		// Parent exists so let's proceed
		while (!empty($pks))
		{
			// Pop the first ID off the stack
			$pk = array_shift($pks);

			$this->table->reset();

			// only allow copy if user may edit this item.
			if (!$this->user->authorise('core.edit',
$contexts[$pk]))
			{
				// Not fatal error
				$this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND',
$pk));
				continue;
			}

			// Check that the row actually exists
			if (!$this->table->load($pk))
			{
				if ($error = $this->table->getError())
				{
					// Fatal error
					$this->setError($error);
					return false;
				}
				else
				{
					// Not fatal error
					$this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND',
$pk));
					continue;
				}
			}

			// Only for strings
			if (ReservationHelper::checkString($this->table->plantype)
&& !is_numeric($this->table->plantype))
			{
				$this->table->plantype =
$this->generateUnique('plantype',$this->table->plantype);
			}

			// insert all set values
			if (ReservationHelper::checkArray($values))
			{
				foreach ($values as $key => $value)
				{
					if (strlen($value) > 0 && isset($this->table->$key))
					{
						$this->table->$key = $value;
					}
				}
			}

			// update all unique fields
			if (ReservationHelper::checkArray($uniqueFields))
			{
				foreach ($uniqueFields as $uniqueField)
				{
					$this->table->$uniqueField =
$this->generateUnique($uniqueField,$this->table->$uniqueField);
				}
			}

			// Reset the ID because we are making a copy
			$this->table->id = 0;

			// TODO: Deal with ordering?
			// $this->table->ordering = 1;

			// Check the row.
			if (!$this->table->check())
			{
				$this->setError($this->table->getError());

				return false;
			}

			if (!empty($this->type))
			{
				$this->createTagsHelper($this->tagsObserver, $this->type, $pk,
$this->typeAlias, $this->table);
			}

			// Store the row.
			if (!$this->table->store())
			{
				$this->setError($this->table->getError());

				return false;
			}

			// Get the new item ID
			$newId = $this->table->get('id');

			// Add the new ID to the array
			$newIds[$pk] = $newId;
		}

		// Clean the cache
		$this->cleanCache();

		return $newIds;
	}

	/**
	 * Batch move items to a new category
	 *
	 * @param   integer  $value     The new category ID.
	 * @param   array    $pks       An array of row IDs.
	 * @param   array    $contexts  An array of item contexts.
	 *
	 * @return  boolean  True if successful, false otherwise and internal
error is set.
	 *
	 * @since 12.2
	 */
	protected function batchMove($values, $pks, $contexts)
	{
		if (empty($this->batchSet))
		{
			// Set some needed variables.
			$this->user		= JFactory::getUser();
			$this->table		= $this->getTable();
			$this->tableClassName	= get_class($this->table);
			$this->canDo		= ReservationHelper::getActions('plan');
		}

		if (!$this->canDo->get('core.edit') &&
!$this->canDo->get('core.batch'))
		{
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT'));
			return false;
		}

		// make sure published only updates if user has the permission.
		if (isset($values['published']) &&
!$this->canDo->get('core.edit.state'))
		{
			unset($values['published']);
		}
		// remove move_copy from array
		unset($values['move_copy']);

		// Parent exists so we proceed
		foreach ($pks as $pk)
		{
			if (!$this->user->authorise('core.edit',
$contexts[$pk]))
			{
				$this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT'));
				return false;
			}

			// Check that the row actually exists
			if (!$this->table->load($pk))
			{
				if ($error = $this->table->getError())
				{
					// Fatal error
					$this->setError($error);
					return false;
				}
				else
				{
					// Not fatal error
					$this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND',
$pk));
					continue;
				}
			}

			// insert all set values.
			if (ReservationHelper::checkArray($values))
			{
				foreach ($values as $key => $value)
				{
					// Do special action for access.
					if ('access' === $key && strlen($value) > 0)
					{
						$this->table->$key = $value;
					}
					elseif (strlen($value) > 0 &&
isset($this->table->$key))
					{
						$this->table->$key = $value;
					}
				}
			}


			// Check the row.
			if (!$this->table->check())
			{
				$this->setError($this->table->getError());

				return false;
			}

			if (!empty($this->type))
			{
				$this->createTagsHelper($this->tagsObserver, $this->type, $pk,
$this->typeAlias, $this->table);
			}

			// Store the row.
			if (!$this->table->store())
			{
				$this->setError($this->table->getError());

				return false;
			}
		}

		// Clean the cache
		$this->cleanCache();

		return true;
	}
	
	/**
	 * Method to save the form data.
	 *
	 * @param   array  $data  The form data.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   1.6
	 */
	public function save($data)
	{
		$input	= JFactory::getApplication()->input;
		$filter	= JFilterInput::getInstance();
        
		// set the metadata to the Item Data
		if (isset($data['metadata']) &&
isset($data['metadata']['author']))
		{
			$data['metadata']['author'] =
$filter->clean($data['metadata']['author'],
'TRIM');
            
			$metadata = new JRegistry;
			$metadata->loadArray($data['metadata']);
			$data['metadata'] = (string) $metadata;
		}
        
		// Set the Params Items to data
		if (isset($data['params']) &&
is_array($data['params']))
		{
			$params = new JRegistry;
			$params->loadArray($data['params']);
			$data['params'] = (string) $params;
		}

		// Alter the unique field for save as copy
		if ($input->get('task') === 'save2copy')
		{
			// Automatic handling of other unique fields
			$uniqueFields = $this->getUniqueFields();
			if (ReservationHelper::checkArray($uniqueFields))
			{
				foreach ($uniqueFields as $uniqueField)
				{
					$data[$uniqueField] =
$this->generateUnique($uniqueField,$data[$uniqueField]);
				}
			}
		}
		
		if (parent::save($data))
		{
			return true;
		}
		return false;
	}
	
	/**
	 * Method to generate a unique value.
	 *
	 * @param   string  $field name.
	 * @param   string  $value data.
	 *
	 * @return  string  New value.
	 *
	 * @since   3.0
	 */
	protected function generateUnique($field,$value)
	{

		// set field value unique
		$table = $this->getTable();

		while ($table->load(array($field => $value)))
		{
			$value = StringHelper::increment($value);
		}

		return $value;
	}

	/**
	 * Method to change the title
	 *
	 * @param   string   $title   The title.
	 *
	 * @return	array  Contains the modified title and alias.
	 *
	 */
	protected function _generateNewTitle($title)
	{

		// Alter the title
		$table = $this->getTable();

		while ($table->load(array('title' => $title)))
		{
			$title = StringHelper::increment($title);
		}

		return $title;
	}
}
PK4~�[�x't66models/plans.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		plans.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Utilities\ArrayHelper;

/**
 * Plans Model
 */
class ReservationModelPlans extends JModelList
{
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
        {
			$config['filter_fields'] = array(
				'a.id','id',
				'a.published','published',
				'a.access','access',
				'a.ordering','ordering',
				'a.created_by','created_by',
				'a.modified_by','modified_by',
				'a.time','time',
				'a.price','price',
				'a.waitingtime','waitingtime'
			);
		}

		parent::__construct($config);
	}

	/**
	 * Method to auto-populate the model state.
	 *
	 * Note. Calling getState in this method will result in recursion.
	 *
	 * @param   string  $ordering   An optional ordering field.
	 * @param   string  $direction  An optional direction (asc|desc).
	 *
	 * @return  void
	 *
	 */
	protected function populateState($ordering = null, $direction = null)
	{
		$app = JFactory::getApplication();

		// Adjust the context to support modal layouts.
		if ($layout = $app->input->get('layout'))
		{
			$this->context .= '.' . $layout;
		}

		// Check if the form was submitted
		$formSubmited =
$app->input->post->get('form_submited');

		$access = $this->getUserStateFromRequest($this->context .
'.filter.access', 'filter_access', 0, 'int');
		if ($formSubmited)
		{
			$access = $app->input->post->get('access');
			$this->setState('filter.access', $access);
		}

		$published = $this->getUserStateFromRequest($this->context .
'.filter.published', 'filter_published', '');
		$this->setState('filter.published', $published);

		$created_by = $this->getUserStateFromRequest($this->context .
'.filter.created_by', 'filter_created_by',
'');
		$this->setState('filter.created_by', $created_by);

		$created = $this->getUserStateFromRequest($this->context .
'.filter.created', 'filter_created');
		$this->setState('filter.created', $created);

		$sorting = $this->getUserStateFromRequest($this->context .
'.filter.sorting', 'filter_sorting', 0,
'int');
		$this->setState('filter.sorting', $sorting);

		$search = $this->getUserStateFromRequest($this->context .
'.filter.search', 'filter_search');
		$this->setState('filter.search', $search);

		$time = $this->getUserStateFromRequest($this->context .
'.filter.time', 'filter_time');
		if ($formSubmited)
		{
			$time = $app->input->post->get('time');
			$this->setState('filter.time', $time);
		}

		$price = $this->getUserStateFromRequest($this->context .
'.filter.price', 'filter_price');
		if ($formSubmited)
		{
			$price = $app->input->post->get('price');
			$this->setState('filter.price', $price);
		}

		$waitingtime = $this->getUserStateFromRequest($this->context .
'.filter.waitingtime', 'filter_waitingtime');
		if ($formSubmited)
		{
			$waitingtime = $app->input->post->get('waitingtime');
			$this->setState('filter.waitingtime', $waitingtime);
		}

		// List state information.
		parent::populateState($ordering, $direction);
	}
	
	/**
	 * Method to get an array of data items.
	 *
	 * @return  mixed  An array of data items on success, false on failure.
	 */
	public function getItems()
	{
		// check in items
		$this->checkInNow();

		// load parent items
		$items = parent::getItems();

		// set selection value to a translatable value
		if (ReservationHelper::checkArray($items))
		{
			foreach ($items as $nr => &$item)
			{
				// convert plantype
				$item->plantype = $this->selectionTranslation($item->plantype,
'plantype');
			}
		}


/***[JCBGUI.admin_view.php_getitems_after_all.112.$$$$]***/
        $db = JFactory::getDbo();
        $query = $db->getQuery(true);

        $query
           
->select($db->quoteName(array('a.id','b.name'),array('consultantId','consultantname')))
           
->from($db->quoteName('#__reservation_consultant',
'a'))
            ->join('INNER',
$db->quoteName('#__users', 'b') . ' ON ' .
$db->quoteName('a.userId') . ' = ' .
$db->quoteName('b.id'));

        $db->setQuery($query);


        $result = $db->loadAssocList('consultantId');

        foreach ($items as &$item) {
            $item->consultantid_id=
$result[$item->consultantid_id]['consultantname'];
        }/***[/JCBGUI$$$$]***/

        
		// return items
		return $items;
	}

	/**
	 * Method to convert selection values to translatable string.
	 *
	 * @return translatable string
	 */
	public function selectionTranslation($value,$name)
	{
		// Array of plantype language strings
		if ($name === 'plantype')
		{
			$plantypeArray = array(
				1 => 'COM_RESERVATION_PLAN_TEL',
				2 => 'COM_RESERVATION_PLAN_CHAT',
				3 => 'COM_RESERVATION_PLAN_VIDEO'
			);
			// Now check if value is found in this array
			if (isset($plantypeArray[$value]) &&
ReservationHelper::checkString($plantypeArray[$value]))
			{
				return $plantypeArray[$value];
			}
		}
		return $value;
	}
	
	/**
	 * Method to build an SQL query to load the list data.
	 *
	 * @return	string	An SQL query
	 */
	protected function getListQuery()
	{
		// Get the user object.
		$user = JFactory::getUser();
		// Create a new query object.
		$db = JFactory::getDBO();
		$query = $db->getQuery(true);

		// Select some fields
		$query->select('a.*');

		// From the reservation_item table
		$query->from($db->quoteName('#__reservation_plan',
'a'));

		// From the reservation_consultant table.
		$query->select($db->quoteName('g.id','consultantid_id'));
		$query->join('LEFT',
$db->quoteName('#__reservation_consultant', 'g') .
' ON (' . $db->quoteName('a.consultantid') . '
= ' . $db->quoteName('g.id') . ')');

		// Filter by published state
		$published = $this->getState('filter.published');
		if (is_numeric($published))
		{
			$query->where('a.published = ' . (int) $published);
		}
		elseif ($published === '')
		{
			$query->where('(a.published = 0 OR a.published = 1)');
		}

		// Join over the asset groups.
		$query->select('ag.title AS access_level');
		$query->join('LEFT', '#__viewlevels AS ag ON ag.id =
a.access');
		// Filter by access level.
		$_access = $this->getState('filter.access');
		if ($_access && is_numeric($_access))
		{
			$query->where('a.access = ' . (int) $_access);
		}
		elseif (ReservationHelper::checkArray($_access))
		{
			// Secure the array for the query
			$_access = ArrayHelper::toInteger($_access);
			// Filter by the Access Array.
			$query->where('a.access IN (' . implode(',',
$_access) . ')');
		}
		// Implement View Level Access
		if (!$user->authorise('core.options',
'com_reservation'))
		{
			$groups = implode(',', $user->getAuthorisedViewLevels());
			$query->where('a.access IN (' . $groups . ')');
		}

		// Add the list ordering clause.
		$orderCol = $this->state->get('list.ordering',
'a.id');
		$orderDirn = $this->state->get('list.direction',
'desc');
		if ($orderCol != '')
		{
			$query->order($db->escape($orderCol . ' ' .
$orderDirn));
		}

		return $query;
	}

	/**
	 * Method to get list export data.
	 *
	 * @param   array  $pks  The ids of the items to get
	 * @param   JUser  $user  The user making the request
	 *
	 * @return mixed  An array of data items on success, false on failure.
	 */
	public function getExportData($pks, $user = null)
	{
		// setup the query
		if (($pks_size = ReservationHelper::checkArray($pks)) !== false ||
'bulk' === $pks)
		{
			// Set a value to know this is export method. (USE IN CUSTOM CODE TO
ALTER OUTCOME)
			$_export = true;
			// Get the user object if not set.
			if (!isset($user) || !ReservationHelper::checkObject($user))
			{
				$user = JFactory::getUser();
			}
			// Create a new query object.
			$db = JFactory::getDBO();
			$query = $db->getQuery(true);

			// Select some fields
			$query->select('a.*');

			// From the reservation_plan table
			$query->from($db->quoteName('#__reservation_plan',
'a'));
			// The bulk export path
			if ('bulk' === $pks)
			{
				$query->where('a.id > 0');
			}
			// A large array of ID's will not work out well
			elseif ($pks_size > 500)
			{
				// Use lowest ID
				$query->where('a.id >= ' . (int) min($pks));
				// Use highest ID
				$query->where('a.id <= ' . (int) max($pks));
			}
			// The normal default path
			else
			{
				$query->where('a.id IN (' . implode(',',$pks) .
')');
			}
			// Implement View Level Access
			if (!$user->authorise('core.options',
'com_reservation'))
			{
				$groups = implode(',', $user->getAuthorisedViewLevels());
				$query->where('a.access IN (' . $groups . ')');
			}

			// Order the results by ordering
			$query->order('a.ordering  ASC');

			// Load the items
			$db->setQuery($query);
			$db->execute();
			if ($db->getNumRows())
			{
				$items = $db->loadObjectList();

				// Set values to display correctly.
				if (ReservationHelper::checkArray($items))
				{
					foreach ($items as $nr => &$item)
					{
						// unset the values we don't want exported.
						unset($item->asset_id);
						unset($item->checked_out);
						unset($item->checked_out_time);
					}
				}
				// Add headers to items array.
				$headers = $this->getExImPortHeaders();
				if (ReservationHelper::checkObject($headers))
				{
					array_unshift($items,$headers);
				}

		
/***[JCBGUI.admin_view.php_getitems_after_all.112.$$$$]***/
        $db = JFactory::getDbo();
        $query = $db->getQuery(true);

        $query
           
->select($db->quoteName(array('a.id','b.name'),array('consultantId','consultantname')))
           
->from($db->quoteName('#__reservation_consultant',
'a'))
            ->join('INNER',
$db->quoteName('#__users', 'b') . ' ON ' .
$db->quoteName('a.userId') . ' = ' .
$db->quoteName('b.id'));

        $db->setQuery($query);


        $result = $db->loadAssocList('consultantId');

        foreach ($items as &$item) {
            $item->consultantid_id=
$result[$item->consultantid_id]['consultantname'];
        }/***[/JCBGUI$$$$]***/

				return $items;
			}
		}
		return false;
	}

	/**
	* Method to get header.
	*
	* @return mixed  An array of data items on success, false on failure.
	*/
	public function getExImPortHeaders()
	{
		// Get a db connection.
		$db = JFactory::getDbo();
		// get the columns
		$columns = $db->getTableColumns("#__reservation_plan");
		if (ReservationHelper::checkArray($columns))
		{
			// remove the headers you don't import/export.
			unset($columns['asset_id']);
			unset($columns['checked_out']);
			unset($columns['checked_out_time']);
			$headers = new stdClass();
			foreach ($columns as $column => $type)
			{
				$headers->{$column} = $column;
			}
			return $headers;
		}
		return false;
	}
	
	/**
	 * Method to get a store id based on model configuration state.
	 *
	 * @return  string  A store id.
	 *
	 */
	protected function getStoreId($id = '')
	{
		// Compile the store id.
		$id .= ':' . $this->getState('filter.id');
		$id .= ':' . $this->getState('filter.search');
		$id .= ':' . $this->getState('filter.published');
		// Check if the value is an array
		$_access = $this->getState('filter.access');
		if (ReservationHelper::checkArray($_access))
		{
			$id .= ':' . implode(':', $_access);
		}
		// Check if this is only an number or string
		elseif (is_numeric($_access)
		 || ReservationHelper::checkString($_access))
		{
			$id .= ':' . $_access;
		}
		$id .= ':' . $this->getState('filter.ordering');
		$id .= ':' . $this->getState('filter.created_by');
		$id .= ':' .
$this->getState('filter.modified_by');
		$id .= ':' . $this->getState('filter.time');
		$id .= ':' . $this->getState('filter.price');
		$id .= ':' .
$this->getState('filter.waitingtime');

		return parent::getStoreId($id);
	}

	/**
	 * Build an SQL query to checkin all items left checked out longer then a
set time.
	 *
	 * @return  a bool
	 *
	 */
	protected function checkInNow()
	{
		// Get set check in time
		$time =
JComponentHelper::getParams('com_reservation')->get('check_in');

		if ($time)
		{

			// Get a db connection.
			$db = JFactory::getDbo();
			// reset query
			$query = $db->getQuery(true);
			$query->select('*');
			$query->from($db->quoteName('#__reservation_plan'));
			$db->setQuery($query);
			$db->execute();
			if ($db->getNumRows())
			{
				// Get Yesterdays date
				$date = JFactory::getDate()->modify($time)->toSql();
				// reset query
				$query = $db->getQuery(true);

				// Fields to update.
				$fields = array(
					$db->quoteName('checked_out_time') .
'=\'0000-00-00 00:00:00\'',
					$db->quoteName('checked_out') . '=0'
				);

				// Conditions for which records should be updated.
				$conditions = array(
					$db->quoteName('checked_out') . '!=0', 
					$db->quoteName('checked_out_time') .
'<\''.$date.'\''
				);

				// Check table
				$query->update($db->quoteName('#__reservation_plan'))->set($fields)->where($conditions);


				$db->setQuery($query);

				$db->execute();
			}
		}

		return false;
	}
}
PK4~�[����&�&models/reservation.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		reservation.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

/**
 * Reservation Model
 */
class ReservationModelReservation extends JModelList
{
	public function getIcons()
	{
		// load user for access menus
		$user = JFactory::getUser();
		// reset icon array
		$icons  = array();
		// view groups array
		$viewGroups = array(
			'main' => array('png.reserves',
'png.bbbclasses', 'png.doctors',
'png.doctors.catid_qpo0O0oqp_com_reservation',
'png.appointments', 'png.capitals',
'png.comments', 'png.sessions', 'png.sicks',
'png.plans', 'png.consultants',
'png.consultants.catid_qpo0O0oqp_com_reservation',
'png.messages')
		);
		// view access array
		$viewAccess = array(
			'reserves.access' => 'reserve.access',
			'reserve.access' => 'reserve.access',
			'reserves.submenu' => 'reserve.submenu',
			'reserves.dashboard_list' =>
'reserve.dashboard_list',
			'bbbclasses.access' => 'bbbclass.access',
			'bbbclass.access' => 'bbbclass.access',
			'bbbclasses.submenu' => 'bbbclass.submenu',
			'bbbclasses.dashboard_list' =>
'bbbclass.dashboard_list',
			'doctors.access' => 'doctor.access',
			'doctor.access' => 'doctor.access',
			'doctors.submenu' => 'doctor.submenu',
			'doctors.dashboard_list' =>
'doctor.dashboard_list',
			'appointments.access' => 'appointment.access',
			'appointment.access' => 'appointment.access',
			'appointments.submenu' => 'appointment.submenu',
			'appointments.dashboard_list' =>
'appointment.dashboard_list',
			'capitals.access' => 'capital.access',
			'capital.access' => 'capital.access',
			'capitals.submenu' => 'capital.submenu',
			'capitals.dashboard_list' =>
'capital.dashboard_list',
			'comments.access' => 'comment.access',
			'comment.access' => 'comment.access',
			'comments.submenu' => 'comment.submenu',
			'comments.dashboard_list' =>
'comment.dashboard_list',
			'sessions.access' => 'session.access',
			'session.access' => 'session.access',
			'sessions.submenu' => 'session.submenu',
			'sessions.dashboard_list' =>
'session.dashboard_list',
			'sicks.access' => 'sick.access',
			'sick.access' => 'sick.access',
			'sicks.submenu' => 'sick.submenu',
			'sicks.dashboard_list' => 'sick.dashboard_list',
			'plans.access' => 'plan.access',
			'plan.access' => 'plan.access',
			'plans.submenu' => 'plan.submenu',
			'plans.dashboard_list' => 'plan.dashboard_list',
			'consultants.access' => 'consultant.access',
			'consultant.access' => 'consultant.access',
			'consultants.submenu' => 'consultant.submenu',
			'consultants.dashboard_list' =>
'consultant.dashboard_list',
			'messages.access' => 'message.access',
			'message.access' => 'message.access',
			'messages.submenu' => 'message.submenu',
			'messages.dashboard_list' =>
'message.dashboard_list');
		// loop over the $views
		foreach($viewGroups as $group => $views)
		{
			$i = 0;
			if (ReservationHelper::checkArray($views))
			{
				foreach($views as $view)
				{
					$add = false;
					// external views (links)
					if (strpos($view,'||') !== false)
					{
						$dwd = explode('||', $view);
						if (count($dwd) == 3)
						{
							list($type, $name, $url) = $dwd;
							$viewName 	= $name;
							$alt 		= $name;
							$url 		= $url;
							$image 		= $name . '.' . $type;
							$name 		= 'COM_RESERVATION_DASHBOARD_' .
ReservationHelper::safeString($name,'U');
						}
					}
					// internal views
					elseif (strpos($view,'.') !== false)
					{
						$dwd = explode('.', $view);
						if (count($dwd) == 3)
						{
							list($type, $name, $action) = $dwd;
						}
						elseif (count($dwd) == 2)
						{
							list($type, $name) = $dwd;
							$action = false;
						}
						if ($action)
						{
							$viewName = $name;
							switch($action)
							{
								case 'add':
									$url	= 'index.php?option=com_reservation&view=' .
$name . '&layout=edit';
									$image	= $name . '_' . $action.  '.' . $type;
									$alt	= $name . '&nbsp;' . $action;
									$name	=
'COM_RESERVATION_DASHBOARD_'.ReservationHelper::safeString($name,'U').'_ADD';
									$add	= true;
								break;
								default:
									// check for new convention (more stable)
									if (strpos($action, '_qpo0O0oqp_') !== false)
									{
										list($action, $extension) = (array)
explode('_qpo0O0oqp_', $action);
										$extension = str_replace('_po0O0oq_', '.',
$extension);
									}
									else
									{
										$extension = 'com_reservation.' . $name;
									}
									$url	=
'index.php?option=com_categories&view=categories&extension='
. $extension;
									$image	= $name . '_' . $action . '.' . $type;
									$alt	= $viewName . '&nbsp;' . $action;
									$name	= 'COM_RESERVATION_DASHBOARD_' .
ReservationHelper::safeString($name,'U') . '_' .
ReservationHelper::safeString($action,'U');
								break;
							}
						}
						else
						{
							$viewName 	= $name;
							$alt 		= $name;
							$url 		= 'index.php?option=com_reservation&view=' .
$name;
							$image 		= $name . '.' . $type;
							$name 		= 'COM_RESERVATION_DASHBOARD_' .
ReservationHelper::safeString($name,'U');
							$hover		= false;
						}
					}
					else
					{
						$viewName 	= $view;
						$alt 		= $view;
						$url 		= 'index.php?option=com_reservation&view=' .
$view;
						$image 		= $view . '.png';
						$name 		= ucwords($view).'<br /><br />';
						$hover		= false;
					}
					// first make sure the view access is set
					if (ReservationHelper::checkArray($viewAccess))
					{
						// setup some defaults
						$dashboard_add = false;
						$dashboard_list = false;
						$accessTo = '';
						$accessAdd = '';
						// access checking start
						$accessCreate = (isset($viewAccess[$viewName.'.create'])) ?
ReservationHelper::checkString($viewAccess[$viewName.'.create']):false;
						$accessAccess = (isset($viewAccess[$viewName.'.access'])) ?
ReservationHelper::checkString($viewAccess[$viewName.'.access']):false;
						// set main controllers
						$accessDashboard_add =
(isset($viewAccess[$viewName.'.dashboard_add'])) ?
ReservationHelper::checkString($viewAccess[$viewName.'.dashboard_add']):false;
						$accessDashboard_list =
(isset($viewAccess[$viewName.'.dashboard_list'])) ?
ReservationHelper::checkString($viewAccess[$viewName.'.dashboard_list']):false;
						// check for adding access
						if ($add && $accessCreate)
						{
							$accessAdd = $viewAccess[$viewName.'.create'];
						}
						elseif ($add)
						{
							$accessAdd = 'core.create';
						}
						// check if access to view is set
						if ($accessAccess)
						{
							$accessTo = $viewAccess[$viewName.'.access'];
						}
						// set main access controllers
						if ($accessDashboard_add)
						{
							$dashboard_add	=
$user->authorise($viewAccess[$viewName.'.dashboard_add'],
'com_reservation');
						}
						if ($accessDashboard_list)
						{
							$dashboard_list =
$user->authorise($viewAccess[$viewName.'.dashboard_list'],
'com_reservation');
						}
						if (ReservationHelper::checkString($accessAdd) &&
ReservationHelper::checkString($accessTo))
						{
							// check access
							if($user->authorise($accessAdd, 'com_reservation')
&& $user->authorise($accessTo, 'com_reservation')
&& $dashboard_add)
							{
								$icons[$group][$i]			= new StdClass;
								$icons[$group][$i]->url 	= $url;
								$icons[$group][$i]->name 	= $name;
								$icons[$group][$i]->image 	= $image;
								$icons[$group][$i]->alt 	= $alt;
							}
						}
						elseif (ReservationHelper::checkString($accessTo))
						{
							// check access
							if($user->authorise($accessTo, 'com_reservation')
&& $dashboard_list)
							{
								$icons[$group][$i]			= new StdClass;
								$icons[$group][$i]->url 	= $url;
								$icons[$group][$i]->name 	= $name;
								$icons[$group][$i]->image 	= $image;
								$icons[$group][$i]->alt 	= $alt;
							}
						}
						elseif (ReservationHelper::checkString($accessAdd))
						{
							// check access
							if($user->authorise($accessAdd, 'com_reservation')
&& $dashboard_add)
							{
								$icons[$group][$i]			= new StdClass;
								$icons[$group][$i]->url 	= $url;
								$icons[$group][$i]->name 	= $name;
								$icons[$group][$i]->image 	= $image;
								$icons[$group][$i]->alt 	= $alt;
							}
						}
						else
						{
							$icons[$group][$i]			= new StdClass;
							$icons[$group][$i]->url 	= $url;
							$icons[$group][$i]->name 	= $name;
							$icons[$group][$i]->image 	= $image;
							$icons[$group][$i]->alt 	= $alt;
						}
					}
					else
					{
						$icons[$group][$i]			= new StdClass;
						$icons[$group][$i]->url 	= $url;
						$icons[$group][$i]->name 	= $name;
						$icons[$group][$i]->image 	= $image;
						$icons[$group][$i]->alt 	= $alt;
					}
					$i++;
				}
			}
			else
			{
					$icons[$group][$i] = false;
			}
		}
		return $icons;
	}
}
PK4~�[g[ᙔU�Umodels/reserve.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		reserve.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Registry\Registry;
use Joomla\String\StringHelper;
use Joomla\Utilities\ArrayHelper;

/**
 * Reservation Reserve Model
 */
class ReservationModelReserve extends JModelAdmin
{
	/**
	 * The tab layout fields array.
	 *
	 * @var      array
	 */
	protected $tabLayoutFields = array(
		'details' => array(
			'left' => array(
				'sickid',
				'full_price',
				'doctor_quota',
				'system_quota'
			),
			'right' => array(
				'appointmentid',
				'status',
				'payment_method',
				'tracking_code'
			)
		)
	);

	/**
	 * @var        string    The prefix to use with controller messages.
	 * @since   1.6
	 */
	protected $text_prefix = 'COM_RESERVATION';

	/**
	 * The type alias for this content type.
	 *
	 * @var      string
	 * @since    3.2
	 */
	public $typeAlias = 'com_reservation.reserve';

	/**
	 * Returns a Table object, always creating it
	 *
	 * @param   type    $type    The table type to instantiate
	 * @param   string  $prefix  A prefix for the table class name. Optional.
	 * @param   array   $config  Configuration array for model. Optional.
	 *
	 * @return  JTable  A database object
	 *
	 * @since   1.6
	 */
	public function getTable($type = 'reserve', $prefix =
'ReservationTable', $config = array())
	{
		// add table path for when model gets used from other component
		$this->addTablePath(JPATH_ADMINISTRATOR .
'/components/com_reservation/tables');
		// get instance of the table
		return JTable::getInstance($type, $prefix, $config);
	}
    
	/**
	 * Method to get a single record.
	 *
	 * @param   integer  $pk  The id of the primary key.
	 *
	 * @return  mixed  Object on success, false on failure.
	 *
	 * @since   1.6
	 */
	public function getItem($pk = null)
	{
		if ($item = parent::getItem($pk))
		{
			if (!empty($item->params) && !is_array($item->params))
			{
				// Convert the params field to an array.
				$registry = new Registry;
				$registry->loadString($item->params);
				$item->params = $registry->toArray();
			}

			if (!empty($item->metadata))
			{
				// Convert the metadata field to an array.
				$registry = new Registry;
				$registry->loadString($item->metadata);
				$item->metadata = $registry->toArray();
			}
		}

		return $item;
	}

	/**
	 * Method to get the record form.
	 *
	 * @param   array    $data      Data for the form.
	 * @param   boolean  $loadData  True if the form is to load its own data
(default case), false if not.
	 * @param   array    $options   Optional array of options for the form
creation.
	 *
	 * @return  mixed  A JForm object on success, false on failure
	 *
	 * @since   1.6
	 */
	public function getForm($data = array(), $loadData = true, $options =
array('control' => 'jform'))
	{
		// set load data option
		$options['load_data'] = $loadData;
		// check if xpath was set in options
		$xpath = false;
		if (isset($options['xpath']))
		{
			$xpath = $options['xpath'];
			unset($options['xpath']);
		}
		// check if clear form was set in options
		$clear = false;
		if (isset($options['clear']))
		{
			$clear = $options['clear'];
			unset($options['clear']);
		}

		// Get the form.
		$form = $this->loadForm('com_reservation.reserve',
'reserve', $options, $clear, $xpath);

		if (empty($form))
		{
			return false;
		}

		$jinput = JFactory::getApplication()->input;

		// The front end calls this model and uses a_id to avoid id clashes so we
need to check for that first.
		if ($jinput->get('a_id'))
		{
			$id = $jinput->get('a_id', 0, 'INT');
		}
		// The back end uses id so we use that the rest of the time and set it to
0 by default.
		else
		{
			$id = $jinput->get('id', 0, 'INT');
		}

		$user = JFactory::getUser();

		// Check for existing item.
		// Modify the form based on Edit State access controls.
		if ($id != 0 &&
(!$user->authorise('core.edit.state',
'com_reservation.reserve.' . (int) $id))
			|| ($id == 0 &&
!$user->authorise('core.edit.state',
'com_reservation')))
		{
			// Disable fields for display.
			$form->setFieldAttribute('ordering', 'disabled',
'true');
			$form->setFieldAttribute('published', 'disabled',
'true');
			// Disable fields while saving.
			$form->setFieldAttribute('ordering', 'filter',
'unset');
			$form->setFieldAttribute('published', 'filter',
'unset');
		}
		// If this is a new item insure the greated by is set.
		if (0 == $id)
		{
			// Set the created_by to this user
			$form->setValue('created_by', null, $user->id);
		}
		// Modify the form based on Edit Creaded By access controls.
		if (!$user->authorise('core.edit.created_by',
'com_reservation'))
		{
			// Disable fields for display.
			$form->setFieldAttribute('created_by',
'disabled', 'true');
			// Disable fields for display.
			$form->setFieldAttribute('created_by',
'readonly', 'true');
			// Disable fields while saving.
			$form->setFieldAttribute('created_by', 'filter',
'unset');
		}
		// Modify the form based on Edit Creaded Date access controls.
		if (!$user->authorise('core.edit.created',
'com_reservation'))
		{
			// Disable fields for display.
			$form->setFieldAttribute('created', 'disabled',
'true');
			// Disable fields while saving.
			$form->setFieldAttribute('created', 'filter',
'unset');
		}
		// Only load these values if no id is found
		if (0 == $id)
		{
			// Set redirected view name
			$redirectedView = $jinput->get('ref', null,
'STRING');
			// Set field name (or fall back to view name)
			$redirectedField = $jinput->get('field', $redirectedView,
'STRING');
			// Set redirected view id
			$redirectedId = $jinput->get('refid', 0, 'INT');
			// Set field id (or fall back to redirected view id)
			$redirectedValue = $jinput->get('field_id', $redirectedId,
'INT');
			if (0 != $redirectedValue && $redirectedField)
			{
				// Now set the local-redirected field default value
				$form->setValue($redirectedField, null, $redirectedValue);
			}
		}
		return $form;
	}

	/**
	 * Method to get the script that have to be included on the form
	 *
	 * @return string	script files
	 */
	public function getScript()
	{
		return 'media/com_reservation/js/reserve.js';
	}
    
	/**
	 * Method to test whether a record can be deleted.
	 *
	 * @param   object  $record  A record object.
	 *
	 * @return  boolean  True if allowed to delete the record. Defaults to the
permission set in the component.
	 *
	 * @since   1.6
	 */
	protected function canDelete($record)
	{
		if (!empty($record->id))
		{
			if ($record->published != -2)
			{
				return;
			}

			$user = JFactory::getUser();
			// The record has been set. Check the record permissions.
			return $user->authorise('core.delete',
'com_reservation.reserve.' . (int) $record->id);
		}
		return false;
	}

	/**
	 * Method to test whether a record can have its state edited.
	 *
	 * @param   object  $record  A record object.
	 *
	 * @return  boolean  True if allowed to change the state of the record.
Defaults to the permission set in the component.
	 *
	 * @since   1.6
	 */
	protected function canEditState($record)
	{
		$user = JFactory::getUser();
		$recordId = (!empty($record->id)) ? $record->id : 0;

		if ($recordId)
		{
			// The record has been set. Check the record permissions.
			$permission = $user->authorise('core.edit.state',
'com_reservation.reserve.' . (int) $recordId);
			if (!$permission && !is_null($permission))
			{
				return false;
			}
		}
		// In the absense of better information, revert to the component
permissions.
		return parent::canEditState($record);
	}
    
	/**
	 * Method override to check if you can edit an existing record.
	 *
	 * @param	array	$data	An array of input data.
	 * @param	string	$key	The name of the key for the primary key.
	 *
	 * @return	boolean
	 * @since	2.5
	 */
	protected function allowEdit($data = array(), $key = 'id')
	{
		// Check specific edit permission then general edit permission.

		return JFactory::getUser()->authorise('core.edit',
'com_reservation.reserve.'. ((int) isset($data[$key]) ?
$data[$key] : 0)) or parent::allowEdit($data, $key);
	}
    
	/**
	 * Prepare and sanitise the table data prior to saving.
	 *
	 * @param   JTable  $table  A JTable object.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function prepareTable($table)
	{
		$date = JFactory::getDate();
		$user = JFactory::getUser();
		
		if (isset($table->name))
		{
			$table->name = htmlspecialchars_decode($table->name, ENT_QUOTES);
		}
		
		if (isset($table->alias) && empty($table->alias))
		{
			$table->generateAlias();
		}
		
		if (empty($table->id))
		{
			$table->created = $date->toSql();
			// set the user
			if ($table->created_by == 0 || empty($table->created_by))
			{
				$table->created_by = $user->id;
			}
			// Set ordering to the last item if not set
			if (empty($table->ordering))
			{
				$db = JFactory::getDbo();
				$query = $db->getQuery(true)
					->select('MAX(ordering)')
					->from($db->quoteName('#__reservation_reserve'));
				$db->setQuery($query);
				$max = $db->loadResult();

				$table->ordering = $max + 1;
			}
		}
		else
		{
			$table->modified = $date->toSql();
			$table->modified_by = $user->id;
		}
        
		if (!empty($table->id))
		{
			// Increment the items version number.
			$table->version++;
		}
	}

	/**
	 * Method to get the data that should be injected in the form.
	 *
	 * @return  mixed  The data for the form.
	 *
	 * @since   1.6
	 */
	protected function loadFormData() 
	{
		// Check the session for previously entered form data.
		$data =
JFactory::getApplication()->getUserState('com_reservation.edit.reserve.data',
array());

		if (empty($data))
		{
			$data = $this->getItem();
			// run the perprocess of the data
			$this->preprocessData('com_reservation.reserve', $data);
		}

		return $data;
	}

	/**
	 * Method to get the unique fields of this table.
	 *
	 * @return  mixed  An array of field names, boolean false if none is set.
	 *
	 * @since   3.0
	 */
	protected function getUniqueFields()
	{
		return false;
	}
	
	/**
	 * Method to delete one or more records.
	 *
	 * @param   array  &$pks  An array of record primary keys.
	 *
	 * @return  boolean  True if successful, false if an error occurs.
	 *
	 * @since   12.2
	 */
	public function delete(&$pks)
	{
		if (!parent::delete($pks))
		{
			return false;
		}
		
		return true;
	}

	/**
	 * Method to change the published state of one or more records.
	 *
	 * @param   array    &$pks   A list of the primary keys to change.
	 * @param   integer  $value  The value of the published state.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   12.2
	 */
	public function publish(&$pks, $value = 1)
	{
		if (!parent::publish($pks, $value))
		{
			return false;
		}
		
		return true;
        }
    
	/**
	 * Method to perform batch operations on an item or a set of items.
	 *
	 * @param   array  $commands  An array of commands to perform.
	 * @param   array  $pks       An array of item ids.
	 * @param   array  $contexts  An array of item contexts.
	 *
	 * @return  boolean  Returns true on success, false on failure.
	 *
	 * @since   12.2
	 */
	public function batch($commands, $pks, $contexts)
	{
		// Sanitize ids.
		$pks = array_unique($pks);
		ArrayHelper::toInteger($pks);

		// Remove any values of zero.
		if (array_search(0, $pks, true))
		{
			unset($pks[array_search(0, $pks, true)]);
		}

		if (empty($pks))
		{
			$this->setError(JText::_('JGLOBAL_NO_ITEM_SELECTED'));
			return false;
		}

		$done = false;

		// Set some needed variables.
		$this->user			= JFactory::getUser();
		$this->table			= $this->getTable();
		$this->tableClassName		= get_class($this->table);
		$this->contentType		= new JUcmType;
		$this->type			=
$this->contentType->getTypeByTable($this->tableClassName);
		$this->canDo			= ReservationHelper::getActions('reserve');
		$this->batchSet			= true;

		if (!$this->canDo->get('core.batch'))
		{
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_INSUFFICIENT_BATCH_INFORMATION'));
			return false;
		}
        
		if ($this->type == false)
		{
			$type = new JUcmType;
			$this->type = $type->getTypeByAlias($this->typeAlias);
		}

		$this->tagsObserver =
$this->table->getObserverOfClass('JTableObserverTags');

		if (!empty($commands['move_copy']))
		{
			$cmd = ArrayHelper::getValue($commands, 'move_copy',
'c');

			if ($cmd == 'c')
			{
				$result = $this->batchCopy($commands, $pks, $contexts);

				if (is_array($result))
				{
					foreach ($result as $old => $new)
					{
						$contexts[$new] = $contexts[$old];
					}
					$pks = array_values($result);
				}
				else
				{
					return false;
				}
			}
			elseif ($cmd == 'm' && !$this->batchMove($commands,
$pks, $contexts))
			{
				return false;
			}

			$done = true;
		}

		if (!$done)
		{
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_INSUFFICIENT_BATCH_INFORMATION'));

			return false;
		}

		// Clear the cache
		$this->cleanCache();

		return true;
	}

	/**
	 * Batch copy items to a new category or current.
	 *
	 * @param   integer  $values    The new values.
	 * @param   array    $pks       An array of row IDs.
	 * @param   array    $contexts  An array of item contexts.
	 *
	 * @return  mixed  An array of new IDs on success, boolean false on
failure.
	 *
	 * @since 12.2
	 */
	protected function batchCopy($values, $pks, $contexts)
	{
		if (empty($this->batchSet))
		{
			// Set some needed variables.
			$this->user 		= JFactory::getUser();
			$this->table 		= $this->getTable();
			$this->tableClassName	= get_class($this->table);
			$this->canDo		= ReservationHelper::getActions('reserve');
		}

		if (!$this->canDo->get('core.create') ||
!$this->canDo->get('core.batch'))
		{
			return false;
		}

		// get list of unique fields
		$uniqueFields = $this->getUniqueFields();
		// remove move_copy from array
		unset($values['move_copy']);

		// make sure published is set
		if (!isset($values['published']))
		{
			$values['published'] = 0;
		}
		elseif (isset($values['published']) &&
!$this->canDo->get('core.edit.state'))
		{
				$values['published'] = 0;
		}

		$newIds = array();
		// Parent exists so let's proceed
		while (!empty($pks))
		{
			// Pop the first ID off the stack
			$pk = array_shift($pks);

			$this->table->reset();

			// only allow copy if user may edit this item.
			if (!$this->user->authorise('core.edit',
$contexts[$pk]))
			{
				// Not fatal error
				$this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND',
$pk));
				continue;
			}

			// Check that the row actually exists
			if (!$this->table->load($pk))
			{
				if ($error = $this->table->getError())
				{
					// Fatal error
					$this->setError($error);
					return false;
				}
				else
				{
					// Not fatal error
					$this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND',
$pk));
					continue;
				}
			}

			// Only for strings
			if (ReservationHelper::checkString($this->table->appointmentid)
&& !is_numeric($this->table->appointmentid))
			{
				$this->table->appointmentid =
$this->generateUnique('appointmentid',$this->table->appointmentid);
			}

			// insert all set values
			if (ReservationHelper::checkArray($values))
			{
				foreach ($values as $key => $value)
				{
					if (strlen($value) > 0 && isset($this->table->$key))
					{
						$this->table->$key = $value;
					}
				}
			}

			// update all unique fields
			if (ReservationHelper::checkArray($uniqueFields))
			{
				foreach ($uniqueFields as $uniqueField)
				{
					$this->table->$uniqueField =
$this->generateUnique($uniqueField,$this->table->$uniqueField);
				}
			}

			// Reset the ID because we are making a copy
			$this->table->id = 0;

			// TODO: Deal with ordering?
			// $this->table->ordering = 1;

			// Check the row.
			if (!$this->table->check())
			{
				$this->setError($this->table->getError());

				return false;
			}

			if (!empty($this->type))
			{
				$this->createTagsHelper($this->tagsObserver, $this->type, $pk,
$this->typeAlias, $this->table);
			}

			// Store the row.
			if (!$this->table->store())
			{
				$this->setError($this->table->getError());

				return false;
			}

			// Get the new item ID
			$newId = $this->table->get('id');

			// Add the new ID to the array
			$newIds[$pk] = $newId;
		}

		// Clean the cache
		$this->cleanCache();

		return $newIds;
	}

	/**
	 * Batch move items to a new category
	 *
	 * @param   integer  $value     The new category ID.
	 * @param   array    $pks       An array of row IDs.
	 * @param   array    $contexts  An array of item contexts.
	 *
	 * @return  boolean  True if successful, false otherwise and internal
error is set.
	 *
	 * @since 12.2
	 */
	protected function batchMove($values, $pks, $contexts)
	{
		if (empty($this->batchSet))
		{
			// Set some needed variables.
			$this->user		= JFactory::getUser();
			$this->table		= $this->getTable();
			$this->tableClassName	= get_class($this->table);
			$this->canDo		= ReservationHelper::getActions('reserve');
		}

		if (!$this->canDo->get('core.edit') &&
!$this->canDo->get('core.batch'))
		{
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT'));
			return false;
		}

		// make sure published only updates if user has the permission.
		if (isset($values['published']) &&
!$this->canDo->get('core.edit.state'))
		{
			unset($values['published']);
		}
		// remove move_copy from array
		unset($values['move_copy']);

		// Parent exists so we proceed
		foreach ($pks as $pk)
		{
			if (!$this->user->authorise('core.edit',
$contexts[$pk]))
			{
				$this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT'));
				return false;
			}

			// Check that the row actually exists
			if (!$this->table->load($pk))
			{
				if ($error = $this->table->getError())
				{
					// Fatal error
					$this->setError($error);
					return false;
				}
				else
				{
					// Not fatal error
					$this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND',
$pk));
					continue;
				}
			}

			// insert all set values.
			if (ReservationHelper::checkArray($values))
			{
				foreach ($values as $key => $value)
				{
					// Do special action for access.
					if ('access' === $key && strlen($value) > 0)
					{
						$this->table->$key = $value;
					}
					elseif (strlen($value) > 0 &&
isset($this->table->$key))
					{
						$this->table->$key = $value;
					}
				}
			}


			// Check the row.
			if (!$this->table->check())
			{
				$this->setError($this->table->getError());

				return false;
			}

			if (!empty($this->type))
			{
				$this->createTagsHelper($this->tagsObserver, $this->type, $pk,
$this->typeAlias, $this->table);
			}

			// Store the row.
			if (!$this->table->store())
			{
				$this->setError($this->table->getError());

				return false;
			}
		}

		// Clean the cache
		$this->cleanCache();

		return true;
	}
	
	/**
	 * Method to save the form data.
	 *
	 * @param   array  $data  The form data.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   1.6
	 */
	public function save($data)
	{
		$input	= JFactory::getApplication()->input;
		$filter	= JFilterInput::getInstance();
        
		// set the metadata to the Item Data
		if (isset($data['metadata']) &&
isset($data['metadata']['author']))
		{
			$data['metadata']['author'] =
$filter->clean($data['metadata']['author'],
'TRIM');
            
			$metadata = new JRegistry;
			$metadata->loadArray($data['metadata']);
			$data['metadata'] = (string) $metadata;
		}
        
		// Set the Params Items to data
		if (isset($data['params']) &&
is_array($data['params']))
		{
			$params = new JRegistry;
			$params->loadArray($data['params']);
			$data['params'] = (string) $params;
		}

		// Alter the unique field for save as copy
		if ($input->get('task') === 'save2copy')
		{
			// Automatic handling of other unique fields
			$uniqueFields = $this->getUniqueFields();
			if (ReservationHelper::checkArray($uniqueFields))
			{
				foreach ($uniqueFields as $uniqueField)
				{
					$data[$uniqueField] =
$this->generateUnique($uniqueField,$data[$uniqueField]);
				}
			}
		}
		
		if (parent::save($data))
		{
			return true;
		}
		return false;
	}
	
	/**
	 * Method to generate a unique value.
	 *
	 * @param   string  $field name.
	 * @param   string  $value data.
	 *
	 * @return  string  New value.
	 *
	 * @since   3.0
	 */
	protected function generateUnique($field,$value)
	{

		// set field value unique
		$table = $this->getTable();

		while ($table->load(array($field => $value)))
		{
			$value = StringHelper::increment($value);
		}

		return $value;
	}

	/**
	 * Method to change the title
	 *
	 * @param   string   $title   The title.
	 *
	 * @return	array  Contains the modified title and alias.
	 *
	 */
	protected function _generateNewTitle($title)
	{

		// Alter the title
		$table = $this->getTable();

		while ($table->load(array('title' => $title)))
		{
			$title = StringHelper::increment($title);
		}

		return $title;
	}
}
PK4~�[I�D�8�8models/reserves.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		reserves.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Utilities\ArrayHelper;

/**
 * Reserves Model
 */
class ReservationModelReserves extends JModelList
{
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
        {
			$config['filter_fields'] = array(
				'a.id','id',
				'a.published','published',
				'a.access','access',
				'a.ordering','ordering',
				'a.created_by','created_by',
				'a.modified_by','modified_by',
				'a.full_price','full_price',
				'a.doctor_quota','doctor_quota',
				'a.system_quota','system_quota'
			);
		}

		parent::__construct($config);
	}

	/**
	 * Method to auto-populate the model state.
	 *
	 * Note. Calling getState in this method will result in recursion.
	 *
	 * @param   string  $ordering   An optional ordering field.
	 * @param   string  $direction  An optional direction (asc|desc).
	 *
	 * @return  void
	 *
	 */
	protected function populateState($ordering = null, $direction = null)
	{
		$app = JFactory::getApplication();

		// Adjust the context to support modal layouts.
		if ($layout = $app->input->get('layout'))
		{
			$this->context .= '.' . $layout;
		}

		// Check if the form was submitted
		$formSubmited =
$app->input->post->get('form_submited');

		$access = $this->getUserStateFromRequest($this->context .
'.filter.access', 'filter_access', 0, 'int');
		if ($formSubmited)
		{
			$access = $app->input->post->get('access');
			$this->setState('filter.access', $access);
		}

		$published = $this->getUserStateFromRequest($this->context .
'.filter.published', 'filter_published', '');
		$this->setState('filter.published', $published);

		$created_by = $this->getUserStateFromRequest($this->context .
'.filter.created_by', 'filter_created_by',
'');
		$this->setState('filter.created_by', $created_by);

		$created = $this->getUserStateFromRequest($this->context .
'.filter.created', 'filter_created');
		$this->setState('filter.created', $created);

		$sorting = $this->getUserStateFromRequest($this->context .
'.filter.sorting', 'filter_sorting', 0,
'int');
		$this->setState('filter.sorting', $sorting);

		$search = $this->getUserStateFromRequest($this->context .
'.filter.search', 'filter_search');
		$this->setState('filter.search', $search);

		$full_price = $this->getUserStateFromRequest($this->context .
'.filter.full_price', 'filter_full_price');
		if ($formSubmited)
		{
			$full_price = $app->input->post->get('full_price');
			$this->setState('filter.full_price', $full_price);
		}

		$doctor_quota = $this->getUserStateFromRequest($this->context .
'.filter.doctor_quota', 'filter_doctor_quota');
		if ($formSubmited)
		{
			$doctor_quota =
$app->input->post->get('doctor_quota');
			$this->setState('filter.doctor_quota', $doctor_quota);
		}

		$system_quota = $this->getUserStateFromRequest($this->context .
'.filter.system_quota', 'filter_system_quota');
		if ($formSubmited)
		{
			$system_quota =
$app->input->post->get('system_quota');
			$this->setState('filter.system_quota', $system_quota);
		}

		// List state information.
		parent::populateState($ordering, $direction);
	}
	
	/**
	 * Method to get an array of data items.
	 *
	 * @return  mixed  An array of data items on success, false on failure.
	 */
	public function getItems()
	{
		// check in items
		$this->checkInNow();

		// load parent items
		$items = parent::getItems();

		// set selection value to a translatable value
		if (ReservationHelper::checkArray($items))
		{
			foreach ($items as $nr => &$item)
			{
				// convert status
				$item->status = $this->selectionTranslation($item->status,
'status');
			}
		}

        
		// return items
		return $items;
	}

	/**
	 * Method to convert selection values to translatable string.
	 *
	 * @return translatable string
	 */
	public function selectionTranslation($value,$name)
	{
		// Array of status language strings
		if ($name === 'status')
		{
			$statusArray = array(
				'confirmed' =>
'COM_RESERVATION_RESERVE_CONFIRMED',
				'created' => 'COM_RESERVATION_RESERVE_CREATED'
			);
			// Now check if value is found in this array
			if (isset($statusArray[$value]) &&
ReservationHelper::checkString($statusArray[$value]))
			{
				return $statusArray[$value];
			}
		}
		return $value;
	}
	
	/**
	 * Method to build an SQL query to load the list data.
	 *
	 * @return	string	An SQL query
	 */
	protected function getListQuery()
	{
/***[REPLACED$$$$]***//*7*/
		// Get the user object.
		$user = JFactory::getUser();
		// Create a new query object.
		$db = JFactory::getDBO();
		$query = $db->getQuery(true);

		// Select some fields
		$query->select('a.*');

		// From the reservation_item table
		$query->from($db->quoteName('#__reservation_reserve',
'a'));


/***[JCBGUI.admin_view.php_getlistquery.127.$$$$]***/

//$query->join('inner',$db->quoteName('#__reservation_doctor','d')
. ' on'
.$db->quoteName('g.doctorid').'='.$db->quoteName('d.id'));
//$query->join('inner',$db->quoteName('#__users','u')
. ' on'
.$db->quoteName('u.id').'='.$db->quoteName('d.userid'));
//$query->join('inner',$db->quoteName('#__categories','c')
. ' on'
.$db->quoteName('c.id').'='.$db->quoteName('d.catid'));
//$query->select($db->quoteName(array('u.name','c.title'),array('name','title')));/***[/JCBGUI$$$$]***/


		// From the reservation_appointment table.
		$query->select($db->quoteName('g.appointment','appointmentid_appointment'));
		$query->join('LEFT',
$db->quoteName('#__reservation_appointment', 'g') .
' ON (' . $db->quoteName('a.appointmentid') . '
= ' . $db->quoteName('g.id') . ')');

       
$query->join('inner',$db->quoteName('#__reservation_doctor','d')
. ' on'
.$db->quoteName('g.doctorid').'='.$db->quoteName('d.id'));
       
$query->join('inner',$db->quoteName('#__users','u')
. ' on'
.$db->quoteName('u.id').'='.$db->quoteName('d.userid'));
       
$query->join('inner',$db->quoteName('#__categories','c')
. ' on'
.$db->quoteName('c.id').'='.$db->quoteName('d.catid'));
       
$query->select($db->quoteName(array('u.name','c.title'),array('name','title')));
		
		
		// From the reservation_sick table.
		$query->select($db->quoteName('h.phonenumber','sickid_phonenumber'));
		$query->join('LEFT',
$db->quoteName('#__reservation_sick', 'h') . '
ON (' . $db->quoteName('a.sickid') . ' = ' .
$db->quoteName('h.id') . ')');

		// Filter by published state
		$published = $this->getState('filter.published');
		if (is_numeric($published))
		{
			$query->where('a.published = ' . (int) $published);
		}
		elseif ($published === '')
		{
			$query->where('(a.published = 0 OR a.published = 1)');
		}

		// Join over the asset groups.
		$query->select('ag.title AS access_level');
		$query->join('LEFT', '#__viewlevels AS ag ON ag.id =
a.access');
		// Filter by access level.
		$_access = $this->getState('filter.access');
		if ($_access && is_numeric($_access))
		{
			$query->where('a.access = ' . (int) $_access);
		}
		elseif (ReservationHelper::checkArray($_access))
		{
			// Secure the array for the query
			$_access = ArrayHelper::toInteger($_access);
			// Filter by the Access Array.
			$query->where('a.access IN (' . implode(',',
$_access) . ')');
		}
		// Implement View Level Access
		if (!$user->authorise('core.options',
'com_reservation'))
		{
			$groups = implode(',', $user->getAuthorisedViewLevels());
			$query->where('a.access IN (' . $groups . ')');
		}

		// Add the list ordering clause.
		$orderCol = $this->state->get('list.ordering',
'a.id');
		$orderDirn = $this->state->get('list.direction',
'desc');
		if ($orderCol != '')
		{
			$query->order($db->escape($orderCol . ' ' .
$orderDirn));
		}

		return $query;
/***[/REPLACED$$$$]***/
	}

	/**
	 * Method to get list export data.
	 *
	 * @param   array  $pks  The ids of the items to get
	 * @param   JUser  $user  The user making the request
	 *
	 * @return mixed  An array of data items on success, false on failure.
	 */
	public function getExportData($pks, $user = null)
	{
		// setup the query
		if (($pks_size = ReservationHelper::checkArray($pks)) !== false ||
'bulk' === $pks)
		{
			// Set a value to know this is export method. (USE IN CUSTOM CODE TO
ALTER OUTCOME)
			$_export = true;
			// Get the user object if not set.
			if (!isset($user) || !ReservationHelper::checkObject($user))
			{
				$user = JFactory::getUser();
			}
			// Create a new query object.
			$db = JFactory::getDBO();
			$query = $db->getQuery(true);

			// Select some fields
			$query->select('a.*');

			// From the reservation_reserve table
			$query->from($db->quoteName('#__reservation_reserve',
'a'));
			// The bulk export path
			if ('bulk' === $pks)
			{
				$query->where('a.id > 0');
			}
			// A large array of ID's will not work out well
			elseif ($pks_size > 500)
			{
				// Use lowest ID
				$query->where('a.id >= ' . (int) min($pks));
				// Use highest ID
				$query->where('a.id <= ' . (int) max($pks));
			}
			// The normal default path
			else
			{
				$query->where('a.id IN (' . implode(',',$pks) .
')');
			}

	
/***[JCBGUI.admin_view.php_getlistquery.127.$$$$]***/

//$query->join('inner',$db->quoteName('#__reservation_doctor','d')
. ' on'
.$db->quoteName('g.doctorid').'='.$db->quoteName('d.id'));
//$query->join('inner',$db->quoteName('#__users','u')
. ' on'
.$db->quoteName('u.id').'='.$db->quoteName('d.userid'));
//$query->join('inner',$db->quoteName('#__categories','c')
. ' on'
.$db->quoteName('c.id').'='.$db->quoteName('d.catid'));
//$query->select($db->quoteName(array('u.name','c.title'),array('name','title')));/***[/JCBGUI$$$$]***/

			// Implement View Level Access
			if (!$user->authorise('core.options',
'com_reservation'))
			{
				$groups = implode(',', $user->getAuthorisedViewLevels());
				$query->where('a.access IN (' . $groups . ')');
			}

			// Order the results by ordering
			$query->order('a.ordering  ASC');

			// Load the items
			$db->setQuery($query);
			$db->execute();
			if ($db->getNumRows())
			{
				$items = $db->loadObjectList();

				// Set values to display correctly.
				if (ReservationHelper::checkArray($items))
				{
					foreach ($items as $nr => &$item)
					{
						// unset the values we don't want exported.
						unset($item->asset_id);
						unset($item->checked_out);
						unset($item->checked_out_time);
					}
				}
				// Add headers to items array.
				$headers = $this->getExImPortHeaders();
				if (ReservationHelper::checkObject($headers))
				{
					array_unshift($items,$headers);
				}
				return $items;
			}
		}
		return false;
	}

	/**
	* Method to get header.
	*
	* @return mixed  An array of data items on success, false on failure.
	*/
	public function getExImPortHeaders()
	{
		// Get a db connection.
		$db = JFactory::getDbo();
		// get the columns
		$columns = $db->getTableColumns("#__reservation_reserve");
		if (ReservationHelper::checkArray($columns))
		{
			// remove the headers you don't import/export.
			unset($columns['asset_id']);
			unset($columns['checked_out']);
			unset($columns['checked_out_time']);
			$headers = new stdClass();
			foreach ($columns as $column => $type)
			{
				$headers->{$column} = $column;
			}
			return $headers;
		}
		return false;
	}
	
	/**
	 * Method to get a store id based on model configuration state.
	 *
	 * @return  string  A store id.
	 *
	 */
	protected function getStoreId($id = '')
	{
		// Compile the store id.
		$id .= ':' . $this->getState('filter.id');
		$id .= ':' . $this->getState('filter.search');
		$id .= ':' . $this->getState('filter.published');
		// Check if the value is an array
		$_access = $this->getState('filter.access');
		if (ReservationHelper::checkArray($_access))
		{
			$id .= ':' . implode(':', $_access);
		}
		// Check if this is only an number or string
		elseif (is_numeric($_access)
		 || ReservationHelper::checkString($_access))
		{
			$id .= ':' . $_access;
		}
		$id .= ':' . $this->getState('filter.ordering');
		$id .= ':' . $this->getState('filter.created_by');
		$id .= ':' .
$this->getState('filter.modified_by');
		$id .= ':' . $this->getState('filter.full_price');
		$id .= ':' .
$this->getState('filter.doctor_quota');
		$id .= ':' .
$this->getState('filter.system_quota');

		return parent::getStoreId($id);
	}

	/**
	 * Build an SQL query to checkin all items left checked out longer then a
set time.
	 *
	 * @return  a bool
	 *
	 */
	protected function checkInNow()
	{
		// Get set check in time
		$time =
JComponentHelper::getParams('com_reservation')->get('check_in');

		if ($time)
		{

			// Get a db connection.
			$db = JFactory::getDbo();
			// reset query
			$query = $db->getQuery(true);
			$query->select('*');
			$query->from($db->quoteName('#__reservation_reserve'));
			$db->setQuery($query);
			$db->execute();
			if ($db->getNumRows())
			{
				// Get Yesterdays date
				$date = JFactory::getDate()->modify($time)->toSql();
				// reset query
				$query = $db->getQuery(true);

				// Fields to update.
				$fields = array(
					$db->quoteName('checked_out_time') .
'=\'0000-00-00 00:00:00\'',
					$db->quoteName('checked_out') . '=0'
				);

				// Conditions for which records should be updated.
				$conditions = array(
					$db->quoteName('checked_out') . '!=0', 
					$db->quoteName('checked_out_time') .
'<\''.$date.'\''
				);

				// Check table
				$query->update($db->quoteName('#__reservation_reserve'))->set($fields)->where($conditions);


				$db->setQuery($query);

				$db->execute();
			}
		}

		return false;
	}
}
PK4~�[�#o,,models/rules/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK4~�[��jݑ�models/rules/mobile.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		mobile.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('JPATH_PLATFORM') or die;

use Joomla\CMS\Form\Form;
use Joomla\CMS\Form\FormRule;
use Joomla\Registry\Registry;

/**
 * Form Rule (Mobile) class for the Joomla Platform.
 */
class JFormRuleMobile extends FormRule
{

/***[JCBGUI.validation_rule.php.7.$$$$]***/
protected $regex = '^[0][1-9][0-9]{9}$';/***[/JCBGUI$$$$]***/

}
PK4~�[S��$$models/rules/planrule.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				Lmskaran
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.41
	@build			18th September, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		planrule.php
	@author			Lmskaran <https://Lmskaran.com>
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__)

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('JPATH_PLATFORM') or die;

use Joomla\CMS\Form\Form;
use Joomla\CMS\Form\FormRule;
use Joomla\Registry\Registry;

/**
 * Form Rule (Planrule) class for the Joomla Platform.
 */
class JFormRulePlanrule extends FormRule
{

    /***[JCBGUI.validation_rule.php.10.$$$$]***/
    public function test(\SimpleXMLElement $element, $value, $group = null,
Registry $input = null, Form $form = null)
    {

        $user= jFactory::getUser();
        $user_id= $user->get('id');

        if ((!file_exists(JPATH_SITE .
'/libraries/CBLib/CBLib/Core/CBLib.php')) ||
(!file_exists(JPATH_ADMINISTRATOR .
'/components/com_comprofiler/plugin.foundation.php'))) {
            echo 'CB not installed';
            return;
        }

        include_once(JPATH_ADMINISTRATOR .
'/components/com_comprofiler/plugin.foundation.php');

        $cbUser =& CBuser::getInstance($user_id);
        $user =& $cbUser->getUserData();

        $degree = $user->get('cb_gradetahsili');
        if ($degree== '22')
            $value['final_price_per_min']= 'master';
        elseif ($degree== '33')
            $value['final_price_per_min']= 'phd';


        // dump($degree,"degree");
        if (!$degree){
            return
array("status"=>false,"msg"=>"سطح
تحصیلات شما هنوز تایید نشده است");
        }

        //$value['final_price_per_min']= 'master';
        $plan_type= $value['plantype'];
        switch ($plan_type)
        {
            case 1:
                return $this->handle_mobile_plan($value);
                break;
            case 2:
                return $this->handle_text_plan($value);
                break;
            case 3:
                return $this->handle_video_plan($value);
                break;
        }

    }

    private function handle_mobile_plan($value)
    {
        $return_data=[];
        $min= 15;
        $max= 60;
        $waitingTime= 180;
        $master_price_per_min= 4800;
        $phd_price_per_min= 5500;

        if ($value['final_price_per_min']== 'master')
            $final_price_per_min= $master_price_per_min;
        else if ($value['final_price_per_min']==
'phd')
            $final_price_per_min= $phd_price_per_min;

        $time= $value['time'];
        $price= $value['price'];


        $total= (int) $time * $final_price_per_min;
        $min_price= $total - (20/100*$total);
        $max_price= $total + (20/100*$total);

        $return_data['total']= 0;
        if ($time < $min or $time > $max)
        {
            $return_data['status']= false;
            $return_data['msg']= "حداقل زمان
مشاوره تلفنی {$min} دقیقه و حداکثر زمان
مشاوره تلفنی {$max} دقیقه میباشد";
            return $return_data;
        }

        $return_data['total']= $total;

        if ($value['waitingtime'] < 0 or 
$value['waitingtime'] > $waitingTime)
        {
            $return_data['status']= false;
            $return_data['msg']= "حداکثر زمان
انتظار برای مشاوره متنی {$waitingTime} دقیقه
میباشد";
            return $return_data;
        }


        if ($value['submit'])
        {
            if ($price < $min_price or $price > $max_price )
            {
                $return_data['status']= false;
                $return_data['msg']= "حداقل هزینه
مشاوره تلفنی {$min_price} و حداکثر هزینه
مشاوره تلفنی {$max_price} میباشد";
                return $return_data;
            }

            $return_data['status']= true;
            $return_data['msg']= "پلن شما با
موفقیت ایجاد گردید";
            return $return_data;
        }

        $return_data['status']= false;
        $return_data['msg']= "";
        return $return_data;
    }


    private function handle_text_plan($value)
    {
        $return_data=[];
        $min= 30;
        $max= 90;
        $waitingTime= 400;
        $master_price_per_min= 4500;
        $phd_price_per_min= 5000;

        if ($value['final_price_per_min']== 'master')
            $final_price_per_min= $master_price_per_min;
        else if ($value['final_price_per_min']==
'phd')
            $final_price_per_min= $phd_price_per_min;

        $time= $value['time'];
        $price= $value['price'];


        $total= (int) $time * $final_price_per_min;
        $min_price= $total - (20/100*$total);
        $max_price= $total + (20/100*$total);

        $return_data['total']= 0;
        if ($time < $min or $time > $max)
        {
            $return_data['status']= false;
            $return_data['msg']= "حداقل زمان
مشاوره متنی {$min} دقیقه و حداکثر زمان
مشاوره متنی {$max} دقیقه میباشد";
            return $return_data;
        }

        $return_data['total']= $total;

        if ($value['waitingtime'] < 0 or 
$value['waitingtime'] > $waitingTime)
        {
            $return_data['status']= false;
            $return_data['msg']= "حداکثر زمان
انتظار برای مشاوره متنی {$waitingTime} دقیقه
میباشد";
            return $return_data;
        }


        if ($value['submit'])
        {
            if ($price < $min_price or $price > $max_price )
            {
                $return_data['status']= false;
                $return_data['msg']= "حداقل هزینه
مشاوره متنی {$min_price} و حداکثر هزینه مشاوره
متنی {$max_price} میباشد";
                return $return_data;
            }

            $return_data['status']= true;
            $return_data['msg']= "پلن شما با
موفقیت ایجاد گردید";
            return $return_data;
        }

        $return_data['status']= false;
        $return_data['msg']= "";
        return $return_data;
    }


    private function handle_video_plan($value)
    {
        $return_data=[];
        $min= 15;
        $max= 60;
        $waitingTime= 180;
        $master_price_per_min= 5000;
        $phd_price_per_min= 6000;

        if ($value['final_price_per_min']== 'master')
            $final_price_per_min= $master_price_per_min;
        else if ($value['final_price_per_min']==
'phd')
            $final_price_per_min= $phd_price_per_min;

        $time= $value['time'];
        $price= $value['price'];


        $total= (int) $time * $final_price_per_min;
        $min_price= $total - (20/100*$total);
        $max_price= $total + (20/100*$total);

        $return_data['total']= 0;
        if ($time < $min or $time > $max)
        {
            $return_data['status']= false;
            $return_data['msg']= "حداقل زمان
مشاوره ویدیویی {$min} دقیقه و حداکثر زمان
مشاوره ویدیویی {$max} دقیقه میباشد";
            return $return_data;
        }

        $return_data['total']= $total;

        if ($value['waitingtime'] < 0 or 
$value['waitingtime'] > $waitingTime)
        {
            $return_data['status']= false;
            $return_data['msg']= "حداکثر زمان
انتظار برای مشاوره ویدیویی {$waitingTime} دقیقه
میباشد";
            return $return_data;
        }


        if ($value['submit'])
        {
            if ($price < $min_price or $price > $max_price )
            {
                $return_data['status']= false;
                $return_data['msg']= "حداقل هزینه
مشاوره ویدیویی {$min_price} و حداکثر هزینه
مشاوره ویدیویی {$max_price} میباشد";
                return $return_data;
            }

            $return_data['status']= true;
            $return_data['msg']= "پلن شما با
موفقیت ایجاد گردید";
            return $return_data;
        }

        $return_data['status']= false;
        $return_data['msg']= "";
        return $return_data;
    }/***[/JCBGUI$$$$]***/

}
PK4~�[O�_�$$models/rules/eplanrule.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				Lmskaran
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.41
	@build			18th September, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		planrule.php
	@author			Lmskaran <https://Lmskaran.com>
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__)

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('JPATH_PLATFORM') or die;

use Joomla\CMS\Form\Form;
use Joomla\CMS\Form\FormRule;
use Joomla\Registry\Registry;

/**
 * Form Rule (Planrule) class for the Joomla Platform.
 */
class JFormRuleEplanrule extends FormRule
{

    /***[JCBGUI.validation_rule.php.10.$$$$]***/
    public function test(\SimpleXMLElement $element, $value, $group = null,
Registry $input = null, Form $form = null)
    {

        $user= jFactory::getUser();
        $user_id= $user->get('id');

        if ((!file_exists(JPATH_SITE .
'/libraries/CBLib/CBLib/Core/CBLib.php')) ||
(!file_exists(JPATH_ADMINISTRATOR .
'/components/com_comprofiler/plugin.foundation.php'))) {
            echo 'CB not installed';
            return;
        }

        include_once(JPATH_ADMINISTRATOR .
'/components/com_comprofiler/plugin.foundation.php');

        $cbUser =& CBuser::getInstance($user_id);
        $user =& $cbUser->getUserData();

        $degree = $user->get('cb_gradetahsili');
        if ($degree== '22')
            $value['final_price_per_min']= 'master';
        elseif ($degree== '33')
            $value['final_price_per_min']= 'phd';


        // dump($degree,"degree");
        if (!$degree){
            return
array("status"=>false,"msg"=>"سطح
تحصیلات شما هنوز تایید نشده است");
        }

        //$value['final_price_per_min']= 'master';
        $plan_type= $value['plantype'];
        switch ($plan_type)
        {
            case 1:
                return $this->handle_mobile_plan($value);
                break;
            case 2:
                return $this->handle_text_plan($value);
                break;
            case 3:
                return $this->handle_video_plan($value);
                break;
        }

    }

    private function handle_mobile_plan($value)
    {
        $return_data=[];
        $min= 30;
        $max= 30;
        $waitingTime= 0;
        $master_price_per_min= 4800;
        $phd_price_per_min= 5500;

        if ($value['final_price_per_min']== 'master')
            $final_price_per_min= $master_price_per_min;
        else if ($value['final_price_per_min']==
'phd')
            $final_price_per_min= $phd_price_per_min;

        $time= $value['time'];
        $price= $value['price'];


        $total= (int) $time * $final_price_per_min;
        $min_price= $total - (20/100*$total);
        $max_price= $total + (20/100*$total);

        $return_data['total']= 0;
        if ($time < $min or $time > $max)
        {
            $return_data['status']= false;
            $return_data['msg']= "حداقل زمان
مشاوره تلفنی {$min} دقیقه و حداکثر زمان
مشاوره تلفنی {$max} دقیقه میباشد";
            return $return_data;
        }

        $return_data['total']= $total;

        if ($value['waitingtime'] < 0 or 
$value['waitingtime'] > $waitingTime)
        {
            $return_data['status']= false;
            $return_data['msg']= "حداکثر زمان
انتظار برای مشاوره متنی {$waitingTime} دقیقه
میباشد";
            return $return_data;
        }


        if ($value['submit'])
        {
            if ($price < $min_price or $price > $max_price )
            {
                $return_data['status']= false;
                $return_data['msg']= "حداقل هزینه
مشاوره تلفنی {$min_price} و حداکثر هزینه
مشاوره تلفنی {$max_price} میباشد";
                return $return_data;
            }

            $return_data['status']= true;
            $return_data['msg']= "پلن شما با
موفقیت ایجاد گردید";
            return $return_data;
        }

        $return_data['status']= false;
        $return_data['msg']= "";
        return $return_data;
    }


    private function handle_text_plan($value)
    {
        $return_data=[];
        $min= 30;
        $max= 30;
        $waitingTime= 0;
        $master_price_per_min= 4500;
        $phd_price_per_min= 5000;

        if ($value['final_price_per_min']== 'master')
            $final_price_per_min= $master_price_per_min;
        else if ($value['final_price_per_min']==
'phd')
            $final_price_per_min= $phd_price_per_min;

        $time= $value['time'];
        $price= $value['price'];


        $total= (int) $time * $final_price_per_min;
        $min_price= $total - (20/100*$total);
        $max_price= $total + (20/100*$total);

        $return_data['total']= 0;
        if ($time < $min or $time > $max)
        {
            $return_data['status']= false;
            $return_data['msg']= "حداقل زمان
مشاوره متنی {$min} دقیقه و حداکثر زمان
مشاوره متنی {$max} دقیقه میباشد";
            return $return_data;
        }

        $return_data['total']= $total;

        if ($value['waitingtime'] < 0 or 
$value['waitingtime'] > $waitingTime)
        {
            $return_data['status']= false;
            $return_data['msg']= "حداکثر زمان
انتظار برای مشاوره متنی {$waitingTime} دقیقه
میباشد";
            return $return_data;
        }


        if ($value['submit'])
        {
            if ($price < $min_price or $price > $max_price )
            {
                $return_data['status']= false;
                $return_data['msg']= "حداقل هزینه
مشاوره متنی {$min_price} و حداکثر هزینه مشاوره
متنی {$max_price} میباشد";
                return $return_data;
            }

            $return_data['status']= true;
            $return_data['msg']= "پلن شما با
موفقیت ایجاد گردید";
            return $return_data;
        }

        $return_data['status']= false;
        $return_data['msg']= "";
        return $return_data;
    }


    private function handle_video_plan($value)
    {
        $return_data=[];
        $min= 30;
        $max= 30;
        $waitingTime= 0;
        $master_price_per_min= 5000;
        $phd_price_per_min= 6000;

        if ($value['final_price_per_min']== 'master')
            $final_price_per_min= $master_price_per_min;
        else if ($value['final_price_per_min']==
'phd')
            $final_price_per_min= $phd_price_per_min;

        $time= $value['time'];
        $price= $value['price'];


        $total= (int) $time * $final_price_per_min;
        $min_price= $total - (20/100*$total);
        $max_price= $total + (20/100*$total);

        $return_data['total']= 0;
        if ($time < $min or $time > $max)
        {
            $return_data['status']= false;
            $return_data['msg']= "حداقل زمان
مشاوره ویدیویی {$min} دقیقه و حداکثر زمان
مشاوره ویدیویی {$max} دقیقه میباشد";
            return $return_data;
        }

        $return_data['total']= $total;

        if ($value['waitingtime'] < 0 or 
$value['waitingtime'] > $waitingTime)
        {
            $return_data['status']= false;
            $return_data['msg']= "حداکثر زمان
انتظار برای مشاوره ویدیویی {$waitingTime} دقیقه
میباشد";
            return $return_data;
        }


        if ($value['submit'])
        {
            if ($price < $min_price or $price > $max_price )
            {
                $return_data['status']= false;
                $return_data['msg']= "حداقل هزینه
مشاوره ویدیویی {$min_price} و حداکثر هزینه
مشاوره ویدیویی {$max_price} میباشد";
                return $return_data;
            }

            $return_data['status']= true;
            $return_data['msg']= "پلن شما با
موفقیت ایجاد گردید";
            return $return_data;
        }

        $return_data['status']= false;
        $return_data['msg']= "";
        return $return_data;
    }/***[/JCBGUI$$$$]***/

}
PK4~�[I�j��U�Umodels/session.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		session.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Registry\Registry;
use Joomla\String\StringHelper;
use Joomla\Utilities\ArrayHelper;

/**
 * Reservation Session Model
 */
class ReservationModelSession extends JModelAdmin
{
	/**
	 * The tab layout fields array.
	 *
	 * @var      array
	 */
	protected $tabLayoutFields = array(
		'details' => array(
			'left' => array(
				'sickid',
				'pay',
				'finish'
			),
			'right' => array(
				'planid',
				'firsttext',
				'channel_token'
			)
		)
	);

	/**
	 * @var        string    The prefix to use with controller messages.
	 * @since   1.6
	 */
	protected $text_prefix = 'COM_RESERVATION';

	/**
	 * The type alias for this content type.
	 *
	 * @var      string
	 * @since    3.2
	 */
	public $typeAlias = 'com_reservation.session';

	/**
	 * Returns a Table object, always creating it
	 *
	 * @param   type    $type    The table type to instantiate
	 * @param   string  $prefix  A prefix for the table class name. Optional.
	 * @param   array   $config  Configuration array for model. Optional.
	 *
	 * @return  JTable  A database object
	 *
	 * @since   1.6
	 */
	public function getTable($type = 'session', $prefix =
'ReservationTable', $config = array())
	{
		// add table path for when model gets used from other component
		$this->addTablePath(JPATH_ADMINISTRATOR .
'/components/com_reservation/tables');
		// get instance of the table
		return JTable::getInstance($type, $prefix, $config);
	}
    
	/**
	 * Method to get a single record.
	 *
	 * @param   integer  $pk  The id of the primary key.
	 *
	 * @return  mixed  Object on success, false on failure.
	 *
	 * @since   1.6
	 */
	public function getItem($pk = null)
	{
		if ($item = parent::getItem($pk))
		{
			if (!empty($item->params) && !is_array($item->params))
			{
				// Convert the params field to an array.
				$registry = new Registry;
				$registry->loadString($item->params);
				$item->params = $registry->toArray();
			}

			if (!empty($item->metadata))
			{
				// Convert the metadata field to an array.
				$registry = new Registry;
				$registry->loadString($item->metadata);
				$item->metadata = $registry->toArray();
			}
		}

		return $item;
	}

	/**
	 * Method to get the record form.
	 *
	 * @param   array    $data      Data for the form.
	 * @param   boolean  $loadData  True if the form is to load its own data
(default case), false if not.
	 * @param   array    $options   Optional array of options for the form
creation.
	 *
	 * @return  mixed  A JForm object on success, false on failure
	 *
	 * @since   1.6
	 */
	public function getForm($data = array(), $loadData = true, $options =
array('control' => 'jform'))
	{
		// set load data option
		$options['load_data'] = $loadData;
		// check if xpath was set in options
		$xpath = false;
		if (isset($options['xpath']))
		{
			$xpath = $options['xpath'];
			unset($options['xpath']);
		}
		// check if clear form was set in options
		$clear = false;
		if (isset($options['clear']))
		{
			$clear = $options['clear'];
			unset($options['clear']);
		}

		// Get the form.
		$form = $this->loadForm('com_reservation.session',
'session', $options, $clear, $xpath);

		if (empty($form))
		{
			return false;
		}

		$jinput = JFactory::getApplication()->input;

		// The front end calls this model and uses a_id to avoid id clashes so we
need to check for that first.
		if ($jinput->get('a_id'))
		{
			$id = $jinput->get('a_id', 0, 'INT');
		}
		// The back end uses id so we use that the rest of the time and set it to
0 by default.
		else
		{
			$id = $jinput->get('id', 0, 'INT');
		}

		$user = JFactory::getUser();

		// Check for existing item.
		// Modify the form based on Edit State access controls.
		if ($id != 0 &&
(!$user->authorise('core.edit.state',
'com_reservation.session.' . (int) $id))
			|| ($id == 0 &&
!$user->authorise('core.edit.state',
'com_reservation')))
		{
			// Disable fields for display.
			$form->setFieldAttribute('ordering', 'disabled',
'true');
			$form->setFieldAttribute('published', 'disabled',
'true');
			// Disable fields while saving.
			$form->setFieldAttribute('ordering', 'filter',
'unset');
			$form->setFieldAttribute('published', 'filter',
'unset');
		}
		// If this is a new item insure the greated by is set.
		if (0 == $id)
		{
			// Set the created_by to this user
			$form->setValue('created_by', null, $user->id);
		}
		// Modify the form based on Edit Creaded By access controls.
		if (!$user->authorise('core.edit.created_by',
'com_reservation'))
		{
			// Disable fields for display.
			$form->setFieldAttribute('created_by',
'disabled', 'true');
			// Disable fields for display.
			$form->setFieldAttribute('created_by',
'readonly', 'true');
			// Disable fields while saving.
			$form->setFieldAttribute('created_by', 'filter',
'unset');
		}
		// Modify the form based on Edit Creaded Date access controls.
		if (!$user->authorise('core.edit.created',
'com_reservation'))
		{
			// Disable fields for display.
			$form->setFieldAttribute('created', 'disabled',
'true');
			// Disable fields while saving.
			$form->setFieldAttribute('created', 'filter',
'unset');
		}
		// Only load these values if no id is found
		if (0 == $id)
		{
			// Set redirected view name
			$redirectedView = $jinput->get('ref', null,
'STRING');
			// Set field name (or fall back to view name)
			$redirectedField = $jinput->get('field', $redirectedView,
'STRING');
			// Set redirected view id
			$redirectedId = $jinput->get('refid', 0, 'INT');
			// Set field id (or fall back to redirected view id)
			$redirectedValue = $jinput->get('field_id', $redirectedId,
'INT');
			if (0 != $redirectedValue && $redirectedField)
			{
				// Now set the local-redirected field default value
				$form->setValue($redirectedField, null, $redirectedValue);
			}
		}
		return $form;
	}

	/**
	 * Method to get the script that have to be included on the form
	 *
	 * @return string	script files
	 */
	public function getScript()
	{
		return 'media/com_reservation/js/session.js';
	}
    
	/**
	 * Method to test whether a record can be deleted.
	 *
	 * @param   object  $record  A record object.
	 *
	 * @return  boolean  True if allowed to delete the record. Defaults to the
permission set in the component.
	 *
	 * @since   1.6
	 */
	protected function canDelete($record)
	{
		if (!empty($record->id))
		{
			if ($record->published != -2)
			{
				return;
			}

			$user = JFactory::getUser();
			// The record has been set. Check the record permissions.
			return $user->authorise('core.delete',
'com_reservation.session.' . (int) $record->id);
		}
		return false;
	}

	/**
	 * Method to test whether a record can have its state edited.
	 *
	 * @param   object  $record  A record object.
	 *
	 * @return  boolean  True if allowed to change the state of the record.
Defaults to the permission set in the component.
	 *
	 * @since   1.6
	 */
	protected function canEditState($record)
	{
		$user = JFactory::getUser();
		$recordId = (!empty($record->id)) ? $record->id : 0;

		if ($recordId)
		{
			// The record has been set. Check the record permissions.
			$permission = $user->authorise('core.edit.state',
'com_reservation.session.' . (int) $recordId);
			if (!$permission && !is_null($permission))
			{
				return false;
			}
		}
		// In the absense of better information, revert to the component
permissions.
		return parent::canEditState($record);
	}
    
	/**
	 * Method override to check if you can edit an existing record.
	 *
	 * @param	array	$data	An array of input data.
	 * @param	string	$key	The name of the key for the primary key.
	 *
	 * @return	boolean
	 * @since	2.5
	 */
	protected function allowEdit($data = array(), $key = 'id')
	{
		// Check specific edit permission then general edit permission.

		return JFactory::getUser()->authorise('core.edit',
'com_reservation.session.'. ((int) isset($data[$key]) ?
$data[$key] : 0)) or parent::allowEdit($data, $key);
	}
    
	/**
	 * Prepare and sanitise the table data prior to saving.
	 *
	 * @param   JTable  $table  A JTable object.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function prepareTable($table)
	{
		$date = JFactory::getDate();
		$user = JFactory::getUser();
		
		if (isset($table->name))
		{
			$table->name = htmlspecialchars_decode($table->name, ENT_QUOTES);
		}
		
		if (isset($table->alias) && empty($table->alias))
		{
			$table->generateAlias();
		}
		
		if (empty($table->id))
		{
			$table->created = $date->toSql();
			// set the user
			if ($table->created_by == 0 || empty($table->created_by))
			{
				$table->created_by = $user->id;
			}
			// Set ordering to the last item if not set
			if (empty($table->ordering))
			{
				$db = JFactory::getDbo();
				$query = $db->getQuery(true)
					->select('MAX(ordering)')
					->from($db->quoteName('#__reservation_session'));
				$db->setQuery($query);
				$max = $db->loadResult();

				$table->ordering = $max + 1;
			}
		}
		else
		{
			$table->modified = $date->toSql();
			$table->modified_by = $user->id;
		}
        
		if (!empty($table->id))
		{
			// Increment the items version number.
			$table->version++;
		}
	}

	/**
	 * Method to get the data that should be injected in the form.
	 *
	 * @return  mixed  The data for the form.
	 *
	 * @since   1.6
	 */
	protected function loadFormData() 
	{
		// Check the session for previously entered form data.
		$data =
JFactory::getApplication()->getUserState('com_reservation.edit.session.data',
array());

		if (empty($data))
		{
			$data = $this->getItem();
			// run the perprocess of the data
			$this->preprocessData('com_reservation.session', $data);
		}

		return $data;
	}

	/**
	 * Method to get the unique fields of this table.
	 *
	 * @return  mixed  An array of field names, boolean false if none is set.
	 *
	 * @since   3.0
	 */
	protected function getUniqueFields()
	{
		return false;
	}
	
	/**
	 * Method to delete one or more records.
	 *
	 * @param   array  &$pks  An array of record primary keys.
	 *
	 * @return  boolean  True if successful, false if an error occurs.
	 *
	 * @since   12.2
	 */
	public function delete(&$pks)
	{
		if (!parent::delete($pks))
		{
			return false;
		}
		
		return true;
	}

	/**
	 * Method to change the published state of one or more records.
	 *
	 * @param   array    &$pks   A list of the primary keys to change.
	 * @param   integer  $value  The value of the published state.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   12.2
	 */
	public function publish(&$pks, $value = 1)
	{
		if (!parent::publish($pks, $value))
		{
			return false;
		}
		
		return true;
        }
    
	/**
	 * Method to perform batch operations on an item or a set of items.
	 *
	 * @param   array  $commands  An array of commands to perform.
	 * @param   array  $pks       An array of item ids.
	 * @param   array  $contexts  An array of item contexts.
	 *
	 * @return  boolean  Returns true on success, false on failure.
	 *
	 * @since   12.2
	 */
	public function batch($commands, $pks, $contexts)
	{
		// Sanitize ids.
		$pks = array_unique($pks);
		ArrayHelper::toInteger($pks);

		// Remove any values of zero.
		if (array_search(0, $pks, true))
		{
			unset($pks[array_search(0, $pks, true)]);
		}

		if (empty($pks))
		{
			$this->setError(JText::_('JGLOBAL_NO_ITEM_SELECTED'));
			return false;
		}

		$done = false;

		// Set some needed variables.
		$this->user			= JFactory::getUser();
		$this->table			= $this->getTable();
		$this->tableClassName		= get_class($this->table);
		$this->contentType		= new JUcmType;
		$this->type			=
$this->contentType->getTypeByTable($this->tableClassName);
		$this->canDo			= ReservationHelper::getActions('session');
		$this->batchSet			= true;

		if (!$this->canDo->get('core.batch'))
		{
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_INSUFFICIENT_BATCH_INFORMATION'));
			return false;
		}
        
		if ($this->type == false)
		{
			$type = new JUcmType;
			$this->type = $type->getTypeByAlias($this->typeAlias);
		}

		$this->tagsObserver =
$this->table->getObserverOfClass('JTableObserverTags');

		if (!empty($commands['move_copy']))
		{
			$cmd = ArrayHelper::getValue($commands, 'move_copy',
'c');

			if ($cmd == 'c')
			{
				$result = $this->batchCopy($commands, $pks, $contexts);

				if (is_array($result))
				{
					foreach ($result as $old => $new)
					{
						$contexts[$new] = $contexts[$old];
					}
					$pks = array_values($result);
				}
				else
				{
					return false;
				}
			}
			elseif ($cmd == 'm' && !$this->batchMove($commands,
$pks, $contexts))
			{
				return false;
			}

			$done = true;
		}

		if (!$done)
		{
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_INSUFFICIENT_BATCH_INFORMATION'));

			return false;
		}

		// Clear the cache
		$this->cleanCache();

		return true;
	}

	/**
	 * Batch copy items to a new category or current.
	 *
	 * @param   integer  $values    The new values.
	 * @param   array    $pks       An array of row IDs.
	 * @param   array    $contexts  An array of item contexts.
	 *
	 * @return  mixed  An array of new IDs on success, boolean false on
failure.
	 *
	 * @since 12.2
	 */
	protected function batchCopy($values, $pks, $contexts)
	{
		if (empty($this->batchSet))
		{
			// Set some needed variables.
			$this->user 		= JFactory::getUser();
			$this->table 		= $this->getTable();
			$this->tableClassName	= get_class($this->table);
			$this->canDo		= ReservationHelper::getActions('session');
		}

		if (!$this->canDo->get('core.create') ||
!$this->canDo->get('core.batch'))
		{
			return false;
		}

		// get list of unique fields
		$uniqueFields = $this->getUniqueFields();
		// remove move_copy from array
		unset($values['move_copy']);

		// make sure published is set
		if (!isset($values['published']))
		{
			$values['published'] = 0;
		}
		elseif (isset($values['published']) &&
!$this->canDo->get('core.edit.state'))
		{
				$values['published'] = 0;
		}

		$newIds = array();
		// Parent exists so let's proceed
		while (!empty($pks))
		{
			// Pop the first ID off the stack
			$pk = array_shift($pks);

			$this->table->reset();

			// only allow copy if user may edit this item.
			if (!$this->user->authorise('core.edit',
$contexts[$pk]))
			{
				// Not fatal error
				$this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND',
$pk));
				continue;
			}

			// Check that the row actually exists
			if (!$this->table->load($pk))
			{
				if ($error = $this->table->getError())
				{
					// Fatal error
					$this->setError($error);
					return false;
				}
				else
				{
					// Not fatal error
					$this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND',
$pk));
					continue;
				}
			}

			// Only for strings
			if (ReservationHelper::checkString($this->table->sickid)
&& !is_numeric($this->table->sickid))
			{
				$this->table->sickid =
$this->generateUnique('sickid',$this->table->sickid);
			}

			// insert all set values
			if (ReservationHelper::checkArray($values))
			{
				foreach ($values as $key => $value)
				{
					if (strlen($value) > 0 && isset($this->table->$key))
					{
						$this->table->$key = $value;
					}
				}
			}

			// update all unique fields
			if (ReservationHelper::checkArray($uniqueFields))
			{
				foreach ($uniqueFields as $uniqueField)
				{
					$this->table->$uniqueField =
$this->generateUnique($uniqueField,$this->table->$uniqueField);
				}
			}

			// Reset the ID because we are making a copy
			$this->table->id = 0;

			// TODO: Deal with ordering?
			// $this->table->ordering = 1;

			// Check the row.
			if (!$this->table->check())
			{
				$this->setError($this->table->getError());

				return false;
			}

			if (!empty($this->type))
			{
				$this->createTagsHelper($this->tagsObserver, $this->type, $pk,
$this->typeAlias, $this->table);
			}

			// Store the row.
			if (!$this->table->store())
			{
				$this->setError($this->table->getError());

				return false;
			}

			// Get the new item ID
			$newId = $this->table->get('id');

			// Add the new ID to the array
			$newIds[$pk] = $newId;
		}

		// Clean the cache
		$this->cleanCache();

		return $newIds;
	}

	/**
	 * Batch move items to a new category
	 *
	 * @param   integer  $value     The new category ID.
	 * @param   array    $pks       An array of row IDs.
	 * @param   array    $contexts  An array of item contexts.
	 *
	 * @return  boolean  True if successful, false otherwise and internal
error is set.
	 *
	 * @since 12.2
	 */
	protected function batchMove($values, $pks, $contexts)
	{
		if (empty($this->batchSet))
		{
			// Set some needed variables.
			$this->user		= JFactory::getUser();
			$this->table		= $this->getTable();
			$this->tableClassName	= get_class($this->table);
			$this->canDo		= ReservationHelper::getActions('session');
		}

		if (!$this->canDo->get('core.edit') &&
!$this->canDo->get('core.batch'))
		{
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT'));
			return false;
		}

		// make sure published only updates if user has the permission.
		if (isset($values['published']) &&
!$this->canDo->get('core.edit.state'))
		{
			unset($values['published']);
		}
		// remove move_copy from array
		unset($values['move_copy']);

		// Parent exists so we proceed
		foreach ($pks as $pk)
		{
			if (!$this->user->authorise('core.edit',
$contexts[$pk]))
			{
				$this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT'));
				return false;
			}

			// Check that the row actually exists
			if (!$this->table->load($pk))
			{
				if ($error = $this->table->getError())
				{
					// Fatal error
					$this->setError($error);
					return false;
				}
				else
				{
					// Not fatal error
					$this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND',
$pk));
					continue;
				}
			}

			// insert all set values.
			if (ReservationHelper::checkArray($values))
			{
				foreach ($values as $key => $value)
				{
					// Do special action for access.
					if ('access' === $key && strlen($value) > 0)
					{
						$this->table->$key = $value;
					}
					elseif (strlen($value) > 0 &&
isset($this->table->$key))
					{
						$this->table->$key = $value;
					}
				}
			}


			// Check the row.
			if (!$this->table->check())
			{
				$this->setError($this->table->getError());

				return false;
			}

			if (!empty($this->type))
			{
				$this->createTagsHelper($this->tagsObserver, $this->type, $pk,
$this->typeAlias, $this->table);
			}

			// Store the row.
			if (!$this->table->store())
			{
				$this->setError($this->table->getError());

				return false;
			}
		}

		// Clean the cache
		$this->cleanCache();

		return true;
	}
	
	/**
	 * Method to save the form data.
	 *
	 * @param   array  $data  The form data.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   1.6
	 */
	public function save($data)
	{
		$input	= JFactory::getApplication()->input;
		$filter	= JFilterInput::getInstance();
        
		// set the metadata to the Item Data
		if (isset($data['metadata']) &&
isset($data['metadata']['author']))
		{
			$data['metadata']['author'] =
$filter->clean($data['metadata']['author'],
'TRIM');
            
			$metadata = new JRegistry;
			$metadata->loadArray($data['metadata']);
			$data['metadata'] = (string) $metadata;
		}

		// Set the empty pay item to data
		if (!isset($data['pay']))
		{
			$data['pay'] = '';
		}

		// Set the empty finish item to data
		if (!isset($data['finish']))
		{
			$data['finish'] = '';
		}
        
		// Set the Params Items to data
		if (isset($data['params']) &&
is_array($data['params']))
		{
			$params = new JRegistry;
			$params->loadArray($data['params']);
			$data['params'] = (string) $params;
		}

		// Alter the unique field for save as copy
		if ($input->get('task') === 'save2copy')
		{
			// Automatic handling of other unique fields
			$uniqueFields = $this->getUniqueFields();
			if (ReservationHelper::checkArray($uniqueFields))
			{
				foreach ($uniqueFields as $uniqueField)
				{
					$data[$uniqueField] =
$this->generateUnique($uniqueField,$data[$uniqueField]);
				}
			}
		}
		
		if (parent::save($data))
		{
			return true;
		}
		return false;
	}
	
	/**
	 * Method to generate a unique value.
	 *
	 * @param   string  $field name.
	 * @param   string  $value data.
	 *
	 * @return  string  New value.
	 *
	 * @since   3.0
	 */
	protected function generateUnique($field,$value)
	{

		// set field value unique
		$table = $this->getTable();

		while ($table->load(array($field => $value)))
		{
			$value = StringHelper::increment($value);
		}

		return $value;
	}

	/**
	 * Method to change the title
	 *
	 * @param   string   $title   The title.
	 *
	 * @return	array  Contains the modified title and alias.
	 *
	 */
	protected function _generateNewTitle($title)
	{

		// Alter the title
		$table = $this->getTable();

		while ($table->load(array('title' => $title)))
		{
			$title = StringHelper::increment($title);
		}

		return $title;
	}
}
PK4~�[��S�=�=models/sessions.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		sessions.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Utilities\ArrayHelper;

/**
 * Sessions Model
 */
class ReservationModelSessions extends JModelList
{
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
        {
			$config['filter_fields'] = array(
				'a.id','id',
				'a.published','published',
				'a.access','access',
				'a.ordering','ordering',
				'a.created_by','created_by',
				'a.modified_by','modified_by'
			);
		}

		parent::__construct($config);
	}

	/**
	 * Method to auto-populate the model state.
	 *
	 * Note. Calling getState in this method will result in recursion.
	 *
	 * @param   string  $ordering   An optional ordering field.
	 * @param   string  $direction  An optional direction (asc|desc).
	 *
	 * @return  void
	 *
	 */
	protected function populateState($ordering = null, $direction = null)
	{
		$app = JFactory::getApplication();

		// Adjust the context to support modal layouts.
		if ($layout = $app->input->get('layout'))
		{
			$this->context .= '.' . $layout;
		}

		// Check if the form was submitted
		$formSubmited =
$app->input->post->get('form_submited');

		$access = $this->getUserStateFromRequest($this->context .
'.filter.access', 'filter_access', 0, 'int');
		if ($formSubmited)
		{
			$access = $app->input->post->get('access');
			$this->setState('filter.access', $access);
		}

		$published = $this->getUserStateFromRequest($this->context .
'.filter.published', 'filter_published', '');
		$this->setState('filter.published', $published);

		$created_by = $this->getUserStateFromRequest($this->context .
'.filter.created_by', 'filter_created_by',
'');
		$this->setState('filter.created_by', $created_by);

		$created = $this->getUserStateFromRequest($this->context .
'.filter.created', 'filter_created');
		$this->setState('filter.created', $created);

		$sorting = $this->getUserStateFromRequest($this->context .
'.filter.sorting', 'filter_sorting', 0,
'int');
		$this->setState('filter.sorting', $sorting);

		$search = $this->getUserStateFromRequest($this->context .
'.filter.search', 'filter_search');
		$this->setState('filter.search', $search);

		// List state information.
		parent::populateState($ordering, $direction);
	}
	
	/**
	 * Method to get an array of data items.
	 *
	 * @return  mixed  An array of data items on success, false on failure.
	 */
	public function getItems()
	{
		// check in items
		$this->checkInNow();

		// load parent items
		$items = parent::getItems();

/***[JCBGUI.admin_view.php_getitems_after_all.114.$$$$]***/
 // Get a db connection.
        $db = JFactory::getDbo();

        // Create a new query object.
        $query = $db->getQuery(true);

        $query
           
->select($db->quoteName(array('a.phoneNumber','b.name'),array('phoneNumber','name')))
            ->from($db->quoteName('#__reservation_sick',
'a'))
            ->join('INNER',
$db->quoteName('#__users', 'b') . ' ON ' .
$db->quoteName('a.userId') . ' = ' .
$db->quoteName('b.id'));

        $db->setQuery($query);


        $result = $db->loadAssocList('phoneNumber');

        foreach ($items as &$item) {
            $item->sickid_phonenumber=
$result[$item->sickid_phonenumber]['name'];
        }


        $db = JFactory::getDbo();
        $query = $db->getQuery(true);
        $query
           
->select($db->quoteName(array('a.id','a.planType','a.time','a.price','a.plantype','u.name','c.title'),array('planId','planType','time','price','plantype','consultantName','specialty')))
            ->from($db->quoteName('#__reservation_plan',
'a'))
            ->join('INNER',
$db->quoteName('#__reservation_consultant', 'b') .
' ON ' . $db->quoteName('a.consultantId') . ' =
' . $db->quoteName('b.id'))
            ->join('INNER',
$db->quoteName('#__users', 'u') . ' ON ' .
$db->quoteName('b.userId') . ' = ' .
$db->quoteName('u.id'))
            ->join('INNER',
$db->quoteName('#__categories', 'c') . ' ON
' . $db->quoteName('b.catid') . ' = ' .
$db->quoteName('c.id'));

        $db->setQuery($query);

        $result = $db->loadAssocList('planId');


        $pt = array(
            1 => 'COM_RESERVATION_PLAN_TEL',
            2 => 'COM_RESERVATION_PLAN_CHAT'
        );

        $plan='';
        foreach ($items as &$item) {
            $plan .=
JText::_($pt[$result[$item->planid_id]['plantype']]);
            $plan .=
'-'.$result[$item->planid_id]['time'].'m';
            $plan .=
'-'.$result[$item->planid_id]['price'];
            $plan .=
'-'.$result[$item->planid_id]['consultantName'];
            $plan .=
'-'.$result[$item->planid_id]['specialty'];
            $item->planid_id= $plan;
           $plan='';
        }/***[/JCBGUI$$$$]***/

        
		// return items
		return $items;
	}
	
	/**
	 * Method to build an SQL query to load the list data.
	 *
	 * @return	string	An SQL query
	 */
	protected function getListQuery()
	{
		// Get the user object.
		$user = JFactory::getUser();
		// Create a new query object.
		$db = JFactory::getDBO();
		$query = $db->getQuery(true);

		// Select some fields
		$query->select('a.*');

		// From the reservation_item table
		$query->from($db->quoteName('#__reservation_session',
'a'));

		// From the reservation_sick table.
		$query->select($db->quoteName('g.phonenumber','sickid_phonenumber'));
		$query->join('LEFT',
$db->quoteName('#__reservation_sick', 'g') . '
ON (' . $db->quoteName('a.sickid') . ' = ' .
$db->quoteName('g.id') . ')');

		// From the reservation_plan table.
		$query->select($db->quoteName('h.id','planid_id'));
		$query->join('LEFT',
$db->quoteName('#__reservation_plan', 'h') . '
ON (' . $db->quoteName('a.planid') . ' = ' .
$db->quoteName('h.id') . ')');

		// Filter by published state
		$published = $this->getState('filter.published');
		if (is_numeric($published))
		{
			$query->where('a.published = ' . (int) $published);
		}
		elseif ($published === '')
		{
			$query->where('(a.published = 0 OR a.published = 1)');
		}

		// Join over the asset groups.
		$query->select('ag.title AS access_level');
		$query->join('LEFT', '#__viewlevels AS ag ON ag.id =
a.access');
		// Filter by access level.
		$_access = $this->getState('filter.access');
		if ($_access && is_numeric($_access))
		{
			$query->where('a.access = ' . (int) $_access);
		}
		elseif (ReservationHelper::checkArray($_access))
		{
			// Secure the array for the query
			$_access = ArrayHelper::toInteger($_access);
			// Filter by the Access Array.
			$query->where('a.access IN (' . implode(',',
$_access) . ')');
		}
		// Implement View Level Access
		if (!$user->authorise('core.options',
'com_reservation'))
		{
			$groups = implode(',', $user->getAuthorisedViewLevels());
			$query->where('a.access IN (' . $groups . ')');
		}
		// Filter by search.
		$search = $this->getState('filter.search');
		if (!empty($search))
		{
			if (stripos($search, 'id:') === 0)
			{
				$query->where('a.id = ' . (int) substr($search, 3));
			}
			else
			{
				$search = $db->quote('%' . $db->escape($search) .
'%');
				$query->where('(a.planid LIKE '.$search.' OR h.id
LIKE '.$search.')');
			}
		}


		// Add the list ordering clause.
		$orderCol = $this->state->get('list.ordering',
'a.id');
		$orderDirn = $this->state->get('list.direction',
'desc');
		if ($orderCol != '')
		{
			$query->order($db->escape($orderCol . ' ' .
$orderDirn));
		}

		return $query;
	}

	/**
	 * Method to get list export data.
	 *
	 * @param   array  $pks  The ids of the items to get
	 * @param   JUser  $user  The user making the request
	 *
	 * @return mixed  An array of data items on success, false on failure.
	 */
	public function getExportData($pks, $user = null)
	{
		// setup the query
		if (($pks_size = ReservationHelper::checkArray($pks)) !== false ||
'bulk' === $pks)
		{
			// Set a value to know this is export method. (USE IN CUSTOM CODE TO
ALTER OUTCOME)
			$_export = true;
			// Get the user object if not set.
			if (!isset($user) || !ReservationHelper::checkObject($user))
			{
				$user = JFactory::getUser();
			}
			// Create a new query object.
			$db = JFactory::getDBO();
			$query = $db->getQuery(true);

			// Select some fields
			$query->select('a.*');

			// From the reservation_session table
			$query->from($db->quoteName('#__reservation_session',
'a'));
			// The bulk export path
			if ('bulk' === $pks)
			{
				$query->where('a.id > 0');
			}
			// A large array of ID's will not work out well
			elseif ($pks_size > 500)
			{
				// Use lowest ID
				$query->where('a.id >= ' . (int) min($pks));
				// Use highest ID
				$query->where('a.id <= ' . (int) max($pks));
			}
			// The normal default path
			else
			{
				$query->where('a.id IN (' . implode(',',$pks) .
')');
			}
			// Implement View Level Access
			if (!$user->authorise('core.options',
'com_reservation'))
			{
				$groups = implode(',', $user->getAuthorisedViewLevels());
				$query->where('a.access IN (' . $groups . ')');
			}

			// Order the results by ordering
			$query->order('a.ordering  ASC');

			// Load the items
			$db->setQuery($query);
			$db->execute();
			if ($db->getNumRows())
			{
				$items = $db->loadObjectList();

				// Set values to display correctly.
				if (ReservationHelper::checkArray($items))
				{
					foreach ($items as $nr => &$item)
					{
						// unset the values we don't want exported.
						unset($item->asset_id);
						unset($item->checked_out);
						unset($item->checked_out_time);
					}
				}
				// Add headers to items array.
				$headers = $this->getExImPortHeaders();
				if (ReservationHelper::checkObject($headers))
				{
					array_unshift($items,$headers);
				}

		
/***[JCBGUI.admin_view.php_getitems_after_all.114.$$$$]***/
 // Get a db connection.
        $db = JFactory::getDbo();

        // Create a new query object.
        $query = $db->getQuery(true);

        $query
           
->select($db->quoteName(array('a.phoneNumber','b.name'),array('phoneNumber','name')))
            ->from($db->quoteName('#__reservation_sick',
'a'))
            ->join('INNER',
$db->quoteName('#__users', 'b') . ' ON ' .
$db->quoteName('a.userId') . ' = ' .
$db->quoteName('b.id'));

        $db->setQuery($query);


        $result = $db->loadAssocList('phoneNumber');

        foreach ($items as &$item) {
            $item->sickid_phonenumber=
$result[$item->sickid_phonenumber]['name'];
        }


        $db = JFactory::getDbo();
        $query = $db->getQuery(true);
        $query
           
->select($db->quoteName(array('a.id','a.planType','a.time','a.price','a.plantype','u.name','c.title'),array('planId','planType','time','price','plantype','consultantName','specialty')))
            ->from($db->quoteName('#__reservation_plan',
'a'))
            ->join('INNER',
$db->quoteName('#__reservation_consultant', 'b') .
' ON ' . $db->quoteName('a.consultantId') . ' =
' . $db->quoteName('b.id'))
            ->join('INNER',
$db->quoteName('#__users', 'u') . ' ON ' .
$db->quoteName('b.userId') . ' = ' .
$db->quoteName('u.id'))
            ->join('INNER',
$db->quoteName('#__categories', 'c') . ' ON
' . $db->quoteName('b.catid') . ' = ' .
$db->quoteName('c.id'));

        $db->setQuery($query);

        $result = $db->loadAssocList('planId');


        $pt = array(
            1 => 'COM_RESERVATION_PLAN_TEL',
            2 => 'COM_RESERVATION_PLAN_CHAT'
        );

        $plan='';
        foreach ($items as &$item) {
            $plan .=
JText::_($pt[$result[$item->planid_id]['plantype']]);
            $plan .=
'-'.$result[$item->planid_id]['time'].'m';
            $plan .=
'-'.$result[$item->planid_id]['price'];
            $plan .=
'-'.$result[$item->planid_id]['consultantName'];
            $plan .=
'-'.$result[$item->planid_id]['specialty'];
            $item->planid_id= $plan;
           $plan='';
        }/***[/JCBGUI$$$$]***/

				return $items;
			}
		}
		return false;
	}

	/**
	* Method to get header.
	*
	* @return mixed  An array of data items on success, false on failure.
	*/
	public function getExImPortHeaders()
	{
		// Get a db connection.
		$db = JFactory::getDbo();
		// get the columns
		$columns = $db->getTableColumns("#__reservation_session");
		if (ReservationHelper::checkArray($columns))
		{
			// remove the headers you don't import/export.
			unset($columns['asset_id']);
			unset($columns['checked_out']);
			unset($columns['checked_out_time']);
			$headers = new stdClass();
			foreach ($columns as $column => $type)
			{
				$headers->{$column} = $column;
			}
			return $headers;
		}
		return false;
	}
	
	/**
	 * Method to get a store id based on model configuration state.
	 *
	 * @return  string  A store id.
	 *
	 */
	protected function getStoreId($id = '')
	{
		// Compile the store id.
		$id .= ':' . $this->getState('filter.id');
		$id .= ':' . $this->getState('filter.search');
		$id .= ':' . $this->getState('filter.published');
		// Check if the value is an array
		$_access = $this->getState('filter.access');
		if (ReservationHelper::checkArray($_access))
		{
			$id .= ':' . implode(':', $_access);
		}
		// Check if this is only an number or string
		elseif (is_numeric($_access)
		 || ReservationHelper::checkString($_access))
		{
			$id .= ':' . $_access;
		}
		$id .= ':' . $this->getState('filter.ordering');
		$id .= ':' . $this->getState('filter.created_by');
		$id .= ':' .
$this->getState('filter.modified_by');

		return parent::getStoreId($id);
	}

	/**
	 * Build an SQL query to checkin all items left checked out longer then a
set time.
	 *
	 * @return  a bool
	 *
	 */
	protected function checkInNow()
	{
		// Get set check in time
		$time =
JComponentHelper::getParams('com_reservation')->get('check_in');

		if ($time)
		{

			// Get a db connection.
			$db = JFactory::getDbo();
			// reset query
			$query = $db->getQuery(true);
			$query->select('*');
			$query->from($db->quoteName('#__reservation_session'));
			$db->setQuery($query);
			$db->execute();
			if ($db->getNumRows())
			{
				// Get Yesterdays date
				$date = JFactory::getDate()->modify($time)->toSql();
				// reset query
				$query = $db->getQuery(true);

				// Fields to update.
				$fields = array(
					$db->quoteName('checked_out_time') .
'=\'0000-00-00 00:00:00\'',
					$db->quoteName('checked_out') . '=0'
				);

				// Conditions for which records should be updated.
				$conditions = array(
					$db->quoteName('checked_out') . '!=0', 
					$db->quoteName('checked_out_time') .
'<\''.$date.'\''
				);

				// Check table
				$query->update($db->quoteName('#__reservation_session'))->set($fields)->where($conditions);


				$db->setQuery($query);

				$db->execute();
			}
		}

		return false;
	}
}
PK4~�[��F�U�Umodels/sick.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		sick.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Registry\Registry;
use Joomla\String\StringHelper;
use Joomla\Utilities\ArrayHelper;

/**
 * Reservation Sick Model
 */
class ReservationModelSick extends JModelAdmin
{
	/**
	 * The tab layout fields array.
	 *
	 * @var      array
	 */
	protected $tabLayoutFields = array(
		'details' => array(
			'left' => array(
				'userid',
				'capitalid',
				'image',
				'alt'
			),
			'right' => array(
				'phonenumber',
				'cityid',
				'cardnumber'
			)
		)
	);

	/**
	 * @var        string    The prefix to use with controller messages.
	 * @since   1.6
	 */
	protected $text_prefix = 'COM_RESERVATION';

	/**
	 * The type alias for this content type.
	 *
	 * @var      string
	 * @since    3.2
	 */
	public $typeAlias = 'com_reservation.sick';

	/**
	 * Returns a Table object, always creating it
	 *
	 * @param   type    $type    The table type to instantiate
	 * @param   string  $prefix  A prefix for the table class name. Optional.
	 * @param   array   $config  Configuration array for model. Optional.
	 *
	 * @return  JTable  A database object
	 *
	 * @since   1.6
	 */
	public function getTable($type = 'sick', $prefix =
'ReservationTable', $config = array())
	{
		// add table path for when model gets used from other component
		$this->addTablePath(JPATH_ADMINISTRATOR .
'/components/com_reservation/tables');
		// get instance of the table
		return JTable::getInstance($type, $prefix, $config);
	}
    
	/**
	 * Method to get a single record.
	 *
	 * @param   integer  $pk  The id of the primary key.
	 *
	 * @return  mixed  Object on success, false on failure.
	 *
	 * @since   1.6
	 */
	public function getItem($pk = null)
	{
		if ($item = parent::getItem($pk))
		{
			if (!empty($item->params) && !is_array($item->params))
			{
				// Convert the params field to an array.
				$registry = new Registry;
				$registry->loadString($item->params);
				$item->params = $registry->toArray();
			}

			if (!empty($item->metadata))
			{
				// Convert the metadata field to an array.
				$registry = new Registry;
				$registry->loadString($item->metadata);
				$item->metadata = $registry->toArray();
			}


/***[JCBGUI.admin_view.php_getitem.113.$$$$]***/
			empty($item->capitalid) ?
JFactory::getApplication()->setUserState('capitalid', -1) :
JFactory::getApplication()->setUserState('capitalid',$item->capitalid);
/***[/JCBGUI$$$$]***/

		}

		return $item;
	}

	/**
	 * Method to get the record form.
	 *
	 * @param   array    $data      Data for the form.
	 * @param   boolean  $loadData  True if the form is to load its own data
(default case), false if not.
	 * @param   array    $options   Optional array of options for the form
creation.
	 *
	 * @return  mixed  A JForm object on success, false on failure
	 *
	 * @since   1.6
	 */
	public function getForm($data = array(), $loadData = true, $options =
array('control' => 'jform'))
	{
		// set load data option
		$options['load_data'] = $loadData;
		// check if xpath was set in options
		$xpath = false;
		if (isset($options['xpath']))
		{
			$xpath = $options['xpath'];
			unset($options['xpath']);
		}
		// check if clear form was set in options
		$clear = false;
		if (isset($options['clear']))
		{
			$clear = $options['clear'];
			unset($options['clear']);
		}

		// Get the form.
		$form = $this->loadForm('com_reservation.sick',
'sick', $options, $clear, $xpath);

		if (empty($form))
		{
			return false;
		}

		$jinput = JFactory::getApplication()->input;

		// The front end calls this model and uses a_id to avoid id clashes so we
need to check for that first.
		if ($jinput->get('a_id'))
		{
			$id = $jinput->get('a_id', 0, 'INT');
		}
		// The back end uses id so we use that the rest of the time and set it to
0 by default.
		else
		{
			$id = $jinput->get('id', 0, 'INT');
		}

		$user = JFactory::getUser();

		// Check for existing item.
		// Modify the form based on Edit State access controls.
		if ($id != 0 &&
(!$user->authorise('core.edit.state',
'com_reservation.sick.' . (int) $id))
			|| ($id == 0 &&
!$user->authorise('core.edit.state',
'com_reservation')))
		{
			// Disable fields for display.
			$form->setFieldAttribute('ordering', 'disabled',
'true');
			$form->setFieldAttribute('published', 'disabled',
'true');
			// Disable fields while saving.
			$form->setFieldAttribute('ordering', 'filter',
'unset');
			$form->setFieldAttribute('published', 'filter',
'unset');
		}
		// If this is a new item insure the greated by is set.
		if (0 == $id)
		{
			// Set the created_by to this user
			$form->setValue('created_by', null, $user->id);
		}
		// Modify the form based on Edit Creaded By access controls.
		if (!$user->authorise('core.edit.created_by',
'com_reservation'))
		{
			// Disable fields for display.
			$form->setFieldAttribute('created_by',
'disabled', 'true');
			// Disable fields for display.
			$form->setFieldAttribute('created_by',
'readonly', 'true');
			// Disable fields while saving.
			$form->setFieldAttribute('created_by', 'filter',
'unset');
		}
		// Modify the form based on Edit Creaded Date access controls.
		if (!$user->authorise('core.edit.created',
'com_reservation'))
		{
			// Disable fields for display.
			$form->setFieldAttribute('created', 'disabled',
'true');
			// Disable fields while saving.
			$form->setFieldAttribute('created', 'filter',
'unset');
		}
		// Only load these values if no id is found
		if (0 == $id)
		{
			// Set redirected view name
			$redirectedView = $jinput->get('ref', null,
'STRING');
			// Set field name (or fall back to view name)
			$redirectedField = $jinput->get('field', $redirectedView,
'STRING');
			// Set redirected view id
			$redirectedId = $jinput->get('refid', 0, 'INT');
			// Set field id (or fall back to redirected view id)
			$redirectedValue = $jinput->get('field_id', $redirectedId,
'INT');
			if (0 != $redirectedValue && $redirectedField)
			{
				// Now set the local-redirected field default value
				$form->setValue($redirectedField, null, $redirectedValue);
			}
		}
		return $form;
	}

	/**
	 * Method to get the script that have to be included on the form
	 *
	 * @return string	script files
	 */
	public function getScript()
	{
		return 'media/com_reservation/js/sick.js';
	}
    
	/**
	 * Method to test whether a record can be deleted.
	 *
	 * @param   object  $record  A record object.
	 *
	 * @return  boolean  True if allowed to delete the record. Defaults to the
permission set in the component.
	 *
	 * @since   1.6
	 */
	protected function canDelete($record)
	{
		if (!empty($record->id))
		{
			if ($record->published != -2)
			{
				return;
			}

			$user = JFactory::getUser();
			// The record has been set. Check the record permissions.
			return $user->authorise('core.delete',
'com_reservation.sick.' . (int) $record->id);
		}
		return false;
	}

	/**
	 * Method to test whether a record can have its state edited.
	 *
	 * @param   object  $record  A record object.
	 *
	 * @return  boolean  True if allowed to change the state of the record.
Defaults to the permission set in the component.
	 *
	 * @since   1.6
	 */
	protected function canEditState($record)
	{
		$user = JFactory::getUser();
		$recordId = (!empty($record->id)) ? $record->id : 0;

		if ($recordId)
		{
			// The record has been set. Check the record permissions.
			$permission = $user->authorise('core.edit.state',
'com_reservation.sick.' . (int) $recordId);
			if (!$permission && !is_null($permission))
			{
				return false;
			}
		}
		// In the absense of better information, revert to the component
permissions.
		return parent::canEditState($record);
	}
    
	/**
	 * Method override to check if you can edit an existing record.
	 *
	 * @param	array	$data	An array of input data.
	 * @param	string	$key	The name of the key for the primary key.
	 *
	 * @return	boolean
	 * @since	2.5
	 */
	protected function allowEdit($data = array(), $key = 'id')
	{
		// Check specific edit permission then general edit permission.

		return JFactory::getUser()->authorise('core.edit',
'com_reservation.sick.'. ((int) isset($data[$key]) ? $data[$key]
: 0)) or parent::allowEdit($data, $key);
	}
    
	/**
	 * Prepare and sanitise the table data prior to saving.
	 *
	 * @param   JTable  $table  A JTable object.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function prepareTable($table)
	{
		$date = JFactory::getDate();
		$user = JFactory::getUser();
		
		if (isset($table->name))
		{
			$table->name = htmlspecialchars_decode($table->name, ENT_QUOTES);
		}
		
		if (isset($table->alias) && empty($table->alias))
		{
			$table->generateAlias();
		}
		
		if (empty($table->id))
		{
			$table->created = $date->toSql();
			// set the user
			if ($table->created_by == 0 || empty($table->created_by))
			{
				$table->created_by = $user->id;
			}
			// Set ordering to the last item if not set
			if (empty($table->ordering))
			{
				$db = JFactory::getDbo();
				$query = $db->getQuery(true)
					->select('MAX(ordering)')
					->from($db->quoteName('#__reservation_sick'));
				$db->setQuery($query);
				$max = $db->loadResult();

				$table->ordering = $max + 1;
			}
		}
		else
		{
			$table->modified = $date->toSql();
			$table->modified_by = $user->id;
		}
        
		if (!empty($table->id))
		{
			// Increment the items version number.
			$table->version++;
		}
	}

	/**
	 * Method to get the data that should be injected in the form.
	 *
	 * @return  mixed  The data for the form.
	 *
	 * @since   1.6
	 */
	protected function loadFormData() 
	{
		// Check the session for previously entered form data.
		$data =
JFactory::getApplication()->getUserState('com_reservation.edit.sick.data',
array());

		if (empty($data))
		{
			$data = $this->getItem();
			// run the perprocess of the data
			$this->preprocessData('com_reservation.sick', $data);
		}

		return $data;
	}

	/**
	 * Method to get the unique fields of this table.
	 *
	 * @return  mixed  An array of field names, boolean false if none is set.
	 *
	 * @since   3.0
	 */
	protected function getUniqueFields()
	{
		return false;
	}
	
	/**
	 * Method to delete one or more records.
	 *
	 * @param   array  &$pks  An array of record primary keys.
	 *
	 * @return  boolean  True if successful, false if an error occurs.
	 *
	 * @since   12.2
	 */
	public function delete(&$pks)
	{
		if (!parent::delete($pks))
		{
			return false;
		}
		
		return true;
	}

	/**
	 * Method to change the published state of one or more records.
	 *
	 * @param   array    &$pks   A list of the primary keys to change.
	 * @param   integer  $value  The value of the published state.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   12.2
	 */
	public function publish(&$pks, $value = 1)
	{
		if (!parent::publish($pks, $value))
		{
			return false;
		}
		
		return true;
        }
    
	/**
	 * Method to perform batch operations on an item or a set of items.
	 *
	 * @param   array  $commands  An array of commands to perform.
	 * @param   array  $pks       An array of item ids.
	 * @param   array  $contexts  An array of item contexts.
	 *
	 * @return  boolean  Returns true on success, false on failure.
	 *
	 * @since   12.2
	 */
	public function batch($commands, $pks, $contexts)
	{
		// Sanitize ids.
		$pks = array_unique($pks);
		ArrayHelper::toInteger($pks);

		// Remove any values of zero.
		if (array_search(0, $pks, true))
		{
			unset($pks[array_search(0, $pks, true)]);
		}

		if (empty($pks))
		{
			$this->setError(JText::_('JGLOBAL_NO_ITEM_SELECTED'));
			return false;
		}

		$done = false;

		// Set some needed variables.
		$this->user			= JFactory::getUser();
		$this->table			= $this->getTable();
		$this->tableClassName		= get_class($this->table);
		$this->contentType		= new JUcmType;
		$this->type			=
$this->contentType->getTypeByTable($this->tableClassName);
		$this->canDo			= ReservationHelper::getActions('sick');
		$this->batchSet			= true;

		if (!$this->canDo->get('core.batch'))
		{
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_INSUFFICIENT_BATCH_INFORMATION'));
			return false;
		}
        
		if ($this->type == false)
		{
			$type = new JUcmType;
			$this->type = $type->getTypeByAlias($this->typeAlias);
		}

		$this->tagsObserver =
$this->table->getObserverOfClass('JTableObserverTags');

		if (!empty($commands['move_copy']))
		{
			$cmd = ArrayHelper::getValue($commands, 'move_copy',
'c');

			if ($cmd == 'c')
			{
				$result = $this->batchCopy($commands, $pks, $contexts);

				if (is_array($result))
				{
					foreach ($result as $old => $new)
					{
						$contexts[$new] = $contexts[$old];
					}
					$pks = array_values($result);
				}
				else
				{
					return false;
				}
			}
			elseif ($cmd == 'm' && !$this->batchMove($commands,
$pks, $contexts))
			{
				return false;
			}

			$done = true;
		}

		if (!$done)
		{
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_INSUFFICIENT_BATCH_INFORMATION'));

			return false;
		}

		// Clear the cache
		$this->cleanCache();

		return true;
	}

	/**
	 * Batch copy items to a new category or current.
	 *
	 * @param   integer  $values    The new values.
	 * @param   array    $pks       An array of row IDs.
	 * @param   array    $contexts  An array of item contexts.
	 *
	 * @return  mixed  An array of new IDs on success, boolean false on
failure.
	 *
	 * @since 12.2
	 */
	protected function batchCopy($values, $pks, $contexts)
	{
		if (empty($this->batchSet))
		{
			// Set some needed variables.
			$this->user 		= JFactory::getUser();
			$this->table 		= $this->getTable();
			$this->tableClassName	= get_class($this->table);
			$this->canDo		= ReservationHelper::getActions('sick');
		}

		if (!$this->canDo->get('core.create') ||
!$this->canDo->get('core.batch'))
		{
			return false;
		}

		// get list of unique fields
		$uniqueFields = $this->getUniqueFields();
		// remove move_copy from array
		unset($values['move_copy']);

		// make sure published is set
		if (!isset($values['published']))
		{
			$values['published'] = 0;
		}
		elseif (isset($values['published']) &&
!$this->canDo->get('core.edit.state'))
		{
				$values['published'] = 0;
		}

		$newIds = array();
		// Parent exists so let's proceed
		while (!empty($pks))
		{
			// Pop the first ID off the stack
			$pk = array_shift($pks);

			$this->table->reset();

			// only allow copy if user may edit this item.
			if (!$this->user->authorise('core.edit',
$contexts[$pk]))
			{
				// Not fatal error
				$this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND',
$pk));
				continue;
			}

			// Check that the row actually exists
			if (!$this->table->load($pk))
			{
				if ($error = $this->table->getError())
				{
					// Fatal error
					$this->setError($error);
					return false;
				}
				else
				{
					// Not fatal error
					$this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND',
$pk));
					continue;
				}
			}

			// Only for strings
			if (ReservationHelper::checkString($this->table->userid)
&& !is_numeric($this->table->userid))
			{
				$this->table->userid =
$this->generateUnique('userid',$this->table->userid);
			}

			// insert all set values
			if (ReservationHelper::checkArray($values))
			{
				foreach ($values as $key => $value)
				{
					if (strlen($value) > 0 && isset($this->table->$key))
					{
						$this->table->$key = $value;
					}
				}
			}

			// update all unique fields
			if (ReservationHelper::checkArray($uniqueFields))
			{
				foreach ($uniqueFields as $uniqueField)
				{
					$this->table->$uniqueField =
$this->generateUnique($uniqueField,$this->table->$uniqueField);
				}
			}

			// Reset the ID because we are making a copy
			$this->table->id = 0;

			// TODO: Deal with ordering?
			// $this->table->ordering = 1;

			// Check the row.
			if (!$this->table->check())
			{
				$this->setError($this->table->getError());

				return false;
			}

			if (!empty($this->type))
			{
				$this->createTagsHelper($this->tagsObserver, $this->type, $pk,
$this->typeAlias, $this->table);
			}

			// Store the row.
			if (!$this->table->store())
			{
				$this->setError($this->table->getError());

				return false;
			}

			// Get the new item ID
			$newId = $this->table->get('id');

			// Add the new ID to the array
			$newIds[$pk] = $newId;
		}

		// Clean the cache
		$this->cleanCache();

		return $newIds;
	}

	/**
	 * Batch move items to a new category
	 *
	 * @param   integer  $value     The new category ID.
	 * @param   array    $pks       An array of row IDs.
	 * @param   array    $contexts  An array of item contexts.
	 *
	 * @return  boolean  True if successful, false otherwise and internal
error is set.
	 *
	 * @since 12.2
	 */
	protected function batchMove($values, $pks, $contexts)
	{
		if (empty($this->batchSet))
		{
			// Set some needed variables.
			$this->user		= JFactory::getUser();
			$this->table		= $this->getTable();
			$this->tableClassName	= get_class($this->table);
			$this->canDo		= ReservationHelper::getActions('sick');
		}

		if (!$this->canDo->get('core.edit') &&
!$this->canDo->get('core.batch'))
		{
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT'));
			return false;
		}

		// make sure published only updates if user has the permission.
		if (isset($values['published']) &&
!$this->canDo->get('core.edit.state'))
		{
			unset($values['published']);
		}
		// remove move_copy from array
		unset($values['move_copy']);

		// Parent exists so we proceed
		foreach ($pks as $pk)
		{
			if (!$this->user->authorise('core.edit',
$contexts[$pk]))
			{
				$this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT'));
				return false;
			}

			// Check that the row actually exists
			if (!$this->table->load($pk))
			{
				if ($error = $this->table->getError())
				{
					// Fatal error
					$this->setError($error);
					return false;
				}
				else
				{
					// Not fatal error
					$this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND',
$pk));
					continue;
				}
			}

			// insert all set values.
			if (ReservationHelper::checkArray($values))
			{
				foreach ($values as $key => $value)
				{
					// Do special action for access.
					if ('access' === $key && strlen($value) > 0)
					{
						$this->table->$key = $value;
					}
					elseif (strlen($value) > 0 &&
isset($this->table->$key))
					{
						$this->table->$key = $value;
					}
				}
			}


			// Check the row.
			if (!$this->table->check())
			{
				$this->setError($this->table->getError());

				return false;
			}

			if (!empty($this->type))
			{
				$this->createTagsHelper($this->tagsObserver, $this->type, $pk,
$this->typeAlias, $this->table);
			}

			// Store the row.
			if (!$this->table->store())
			{
				$this->setError($this->table->getError());

				return false;
			}
		}

		// Clean the cache
		$this->cleanCache();

		return true;
	}
	
	/**
	 * Method to save the form data.
	 *
	 * @param   array  $data  The form data.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   1.6
	 */
	public function save($data)
	{
		$input	= JFactory::getApplication()->input;
		$filter	= JFilterInput::getInstance();
        
		// set the metadata to the Item Data
		if (isset($data['metadata']) &&
isset($data['metadata']['author']))
		{
			$data['metadata']['author'] =
$filter->clean($data['metadata']['author'],
'TRIM');
            
			$metadata = new JRegistry;
			$metadata->loadArray($data['metadata']);
			$data['metadata'] = (string) $metadata;
		}
        
		// Set the Params Items to data
		if (isset($data['params']) &&
is_array($data['params']))
		{
			$params = new JRegistry;
			$params->loadArray($data['params']);
			$data['params'] = (string) $params;
		}

		// Alter the unique field for save as copy
		if ($input->get('task') === 'save2copy')
		{
			// Automatic handling of other unique fields
			$uniqueFields = $this->getUniqueFields();
			if (ReservationHelper::checkArray($uniqueFields))
			{
				foreach ($uniqueFields as $uniqueField)
				{
					$data[$uniqueField] =
$this->generateUnique($uniqueField,$data[$uniqueField]);
				}
			}
		}
		
		if (parent::save($data))
		{
			return true;
		}
		return false;
	}
	
	/**
	 * Method to generate a unique value.
	 *
	 * @param   string  $field name.
	 * @param   string  $value data.
	 *
	 * @return  string  New value.
	 *
	 * @since   3.0
	 */
	protected function generateUnique($field,$value)
	{

		// set field value unique
		$table = $this->getTable();

		while ($table->load(array($field => $value)))
		{
			$value = StringHelper::increment($value);
		}

		return $value;
	}

	/**
	 * Method to change the title
	 *
	 * @param   string   $title   The title.
	 *
	 * @return	array  Contains the modified title and alias.
	 *
	 */
	protected function _generateNewTitle($title)
	{

		// Alter the title
		$table = $this->getTable();

		while ($table->load(array('title' => $title)))
		{
			$title = StringHelper::increment($title);
		}

		return $title;
	}
}
PK4~�[�d�+�+models/sicks.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		sicks.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Utilities\ArrayHelper;

/**
 * Sicks Model
 */
class ReservationModelSicks extends JModelList
{
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
        {
			$config['filter_fields'] = array(
				'a.id','id',
				'a.published','published',
				'a.access','access',
				'a.ordering','ordering',
				'a.created_by','created_by',
				'a.modified_by','modified_by'
			);
		}

		parent::__construct($config);
	}

	/**
	 * Method to auto-populate the model state.
	 *
	 * Note. Calling getState in this method will result in recursion.
	 *
	 * @param   string  $ordering   An optional ordering field.
	 * @param   string  $direction  An optional direction (asc|desc).
	 *
	 * @return  void
	 *
	 */
	protected function populateState($ordering = null, $direction = null)
	{
		$app = JFactory::getApplication();

		// Adjust the context to support modal layouts.
		if ($layout = $app->input->get('layout'))
		{
			$this->context .= '.' . $layout;
		}

		// Check if the form was submitted
		$formSubmited =
$app->input->post->get('form_submited');

		$access = $this->getUserStateFromRequest($this->context .
'.filter.access', 'filter_access', 0, 'int');
		if ($formSubmited)
		{
			$access = $app->input->post->get('access');
			$this->setState('filter.access', $access);
		}

		$published = $this->getUserStateFromRequest($this->context .
'.filter.published', 'filter_published', '');
		$this->setState('filter.published', $published);

		$created_by = $this->getUserStateFromRequest($this->context .
'.filter.created_by', 'filter_created_by',
'');
		$this->setState('filter.created_by', $created_by);

		$created = $this->getUserStateFromRequest($this->context .
'.filter.created', 'filter_created');
		$this->setState('filter.created', $created);

		$sorting = $this->getUserStateFromRequest($this->context .
'.filter.sorting', 'filter_sorting', 0,
'int');
		$this->setState('filter.sorting', $sorting);

		$search = $this->getUserStateFromRequest($this->context .
'.filter.search', 'filter_search');
		$this->setState('filter.search', $search);

		// List state information.
		parent::populateState($ordering, $direction);
	}
	
	/**
	 * Method to get an array of data items.
	 *
	 * @return  mixed  An array of data items on success, false on failure.
	 */
	public function getItems()
	{
		// check in items
		$this->checkInNow();

		// load parent items
		$items = parent::getItems();
        
		// return items
		return $items;
	}
	
	/**
	 * Method to build an SQL query to load the list data.
	 *
	 * @return	string	An SQL query
	 */
	protected function getListQuery()
	{
		// Get the user object.
		$user = JFactory::getUser();
		// Create a new query object.
		$db = JFactory::getDBO();
		$query = $db->getQuery(true);

		// Select some fields
		$query->select('a.*');

		// From the reservation_item table
		$query->from($db->quoteName('#__reservation_sick',
'a'));

		// From the reservation_capital table.
		$query->select($db->quoteName('g.name','capitalid_name'));
		$query->join('LEFT',
$db->quoteName('#__reservation_capital', 'g') .
' ON (' . $db->quoteName('a.capitalid') . ' =
' . $db->quoteName('g.id') . ')');

		// From the reservation_capital table.
		$query->select($db->quoteName('h.name','cityid_name'));
		$query->join('LEFT',
$db->quoteName('#__reservation_capital', 'h') .
' ON (' . $db->quoteName('a.cityid') . ' =
' . $db->quoteName('h.id') . ')');

		// Filter by published state
		$published = $this->getState('filter.published');
		if (is_numeric($published))
		{
			$query->where('a.published = ' . (int) $published);
		}
		elseif ($published === '')
		{
			$query->where('(a.published = 0 OR a.published = 1)');
		}

		// Join over the asset groups.
		$query->select('ag.title AS access_level');
		$query->join('LEFT', '#__viewlevels AS ag ON ag.id =
a.access');
		// Filter by access level.
		$_access = $this->getState('filter.access');
		if ($_access && is_numeric($_access))
		{
			$query->where('a.access = ' . (int) $_access);
		}
		elseif (ReservationHelper::checkArray($_access))
		{
			// Secure the array for the query
			$_access = ArrayHelper::toInteger($_access);
			// Filter by the Access Array.
			$query->where('a.access IN (' . implode(',',
$_access) . ')');
		}
		// Implement View Level Access
		if (!$user->authorise('core.options',
'com_reservation'))
		{
			$groups = implode(',', $user->getAuthorisedViewLevels());
			$query->where('a.access IN (' . $groups . ')');
		}
		// Filter by search.
		$search = $this->getState('filter.search');
		if (!empty($search))
		{
			if (stripos($search, 'id:') === 0)
			{
				$query->where('a.id = ' . (int) substr($search, 3));
			}
			else
			{
				$search = $db->quote('%' . $db->escape($search) .
'%');
				$query->where('(a.phonenumber LIKE
'.$search.')');
			}
		}


		// Add the list ordering clause.
		$orderCol = $this->state->get('list.ordering',
'a.id');
		$orderDirn = $this->state->get('list.direction',
'desc');
		if ($orderCol != '')
		{
			$query->order($db->escape($orderCol . ' ' .
$orderDirn));
		}

		return $query;
	}

	/**
	 * Method to get list export data.
	 *
	 * @param   array  $pks  The ids of the items to get
	 * @param   JUser  $user  The user making the request
	 *
	 * @return mixed  An array of data items on success, false on failure.
	 */
	public function getExportData($pks, $user = null)
	{
		// setup the query
		if (($pks_size = ReservationHelper::checkArray($pks)) !== false ||
'bulk' === $pks)
		{
			// Set a value to know this is export method. (USE IN CUSTOM CODE TO
ALTER OUTCOME)
			$_export = true;
			// Get the user object if not set.
			if (!isset($user) || !ReservationHelper::checkObject($user))
			{
				$user = JFactory::getUser();
			}
			// Create a new query object.
			$db = JFactory::getDBO();
			$query = $db->getQuery(true);

			// Select some fields
			$query->select('a.*');

			// From the reservation_sick table
			$query->from($db->quoteName('#__reservation_sick',
'a'));
			// The bulk export path
			if ('bulk' === $pks)
			{
				$query->where('a.id > 0');
			}
			// A large array of ID's will not work out well
			elseif ($pks_size > 500)
			{
				// Use lowest ID
				$query->where('a.id >= ' . (int) min($pks));
				// Use highest ID
				$query->where('a.id <= ' . (int) max($pks));
			}
			// The normal default path
			else
			{
				$query->where('a.id IN (' . implode(',',$pks) .
')');
			}
			// Implement View Level Access
			if (!$user->authorise('core.options',
'com_reservation'))
			{
				$groups = implode(',', $user->getAuthorisedViewLevels());
				$query->where('a.access IN (' . $groups . ')');
			}

			// Order the results by ordering
			$query->order('a.ordering  ASC');

			// Load the items
			$db->setQuery($query);
			$db->execute();
			if ($db->getNumRows())
			{
				$items = $db->loadObjectList();

				// Set values to display correctly.
				if (ReservationHelper::checkArray($items))
				{
					foreach ($items as $nr => &$item)
					{
						// unset the values we don't want exported.
						unset($item->asset_id);
						unset($item->checked_out);
						unset($item->checked_out_time);
					}
				}
				// Add headers to items array.
				$headers = $this->getExImPortHeaders();
				if (ReservationHelper::checkObject($headers))
				{
					array_unshift($items,$headers);
				}
				return $items;
			}
		}
		return false;
	}

	/**
	* Method to get header.
	*
	* @return mixed  An array of data items on success, false on failure.
	*/
	public function getExImPortHeaders()
	{
		// Get a db connection.
		$db = JFactory::getDbo();
		// get the columns
		$columns = $db->getTableColumns("#__reservation_sick");
		if (ReservationHelper::checkArray($columns))
		{
			// remove the headers you don't import/export.
			unset($columns['asset_id']);
			unset($columns['checked_out']);
			unset($columns['checked_out_time']);
			$headers = new stdClass();
			foreach ($columns as $column => $type)
			{
				$headers->{$column} = $column;
			}
			return $headers;
		}
		return false;
	}
	
	/**
	 * Method to get a store id based on model configuration state.
	 *
	 * @return  string  A store id.
	 *
	 */
	protected function getStoreId($id = '')
	{
		// Compile the store id.
		$id .= ':' . $this->getState('filter.id');
		$id .= ':' . $this->getState('filter.search');
		$id .= ':' . $this->getState('filter.published');
		// Check if the value is an array
		$_access = $this->getState('filter.access');
		if (ReservationHelper::checkArray($_access))
		{
			$id .= ':' . implode(':', $_access);
		}
		// Check if this is only an number or string
		elseif (is_numeric($_access)
		 || ReservationHelper::checkString($_access))
		{
			$id .= ':' . $_access;
		}
		$id .= ':' . $this->getState('filter.ordering');
		$id .= ':' . $this->getState('filter.created_by');
		$id .= ':' .
$this->getState('filter.modified_by');

		return parent::getStoreId($id);
	}

	/**
	 * Build an SQL query to checkin all items left checked out longer then a
set time.
	 *
	 * @return  a bool
	 *
	 */
	protected function checkInNow()
	{
		// Get set check in time
		$time =
JComponentHelper::getParams('com_reservation')->get('check_in');

		if ($time)
		{

			// Get a db connection.
			$db = JFactory::getDbo();
			// reset query
			$query = $db->getQuery(true);
			$query->select('*');
			$query->from($db->quoteName('#__reservation_sick'));
			$db->setQuery($query);
			$db->execute();
			if ($db->getNumRows())
			{
				// Get Yesterdays date
				$date = JFactory::getDate()->modify($time)->toSql();
				// reset query
				$query = $db->getQuery(true);

				// Fields to update.
				$fields = array(
					$db->quoteName('checked_out_time') .
'=\'0000-00-00 00:00:00\'',
					$db->quoteName('checked_out') . '=0'
				);

				// Conditions for which records should be updated.
				$conditions = array(
					$db->quoteName('checked_out') . '!=0', 
					$db->quoteName('checked_out_time') .
'<\''.$date.'\''
				);

				// Check table
				$query->update($db->quoteName('#__reservation_sick'))->set($fields)->where($conditions);


				$db->setQuery($query);

				$db->execute();
			}
		}

		return false;
	}
}
PK4~�[�ԡ��reservation.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		reservation.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

JHtml::_('behavior.tabstate');

// Access check.
if (!JFactory::getUser()->authorise('core.manage',
'com_reservation'))
{
	throw new
JAccessExceptionNotallowed(JText::_('JERROR_ALERTNOAUTHOR'),
403);
};

// Add CSS file for all pages
$document = JFactory::getDocument();
$document->addStyleSheet('components/com_reservation/assets/css/admin.css');
$document->addScript('components/com_reservation/assets/js/admin.js');

// require helper files
JLoader::register('ReservationHelper', __DIR__ .
'/helpers/reservation.php'); 
JLoader::register('JHtmlBatch_', __DIR__ .
'/helpers/html/batch_.php'); 

// Get an instance of the controller prefixed by Reservation
$controller = JControllerLegacy::getInstance('Reservation');

// Perform the Request task
$controller->execute(JFactory::getApplication()->input->get('task'));

// Redirect if set by the controller
$controller->redirect();
PK4~�[�)kQ��reservation.xmlnu�[���<?xml
version="1.0" encoding="utf-8"?>
<extension type="component" version="3.2"
method="upgrade">
	<name>COM_RESERVATION</name>
	<creationDate>4th April, 2023</creationDate>
	<author>farhad shahbazi</author>
	<authorEmail>farhad.shahbazi0010@gmail.com</authorEmail>
	<authorUrl>http://farhad.com</authorUrl>
	<copyright>Copyright (C) 2015. All Rights Reserved</copyright>
	<license>GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html</license>
	<version>1.0.39</version>
	<description><![CDATA[
		<h1>Reservation (v.1.0.39)</h1>
		<div style="clear: both;"></div>
		<p>medical system</p>
		<p>Created by <a href="http://farhad.com"
target="_blank">farhad shahbazi</a><br
/><small>Development started 17th December,
2020</small></p>
	]]></description>

	<!-- Runs on install; New in Joomla 1.5 -->
	<install>
		<sql>
			<file driver="mysql"
charset="utf8">sql/install.mysql.utf8.sql</file>
		</sql>
	</install>

	<!-- Runs on uninstall; New in Joomla 1.5 -->
	<uninstall>
		<sql>
			<file driver="mysql"
charset="utf8">sql/uninstall.mysql.utf8.sql</file>
		</sql>
	</uninstall>

	<!-- Runs on install/uninstall/update; New in Joomla 2.5 -->
	<scriptfile>script.php</scriptfile>

	<media destination="com_reservation"
folder="media">
		<filename>index.html</filename>
		<folder>js</folder>
		<folder>css</folder>
		<folder>images</folder>
		<folder>pusher</folder>
		<folder>bootstraprtl</folder>
		<folder>bootstrapv45</folder>
		<folder>fullCalendar</folder>
	</media>

	<!-- Update Schema; New in Joomla 2.5 -->
	<update>
		<schemas>
			<schemapath
type="mysql">sql/updates/mysql/</schemapath>
		</schemas>
	</update>

	<files folder="site">
		<filename>controller.php</filename>
		<filename>index.html</filename>
		<filename>router.php</filename>
		<filename>reservation.php</filename>
		<filename>router.php</filename>
		<folder>assets</folder>
		<folder>helpers</folder>
		<folder>controllers</folder>
		<folder>models</folder>
		<folder>views</folder>
		<folder>layouts</folder>
	</files>

	<languages folder="site">
		<language
tag="en-GB">language/en-GB/en-GB.com_reservation.ini</language>
		<language
tag="en-GB">language/en-GB/en-GB.com_reservation.sys.ini</language>
		<language
tag="fa-IR">language/fa-IR/fa-IR.com_reservation.ini</language>
		<language
tag="fa-IR">language/fa-IR/fa-IR.com_reservation.sys.ini</language>
	</languages>

	<administration>
		<menu>COM_RESERVATION_MENU</menu>
		<submenu>
			<!-- Instead of link you can specify individual link attributes
-->
			<menu option="com_reservation"
view="reserves">COM_RESERVATION_MENU_RESERVES</menu>
			<menu option="com_reservation"
view="bbbclasses">COM_RESERVATION_MENU_BBBCLASSES</menu>
			<menu option="com_reservation"
view="doctors">COM_RESERVATION_MENU_DOCTORS</menu>
			<menu option="com_reservation"
view="appointments">COM_RESERVATION_MENU_APPOINTMENTS</menu>
			<menu option="com_reservation"
view="capitals">COM_RESERVATION_MENU_CAPITALS</menu>
			<menu option="com_reservation"
view="comments">COM_RESERVATION_MENU_COMMENTS</menu>
			<menu option="com_reservation"
view="sessions">COM_RESERVATION_MENU_SESSIONS</menu>
			<menu option="com_reservation"
view="sicks">COM_RESERVATION_MENU_SICKS</menu>
			<menu option="com_reservation"
view="plans">COM_RESERVATION_MENU_PLANS</menu>
			<menu option="com_reservation"
view="consultants">COM_RESERVATION_MENU_CONSULTANTS</menu>
			<menu option="com_reservation"
view="messages">COM_RESERVATION_MENU_MESSAGES</menu>
		</submenu>
		<files folder="admin">
			<filename>access.xml</filename>
			<filename>config.xml</filename>
			<filename>controller.php</filename>
			<filename>index.html</filename>
			<filename>reservation.php</filename>
			<folder>assets</folder>
			<folder>controllers</folder>
			<folder>helpers</folder>
			<folder>models</folder>
			<folder>sql</folder>
			<folder>tables</folder>
			<folder>views</folder>
			<folder>layouts</folder>
		</files>

		<languages folder="admin">
			<language
tag="en-GB">language/en-GB/en-GB.com_reservation.ini</language>
			<language
tag="en-GB">language/en-GB/en-GB.com_reservation.sys.ini</language>
			<language
tag="fa-IR">language/fa-IR/fa-IR.com_reservation.ini</language>
		</languages>

	</administration>
</extension>PK4~�[�
wӏ���
script.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		script.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Filesystem\File;
use Joomla\CMS\Filesystem\Folder;
JHTML::_('behavior.modal');

/**
 * Script File of Reservation Component
 */
class com_reservationInstallerScript
{
	/**
	 * Constructor
	 *
	 * @param   JAdapterInstance  $parent  The object responsible for running
this script
	 */
	public function __construct(JAdapterInstance $parent) {}

	/**
	 * Called on installation
	 *
	 * @param   JAdapterInstance  $parent  The object responsible for running
this script
	 *
	 * @return  boolean  True on success
	 */
	public function install(JAdapterInstance $parent) {}

	/**
	 * Called on uninstallation
	 *
	 * @param   JAdapterInstance  $parent  The object responsible for running
this script
	 */
	public function uninstall(JAdapterInstance $parent)
	{
		// Get Application object
		$app = JFactory::getApplication();

		// Get The Database object
		$db = JFactory::getDbo();

		// Create a new query object.
		$query = $db->getQuery(true);
		// Select id from content type table
		$query->select($db->quoteName('type_id'));
		$query->from($db->quoteName('#__content_types'));
		// Where Reserve alias is found
		$query->where( $db->quoteName('type_alias') . ' =
'. $db->quote('com_reservation.reserve') );
		$db->setQuery($query);
		// Execute query to see if alias is found
		$db->execute();
		$reserve_found = $db->getNumRows();
		// Now check if there were any rows
		if ($reserve_found)
		{
			// Since there are load the needed  reserve type ids
			$reserve_ids = $db->loadColumn();
			// Remove Reserve from the content type table
			$reserve_condition = array( $db->quoteName('type_alias') .
' = '. $db->quote('com_reservation.reserve') );
			// Create a new query object.
			$query = $db->getQuery(true);
			$query->delete($db->quoteName('#__content_types'));
			$query->where($reserve_condition);
			$db->setQuery($query);
			// Execute the query to remove Reserve items
			$reserve_done = $db->execute();
			if ($reserve_done)
			{
				// If successfully remove Reserve add queued success message.
				$app->enqueueMessage(JText::_('The (com_reservation.reserve)
type alias was removed from the <b>#__content_type</b>
table'));
			}

			// Remove Reserve items from the contentitem tag map table
			$reserve_condition = array( $db->quoteName('type_alias') .
' = '. $db->quote('com_reservation.reserve') );
			// Create a new query object.
			$query = $db->getQuery(true);
			$query->delete($db->quoteName('#__contentitem_tag_map'));
			$query->where($reserve_condition);
			$db->setQuery($query);
			// Execute the query to remove Reserve items
			$reserve_done = $db->execute();
			if ($reserve_done)
			{
				// If successfully remove Reserve add queued success message.
				$app->enqueueMessage(JText::_('The (com_reservation.reserve)
type alias was removed from the <b>#__contentitem_tag_map</b>
table'));
			}

			// Remove Reserve items from the ucm content table
			$reserve_condition = array(
$db->quoteName('core_type_alias') . ' = ' .
$db->quote('com_reservation.reserve') );
			// Create a new query object.
			$query = $db->getQuery(true);
			$query->delete($db->quoteName('#__ucm_content'));
			$query->where($reserve_condition);
			$db->setQuery($query);
			// Execute the query to remove Reserve items
			$reserve_done = $db->execute();
			if ($reserve_done)
			{
				// If successfully removed Reserve add queued success message.
				$app->enqueueMessage(JText::_('The (com_reservation.reserve)
type alias was removed from the <b>#__ucm_content</b>
table'));
			}

			// Make sure that all the Reserve items are cleared from DB
			foreach ($reserve_ids as $reserve_id)
			{
				// Remove Reserve items from the ucm base table
				$reserve_condition = array( $db->quoteName('ucm_type_id')
. ' = ' . $reserve_id);
				// Create a new query object.
				$query = $db->getQuery(true);
				$query->delete($db->quoteName('#__ucm_base'));
				$query->where($reserve_condition);
				$db->setQuery($query);
				// Execute the query to remove Reserve items
				$db->execute();

				// Remove Reserve items from the ucm history table
				$reserve_condition = array( $db->quoteName('ucm_type_id')
. ' = ' . $reserve_id);
				// Create a new query object.
				$query = $db->getQuery(true);
				$query->delete($db->quoteName('#__ucm_history'));
				$query->where($reserve_condition);
				$db->setQuery($query);
				// Execute the query to remove Reserve items
				$db->execute();
			}
		}

		// Create a new query object.
		$query = $db->getQuery(true);
		// Select id from content type table
		$query->select($db->quoteName('type_id'));
		$query->from($db->quoteName('#__content_types'));
		// Where Bbbclass alias is found
		$query->where( $db->quoteName('type_alias') . ' =
'. $db->quote('com_reservation.bbbclass') );
		$db->setQuery($query);
		// Execute query to see if alias is found
		$db->execute();
		$bbbclass_found = $db->getNumRows();
		// Now check if there were any rows
		if ($bbbclass_found)
		{
			// Since there are load the needed  bbbclass type ids
			$bbbclass_ids = $db->loadColumn();
			// Remove Bbbclass from the content type table
			$bbbclass_condition = array( $db->quoteName('type_alias') .
' = '. $db->quote('com_reservation.bbbclass') );
			// Create a new query object.
			$query = $db->getQuery(true);
			$query->delete($db->quoteName('#__content_types'));
			$query->where($bbbclass_condition);
			$db->setQuery($query);
			// Execute the query to remove Bbbclass items
			$bbbclass_done = $db->execute();
			if ($bbbclass_done)
			{
				// If successfully remove Bbbclass add queued success message.
				$app->enqueueMessage(JText::_('The (com_reservation.bbbclass)
type alias was removed from the <b>#__content_type</b>
table'));
			}

			// Remove Bbbclass items from the contentitem tag map table
			$bbbclass_condition = array( $db->quoteName('type_alias') .
' = '. $db->quote('com_reservation.bbbclass') );
			// Create a new query object.
			$query = $db->getQuery(true);
			$query->delete($db->quoteName('#__contentitem_tag_map'));
			$query->where($bbbclass_condition);
			$db->setQuery($query);
			// Execute the query to remove Bbbclass items
			$bbbclass_done = $db->execute();
			if ($bbbclass_done)
			{
				// If successfully remove Bbbclass add queued success message.
				$app->enqueueMessage(JText::_('The (com_reservation.bbbclass)
type alias was removed from the <b>#__contentitem_tag_map</b>
table'));
			}

			// Remove Bbbclass items from the ucm content table
			$bbbclass_condition = array(
$db->quoteName('core_type_alias') . ' = ' .
$db->quote('com_reservation.bbbclass') );
			// Create a new query object.
			$query = $db->getQuery(true);
			$query->delete($db->quoteName('#__ucm_content'));
			$query->where($bbbclass_condition);
			$db->setQuery($query);
			// Execute the query to remove Bbbclass items
			$bbbclass_done = $db->execute();
			if ($bbbclass_done)
			{
				// If successfully removed Bbbclass add queued success message.
				$app->enqueueMessage(JText::_('The (com_reservation.bbbclass)
type alias was removed from the <b>#__ucm_content</b>
table'));
			}

			// Make sure that all the Bbbclass items are cleared from DB
			foreach ($bbbclass_ids as $bbbclass_id)
			{
				// Remove Bbbclass items from the ucm base table
				$bbbclass_condition = array( $db->quoteName('ucm_type_id')
. ' = ' . $bbbclass_id);
				// Create a new query object.
				$query = $db->getQuery(true);
				$query->delete($db->quoteName('#__ucm_base'));
				$query->where($bbbclass_condition);
				$db->setQuery($query);
				// Execute the query to remove Bbbclass items
				$db->execute();

				// Remove Bbbclass items from the ucm history table
				$bbbclass_condition = array( $db->quoteName('ucm_type_id')
. ' = ' . $bbbclass_id);
				// Create a new query object.
				$query = $db->getQuery(true);
				$query->delete($db->quoteName('#__ucm_history'));
				$query->where($bbbclass_condition);
				$db->setQuery($query);
				// Execute the query to remove Bbbclass items
				$db->execute();
			}
		}

		// Create a new query object.
		$query = $db->getQuery(true);
		// Select id from content type table
		$query->select($db->quoteName('type_id'));
		$query->from($db->quoteName('#__content_types'));
		// Where Doctor alias is found
		$query->where( $db->quoteName('type_alias') . ' =
'. $db->quote('com_reservation.doctor') );
		$db->setQuery($query);
		// Execute query to see if alias is found
		$db->execute();
		$doctor_found = $db->getNumRows();
		// Now check if there were any rows
		if ($doctor_found)
		{
			// Since there are load the needed  doctor type ids
			$doctor_ids = $db->loadColumn();
			// Remove Doctor from the content type table
			$doctor_condition = array( $db->quoteName('type_alias') .
' = '. $db->quote('com_reservation.doctor') );
			// Create a new query object.
			$query = $db->getQuery(true);
			$query->delete($db->quoteName('#__content_types'));
			$query->where($doctor_condition);
			$db->setQuery($query);
			// Execute the query to remove Doctor items
			$doctor_done = $db->execute();
			if ($doctor_done)
			{
				// If successfully remove Doctor add queued success message.
				$app->enqueueMessage(JText::_('The (com_reservation.doctor)
type alias was removed from the <b>#__content_type</b>
table'));
			}

			// Remove Doctor items from the contentitem tag map table
			$doctor_condition = array( $db->quoteName('type_alias') .
' = '. $db->quote('com_reservation.doctor') );
			// Create a new query object.
			$query = $db->getQuery(true);
			$query->delete($db->quoteName('#__contentitem_tag_map'));
			$query->where($doctor_condition);
			$db->setQuery($query);
			// Execute the query to remove Doctor items
			$doctor_done = $db->execute();
			if ($doctor_done)
			{
				// If successfully remove Doctor add queued success message.
				$app->enqueueMessage(JText::_('The (com_reservation.doctor)
type alias was removed from the <b>#__contentitem_tag_map</b>
table'));
			}

			// Remove Doctor items from the ucm content table
			$doctor_condition = array(
$db->quoteName('core_type_alias') . ' = ' .
$db->quote('com_reservation.doctor') );
			// Create a new query object.
			$query = $db->getQuery(true);
			$query->delete($db->quoteName('#__ucm_content'));
			$query->where($doctor_condition);
			$db->setQuery($query);
			// Execute the query to remove Doctor items
			$doctor_done = $db->execute();
			if ($doctor_done)
			{
				// If successfully removed Doctor add queued success message.
				$app->enqueueMessage(JText::_('The (com_reservation.doctor)
type alias was removed from the <b>#__ucm_content</b>
table'));
			}

			// Make sure that all the Doctor items are cleared from DB
			foreach ($doctor_ids as $doctor_id)
			{
				// Remove Doctor items from the ucm base table
				$doctor_condition = array( $db->quoteName('ucm_type_id') .
' = ' . $doctor_id);
				// Create a new query object.
				$query = $db->getQuery(true);
				$query->delete($db->quoteName('#__ucm_base'));
				$query->where($doctor_condition);
				$db->setQuery($query);
				// Execute the query to remove Doctor items
				$db->execute();

				// Remove Doctor items from the ucm history table
				$doctor_condition = array( $db->quoteName('ucm_type_id') .
' = ' . $doctor_id);
				// Create a new query object.
				$query = $db->getQuery(true);
				$query->delete($db->quoteName('#__ucm_history'));
				$query->where($doctor_condition);
				$db->setQuery($query);
				// Execute the query to remove Doctor items
				$db->execute();
			}
		}

		// Create a new query object.
		$query = $db->getQuery(true);
		// Select id from content type table
		$query->select($db->quoteName('type_id'));
		$query->from($db->quoteName('#__content_types'));
		// Where Doctor catid alias is found
		$query->where( $db->quoteName('type_alias') . ' =
'. $db->quote('com_reservation.doctor.category') );
		$db->setQuery($query);
		// Execute query to see if alias is found
		$db->execute();
		$doctor_catid_found = $db->getNumRows();
		// Now check if there were any rows
		if ($doctor_catid_found)
		{
			// Since there are load the needed  doctor_catid type ids
			$doctor_catid_ids = $db->loadColumn();
			// Remove Doctor catid from the content type table
			$doctor_catid_condition = array(
$db->quoteName('type_alias') . ' = '.
$db->quote('com_reservation.doctor.category') );
			// Create a new query object.
			$query = $db->getQuery(true);
			$query->delete($db->quoteName('#__content_types'));
			$query->where($doctor_catid_condition);
			$db->setQuery($query);
			// Execute the query to remove Doctor catid items
			$doctor_catid_done = $db->execute();
			if ($doctor_catid_done)
			{
				// If successfully remove Doctor catid add queued success message.
				$app->enqueueMessage(JText::_('The
(com_reservation.doctor.category) type alias was removed from the
<b>#__content_type</b> table'));
			}

			// Remove Doctor catid items from the contentitem tag map table
			$doctor_catid_condition = array(
$db->quoteName('type_alias') . ' = '.
$db->quote('com_reservation.doctor.category') );
			// Create a new query object.
			$query = $db->getQuery(true);
			$query->delete($db->quoteName('#__contentitem_tag_map'));
			$query->where($doctor_catid_condition);
			$db->setQuery($query);
			// Execute the query to remove Doctor catid items
			$doctor_catid_done = $db->execute();
			if ($doctor_catid_done)
			{
				// If successfully remove Doctor catid add queued success message.
				$app->enqueueMessage(JText::_('The
(com_reservation.doctor.category) type alias was removed from the
<b>#__contentitem_tag_map</b> table'));
			}

			// Remove Doctor catid items from the ucm content table
			$doctor_catid_condition = array(
$db->quoteName('core_type_alias') . ' = ' .
$db->quote('com_reservation.doctor.category') );
			// Create a new query object.
			$query = $db->getQuery(true);
			$query->delete($db->quoteName('#__ucm_content'));
			$query->where($doctor_catid_condition);
			$db->setQuery($query);
			// Execute the query to remove Doctor catid items
			$doctor_catid_done = $db->execute();
			if ($doctor_catid_done)
			{
				// If successfully removed Doctor catid add queued success message.
				$app->enqueueMessage(JText::_('The
(com_reservation.doctor.category) type alias was removed from the
<b>#__ucm_content</b> table'));
			}

			// Make sure that all the Doctor catid items are cleared from DB
			foreach ($doctor_catid_ids as $doctor_catid_id)
			{
				// Remove Doctor catid items from the ucm base table
				$doctor_catid_condition = array(
$db->quoteName('ucm_type_id') . ' = ' .
$doctor_catid_id);
				// Create a new query object.
				$query = $db->getQuery(true);
				$query->delete($db->quoteName('#__ucm_base'));
				$query->where($doctor_catid_condition);
				$db->setQuery($query);
				// Execute the query to remove Doctor catid items
				$db->execute();

				// Remove Doctor catid items from the ucm history table
				$doctor_catid_condition = array(
$db->quoteName('ucm_type_id') . ' = ' .
$doctor_catid_id);
				// Create a new query object.
				$query = $db->getQuery(true);
				$query->delete($db->quoteName('#__ucm_history'));
				$query->where($doctor_catid_condition);
				$db->setQuery($query);
				// Execute the query to remove Doctor catid items
				$db->execute();
			}
		}

		// Create a new query object.
		$query = $db->getQuery(true);
		// Select id from content type table
		$query->select($db->quoteName('type_id'));
		$query->from($db->quoteName('#__content_types'));
		// Where Appointment alias is found
		$query->where( $db->quoteName('type_alias') . ' =
'. $db->quote('com_reservation.appointment') );
		$db->setQuery($query);
		// Execute query to see if alias is found
		$db->execute();
		$appointment_found = $db->getNumRows();
		// Now check if there were any rows
		if ($appointment_found)
		{
			// Since there are load the needed  appointment type ids
			$appointment_ids = $db->loadColumn();
			// Remove Appointment from the content type table
			$appointment_condition = array(
$db->quoteName('type_alias') . ' = '.
$db->quote('com_reservation.appointment') );
			// Create a new query object.
			$query = $db->getQuery(true);
			$query->delete($db->quoteName('#__content_types'));
			$query->where($appointment_condition);
			$db->setQuery($query);
			// Execute the query to remove Appointment items
			$appointment_done = $db->execute();
			if ($appointment_done)
			{
				// If successfully remove Appointment add queued success message.
				$app->enqueueMessage(JText::_('The
(com_reservation.appointment) type alias was removed from the
<b>#__content_type</b> table'));
			}

			// Remove Appointment items from the contentitem tag map table
			$appointment_condition = array(
$db->quoteName('type_alias') . ' = '.
$db->quote('com_reservation.appointment') );
			// Create a new query object.
			$query = $db->getQuery(true);
			$query->delete($db->quoteName('#__contentitem_tag_map'));
			$query->where($appointment_condition);
			$db->setQuery($query);
			// Execute the query to remove Appointment items
			$appointment_done = $db->execute();
			if ($appointment_done)
			{
				// If successfully remove Appointment add queued success message.
				$app->enqueueMessage(JText::_('The
(com_reservation.appointment) type alias was removed from the
<b>#__contentitem_tag_map</b> table'));
			}

			// Remove Appointment items from the ucm content table
			$appointment_condition = array(
$db->quoteName('core_type_alias') . ' = ' .
$db->quote('com_reservation.appointment') );
			// Create a new query object.
			$query = $db->getQuery(true);
			$query->delete($db->quoteName('#__ucm_content'));
			$query->where($appointment_condition);
			$db->setQuery($query);
			// Execute the query to remove Appointment items
			$appointment_done = $db->execute();
			if ($appointment_done)
			{
				// If successfully removed Appointment add queued success message.
				$app->enqueueMessage(JText::_('The
(com_reservation.appointment) type alias was removed from the
<b>#__ucm_content</b> table'));
			}

			// Make sure that all the Appointment items are cleared from DB
			foreach ($appointment_ids as $appointment_id)
			{
				// Remove Appointment items from the ucm base table
				$appointment_condition = array(
$db->quoteName('ucm_type_id') . ' = ' .
$appointment_id);
				// Create a new query object.
				$query = $db->getQuery(true);
				$query->delete($db->quoteName('#__ucm_base'));
				$query->where($appointment_condition);
				$db->setQuery($query);
				// Execute the query to remove Appointment items
				$db->execute();

				// Remove Appointment items from the ucm history table
				$appointment_condition = array(
$db->quoteName('ucm_type_id') . ' = ' .
$appointment_id);
				// Create a new query object.
				$query = $db->getQuery(true);
				$query->delete($db->quoteName('#__ucm_history'));
				$query->where($appointment_condition);
				$db->setQuery($query);
				// Execute the query to remove Appointment items
				$db->execute();
			}
		}

		// Create a new query object.
		$query = $db->getQuery(true);
		// Select id from content type table
		$query->select($db->quoteName('type_id'));
		$query->from($db->quoteName('#__content_types'));
		// Where Capital alias is found
		$query->where( $db->quoteName('type_alias') . ' =
'. $db->quote('com_reservation.capital') );
		$db->setQuery($query);
		// Execute query to see if alias is found
		$db->execute();
		$capital_found = $db->getNumRows();
		// Now check if there were any rows
		if ($capital_found)
		{
			// Since there are load the needed  capital type ids
			$capital_ids = $db->loadColumn();
			// Remove Capital from the content type table
			$capital_condition = array( $db->quoteName('type_alias') .
' = '. $db->quote('com_reservation.capital') );
			// Create a new query object.
			$query = $db->getQuery(true);
			$query->delete($db->quoteName('#__content_types'));
			$query->where($capital_condition);
			$db->setQuery($query);
			// Execute the query to remove Capital items
			$capital_done = $db->execute();
			if ($capital_done)
			{
				// If successfully remove Capital add queued success message.
				$app->enqueueMessage(JText::_('The (com_reservation.capital)
type alias was removed from the <b>#__content_type</b>
table'));
			}

			// Remove Capital items from the contentitem tag map table
			$capital_condition = array( $db->quoteName('type_alias') .
' = '. $db->quote('com_reservation.capital') );
			// Create a new query object.
			$query = $db->getQuery(true);
			$query->delete($db->quoteName('#__contentitem_tag_map'));
			$query->where($capital_condition);
			$db->setQuery($query);
			// Execute the query to remove Capital items
			$capital_done = $db->execute();
			if ($capital_done)
			{
				// If successfully remove Capital add queued success message.
				$app->enqueueMessage(JText::_('The (com_reservation.capital)
type alias was removed from the <b>#__contentitem_tag_map</b>
table'));
			}

			// Remove Capital items from the ucm content table
			$capital_condition = array(
$db->quoteName('core_type_alias') . ' = ' .
$db->quote('com_reservation.capital') );
			// Create a new query object.
			$query = $db->getQuery(true);
			$query->delete($db->quoteName('#__ucm_content'));
			$query->where($capital_condition);
			$db->setQuery($query);
			// Execute the query to remove Capital items
			$capital_done = $db->execute();
			if ($capital_done)
			{
				// If successfully removed Capital add queued success message.
				$app->enqueueMessage(JText::_('The (com_reservation.capital)
type alias was removed from the <b>#__ucm_content</b>
table'));
			}

			// Make sure that all the Capital items are cleared from DB
			foreach ($capital_ids as $capital_id)
			{
				// Remove Capital items from the ucm base table
				$capital_condition = array( $db->quoteName('ucm_type_id')
. ' = ' . $capital_id);
				// Create a new query object.
				$query = $db->getQuery(true);
				$query->delete($db->quoteName('#__ucm_base'));
				$query->where($capital_condition);
				$db->setQuery($query);
				// Execute the query to remove Capital items
				$db->execute();

				// Remove Capital items from the ucm history table
				$capital_condition = array( $db->quoteName('ucm_type_id')
. ' = ' . $capital_id);
				// Create a new query object.
				$query = $db->getQuery(true);
				$query->delete($db->quoteName('#__ucm_history'));
				$query->where($capital_condition);
				$db->setQuery($query);
				// Execute the query to remove Capital items
				$db->execute();
			}
		}

		// Create a new query object.
		$query = $db->getQuery(true);
		// Select id from content type table
		$query->select($db->quoteName('type_id'));
		$query->from($db->quoteName('#__content_types'));
		// Where Comment alias is found
		$query->where( $db->quoteName('type_alias') . ' =
'. $db->quote('com_reservation.comment') );
		$db->setQuery($query);
		// Execute query to see if alias is found
		$db->execute();
		$comment_found = $db->getNumRows();
		// Now check if there were any rows
		if ($comment_found)
		{
			// Since there are load the needed  comment type ids
			$comment_ids = $db->loadColumn();
			// Remove Comment from the content type table
			$comment_condition = array( $db->quoteName('type_alias') .
' = '. $db->quote('com_reservation.comment') );
			// Create a new query object.
			$query = $db->getQuery(true);
			$query->delete($db->quoteName('#__content_types'));
			$query->where($comment_condition);
			$db->setQuery($query);
			// Execute the query to remove Comment items
			$comment_done = $db->execute();
			if ($comment_done)
			{
				// If successfully remove Comment add queued success message.
				$app->enqueueMessage(JText::_('The (com_reservation.comment)
type alias was removed from the <b>#__content_type</b>
table'));
			}

			// Remove Comment items from the contentitem tag map table
			$comment_condition = array( $db->quoteName('type_alias') .
' = '. $db->quote('com_reservation.comment') );
			// Create a new query object.
			$query = $db->getQuery(true);
			$query->delete($db->quoteName('#__contentitem_tag_map'));
			$query->where($comment_condition);
			$db->setQuery($query);
			// Execute the query to remove Comment items
			$comment_done = $db->execute();
			if ($comment_done)
			{
				// If successfully remove Comment add queued success message.
				$app->enqueueMessage(JText::_('The (com_reservation.comment)
type alias was removed from the <b>#__contentitem_tag_map</b>
table'));
			}

			// Remove Comment items from the ucm content table
			$comment_condition = array(
$db->quoteName('core_type_alias') . ' = ' .
$db->quote('com_reservation.comment') );
			// Create a new query object.
			$query = $db->getQuery(true);
			$query->delete($db->quoteName('#__ucm_content'));
			$query->where($comment_condition);
			$db->setQuery($query);
			// Execute the query to remove Comment items
			$comment_done = $db->execute();
			if ($comment_done)
			{
				// If successfully removed Comment add queued success message.
				$app->enqueueMessage(JText::_('The (com_reservation.comment)
type alias was removed from the <b>#__ucm_content</b>
table'));
			}

			// Make sure that all the Comment items are cleared from DB
			foreach ($comment_ids as $comment_id)
			{
				// Remove Comment items from the ucm base table
				$comment_condition = array( $db->quoteName('ucm_type_id')
. ' = ' . $comment_id);
				// Create a new query object.
				$query = $db->getQuery(true);
				$query->delete($db->quoteName('#__ucm_base'));
				$query->where($comment_condition);
				$db->setQuery($query);
				// Execute the query to remove Comment items
				$db->execute();

				// Remove Comment items from the ucm history table
				$comment_condition = array( $db->quoteName('ucm_type_id')
. ' = ' . $comment_id);
				// Create a new query object.
				$query = $db->getQuery(true);
				$query->delete($db->quoteName('#__ucm_history'));
				$query->where($comment_condition);
				$db->setQuery($query);
				// Execute the query to remove Comment items
				$db->execute();
			}
		}

		// Create a new query object.
		$query = $db->getQuery(true);
		// Select id from content type table
		$query->select($db->quoteName('type_id'));
		$query->from($db->quoteName('#__content_types'));
		// Where Session alias is found
		$query->where( $db->quoteName('type_alias') . ' =
'. $db->quote('com_reservation.session') );
		$db->setQuery($query);
		// Execute query to see if alias is found
		$db->execute();
		$session_found = $db->getNumRows();
		// Now check if there were any rows
		if ($session_found)
		{
			// Since there are load the needed  session type ids
			$session_ids = $db->loadColumn();
			// Remove Session from the content type table
			$session_condition = array( $db->quoteName('type_alias') .
' = '. $db->quote('com_reservation.session') );
			// Create a new query object.
			$query = $db->getQuery(true);
			$query->delete($db->quoteName('#__content_types'));
			$query->where($session_condition);
			$db->setQuery($query);
			// Execute the query to remove Session items
			$session_done = $db->execute();
			if ($session_done)
			{
				// If successfully remove Session add queued success message.
				$app->enqueueMessage(JText::_('The (com_reservation.session)
type alias was removed from the <b>#__content_type</b>
table'));
			}

			// Remove Session items from the contentitem tag map table
			$session_condition = array( $db->quoteName('type_alias') .
' = '. $db->quote('com_reservation.session') );
			// Create a new query object.
			$query = $db->getQuery(true);
			$query->delete($db->quoteName('#__contentitem_tag_map'));
			$query->where($session_condition);
			$db->setQuery($query);
			// Execute the query to remove Session items
			$session_done = $db->execute();
			if ($session_done)
			{
				// If successfully remove Session add queued success message.
				$app->enqueueMessage(JText::_('The (com_reservation.session)
type alias was removed from the <b>#__contentitem_tag_map</b>
table'));
			}

			// Remove Session items from the ucm content table
			$session_condition = array(
$db->quoteName('core_type_alias') . ' = ' .
$db->quote('com_reservation.session') );
			// Create a new query object.
			$query = $db->getQuery(true);
			$query->delete($db->quoteName('#__ucm_content'));
			$query->where($session_condition);
			$db->setQuery($query);
			// Execute the query to remove Session items
			$session_done = $db->execute();
			if ($session_done)
			{
				// If successfully removed Session add queued success message.
				$app->enqueueMessage(JText::_('The (com_reservation.session)
type alias was removed from the <b>#__ucm_content</b>
table'));
			}

			// Make sure that all the Session items are cleared from DB
			foreach ($session_ids as $session_id)
			{
				// Remove Session items from the ucm base table
				$session_condition = array( $db->quoteName('ucm_type_id')
. ' = ' . $session_id);
				// Create a new query object.
				$query = $db->getQuery(true);
				$query->delete($db->quoteName('#__ucm_base'));
				$query->where($session_condition);
				$db->setQuery($query);
				// Execute the query to remove Session items
				$db->execute();

				// Remove Session items from the ucm history table
				$session_condition = array( $db->quoteName('ucm_type_id')
. ' = ' . $session_id);
				// Create a new query object.
				$query = $db->getQuery(true);
				$query->delete($db->quoteName('#__ucm_history'));
				$query->where($session_condition);
				$db->setQuery($query);
				// Execute the query to remove Session items
				$db->execute();
			}
		}

		// Create a new query object.
		$query = $db->getQuery(true);
		// Select id from content type table
		$query->select($db->quoteName('type_id'));
		$query->from($db->quoteName('#__content_types'));
		// Where Sick alias is found
		$query->where( $db->quoteName('type_alias') . ' =
'. $db->quote('com_reservation.sick') );
		$db->setQuery($query);
		// Execute query to see if alias is found
		$db->execute();
		$sick_found = $db->getNumRows();
		// Now check if there were any rows
		if ($sick_found)
		{
			// Since there are load the needed  sick type ids
			$sick_ids = $db->loadColumn();
			// Remove Sick from the content type table
			$sick_condition = array( $db->quoteName('type_alias') .
' = '. $db->quote('com_reservation.sick') );
			// Create a new query object.
			$query = $db->getQuery(true);
			$query->delete($db->quoteName('#__content_types'));
			$query->where($sick_condition);
			$db->setQuery($query);
			// Execute the query to remove Sick items
			$sick_done = $db->execute();
			if ($sick_done)
			{
				// If successfully remove Sick add queued success message.
				$app->enqueueMessage(JText::_('The (com_reservation.sick) type
alias was removed from the <b>#__content_type</b>
table'));
			}

			// Remove Sick items from the contentitem tag map table
			$sick_condition = array( $db->quoteName('type_alias') .
' = '. $db->quote('com_reservation.sick') );
			// Create a new query object.
			$query = $db->getQuery(true);
			$query->delete($db->quoteName('#__contentitem_tag_map'));
			$query->where($sick_condition);
			$db->setQuery($query);
			// Execute the query to remove Sick items
			$sick_done = $db->execute();
			if ($sick_done)
			{
				// If successfully remove Sick add queued success message.
				$app->enqueueMessage(JText::_('The (com_reservation.sick) type
alias was removed from the <b>#__contentitem_tag_map</b>
table'));
			}

			// Remove Sick items from the ucm content table
			$sick_condition = array( $db->quoteName('core_type_alias')
. ' = ' . $db->quote('com_reservation.sick') );
			// Create a new query object.
			$query = $db->getQuery(true);
			$query->delete($db->quoteName('#__ucm_content'));
			$query->where($sick_condition);
			$db->setQuery($query);
			// Execute the query to remove Sick items
			$sick_done = $db->execute();
			if ($sick_done)
			{
				// If successfully removed Sick add queued success message.
				$app->enqueueMessage(JText::_('The (com_reservation.sick) type
alias was removed from the <b>#__ucm_content</b> table'));
			}

			// Make sure that all the Sick items are cleared from DB
			foreach ($sick_ids as $sick_id)
			{
				// Remove Sick items from the ucm base table
				$sick_condition = array( $db->quoteName('ucm_type_id') .
' = ' . $sick_id);
				// Create a new query object.
				$query = $db->getQuery(true);
				$query->delete($db->quoteName('#__ucm_base'));
				$query->where($sick_condition);
				$db->setQuery($query);
				// Execute the query to remove Sick items
				$db->execute();

				// Remove Sick items from the ucm history table
				$sick_condition = array( $db->quoteName('ucm_type_id') .
' = ' . $sick_id);
				// Create a new query object.
				$query = $db->getQuery(true);
				$query->delete($db->quoteName('#__ucm_history'));
				$query->where($sick_condition);
				$db->setQuery($query);
				// Execute the query to remove Sick items
				$db->execute();
			}
		}

		// Create a new query object.
		$query = $db->getQuery(true);
		// Select id from content type table
		$query->select($db->quoteName('type_id'));
		$query->from($db->quoteName('#__content_types'));
		// Where Plan alias is found
		$query->where( $db->quoteName('type_alias') . ' =
'. $db->quote('com_reservation.plan') );
		$db->setQuery($query);
		// Execute query to see if alias is found
		$db->execute();
		$plan_found = $db->getNumRows();
		// Now check if there were any rows
		if ($plan_found)
		{
			// Since there are load the needed  plan type ids
			$plan_ids = $db->loadColumn();
			// Remove Plan from the content type table
			$plan_condition = array( $db->quoteName('type_alias') .
' = '. $db->quote('com_reservation.plan') );
			// Create a new query object.
			$query = $db->getQuery(true);
			$query->delete($db->quoteName('#__content_types'));
			$query->where($plan_condition);
			$db->setQuery($query);
			// Execute the query to remove Plan items
			$plan_done = $db->execute();
			if ($plan_done)
			{
				// If successfully remove Plan add queued success message.
				$app->enqueueMessage(JText::_('The (com_reservation.plan) type
alias was removed from the <b>#__content_type</b>
table'));
			}

			// Remove Plan items from the contentitem tag map table
			$plan_condition = array( $db->quoteName('type_alias') .
' = '. $db->quote('com_reservation.plan') );
			// Create a new query object.
			$query = $db->getQuery(true);
			$query->delete($db->quoteName('#__contentitem_tag_map'));
			$query->where($plan_condition);
			$db->setQuery($query);
			// Execute the query to remove Plan items
			$plan_done = $db->execute();
			if ($plan_done)
			{
				// If successfully remove Plan add queued success message.
				$app->enqueueMessage(JText::_('The (com_reservation.plan) type
alias was removed from the <b>#__contentitem_tag_map</b>
table'));
			}

			// Remove Plan items from the ucm content table
			$plan_condition = array( $db->quoteName('core_type_alias')
. ' = ' . $db->quote('com_reservation.plan') );
			// Create a new query object.
			$query = $db->getQuery(true);
			$query->delete($db->quoteName('#__ucm_content'));
			$query->where($plan_condition);
			$db->setQuery($query);
			// Execute the query to remove Plan items
			$plan_done = $db->execute();
			if ($plan_done)
			{
				// If successfully removed Plan add queued success message.
				$app->enqueueMessage(JText::_('The (com_reservation.plan) type
alias was removed from the <b>#__ucm_content</b> table'));
			}

			// Make sure that all the Plan items are cleared from DB
			foreach ($plan_ids as $plan_id)
			{
				// Remove Plan items from the ucm base table
				$plan_condition = array( $db->quoteName('ucm_type_id') .
' = ' . $plan_id);
				// Create a new query object.
				$query = $db->getQuery(true);
				$query->delete($db->quoteName('#__ucm_base'));
				$query->where($plan_condition);
				$db->setQuery($query);
				// Execute the query to remove Plan items
				$db->execute();

				// Remove Plan items from the ucm history table
				$plan_condition = array( $db->quoteName('ucm_type_id') .
' = ' . $plan_id);
				// Create a new query object.
				$query = $db->getQuery(true);
				$query->delete($db->quoteName('#__ucm_history'));
				$query->where($plan_condition);
				$db->setQuery($query);
				// Execute the query to remove Plan items
				$db->execute();
			}
		}

		// Create a new query object.
		$query = $db->getQuery(true);
		// Select id from content type table
		$query->select($db->quoteName('type_id'));
		$query->from($db->quoteName('#__content_types'));
		// Where Consultant alias is found
		$query->where( $db->quoteName('type_alias') . ' =
'. $db->quote('com_reservation.consultant') );
		$db->setQuery($query);
		// Execute query to see if alias is found
		$db->execute();
		$consultant_found = $db->getNumRows();
		// Now check if there were any rows
		if ($consultant_found)
		{
			// Since there are load the needed  consultant type ids
			$consultant_ids = $db->loadColumn();
			// Remove Consultant from the content type table
			$consultant_condition = array( $db->quoteName('type_alias')
. ' = '. $db->quote('com_reservation.consultant') );
			// Create a new query object.
			$query = $db->getQuery(true);
			$query->delete($db->quoteName('#__content_types'));
			$query->where($consultant_condition);
			$db->setQuery($query);
			// Execute the query to remove Consultant items
			$consultant_done = $db->execute();
			if ($consultant_done)
			{
				// If successfully remove Consultant add queued success message.
				$app->enqueueMessage(JText::_('The (com_reservation.consultant)
type alias was removed from the <b>#__content_type</b>
table'));
			}

			// Remove Consultant items from the contentitem tag map table
			$consultant_condition = array( $db->quoteName('type_alias')
. ' = '. $db->quote('com_reservation.consultant') );
			// Create a new query object.
			$query = $db->getQuery(true);
			$query->delete($db->quoteName('#__contentitem_tag_map'));
			$query->where($consultant_condition);
			$db->setQuery($query);
			// Execute the query to remove Consultant items
			$consultant_done = $db->execute();
			if ($consultant_done)
			{
				// If successfully remove Consultant add queued success message.
				$app->enqueueMessage(JText::_('The (com_reservation.consultant)
type alias was removed from the <b>#__contentitem_tag_map</b>
table'));
			}

			// Remove Consultant items from the ucm content table
			$consultant_condition = array(
$db->quoteName('core_type_alias') . ' = ' .
$db->quote('com_reservation.consultant') );
			// Create a new query object.
			$query = $db->getQuery(true);
			$query->delete($db->quoteName('#__ucm_content'));
			$query->where($consultant_condition);
			$db->setQuery($query);
			// Execute the query to remove Consultant items
			$consultant_done = $db->execute();
			if ($consultant_done)
			{
				// If successfully removed Consultant add queued success message.
				$app->enqueueMessage(JText::_('The (com_reservation.consultant)
type alias was removed from the <b>#__ucm_content</b>
table'));
			}

			// Make sure that all the Consultant items are cleared from DB
			foreach ($consultant_ids as $consultant_id)
			{
				// Remove Consultant items from the ucm base table
				$consultant_condition = array(
$db->quoteName('ucm_type_id') . ' = ' .
$consultant_id);
				// Create a new query object.
				$query = $db->getQuery(true);
				$query->delete($db->quoteName('#__ucm_base'));
				$query->where($consultant_condition);
				$db->setQuery($query);
				// Execute the query to remove Consultant items
				$db->execute();

				// Remove Consultant items from the ucm history table
				$consultant_condition = array(
$db->quoteName('ucm_type_id') . ' = ' .
$consultant_id);
				// Create a new query object.
				$query = $db->getQuery(true);
				$query->delete($db->quoteName('#__ucm_history'));
				$query->where($consultant_condition);
				$db->setQuery($query);
				// Execute the query to remove Consultant items
				$db->execute();
			}
		}

		// Create a new query object.
		$query = $db->getQuery(true);
		// Select id from content type table
		$query->select($db->quoteName('type_id'));
		$query->from($db->quoteName('#__content_types'));
		// Where Consultant catid alias is found
		$query->where( $db->quoteName('type_alias') . ' =
'. $db->quote('com_reservation.consultant.category') );
		$db->setQuery($query);
		// Execute query to see if alias is found
		$db->execute();
		$consultant_catid_found = $db->getNumRows();
		// Now check if there were any rows
		if ($consultant_catid_found)
		{
			// Since there are load the needed  consultant_catid type ids
			$consultant_catid_ids = $db->loadColumn();
			// Remove Consultant catid from the content type table
			$consultant_catid_condition = array(
$db->quoteName('type_alias') . ' = '.
$db->quote('com_reservation.consultant.category') );
			// Create a new query object.
			$query = $db->getQuery(true);
			$query->delete($db->quoteName('#__content_types'));
			$query->where($consultant_catid_condition);
			$db->setQuery($query);
			// Execute the query to remove Consultant catid items
			$consultant_catid_done = $db->execute();
			if ($consultant_catid_done)
			{
				// If successfully remove Consultant catid add queued success message.
				$app->enqueueMessage(JText::_('The
(com_reservation.consultant.category) type alias was removed from the
<b>#__content_type</b> table'));
			}

			// Remove Consultant catid items from the contentitem tag map table
			$consultant_catid_condition = array(
$db->quoteName('type_alias') . ' = '.
$db->quote('com_reservation.consultant.category') );
			// Create a new query object.
			$query = $db->getQuery(true);
			$query->delete($db->quoteName('#__contentitem_tag_map'));
			$query->where($consultant_catid_condition);
			$db->setQuery($query);
			// Execute the query to remove Consultant catid items
			$consultant_catid_done = $db->execute();
			if ($consultant_catid_done)
			{
				// If successfully remove Consultant catid add queued success message.
				$app->enqueueMessage(JText::_('The
(com_reservation.consultant.category) type alias was removed from the
<b>#__contentitem_tag_map</b> table'));
			}

			// Remove Consultant catid items from the ucm content table
			$consultant_catid_condition = array(
$db->quoteName('core_type_alias') . ' = ' .
$db->quote('com_reservation.consultant.category') );
			// Create a new query object.
			$query = $db->getQuery(true);
			$query->delete($db->quoteName('#__ucm_content'));
			$query->where($consultant_catid_condition);
			$db->setQuery($query);
			// Execute the query to remove Consultant catid items
			$consultant_catid_done = $db->execute();
			if ($consultant_catid_done)
			{
				// If successfully removed Consultant catid add queued success message.
				$app->enqueueMessage(JText::_('The
(com_reservation.consultant.category) type alias was removed from the
<b>#__ucm_content</b> table'));
			}

			// Make sure that all the Consultant catid items are cleared from DB
			foreach ($consultant_catid_ids as $consultant_catid_id)
			{
				// Remove Consultant catid items from the ucm base table
				$consultant_catid_condition = array(
$db->quoteName('ucm_type_id') . ' = ' .
$consultant_catid_id);
				// Create a new query object.
				$query = $db->getQuery(true);
				$query->delete($db->quoteName('#__ucm_base'));
				$query->where($consultant_catid_condition);
				$db->setQuery($query);
				// Execute the query to remove Consultant catid items
				$db->execute();

				// Remove Consultant catid items from the ucm history table
				$consultant_catid_condition = array(
$db->quoteName('ucm_type_id') . ' = ' .
$consultant_catid_id);
				// Create a new query object.
				$query = $db->getQuery(true);
				$query->delete($db->quoteName('#__ucm_history'));
				$query->where($consultant_catid_condition);
				$db->setQuery($query);
				// Execute the query to remove Consultant catid items
				$db->execute();
			}
		}

		// Create a new query object.
		$query = $db->getQuery(true);
		// Select id from content type table
		$query->select($db->quoteName('type_id'));
		$query->from($db->quoteName('#__content_types'));
		// Where Message alias is found
		$query->where( $db->quoteName('type_alias') . ' =
'. $db->quote('com_reservation.message') );
		$db->setQuery($query);
		// Execute query to see if alias is found
		$db->execute();
		$message_found = $db->getNumRows();
		// Now check if there were any rows
		if ($message_found)
		{
			// Since there are load the needed  message type ids
			$message_ids = $db->loadColumn();
			// Remove Message from the content type table
			$message_condition = array( $db->quoteName('type_alias') .
' = '. $db->quote('com_reservation.message') );
			// Create a new query object.
			$query = $db->getQuery(true);
			$query->delete($db->quoteName('#__content_types'));
			$query->where($message_condition);
			$db->setQuery($query);
			// Execute the query to remove Message items
			$message_done = $db->execute();
			if ($message_done)
			{
				// If successfully remove Message add queued success message.
				$app->enqueueMessage(JText::_('The (com_reservation.message)
type alias was removed from the <b>#__content_type</b>
table'));
			}

			// Remove Message items from the contentitem tag map table
			$message_condition = array( $db->quoteName('type_alias') .
' = '. $db->quote('com_reservation.message') );
			// Create a new query object.
			$query = $db->getQuery(true);
			$query->delete($db->quoteName('#__contentitem_tag_map'));
			$query->where($message_condition);
			$db->setQuery($query);
			// Execute the query to remove Message items
			$message_done = $db->execute();
			if ($message_done)
			{
				// If successfully remove Message add queued success message.
				$app->enqueueMessage(JText::_('The (com_reservation.message)
type alias was removed from the <b>#__contentitem_tag_map</b>
table'));
			}

			// Remove Message items from the ucm content table
			$message_condition = array(
$db->quoteName('core_type_alias') . ' = ' .
$db->quote('com_reservation.message') );
			// Create a new query object.
			$query = $db->getQuery(true);
			$query->delete($db->quoteName('#__ucm_content'));
			$query->where($message_condition);
			$db->setQuery($query);
			// Execute the query to remove Message items
			$message_done = $db->execute();
			if ($message_done)
			{
				// If successfully removed Message add queued success message.
				$app->enqueueMessage(JText::_('The (com_reservation.message)
type alias was removed from the <b>#__ucm_content</b>
table'));
			}

			// Make sure that all the Message items are cleared from DB
			foreach ($message_ids as $message_id)
			{
				// Remove Message items from the ucm base table
				$message_condition = array( $db->quoteName('ucm_type_id')
. ' = ' . $message_id);
				// Create a new query object.
				$query = $db->getQuery(true);
				$query->delete($db->quoteName('#__ucm_base'));
				$query->where($message_condition);
				$db->setQuery($query);
				// Execute the query to remove Message items
				$db->execute();

				// Remove Message items from the ucm history table
				$message_condition = array( $db->quoteName('ucm_type_id')
. ' = ' . $message_id);
				// Create a new query object.
				$query = $db->getQuery(true);
				$query->delete($db->quoteName('#__ucm_history'));
				$query->where($message_condition);
				$db->setQuery($query);
				// Execute the query to remove Message items
				$db->execute();
			}
		}

		// If All related items was removed queued success message.
		$app->enqueueMessage(JText::_('All related items was removed from
the <b>#__ucm_base</b> table'));
		$app->enqueueMessage(JText::_('All related items was removed from
the <b>#__ucm_history</b> table'));

		// Remove reservation assets from the assets table
		$reservation_condition = array( $db->quoteName('name') .
' LIKE ' . $db->quote('com_reservation%') );

		// Create a new query object.
		$query = $db->getQuery(true);
		$query->delete($db->quoteName('#__assets'));
		$query->where($reservation_condition);
		$db->setQuery($query);
		$message_done = $db->execute();
		if ($message_done)
		{
			// If successfully removed reservation add queued success message.
			$app->enqueueMessage(JText::_('All related items was removed
from the <b>#__assets</b> table'));
		}

		// little notice as after service, in case of bad experience with
component.
		echo '<h2>Did something go wrong? Are you
disappointed?</h2>
		<p>Please let me know at <a
href="mailto:farhad.shahbazi0010@gmail.com">farhad.shahbazi0010@gmail.com</a>.
		<br />We at fdsh are committed to building extensions that performs
proficiently! You can help us, really!
		<br />Send me your thoughts on improvements that is needed, trust
me, I will be very grateful!
		<br />Visit us at <a href="http://farhad.com"
target="_blank">http://farhad.com</a>
today!</p>';
	}

	/**
	 * Called on update
	 *
	 * @param   JAdapterInstance  $parent  The object responsible for running
this script
	 *
	 * @return  boolean  True on success
	 */
	public function update(JAdapterInstance $parent){}

	/**
	 * Called before any type of action
	 *
	 * @param   string  $type  Which action is happening
(install|uninstall|discover_install|update)
	 * @param   JAdapterInstance  $parent  The object responsible for running
this script
	 *
	 * @return  boolean  True on success
	 */
	public function preflight($type, JAdapterInstance $parent)
	{
		// get application
		$app = JFactory::getApplication();
		// is redundant or so it seems ...hmmm let me know if it works again
		if ($type === 'uninstall')
		{
			return true;
		}
		// the default for both install and update
		$jversion = new JVersion();
		if (!$jversion->isCompatible('3.8.0'))
		{
			$app->enqueueMessage('Please upgrade to at least Joomla! 3.8.0
before continuing!', 'error');
			return false;
		}
		// do any updates needed
		if ($type === 'update')
		{
		}
		// do any install needed
		if ($type === 'install')
		{
		}
		// check if the PHPExcel stuff is still around
		if (File::exists(JPATH_ADMINISTRATOR .
'/components/com_reservation/helpers/PHPExcel.php'))
		{
			// We need to remove this old PHPExcel folder
			$this->removeFolder(JPATH_ADMINISTRATOR .
'/components/com_reservation/helpers/PHPExcel');
			// We need to remove this old PHPExcel file
			File::delete(JPATH_ADMINISTRATOR .
'/components/com_reservation/helpers/PHPExcel.php');
		}
		return true;
	}

	/**
	 * Called after any type of action
	 *
	 * @param   string  $type  Which action is happening
(install|uninstall|discover_install|update)
	 * @param   JAdapterInstance  $parent  The object responsible for running
this script
	 *
	 * @return  boolean  True on success
	 */
	public function postflight($type, JAdapterInstance $parent)
	{
		// get application
		$app = JFactory::getApplication();
		// We check if we have dynamic folders to copy
		$this->setDynamicF0ld3rs($app, $parent);
		// set the default component settings
		if ($type === 'install')
		{

			// Get The Database object
			$db = JFactory::getDbo();

			// Create the reserve content type object.
			$reserve = new stdClass();
			$reserve->type_title = 'Reservation Reserve';
			$reserve->type_alias = 'com_reservation.reserve';
			$reserve->table = '{"special": {"dbtable":
"#__reservation_reserve","key":
"id","type": "Reserve","prefix":
"reservationTable","config":
"array()"},"common": {"dbtable":
"#__ucm_content","key":
"ucm_id","type":
"Corecontent","prefix":
"JTable","config": "array()"}}';
			$reserve->field_mappings = '{"common":
{"core_content_item_id": "id","core_title":
"appointmentid","core_state":
"published","core_alias":
"null","core_created_time":
"created","core_modified_time":
"modified","core_body":
"null","core_hits":
"hits","core_publish_up":
"null","core_publish_down":
"null","core_access":
"access","core_params":
"params","core_featured":
"null","core_metadata":
"null","core_language":
"null","core_images":
"null","core_urls":
"null","core_version":
"version","core_ordering":
"ordering","core_metakey":
"null","core_metadesc":
"null","core_catid":
"null","core_xreference":
"null","asset_id":
"asset_id"},"special":
{"appointmentid":"appointmentid","sickid":"sickid","full_price":"full_price","doctor_quota":"doctor_quota","system_quota":"system_quota","status":"status","payment_method":"payment_method","tracking_code":"tracking_code"}}';
			$reserve->router =
'ReservationHelperRoute::getReserveRoute';
			$reserve->content_history_options = '{"formFile":
"administrator/components/com_reservation/models/forms/reserve.xml","hideFields":
["asset_id","checked_out","checked_out_time","version"],"ignoreChanges":
["modified_by","modified","checked_out","checked_out_time","version","hits"],"convertToInt":
["published","ordering","appointmentid","sickid"],"displayLookup":
[{"sourceColumn": "created_by","targetTable":
"#__users","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"access","targetTable":
"#__viewlevels","targetColumn":
"id","displayColumn":
"title"},{"sourceColumn":
"modified_by","targetTable":
"#__users","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"appointmentid","targetTable":
"#__reservation_appointment","targetColumn":
"id","displayColumn":
"appointment"},{"sourceColumn":
"sickid","targetTable":
"#__reservation_sick","targetColumn":
"id","displayColumn": "phonenumber"}]}';

			// Set the object into the content types table.
			$reserve_Inserted = $db->insertObject('#__content_types',
$reserve);

			// Create the bbbclass content type object.
			$bbbclass = new stdClass();
			$bbbclass->type_title = 'Reservation Bbbclass';
			$bbbclass->type_alias = 'com_reservation.bbbclass';
			$bbbclass->table = '{"special": {"dbtable":
"#__reservation_bbbclass","key":
"id","type": "Bbbclass","prefix":
"reservationTable","config":
"array()"},"common": {"dbtable":
"#__ucm_content","key":
"ucm_id","type":
"Corecontent","prefix":
"JTable","config": "array()"}}';
			$bbbclass->field_mappings = '{"common":
{"core_content_item_id": "id","core_title":
"name","core_state":
"published","core_alias":
"null","core_created_time":
"created","core_modified_time":
"modified","core_body":
"null","core_hits":
"hits","core_publish_up":
"null","core_publish_down":
"null","core_access":
"access","core_params":
"params","core_featured":
"null","core_metadata":
"null","core_language":
"null","core_images":
"null","core_urls":
"null","core_version":
"version","core_ordering":
"ordering","core_metakey":
"null","core_metadesc":
"null","core_catid":
"null","core_xreference":
"null","asset_id":
"asset_id"},"special":
{"name":"name","planid":"planid","seid":"seid","exmid":"exmid","inmid":"inmid","mpass":"mpass","vpass":"vpass"}}';
			$bbbclass->router =
'ReservationHelperRoute::getBbbclassRoute';
			$bbbclass->content_history_options = '{"formFile":
"administrator/components/com_reservation/models/forms/bbbclass.xml","hideFields":
["asset_id","checked_out","checked_out_time","version"],"ignoreChanges":
["modified_by","modified","checked_out","checked_out_time","version","hits"],"convertToInt":
["published","ordering","planid","seid"],"displayLookup":
[{"sourceColumn": "created_by","targetTable":
"#__users","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"access","targetTable":
"#__viewlevels","targetColumn":
"id","displayColumn":
"title"},{"sourceColumn":
"modified_by","targetTable":
"#__users","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"planid","targetTable":
"#__reservation_plan","targetColumn":
"id","displayColumn": "id"}]}';

			// Set the object into the content types table.
			$bbbclass_Inserted = $db->insertObject('#__content_types',
$bbbclass);

			// Create the doctor content type object.
			$doctor = new stdClass();
			$doctor->type_title = 'Reservation Doctor';
			$doctor->type_alias = 'com_reservation.doctor';
			$doctor->table = '{"special": {"dbtable":
"#__reservation_doctor","key":
"id","type": "Doctor","prefix":
"reservationTable","config":
"array()"},"common": {"dbtable":
"#__ucm_content","key":
"ucm_id","type":
"Corecontent","prefix":
"JTable","config": "array()"}}';
			$doctor->field_mappings = '{"common":
{"core_content_item_id": "id","core_title":
"userid","core_state":
"published","core_alias":
"null","core_created_time":
"created","core_modified_time":
"modified","core_body":
"address","core_hits":
"hits","core_publish_up":
"null","core_publish_down":
"null","core_access":
"access","core_params":
"params","core_featured":
"null","core_metadata":
"null","core_language":
"null","core_images":
"null","core_urls":
"null","core_version":
"version","core_ordering":
"ordering","core_metakey":
"null","core_metadesc":
"null","core_catid":
"catid","core_xreference":
"null","asset_id":
"asset_id"},"special":
{"userid":"userid","msn":"msn","phonenumber":"phonenumber","officephone":"officephone","address":"address","presence":"presence","image":"image","capitalid":"capitalid","cityid":"cityid","alt":"alt"}}';
			$doctor->router = 'ReservationHelperRoute::getDoctorRoute';
			$doctor->content_history_options = '{"formFile":
"administrator/components/com_reservation/models/forms/doctor.xml","hideFields":
["asset_id","checked_out","checked_out_time","version"],"ignoreChanges":
["modified_by","modified","checked_out","checked_out_time","version","hits"],"convertToInt":
["published","ordering","userid","catid","capitalid","cityid"],"displayLookup":
[{"sourceColumn": "catid","targetTable":
"#__categories","targetColumn":
"id","displayColumn":
"title"},{"sourceColumn":
"created_by","targetTable":
"#__users","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"access","targetTable":
"#__viewlevels","targetColumn":
"id","displayColumn":
"title"},{"sourceColumn":
"modified_by","targetTable":
"#__users","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"capitalid","targetTable":
"#__reservation_capital","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"cityid","targetTable":
"#__reservation_capital","targetColumn":
"id","displayColumn": "name"}]}';

			// Set the object into the content types table.
			$doctor_Inserted = $db->insertObject('#__content_types',
$doctor);

			// Create the doctor category content type object.
			$doctor_category = new stdClass();
			$doctor_category->type_title = 'Reservation Doctor Catid';
			$doctor_category->type_alias =
'com_reservation.doctor.category';
			$doctor_category->table =
'{"special":{"dbtable":"#__categories","key":"id","type":"Category","prefix":"JTable","config":"array()"},"common":{"dbtable":"#__ucm_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}';
			$doctor_category->field_mappings =
'{"common":{"core_content_item_id":"id","core_title":"title","core_state":"published","core_alias":"alias","core_created_time":"created_time","core_modified_time":"modified_time","core_body":"description",
"core_hits":"hits","core_publish_up":"null","core_publish_down":"null","core_access":"access",
"core_params":"params",
"core_featured":"null",
"core_metadata":"metadata",
"core_language":"language",
"core_images":"null",
"core_urls":"null",
"core_version":"version",
"core_ordering":"null",
"core_metakey":"metakey",
"core_metadesc":"metadesc",
"core_catid":"parent_id",
"core_xreference":"null",
"asset_id":"asset_id"},
"special":{"parent_id":"parent_id","lft":"lft","rgt":"rgt","level":"level","path":"path","extension":"extension","note":"note"}}';
			$doctor_category->router =
'ReservationHelperRoute::getCategoryRoute';
			$doctor_category->content_history_options =
'{"formFile":"administrator\/components\/com_categories\/models\/forms\/category.xml",
"hideFields":["asset_id","checked_out","checked_out_time","version","lft","rgt","level","path","extension"],
"ignoreChanges":["modified_user_id",
"modified_time", "checked_out",
"checked_out_time", "version", "hits",
"path"],"convertToInt":["publish_up",
"publish_down"],
"displayLookup":[{"sourceColumn":"created_user_id","targetTable":"#__users","targetColumn":"id","displayColumn":"name"},{"sourceColumn":"access","targetTable":"#__viewlevels","targetColumn":"id","displayColumn":"title"},{"sourceColumn":"modified_user_id","targetTable":"#__users","targetColumn":"id","displayColumn":"name"},{"sourceColumn":"parent_id","targetTable":"#__categories","targetColumn":"id","displayColumn":"title"}]}';

			// Set the object into the content types table.
			$doctor_category_Inserted =
$db->insertObject('#__content_types', $doctor_category);

			// Create the appointment content type object.
			$appointment = new stdClass();
			$appointment->type_title = 'Reservation Appointment';
			$appointment->type_alias = 'com_reservation.appointment';
			$appointment->table = '{"special":
{"dbtable":
"#__reservation_appointment","key":
"id","type":
"Appointment","prefix":
"reservationTable","config":
"array()"},"common": {"dbtable":
"#__ucm_content","key":
"ucm_id","type":
"Corecontent","prefix":
"JTable","config": "array()"}}';
			$appointment->field_mappings = '{"common":
{"core_content_item_id": "id","core_title":
"title","core_state":
"published","core_alias":
"null","core_created_time":
"created","core_modified_time":
"modified","core_body":
"null","core_hits":
"hits","core_publish_up":
"null","core_publish_down":
"null","core_access":
"access","core_params":
"params","core_featured":
"null","core_metadata":
"null","core_language":
"null","core_images":
"null","core_urls":
"null","core_version":
"version","core_ordering":
"ordering","core_metakey":
"null","core_metadesc":
"null","core_catid":
"null","core_xreference":
"null","asset_id":
"asset_id"},"special":
{"title":"title","appointment":"appointment","doctorid":"doctorid"}}';
			$appointment->router =
'ReservationHelperRoute::getAppointmentRoute';
			$appointment->content_history_options = '{"formFile":
"administrator/components/com_reservation/models/forms/appointment.xml","hideFields":
["asset_id","checked_out","checked_out_time","version"],"ignoreChanges":
["modified_by","modified","checked_out","checked_out_time","version","hits"],"convertToInt":
["published","ordering","doctorid"],"displayLookup":
[{"sourceColumn": "created_by","targetTable":
"#__users","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"access","targetTable":
"#__viewlevels","targetColumn":
"id","displayColumn":
"title"},{"sourceColumn":
"modified_by","targetTable":
"#__users","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"doctorid","targetTable":
"#__reservation_consultant","targetColumn":
"id","displayColumn": "id"}]}';

			// Set the object into the content types table.
			$appointment_Inserted =
$db->insertObject('#__content_types', $appointment);

			// Create the capital content type object.
			$capital = new stdClass();
			$capital->type_title = 'Reservation Capital';
			$capital->type_alias = 'com_reservation.capital';
			$capital->table = '{"special": {"dbtable":
"#__reservation_capital","key":
"id","type": "Capital","prefix":
"reservationTable","config":
"array()"},"common": {"dbtable":
"#__ucm_content","key":
"ucm_id","type":
"Corecontent","prefix":
"JTable","config": "array()"}}';
			$capital->field_mappings = '{"common":
{"core_content_item_id": "id","core_title":
"name","core_state":
"published","core_alias":
"null","core_created_time":
"created","core_modified_time":
"modified","core_body":
"null","core_hits":
"hits","core_publish_up":
"null","core_publish_down":
"null","core_access":
"access","core_params":
"params","core_featured":
"null","core_metadata":
"null","core_language":
"null","core_images":
"null","core_urls":
"null","core_version":
"version","core_ordering":
"ordering","core_metakey":
"null","core_metadesc":
"null","core_catid":
"null","core_xreference":
"null","asset_id":
"asset_id"},"special":
{"name":"name","capitalid":"capitalid"}}';
			$capital->router =
'ReservationHelperRoute::getCapitalRoute';
			$capital->content_history_options = '{"formFile":
"administrator/components/com_reservation/models/forms/capital.xml","hideFields":
["asset_id","checked_out","checked_out_time","version"],"ignoreChanges":
["modified_by","modified","checked_out","checked_out_time","version","hits"],"convertToInt":
["published","ordering","capitalid"],"displayLookup":
[{"sourceColumn": "created_by","targetTable":
"#__users","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"access","targetTable":
"#__viewlevels","targetColumn":
"id","displayColumn":
"title"},{"sourceColumn":
"modified_by","targetTable":
"#__users","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"capitalid","targetTable":
"#__reservation_capital","targetColumn":
"id","displayColumn": "name"}]}';

			// Set the object into the content types table.
			$capital_Inserted = $db->insertObject('#__content_types',
$capital);

			// Create the comment content type object.
			$comment = new stdClass();
			$comment->type_title = 'Reservation Comment';
			$comment->type_alias = 'com_reservation.comment';
			$comment->table = '{"special": {"dbtable":
"#__reservation_comment","key":
"id","type": "Comment","prefix":
"reservationTable","config":
"array()"},"common": {"dbtable":
"#__ucm_content","key":
"ucm_id","type":
"Corecontent","prefix":
"JTable","config": "array()"}}';
			$comment->field_mappings = '{"common":
{"core_content_item_id": "id","core_title":
"text","core_state":
"published","core_alias":
"null","core_created_time":
"created","core_modified_time":
"modified","core_body":
"null","core_hits":
"hits","core_publish_up":
"null","core_publish_down":
"null","core_access":
"access","core_params":
"params","core_featured":
"null","core_metadata":
"null","core_language":
"null","core_images":
"null","core_urls":
"null","core_version":
"version","core_ordering":
"ordering","core_metakey":
"null","core_metadesc":
"null","core_catid":
"null","core_xreference":
"null","asset_id":
"asset_id"},"special":
{"text":"text","consultantid":"consultantid","sickid":"sickid","rate":"rate","seid":"seid","token":"token"}}';
			$comment->router =
'ReservationHelperRoute::getCommentRoute';
			$comment->content_history_options = '{"formFile":
"administrator/components/com_reservation/models/forms/comment.xml","hideFields":
["asset_id","checked_out","checked_out_time","version"],"ignoreChanges":
["modified_by","modified","checked_out","checked_out_time","version","hits"],"convertToInt":
["published","ordering","consultantid","sickid","seid"],"displayLookup":
[{"sourceColumn": "created_by","targetTable":
"#__users","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"access","targetTable":
"#__viewlevels","targetColumn":
"id","displayColumn":
"title"},{"sourceColumn":
"modified_by","targetTable":
"#__users","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"consultantid","targetTable":
"#__reservation_consultant","targetColumn":
"id","displayColumn":
"id"},{"sourceColumn":
"sickid","targetTable":
"#__reservation_sick","targetColumn":
"id","displayColumn": "phonenumber"}]}';

			// Set the object into the content types table.
			$comment_Inserted = $db->insertObject('#__content_types',
$comment);

			// Create the session content type object.
			$session = new stdClass();
			$session->type_title = 'Reservation Session';
			$session->type_alias = 'com_reservation.session';
			$session->table = '{"special": {"dbtable":
"#__reservation_session","key":
"id","type": "Session","prefix":
"reservationTable","config":
"array()"},"common": {"dbtable":
"#__ucm_content","key":
"ucm_id","type":
"Corecontent","prefix":
"JTable","config": "array()"}}';
			$session->field_mappings = '{"common":
{"core_content_item_id": "id","core_title":
"sickid","core_state":
"published","core_alias":
"null","core_created_time":
"created","core_modified_time":
"modified","core_body":
"null","core_hits":
"hits","core_publish_up":
"null","core_publish_down":
"null","core_access":
"access","core_params":
"params","core_featured":
"null","core_metadata":
"null","core_language":
"null","core_images":
"null","core_urls":
"null","core_version":
"version","core_ordering":
"ordering","core_metakey":
"null","core_metadesc":
"null","core_catid":
"null","core_xreference":
"null","asset_id":
"asset_id"},"special":
{"sickid":"sickid","planid":"planid","pay":"pay","finish":"finish","channel_token":"channel_token","firsttext":"firsttext"}}';
			$session->router =
'ReservationHelperRoute::getSessionRoute';
			$session->content_history_options = '{"formFile":
"administrator/components/com_reservation/models/forms/session.xml","hideFields":
["asset_id","checked_out","checked_out_time","version"],"ignoreChanges":
["modified_by","modified","checked_out","checked_out_time","version","hits"],"convertToInt":
["published","ordering","sickid","planid","pay","finish"],"displayLookup":
[{"sourceColumn": "created_by","targetTable":
"#__users","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"access","targetTable":
"#__viewlevels","targetColumn":
"id","displayColumn":
"title"},{"sourceColumn":
"modified_by","targetTable":
"#__users","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"sickid","targetTable":
"#__reservation_sick","targetColumn":
"id","displayColumn":
"phonenumber"},{"sourceColumn":
"planid","targetTable":
"#__reservation_plan","targetColumn":
"id","displayColumn": "id"}]}';

			// Set the object into the content types table.
			$session_Inserted = $db->insertObject('#__content_types',
$session);

			// Create the sick content type object.
			$sick = new stdClass();
			$sick->type_title = 'Reservation Sick';
			$sick->type_alias = 'com_reservation.sick';
			$sick->table = '{"special": {"dbtable":
"#__reservation_sick","key":
"id","type": "Sick","prefix":
"reservationTable","config":
"array()"},"common": {"dbtable":
"#__ucm_content","key":
"ucm_id","type":
"Corecontent","prefix":
"JTable","config": "array()"}}';
			$sick->field_mappings = '{"common":
{"core_content_item_id": "id","core_title":
"userid","core_state":
"published","core_alias":
"null","core_created_time":
"created","core_modified_time":
"modified","core_body":
"null","core_hits":
"hits","core_publish_up":
"null","core_publish_down":
"null","core_access":
"access","core_params":
"params","core_featured":
"null","core_metadata":
"null","core_language":
"null","core_images":
"null","core_urls":
"null","core_version":
"version","core_ordering":
"ordering","core_metakey":
"null","core_metadesc":
"null","core_catid":
"null","core_xreference":
"null","asset_id":
"asset_id"},"special":
{"userid":"userid","phonenumber":"phonenumber","capitalid":"capitalid","cityid":"cityid","image":"image","cardnumber":"cardnumber","alt":"alt"}}';
			$sick->router = 'ReservationHelperRoute::getSickRoute';
			$sick->content_history_options = '{"formFile":
"administrator/components/com_reservation/models/forms/sick.xml","hideFields":
["asset_id","checked_out","checked_out_time","version"],"ignoreChanges":
["modified_by","modified","checked_out","checked_out_time","version","hits"],"convertToInt":
["published","ordering","userid","capitalid","cityid"],"displayLookup":
[{"sourceColumn": "created_by","targetTable":
"#__users","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"access","targetTable":
"#__viewlevels","targetColumn":
"id","displayColumn":
"title"},{"sourceColumn":
"modified_by","targetTable":
"#__users","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"capitalid","targetTable":
"#__reservation_capital","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"cityid","targetTable":
"#__reservation_capital","targetColumn":
"id","displayColumn": "name"}]}';

			// Set the object into the content types table.
			$sick_Inserted = $db->insertObject('#__content_types',
$sick);

			// Create the plan content type object.
			$plan = new stdClass();
			$plan->type_title = 'Reservation Plan';
			$plan->type_alias = 'com_reservation.plan';
			$plan->table = '{"special": {"dbtable":
"#__reservation_plan","key":
"id","type": "Plan","prefix":
"reservationTable","config":
"array()"},"common": {"dbtable":
"#__ucm_content","key":
"ucm_id","type":
"Corecontent","prefix":
"JTable","config": "array()"}}';
			$plan->field_mappings = '{"common":
{"core_content_item_id": "id","core_title":
"plantype","core_state":
"published","core_alias":
"null","core_created_time":
"created","core_modified_time":
"modified","core_body":
"null","core_hits":
"hits","core_publish_up":
"null","core_publish_down":
"null","core_access":
"access","core_params":
"params","core_featured":
"null","core_metadata":
"null","core_language":
"null","core_images":
"null","core_urls":
"null","core_version":
"version","core_ordering":
"ordering","core_metakey":
"null","core_metadesc":
"null","core_catid":
"null","core_xreference":
"null","asset_id":
"asset_id"},"special":
{"plantype":"plantype","time":"time","price":"price","waitingtime":"waitingtime","consultantid":"consultantid"}}';
			$plan->router = 'ReservationHelperRoute::getPlanRoute';
			$plan->content_history_options = '{"formFile":
"administrator/components/com_reservation/models/forms/plan.xml","hideFields":
["asset_id","checked_out","checked_out_time","version"],"ignoreChanges":
["modified_by","modified","checked_out","checked_out_time","version","hits"],"convertToInt":
["published","ordering","consultantid"],"displayLookup":
[{"sourceColumn": "created_by","targetTable":
"#__users","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"access","targetTable":
"#__viewlevels","targetColumn":
"id","displayColumn":
"title"},{"sourceColumn":
"modified_by","targetTable":
"#__users","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"consultantid","targetTable":
"#__reservation_consultant","targetColumn":
"id","displayColumn": "id"}]}';

			// Set the object into the content types table.
			$plan_Inserted = $db->insertObject('#__content_types',
$plan);

			// Create the consultant content type object.
			$consultant = new stdClass();
			$consultant->type_title = 'Reservation Consultant';
			$consultant->type_alias = 'com_reservation.consultant';
			$consultant->table = '{"special":
{"dbtable":
"#__reservation_consultant","key":
"id","type": "Consultant","prefix":
"reservationTable","config":
"array()"},"common": {"dbtable":
"#__ucm_content","key":
"ucm_id","type":
"Corecontent","prefix":
"JTable","config": "array()"}}';
			$consultant->field_mappings = '{"common":
{"core_content_item_id": "id","core_title":
"userid","core_state":
"published","core_alias":
"null","core_created_time":
"created","core_modified_time":
"modified","core_body":
"address","core_hits":
"hits","core_publish_up":
"null","core_publish_down":
"null","core_access":
"access","core_params":
"params","core_featured":
"null","core_metadata":
"null","core_language":
"null","core_images":
"null","core_urls":
"null","core_version":
"version","core_ordering":
"ordering","core_metakey":
"null","core_metadesc":
"null","core_catid":
"catid","core_xreference":
"null","asset_id":
"asset_id"},"special":
{"userid":"userid","nationalnumber":"nationalnumber","image":"image","experience":"experience","msn":"msn","phonenumber":"phonenumber","shortlink":"shortlink","account":"account","address":"address","presence":"presence","video":"video","alt":"alt","officephone":"officephone","capitalid":"capitalid","cityid":"cityid","introduction":"introduction"}}';
			$consultant->router =
'ReservationHelperRoute::getConsultantRoute';
			$consultant->content_history_options = '{"formFile":
"administrator/components/com_reservation/models/forms/consultant.xml","hideFields":
["asset_id","checked_out","checked_out_time","version"],"ignoreChanges":
["modified_by","modified","checked_out","checked_out_time","version","hits"],"convertToInt":
["published","ordering","userid","catid","capitalid","cityid"],"displayLookup":
[{"sourceColumn": "catid","targetTable":
"#__categories","targetColumn":
"id","displayColumn":
"title"},{"sourceColumn":
"created_by","targetTable":
"#__users","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"access","targetTable":
"#__viewlevels","targetColumn":
"id","displayColumn":
"title"},{"sourceColumn":
"modified_by","targetTable":
"#__users","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"capitalid","targetTable":
"#__reservation_capital","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"cityid","targetTable":
"#__reservation_capital","targetColumn":
"id","displayColumn": "name"}]}';

			// Set the object into the content types table.
			$consultant_Inserted =
$db->insertObject('#__content_types', $consultant);

			// Create the consultant category content type object.
			$consultant_category = new stdClass();
			$consultant_category->type_title = 'Reservation Consultant
Catid';
			$consultant_category->type_alias =
'com_reservation.consultant.category';
			$consultant_category->table =
'{"special":{"dbtable":"#__categories","key":"id","type":"Category","prefix":"JTable","config":"array()"},"common":{"dbtable":"#__ucm_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}';
			$consultant_category->field_mappings =
'{"common":{"core_content_item_id":"id","core_title":"title","core_state":"published","core_alias":"alias","core_created_time":"created_time","core_modified_time":"modified_time","core_body":"description",
"core_hits":"hits","core_publish_up":"null","core_publish_down":"null","core_access":"access",
"core_params":"params",
"core_featured":"null",
"core_metadata":"metadata",
"core_language":"language",
"core_images":"null",
"core_urls":"null",
"core_version":"version",
"core_ordering":"null",
"core_metakey":"metakey",
"core_metadesc":"metadesc",
"core_catid":"parent_id",
"core_xreference":"null",
"asset_id":"asset_id"},
"special":{"parent_id":"parent_id","lft":"lft","rgt":"rgt","level":"level","path":"path","extension":"extension","note":"note"}}';
			$consultant_category->router =
'ReservationHelperRoute::getCategoryRoute';
			$consultant_category->content_history_options =
'{"formFile":"administrator\/components\/com_categories\/models\/forms\/category.xml",
"hideFields":["asset_id","checked_out","checked_out_time","version","lft","rgt","level","path","extension"],
"ignoreChanges":["modified_user_id",
"modified_time", "checked_out",
"checked_out_time", "version", "hits",
"path"],"convertToInt":["publish_up",
"publish_down"],
"displayLookup":[{"sourceColumn":"created_user_id","targetTable":"#__users","targetColumn":"id","displayColumn":"name"},{"sourceColumn":"access","targetTable":"#__viewlevels","targetColumn":"id","displayColumn":"title"},{"sourceColumn":"modified_user_id","targetTable":"#__users","targetColumn":"id","displayColumn":"name"},{"sourceColumn":"parent_id","targetTable":"#__categories","targetColumn":"id","displayColumn":"title"}]}';

			// Set the object into the content types table.
			$consultant_category_Inserted =
$db->insertObject('#__content_types', $consultant_category);

			// Create the message content type object.
			$message = new stdClass();
			$message->type_title = 'Reservation Message';
			$message->type_alias = 'com_reservation.message';
			$message->table = '{"special": {"dbtable":
"#__reservation_message","key":
"id","type": "Message","prefix":
"reservationTable","config":
"array()"},"common": {"dbtable":
"#__ucm_content","key":
"ucm_id","type":
"Corecontent","prefix":
"JTable","config": "array()"}}';
			$message->field_mappings = '{"common":
{"core_content_item_id": "id","core_title":
"null","core_state":
"published","core_alias":
"null","core_created_time":
"created","core_modified_time":
"modified","core_body":
"null","core_hits":
"hits","core_publish_up":
"null","core_publish_down":
"null","core_access":
"access","core_params":
"params","core_featured":
"null","core_metadata":
"null","core_language":
"null","core_images":
"null","core_urls":
"null","core_version":
"version","core_ordering":
"ordering","core_metakey":
"null","core_metadesc":
"null","core_catid":
"null","core_xreference":
"null","asset_id":
"asset_id"},"special":
{"from":"from","to":"to","reply":"reply","message":"message","read":"read","seen":"seen","seid":"seid"}}';
			$message->router =
'ReservationHelperRoute::getMessageRoute';
			$message->content_history_options = '{"formFile":
"administrator/components/com_reservation/models/forms/message.xml","hideFields":
["asset_id","checked_out","checked_out_time","version"],"ignoreChanges":
["modified_by","modified","checked_out","checked_out_time","version","hits"],"convertToInt":
["published","ordering","from","to","reply","read","seen","seid"],"displayLookup":
[{"sourceColumn": "created_by","targetTable":
"#__users","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"access","targetTable":
"#__viewlevels","targetColumn":
"id","displayColumn":
"title"},{"sourceColumn":
"modified_by","targetTable":
"#__users","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"reply","targetTable":
"#__reservation_message","targetColumn":
"id","displayColumn": "message"}]}';

			// Set the object into the content types table.
			$message_Inserted = $db->insertObject('#__content_types',
$message);


			// Install the global extenstion params.
			$query = $db->getQuery(true);
			// Field to update.
			$fields = array(
				$db->quoteName('params') . ' = ' .
$db->quote('{"autorName":"farhad
shahbazi","autorEmail":"farhad.shahbazi0010@gmail.com","consultantgroup":"0","doctorgroup":"0","sickgroup":"0","imgext":"jpg,jpeg,png,gif,bmp,jfif,pjpeg,webp,tif,tiff","check_in":"-1
day","save_history":"1","history_limit":"10"}'),
			);
			// Condition.
			$conditions = array(
				$db->quoteName('element') . ' = ' .
$db->quote('com_reservation')
			);
			$query->update($db->quoteName('#__extensions'))->set($fields)->where($conditions);
			$db->setQuery($query);
			$allDone = $db->execute();

			echo '<a target="_blank"
href="http://farhad.com" title="Reservation">
				<img
src="components/com_reservation/assets/images/vdm-component.jpg"/>
				</a>';
		}
		// do any updates needed
		if ($type === 'update')
		{

			// Get The Database object
			$db = JFactory::getDbo();

			// Create the reserve content type object.
			$reserve = new stdClass();
			$reserve->type_title = 'Reservation Reserve';
			$reserve->type_alias = 'com_reservation.reserve';
			$reserve->table = '{"special": {"dbtable":
"#__reservation_reserve","key":
"id","type": "Reserve","prefix":
"reservationTable","config":
"array()"},"common": {"dbtable":
"#__ucm_content","key":
"ucm_id","type":
"Corecontent","prefix":
"JTable","config": "array()"}}';
			$reserve->field_mappings = '{"common":
{"core_content_item_id": "id","core_title":
"appointmentid","core_state":
"published","core_alias":
"null","core_created_time":
"created","core_modified_time":
"modified","core_body":
"null","core_hits":
"hits","core_publish_up":
"null","core_publish_down":
"null","core_access":
"access","core_params":
"params","core_featured":
"null","core_metadata":
"null","core_language":
"null","core_images":
"null","core_urls":
"null","core_version":
"version","core_ordering":
"ordering","core_metakey":
"null","core_metadesc":
"null","core_catid":
"null","core_xreference":
"null","asset_id":
"asset_id"},"special":
{"appointmentid":"appointmentid","sickid":"sickid","full_price":"full_price","doctor_quota":"doctor_quota","system_quota":"system_quota","status":"status","payment_method":"payment_method","tracking_code":"tracking_code"}}';
			$reserve->router =
'ReservationHelperRoute::getReserveRoute';
			$reserve->content_history_options = '{"formFile":
"administrator/components/com_reservation/models/forms/reserve.xml","hideFields":
["asset_id","checked_out","checked_out_time","version"],"ignoreChanges":
["modified_by","modified","checked_out","checked_out_time","version","hits"],"convertToInt":
["published","ordering","appointmentid","sickid"],"displayLookup":
[{"sourceColumn": "created_by","targetTable":
"#__users","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"access","targetTable":
"#__viewlevels","targetColumn":
"id","displayColumn":
"title"},{"sourceColumn":
"modified_by","targetTable":
"#__users","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"appointmentid","targetTable":
"#__reservation_appointment","targetColumn":
"id","displayColumn":
"appointment"},{"sourceColumn":
"sickid","targetTable":
"#__reservation_sick","targetColumn":
"id","displayColumn": "phonenumber"}]}';

			// Check if reserve type is already in content_type DB.
			$reserve_id = null;
			$query = $db->getQuery(true);
			$query->select($db->quoteName(array('type_id')));
			$query->from($db->quoteName('#__content_types'));
			$query->where($db->quoteName('type_alias') . ' LIKE
'. $db->quote($reserve->type_alias));
			$db->setQuery($query);
			$db->execute();

			// Set the object into the content types table.
			if ($db->getNumRows())
			{
				$reserve->type_id = $db->loadResult();
				$reserve_Updated = $db->updateObject('#__content_types',
$reserve, 'type_id');
			}
			else
			{
				$reserve_Inserted = $db->insertObject('#__content_types',
$reserve);
			}

			// Create the bbbclass content type object.
			$bbbclass = new stdClass();
			$bbbclass->type_title = 'Reservation Bbbclass';
			$bbbclass->type_alias = 'com_reservation.bbbclass';
			$bbbclass->table = '{"special": {"dbtable":
"#__reservation_bbbclass","key":
"id","type": "Bbbclass","prefix":
"reservationTable","config":
"array()"},"common": {"dbtable":
"#__ucm_content","key":
"ucm_id","type":
"Corecontent","prefix":
"JTable","config": "array()"}}';
			$bbbclass->field_mappings = '{"common":
{"core_content_item_id": "id","core_title":
"name","core_state":
"published","core_alias":
"null","core_created_time":
"created","core_modified_time":
"modified","core_body":
"null","core_hits":
"hits","core_publish_up":
"null","core_publish_down":
"null","core_access":
"access","core_params":
"params","core_featured":
"null","core_metadata":
"null","core_language":
"null","core_images":
"null","core_urls":
"null","core_version":
"version","core_ordering":
"ordering","core_metakey":
"null","core_metadesc":
"null","core_catid":
"null","core_xreference":
"null","asset_id":
"asset_id"},"special":
{"name":"name","planid":"planid","seid":"seid","exmid":"exmid","inmid":"inmid","mpass":"mpass","vpass":"vpass"}}';
			$bbbclass->router =
'ReservationHelperRoute::getBbbclassRoute';
			$bbbclass->content_history_options = '{"formFile":
"administrator/components/com_reservation/models/forms/bbbclass.xml","hideFields":
["asset_id","checked_out","checked_out_time","version"],"ignoreChanges":
["modified_by","modified","checked_out","checked_out_time","version","hits"],"convertToInt":
["published","ordering","planid","seid"],"displayLookup":
[{"sourceColumn": "created_by","targetTable":
"#__users","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"access","targetTable":
"#__viewlevels","targetColumn":
"id","displayColumn":
"title"},{"sourceColumn":
"modified_by","targetTable":
"#__users","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"planid","targetTable":
"#__reservation_plan","targetColumn":
"id","displayColumn": "id"}]}';

			// Check if bbbclass type is already in content_type DB.
			$bbbclass_id = null;
			$query = $db->getQuery(true);
			$query->select($db->quoteName(array('type_id')));
			$query->from($db->quoteName('#__content_types'));
			$query->where($db->quoteName('type_alias') . ' LIKE
'. $db->quote($bbbclass->type_alias));
			$db->setQuery($query);
			$db->execute();

			// Set the object into the content types table.
			if ($db->getNumRows())
			{
				$bbbclass->type_id = $db->loadResult();
				$bbbclass_Updated = $db->updateObject('#__content_types',
$bbbclass, 'type_id');
			}
			else
			{
				$bbbclass_Inserted = $db->insertObject('#__content_types',
$bbbclass);
			}

			// Create the doctor content type object.
			$doctor = new stdClass();
			$doctor->type_title = 'Reservation Doctor';
			$doctor->type_alias = 'com_reservation.doctor';
			$doctor->table = '{"special": {"dbtable":
"#__reservation_doctor","key":
"id","type": "Doctor","prefix":
"reservationTable","config":
"array()"},"common": {"dbtable":
"#__ucm_content","key":
"ucm_id","type":
"Corecontent","prefix":
"JTable","config": "array()"}}';
			$doctor->field_mappings = '{"common":
{"core_content_item_id": "id","core_title":
"userid","core_state":
"published","core_alias":
"null","core_created_time":
"created","core_modified_time":
"modified","core_body":
"address","core_hits":
"hits","core_publish_up":
"null","core_publish_down":
"null","core_access":
"access","core_params":
"params","core_featured":
"null","core_metadata":
"null","core_language":
"null","core_images":
"null","core_urls":
"null","core_version":
"version","core_ordering":
"ordering","core_metakey":
"null","core_metadesc":
"null","core_catid":
"catid","core_xreference":
"null","asset_id":
"asset_id"},"special":
{"userid":"userid","msn":"msn","phonenumber":"phonenumber","officephone":"officephone","address":"address","presence":"presence","image":"image","capitalid":"capitalid","cityid":"cityid","alt":"alt"}}';
			$doctor->router = 'ReservationHelperRoute::getDoctorRoute';
			$doctor->content_history_options = '{"formFile":
"administrator/components/com_reservation/models/forms/doctor.xml","hideFields":
["asset_id","checked_out","checked_out_time","version"],"ignoreChanges":
["modified_by","modified","checked_out","checked_out_time","version","hits"],"convertToInt":
["published","ordering","userid","catid","capitalid","cityid"],"displayLookup":
[{"sourceColumn": "catid","targetTable":
"#__categories","targetColumn":
"id","displayColumn":
"title"},{"sourceColumn":
"created_by","targetTable":
"#__users","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"access","targetTable":
"#__viewlevels","targetColumn":
"id","displayColumn":
"title"},{"sourceColumn":
"modified_by","targetTable":
"#__users","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"capitalid","targetTable":
"#__reservation_capital","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"cityid","targetTable":
"#__reservation_capital","targetColumn":
"id","displayColumn": "name"}]}';

			// Check if doctor type is already in content_type DB.
			$doctor_id = null;
			$query = $db->getQuery(true);
			$query->select($db->quoteName(array('type_id')));
			$query->from($db->quoteName('#__content_types'));
			$query->where($db->quoteName('type_alias') . ' LIKE
'. $db->quote($doctor->type_alias));
			$db->setQuery($query);
			$db->execute();

			// Set the object into the content types table.
			if ($db->getNumRows())
			{
				$doctor->type_id = $db->loadResult();
				$doctor_Updated = $db->updateObject('#__content_types',
$doctor, 'type_id');
			}
			else
			{
				$doctor_Inserted = $db->insertObject('#__content_types',
$doctor);
			}

			// Create the doctor category content type object.
			$doctor_category = new stdClass();
			$doctor_category->type_title = 'Reservation Doctor Catid';
			$doctor_category->type_alias =
'com_reservation.doctor.category';
			$doctor_category->table =
'{"special":{"dbtable":"#__categories","key":"id","type":"Category","prefix":"JTable","config":"array()"},"common":{"dbtable":"#__ucm_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}';
			$doctor_category->field_mappings =
'{"common":{"core_content_item_id":"id","core_title":"title","core_state":"published","core_alias":"alias","core_created_time":"created_time","core_modified_time":"modified_time","core_body":"description",
"core_hits":"hits","core_publish_up":"null","core_publish_down":"null","core_access":"access",
"core_params":"params",
"core_featured":"null",
"core_metadata":"metadata",
"core_language":"language",
"core_images":"null",
"core_urls":"null",
"core_version":"version",
"core_ordering":"null",
"core_metakey":"metakey",
"core_metadesc":"metadesc",
"core_catid":"parent_id",
"core_xreference":"null",
"asset_id":"asset_id"},
"special":{"parent_id":"parent_id","lft":"lft","rgt":"rgt","level":"level","path":"path","extension":"extension","note":"note"}}';
			$doctor_category->router =
'ReservationHelperRoute::getCategoryRoute';
			$doctor_category->content_history_options =
'{"formFile":"administrator\/components\/com_categories\/models\/forms\/category.xml",
"hideFields":["asset_id","checked_out","checked_out_time","version","lft","rgt","level","path","extension"],
"ignoreChanges":["modified_user_id",
"modified_time", "checked_out",
"checked_out_time", "version", "hits",
"path"],"convertToInt":["publish_up",
"publish_down"],
"displayLookup":[{"sourceColumn":"created_user_id","targetTable":"#__users","targetColumn":"id","displayColumn":"name"},{"sourceColumn":"access","targetTable":"#__viewlevels","targetColumn":"id","displayColumn":"title"},{"sourceColumn":"modified_user_id","targetTable":"#__users","targetColumn":"id","displayColumn":"name"},{"sourceColumn":"parent_id","targetTable":"#__categories","targetColumn":"id","displayColumn":"title"}]}';

			// Check if doctor category type is already in content_type DB.
			$doctor_category_id = null;
			$query = $db->getQuery(true);
			$query->select($db->quoteName(array('type_id')));
			$query->from($db->quoteName('#__content_types'));
			$query->where($db->quoteName('type_alias') . ' LIKE
'. $db->quote($doctor_category->type_alias));
			$db->setQuery($query);
			$db->execute();

			// Set the object into the content types table.
			if ($db->getNumRows())
			{
				$doctor_category->type_id = $db->loadResult();
				$doctor_category_Updated =
$db->updateObject('#__content_types', $doctor_category,
'type_id');
			}
			else
			{
				$doctor_category_Inserted =
$db->insertObject('#__content_types', $doctor_category);
			}

			// Create the appointment content type object.
			$appointment = new stdClass();
			$appointment->type_title = 'Reservation Appointment';
			$appointment->type_alias = 'com_reservation.appointment';
			$appointment->table = '{"special":
{"dbtable":
"#__reservation_appointment","key":
"id","type":
"Appointment","prefix":
"reservationTable","config":
"array()"},"common": {"dbtable":
"#__ucm_content","key":
"ucm_id","type":
"Corecontent","prefix":
"JTable","config": "array()"}}';
			$appointment->field_mappings = '{"common":
{"core_content_item_id": "id","core_title":
"title","core_state":
"published","core_alias":
"null","core_created_time":
"created","core_modified_time":
"modified","core_body":
"null","core_hits":
"hits","core_publish_up":
"null","core_publish_down":
"null","core_access":
"access","core_params":
"params","core_featured":
"null","core_metadata":
"null","core_language":
"null","core_images":
"null","core_urls":
"null","core_version":
"version","core_ordering":
"ordering","core_metakey":
"null","core_metadesc":
"null","core_catid":
"null","core_xreference":
"null","asset_id":
"asset_id"},"special":
{"title":"title","appointment":"appointment","doctorid":"doctorid"}}';
			$appointment->router =
'ReservationHelperRoute::getAppointmentRoute';
			$appointment->content_history_options = '{"formFile":
"administrator/components/com_reservation/models/forms/appointment.xml","hideFields":
["asset_id","checked_out","checked_out_time","version"],"ignoreChanges":
["modified_by","modified","checked_out","checked_out_time","version","hits"],"convertToInt":
["published","ordering","doctorid"],"displayLookup":
[{"sourceColumn": "created_by","targetTable":
"#__users","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"access","targetTable":
"#__viewlevels","targetColumn":
"id","displayColumn":
"title"},{"sourceColumn":
"modified_by","targetTable":
"#__users","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"doctorid","targetTable":
"#__reservation_consultant","targetColumn":
"id","displayColumn": "id"}]}';

			// Check if appointment type is already in content_type DB.
			$appointment_id = null;
			$query = $db->getQuery(true);
			$query->select($db->quoteName(array('type_id')));
			$query->from($db->quoteName('#__content_types'));
			$query->where($db->quoteName('type_alias') . ' LIKE
'. $db->quote($appointment->type_alias));
			$db->setQuery($query);
			$db->execute();

			// Set the object into the content types table.
			if ($db->getNumRows())
			{
				$appointment->type_id = $db->loadResult();
				$appointment_Updated =
$db->updateObject('#__content_types', $appointment,
'type_id');
			}
			else
			{
				$appointment_Inserted =
$db->insertObject('#__content_types', $appointment);
			}

			// Create the capital content type object.
			$capital = new stdClass();
			$capital->type_title = 'Reservation Capital';
			$capital->type_alias = 'com_reservation.capital';
			$capital->table = '{"special": {"dbtable":
"#__reservation_capital","key":
"id","type": "Capital","prefix":
"reservationTable","config":
"array()"},"common": {"dbtable":
"#__ucm_content","key":
"ucm_id","type":
"Corecontent","prefix":
"JTable","config": "array()"}}';
			$capital->field_mappings = '{"common":
{"core_content_item_id": "id","core_title":
"name","core_state":
"published","core_alias":
"null","core_created_time":
"created","core_modified_time":
"modified","core_body":
"null","core_hits":
"hits","core_publish_up":
"null","core_publish_down":
"null","core_access":
"access","core_params":
"params","core_featured":
"null","core_metadata":
"null","core_language":
"null","core_images":
"null","core_urls":
"null","core_version":
"version","core_ordering":
"ordering","core_metakey":
"null","core_metadesc":
"null","core_catid":
"null","core_xreference":
"null","asset_id":
"asset_id"},"special":
{"name":"name","capitalid":"capitalid"}}';
			$capital->router =
'ReservationHelperRoute::getCapitalRoute';
			$capital->content_history_options = '{"formFile":
"administrator/components/com_reservation/models/forms/capital.xml","hideFields":
["asset_id","checked_out","checked_out_time","version"],"ignoreChanges":
["modified_by","modified","checked_out","checked_out_time","version","hits"],"convertToInt":
["published","ordering","capitalid"],"displayLookup":
[{"sourceColumn": "created_by","targetTable":
"#__users","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"access","targetTable":
"#__viewlevels","targetColumn":
"id","displayColumn":
"title"},{"sourceColumn":
"modified_by","targetTable":
"#__users","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"capitalid","targetTable":
"#__reservation_capital","targetColumn":
"id","displayColumn": "name"}]}';

			// Check if capital type is already in content_type DB.
			$capital_id = null;
			$query = $db->getQuery(true);
			$query->select($db->quoteName(array('type_id')));
			$query->from($db->quoteName('#__content_types'));
			$query->where($db->quoteName('type_alias') . ' LIKE
'. $db->quote($capital->type_alias));
			$db->setQuery($query);
			$db->execute();

			// Set the object into the content types table.
			if ($db->getNumRows())
			{
				$capital->type_id = $db->loadResult();
				$capital_Updated = $db->updateObject('#__content_types',
$capital, 'type_id');
			}
			else
			{
				$capital_Inserted = $db->insertObject('#__content_types',
$capital);
			}

			// Create the comment content type object.
			$comment = new stdClass();
			$comment->type_title = 'Reservation Comment';
			$comment->type_alias = 'com_reservation.comment';
			$comment->table = '{"special": {"dbtable":
"#__reservation_comment","key":
"id","type": "Comment","prefix":
"reservationTable","config":
"array()"},"common": {"dbtable":
"#__ucm_content","key":
"ucm_id","type":
"Corecontent","prefix":
"JTable","config": "array()"}}';
			$comment->field_mappings = '{"common":
{"core_content_item_id": "id","core_title":
"text","core_state":
"published","core_alias":
"null","core_created_time":
"created","core_modified_time":
"modified","core_body":
"null","core_hits":
"hits","core_publish_up":
"null","core_publish_down":
"null","core_access":
"access","core_params":
"params","core_featured":
"null","core_metadata":
"null","core_language":
"null","core_images":
"null","core_urls":
"null","core_version":
"version","core_ordering":
"ordering","core_metakey":
"null","core_metadesc":
"null","core_catid":
"null","core_xreference":
"null","asset_id":
"asset_id"},"special":
{"text":"text","consultantid":"consultantid","sickid":"sickid","rate":"rate","seid":"seid","token":"token"}}';
			$comment->router =
'ReservationHelperRoute::getCommentRoute';
			$comment->content_history_options = '{"formFile":
"administrator/components/com_reservation/models/forms/comment.xml","hideFields":
["asset_id","checked_out","checked_out_time","version"],"ignoreChanges":
["modified_by","modified","checked_out","checked_out_time","version","hits"],"convertToInt":
["published","ordering","consultantid","sickid","seid"],"displayLookup":
[{"sourceColumn": "created_by","targetTable":
"#__users","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"access","targetTable":
"#__viewlevels","targetColumn":
"id","displayColumn":
"title"},{"sourceColumn":
"modified_by","targetTable":
"#__users","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"consultantid","targetTable":
"#__reservation_consultant","targetColumn":
"id","displayColumn":
"id"},{"sourceColumn":
"sickid","targetTable":
"#__reservation_sick","targetColumn":
"id","displayColumn": "phonenumber"}]}';

			// Check if comment type is already in content_type DB.
			$comment_id = null;
			$query = $db->getQuery(true);
			$query->select($db->quoteName(array('type_id')));
			$query->from($db->quoteName('#__content_types'));
			$query->where($db->quoteName('type_alias') . ' LIKE
'. $db->quote($comment->type_alias));
			$db->setQuery($query);
			$db->execute();

			// Set the object into the content types table.
			if ($db->getNumRows())
			{
				$comment->type_id = $db->loadResult();
				$comment_Updated = $db->updateObject('#__content_types',
$comment, 'type_id');
			}
			else
			{
				$comment_Inserted = $db->insertObject('#__content_types',
$comment);
			}

			// Create the session content type object.
			$session = new stdClass();
			$session->type_title = 'Reservation Session';
			$session->type_alias = 'com_reservation.session';
			$session->table = '{"special": {"dbtable":
"#__reservation_session","key":
"id","type": "Session","prefix":
"reservationTable","config":
"array()"},"common": {"dbtable":
"#__ucm_content","key":
"ucm_id","type":
"Corecontent","prefix":
"JTable","config": "array()"}}';
			$session->field_mappings = '{"common":
{"core_content_item_id": "id","core_title":
"sickid","core_state":
"published","core_alias":
"null","core_created_time":
"created","core_modified_time":
"modified","core_body":
"null","core_hits":
"hits","core_publish_up":
"null","core_publish_down":
"null","core_access":
"access","core_params":
"params","core_featured":
"null","core_metadata":
"null","core_language":
"null","core_images":
"null","core_urls":
"null","core_version":
"version","core_ordering":
"ordering","core_metakey":
"null","core_metadesc":
"null","core_catid":
"null","core_xreference":
"null","asset_id":
"asset_id"},"special":
{"sickid":"sickid","planid":"planid","pay":"pay","finish":"finish","channel_token":"channel_token","firsttext":"firsttext"}}';
			$session->router =
'ReservationHelperRoute::getSessionRoute';
			$session->content_history_options = '{"formFile":
"administrator/components/com_reservation/models/forms/session.xml","hideFields":
["asset_id","checked_out","checked_out_time","version"],"ignoreChanges":
["modified_by","modified","checked_out","checked_out_time","version","hits"],"convertToInt":
["published","ordering","sickid","planid","pay","finish"],"displayLookup":
[{"sourceColumn": "created_by","targetTable":
"#__users","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"access","targetTable":
"#__viewlevels","targetColumn":
"id","displayColumn":
"title"},{"sourceColumn":
"modified_by","targetTable":
"#__users","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"sickid","targetTable":
"#__reservation_sick","targetColumn":
"id","displayColumn":
"phonenumber"},{"sourceColumn":
"planid","targetTable":
"#__reservation_plan","targetColumn":
"id","displayColumn": "id"}]}';

			// Check if session type is already in content_type DB.
			$session_id = null;
			$query = $db->getQuery(true);
			$query->select($db->quoteName(array('type_id')));
			$query->from($db->quoteName('#__content_types'));
			$query->where($db->quoteName('type_alias') . ' LIKE
'. $db->quote($session->type_alias));
			$db->setQuery($query);
			$db->execute();

			// Set the object into the content types table.
			if ($db->getNumRows())
			{
				$session->type_id = $db->loadResult();
				$session_Updated = $db->updateObject('#__content_types',
$session, 'type_id');
			}
			else
			{
				$session_Inserted = $db->insertObject('#__content_types',
$session);
			}

			// Create the sick content type object.
			$sick = new stdClass();
			$sick->type_title = 'Reservation Sick';
			$sick->type_alias = 'com_reservation.sick';
			$sick->table = '{"special": {"dbtable":
"#__reservation_sick","key":
"id","type": "Sick","prefix":
"reservationTable","config":
"array()"},"common": {"dbtable":
"#__ucm_content","key":
"ucm_id","type":
"Corecontent","prefix":
"JTable","config": "array()"}}';
			$sick->field_mappings = '{"common":
{"core_content_item_id": "id","core_title":
"userid","core_state":
"published","core_alias":
"null","core_created_time":
"created","core_modified_time":
"modified","core_body":
"null","core_hits":
"hits","core_publish_up":
"null","core_publish_down":
"null","core_access":
"access","core_params":
"params","core_featured":
"null","core_metadata":
"null","core_language":
"null","core_images":
"null","core_urls":
"null","core_version":
"version","core_ordering":
"ordering","core_metakey":
"null","core_metadesc":
"null","core_catid":
"null","core_xreference":
"null","asset_id":
"asset_id"},"special":
{"userid":"userid","phonenumber":"phonenumber","capitalid":"capitalid","cityid":"cityid","image":"image","cardnumber":"cardnumber","alt":"alt"}}';
			$sick->router = 'ReservationHelperRoute::getSickRoute';
			$sick->content_history_options = '{"formFile":
"administrator/components/com_reservation/models/forms/sick.xml","hideFields":
["asset_id","checked_out","checked_out_time","version"],"ignoreChanges":
["modified_by","modified","checked_out","checked_out_time","version","hits"],"convertToInt":
["published","ordering","userid","capitalid","cityid"],"displayLookup":
[{"sourceColumn": "created_by","targetTable":
"#__users","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"access","targetTable":
"#__viewlevels","targetColumn":
"id","displayColumn":
"title"},{"sourceColumn":
"modified_by","targetTable":
"#__users","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"capitalid","targetTable":
"#__reservation_capital","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"cityid","targetTable":
"#__reservation_capital","targetColumn":
"id","displayColumn": "name"}]}';

			// Check if sick type is already in content_type DB.
			$sick_id = null;
			$query = $db->getQuery(true);
			$query->select($db->quoteName(array('type_id')));
			$query->from($db->quoteName('#__content_types'));
			$query->where($db->quoteName('type_alias') . ' LIKE
'. $db->quote($sick->type_alias));
			$db->setQuery($query);
			$db->execute();

			// Set the object into the content types table.
			if ($db->getNumRows())
			{
				$sick->type_id = $db->loadResult();
				$sick_Updated = $db->updateObject('#__content_types',
$sick, 'type_id');
			}
			else
			{
				$sick_Inserted = $db->insertObject('#__content_types',
$sick);
			}

			// Create the plan content type object.
			$plan = new stdClass();
			$plan->type_title = 'Reservation Plan';
			$plan->type_alias = 'com_reservation.plan';
			$plan->table = '{"special": {"dbtable":
"#__reservation_plan","key":
"id","type": "Plan","prefix":
"reservationTable","config":
"array()"},"common": {"dbtable":
"#__ucm_content","key":
"ucm_id","type":
"Corecontent","prefix":
"JTable","config": "array()"}}';
			$plan->field_mappings = '{"common":
{"core_content_item_id": "id","core_title":
"plantype","core_state":
"published","core_alias":
"null","core_created_time":
"created","core_modified_time":
"modified","core_body":
"null","core_hits":
"hits","core_publish_up":
"null","core_publish_down":
"null","core_access":
"access","core_params":
"params","core_featured":
"null","core_metadata":
"null","core_language":
"null","core_images":
"null","core_urls":
"null","core_version":
"version","core_ordering":
"ordering","core_metakey":
"null","core_metadesc":
"null","core_catid":
"null","core_xreference":
"null","asset_id":
"asset_id"},"special":
{"plantype":"plantype","time":"time","price":"price","waitingtime":"waitingtime","consultantid":"consultantid"}}';
			$plan->router = 'ReservationHelperRoute::getPlanRoute';
			$plan->content_history_options = '{"formFile":
"administrator/components/com_reservation/models/forms/plan.xml","hideFields":
["asset_id","checked_out","checked_out_time","version"],"ignoreChanges":
["modified_by","modified","checked_out","checked_out_time","version","hits"],"convertToInt":
["published","ordering","consultantid"],"displayLookup":
[{"sourceColumn": "created_by","targetTable":
"#__users","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"access","targetTable":
"#__viewlevels","targetColumn":
"id","displayColumn":
"title"},{"sourceColumn":
"modified_by","targetTable":
"#__users","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"consultantid","targetTable":
"#__reservation_consultant","targetColumn":
"id","displayColumn": "id"}]}';

			// Check if plan type is already in content_type DB.
			$plan_id = null;
			$query = $db->getQuery(true);
			$query->select($db->quoteName(array('type_id')));
			$query->from($db->quoteName('#__content_types'));
			$query->where($db->quoteName('type_alias') . ' LIKE
'. $db->quote($plan->type_alias));
			$db->setQuery($query);
			$db->execute();

			// Set the object into the content types table.
			if ($db->getNumRows())
			{
				$plan->type_id = $db->loadResult();
				$plan_Updated = $db->updateObject('#__content_types',
$plan, 'type_id');
			}
			else
			{
				$plan_Inserted = $db->insertObject('#__content_types',
$plan);
			}

			// Create the consultant content type object.
			$consultant = new stdClass();
			$consultant->type_title = 'Reservation Consultant';
			$consultant->type_alias = 'com_reservation.consultant';
			$consultant->table = '{"special":
{"dbtable":
"#__reservation_consultant","key":
"id","type": "Consultant","prefix":
"reservationTable","config":
"array()"},"common": {"dbtable":
"#__ucm_content","key":
"ucm_id","type":
"Corecontent","prefix":
"JTable","config": "array()"}}';
			$consultant->field_mappings = '{"common":
{"core_content_item_id": "id","core_title":
"userid","core_state":
"published","core_alias":
"null","core_created_time":
"created","core_modified_time":
"modified","core_body":
"address","core_hits":
"hits","core_publish_up":
"null","core_publish_down":
"null","core_access":
"access","core_params":
"params","core_featured":
"null","core_metadata":
"null","core_language":
"null","core_images":
"null","core_urls":
"null","core_version":
"version","core_ordering":
"ordering","core_metakey":
"null","core_metadesc":
"null","core_catid":
"catid","core_xreference":
"null","asset_id":
"asset_id"},"special":
{"userid":"userid","nationalnumber":"nationalnumber","image":"image","experience":"experience","msn":"msn","phonenumber":"phonenumber","shortlink":"shortlink","account":"account","address":"address","presence":"presence","video":"video","alt":"alt","officephone":"officephone","capitalid":"capitalid","cityid":"cityid","introduction":"introduction"}}';
			$consultant->router =
'ReservationHelperRoute::getConsultantRoute';
			$consultant->content_history_options = '{"formFile":
"administrator/components/com_reservation/models/forms/consultant.xml","hideFields":
["asset_id","checked_out","checked_out_time","version"],"ignoreChanges":
["modified_by","modified","checked_out","checked_out_time","version","hits"],"convertToInt":
["published","ordering","userid","catid","capitalid","cityid"],"displayLookup":
[{"sourceColumn": "catid","targetTable":
"#__categories","targetColumn":
"id","displayColumn":
"title"},{"sourceColumn":
"created_by","targetTable":
"#__users","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"access","targetTable":
"#__viewlevels","targetColumn":
"id","displayColumn":
"title"},{"sourceColumn":
"modified_by","targetTable":
"#__users","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"capitalid","targetTable":
"#__reservation_capital","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"cityid","targetTable":
"#__reservation_capital","targetColumn":
"id","displayColumn": "name"}]}';

			// Check if consultant type is already in content_type DB.
			$consultant_id = null;
			$query = $db->getQuery(true);
			$query->select($db->quoteName(array('type_id')));
			$query->from($db->quoteName('#__content_types'));
			$query->where($db->quoteName('type_alias') . ' LIKE
'. $db->quote($consultant->type_alias));
			$db->setQuery($query);
			$db->execute();

			// Set the object into the content types table.
			if ($db->getNumRows())
			{
				$consultant->type_id = $db->loadResult();
				$consultant_Updated =
$db->updateObject('#__content_types', $consultant,
'type_id');
			}
			else
			{
				$consultant_Inserted =
$db->insertObject('#__content_types', $consultant);
			}

			// Create the consultant category content type object.
			$consultant_category = new stdClass();
			$consultant_category->type_title = 'Reservation Consultant
Catid';
			$consultant_category->type_alias =
'com_reservation.consultant.category';
			$consultant_category->table =
'{"special":{"dbtable":"#__categories","key":"id","type":"Category","prefix":"JTable","config":"array()"},"common":{"dbtable":"#__ucm_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}';
			$consultant_category->field_mappings =
'{"common":{"core_content_item_id":"id","core_title":"title","core_state":"published","core_alias":"alias","core_created_time":"created_time","core_modified_time":"modified_time","core_body":"description",
"core_hits":"hits","core_publish_up":"null","core_publish_down":"null","core_access":"access",
"core_params":"params",
"core_featured":"null",
"core_metadata":"metadata",
"core_language":"language",
"core_images":"null",
"core_urls":"null",
"core_version":"version",
"core_ordering":"null",
"core_metakey":"metakey",
"core_metadesc":"metadesc",
"core_catid":"parent_id",
"core_xreference":"null",
"asset_id":"asset_id"},
"special":{"parent_id":"parent_id","lft":"lft","rgt":"rgt","level":"level","path":"path","extension":"extension","note":"note"}}';
			$consultant_category->router =
'ReservationHelperRoute::getCategoryRoute';
			$consultant_category->content_history_options =
'{"formFile":"administrator\/components\/com_categories\/models\/forms\/category.xml",
"hideFields":["asset_id","checked_out","checked_out_time","version","lft","rgt","level","path","extension"],
"ignoreChanges":["modified_user_id",
"modified_time", "checked_out",
"checked_out_time", "version", "hits",
"path"],"convertToInt":["publish_up",
"publish_down"],
"displayLookup":[{"sourceColumn":"created_user_id","targetTable":"#__users","targetColumn":"id","displayColumn":"name"},{"sourceColumn":"access","targetTable":"#__viewlevels","targetColumn":"id","displayColumn":"title"},{"sourceColumn":"modified_user_id","targetTable":"#__users","targetColumn":"id","displayColumn":"name"},{"sourceColumn":"parent_id","targetTable":"#__categories","targetColumn":"id","displayColumn":"title"}]}';

			// Check if consultant category type is already in content_type DB.
			$consultant_category_id = null;
			$query = $db->getQuery(true);
			$query->select($db->quoteName(array('type_id')));
			$query->from($db->quoteName('#__content_types'));
			$query->where($db->quoteName('type_alias') . ' LIKE
'. $db->quote($consultant_category->type_alias));
			$db->setQuery($query);
			$db->execute();

			// Set the object into the content types table.
			if ($db->getNumRows())
			{
				$consultant_category->type_id = $db->loadResult();
				$consultant_category_Updated =
$db->updateObject('#__content_types', $consultant_category,
'type_id');
			}
			else
			{
				$consultant_category_Inserted =
$db->insertObject('#__content_types', $consultant_category);
			}

			// Create the message content type object.
			$message = new stdClass();
			$message->type_title = 'Reservation Message';
			$message->type_alias = 'com_reservation.message';
			$message->table = '{"special": {"dbtable":
"#__reservation_message","key":
"id","type": "Message","prefix":
"reservationTable","config":
"array()"},"common": {"dbtable":
"#__ucm_content","key":
"ucm_id","type":
"Corecontent","prefix":
"JTable","config": "array()"}}';
			$message->field_mappings = '{"common":
{"core_content_item_id": "id","core_title":
"null","core_state":
"published","core_alias":
"null","core_created_time":
"created","core_modified_time":
"modified","core_body":
"null","core_hits":
"hits","core_publish_up":
"null","core_publish_down":
"null","core_access":
"access","core_params":
"params","core_featured":
"null","core_metadata":
"null","core_language":
"null","core_images":
"null","core_urls":
"null","core_version":
"version","core_ordering":
"ordering","core_metakey":
"null","core_metadesc":
"null","core_catid":
"null","core_xreference":
"null","asset_id":
"asset_id"},"special":
{"from":"from","to":"to","reply":"reply","message":"message","read":"read","seen":"seen","seid":"seid"}}';
			$message->router =
'ReservationHelperRoute::getMessageRoute';
			$message->content_history_options = '{"formFile":
"administrator/components/com_reservation/models/forms/message.xml","hideFields":
["asset_id","checked_out","checked_out_time","version"],"ignoreChanges":
["modified_by","modified","checked_out","checked_out_time","version","hits"],"convertToInt":
["published","ordering","from","to","reply","read","seen","seid"],"displayLookup":
[{"sourceColumn": "created_by","targetTable":
"#__users","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"access","targetTable":
"#__viewlevels","targetColumn":
"id","displayColumn":
"title"},{"sourceColumn":
"modified_by","targetTable":
"#__users","targetColumn":
"id","displayColumn":
"name"},{"sourceColumn":
"reply","targetTable":
"#__reservation_message","targetColumn":
"id","displayColumn": "message"}]}';

			// Check if message type is already in content_type DB.
			$message_id = null;
			$query = $db->getQuery(true);
			$query->select($db->quoteName(array('type_id')));
			$query->from($db->quoteName('#__content_types'));
			$query->where($db->quoteName('type_alias') . ' LIKE
'. $db->quote($message->type_alias));
			$db->setQuery($query);
			$db->execute();

			// Set the object into the content types table.
			if ($db->getNumRows())
			{
				$message->type_id = $db->loadResult();
				$message_Updated = $db->updateObject('#__content_types',
$message, 'type_id');
			}
			else
			{
				$message_Inserted = $db->insertObject('#__content_types',
$message);
			}


			echo '<a target="_blank"
href="http://farhad.com" title="Reservation">
				<img
src="components/com_reservation/assets/images/vdm-component.jpg"/>
				</a>
				<h3>Upgrade to Version 1.0.39 Was Successful! Let us know if
anything is not working as expected.</h3>';
		}
		return true;
	}

	/**
	 * Remove folders with files
	 * 
	 * @param   string   $dir     The path to folder to remove
	 * @param   boolean  $ignore  The folders and files to ignore and not
remove
	 *
	 * @return  boolean   True in all is removed
	 * 
	 */
	protected function removeFolder($dir, $ignore = false)
	{
		if (Folder::exists($dir))
		{
			$it = new RecursiveDirectoryIterator($dir);
			$it = new RecursiveIteratorIterator($it,
RecursiveIteratorIterator::CHILD_FIRST);
			// remove ending /
			$dir = rtrim($dir, '/');
			// now loop the files & folders
			foreach ($it as $file)
			{
				if ('.' === $file->getBasename() || '..' === 
$file->getBasename()) continue;
				// set file dir
				$file_dir = $file->getPathname();
				// check if this is a dir or a file
				if ($file->isDir())
				{
					$keeper = false;
					if ($this->checkArray($ignore))
					{
						foreach ($ignore as $keep)
						{
							if (strpos($file_dir, $dir.'/'.$keep) !== false)
							{
								$keeper = true;
							}
						}
					}
					if ($keeper)
					{
						continue;
					}
					Folder::delete($file_dir);
				}
				else
				{
					$keeper = false;
					if ($this->checkArray($ignore))
					{
						foreach ($ignore as $keep)
						{
							if (strpos($file_dir, $dir.'/'.$keep) !== false)
							{
								$keeper = true;
							}
						}
					}
					if ($keeper)
					{
						continue;
					}
					File::delete($file_dir);
				}
			}
			// delete the root folder if not ignore found
			if (!$this->checkArray($ignore))
			{
				return Folder::delete($dir);
			}
			return true;
		}
		return false;
	}

	/**
	 * Check if have an array with a length
	 *
	 * @input	array   The array to check
	 *
	 * @returns bool/int  number of items in array on success
	 */
	protected function checkArray($array, $removeEmptyString = false)
	{
		if (isset($array) && is_array($array) && ($nr =
count((array)$array)) > 0)
		{
			// also make sure the empty strings are removed
			if ($removeEmptyString)
			{
				foreach ($array as $key => $string)
				{
					if (empty($string))
					{
						unset($array[$key]);
					}
				}
				return $this->checkArray($array, false);
			}
			return $nr;
		}
		return false;
	}

	/**
	 * Method to set/copy dynamic folders into place (use with caution)
	 *
	 * @return void
	 */
	protected function setDynamicF0ld3rs($app, $parent)
	{
		// get the instalation path
		$installer = $parent->getParent();
		$installPath = $installer->getPath('source');
		// get all the folders
		$folders = Folder::folders($installPath);
		// check if we have folders we may want to copy
		$doNotCopy = array('media','admin','site');
// Joomla already deals with these
		if (count((array) $folders) > 1)
		{
			foreach ($folders as $folder)
			{
				// Only copy if not a standard folders
				if (!in_array($folder, $doNotCopy))
				{
					// set the source path
					$src = $installPath.'/'.$folder;
					// set the destination path
					$dest = JPATH_ROOT.'/'.$folder;
					// now try to copy the folder
					if (!Folder::copy($src, $dest, '', true))
					{
						$app->enqueueMessage('Could not copy '.$folder.'
folder into place, please make sure destination is writable!',
'error');
					}
				}
			}
		}
	}
}
PK4~�[�#o,,sql/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK4~�[O��N�=�=sql/install.mysql.utf8.sqlnu�[���CREATE
TABLE IF NOT EXISTS `#__reservation_reserve` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`asset_id` INT(10) unsigned NOT NULL DEFAULT 0 COMMENT 'FK to the
#__assets table.',
	`appointmentid` INT(100) NOT NULL DEFAULT 0,
	`doctor_quota` VARCHAR(50) NOT NULL DEFAULT '',
	`full_price` VARCHAR(100) NOT NULL DEFAULT '',
	`payment_method` VARCHAR(50) NOT NULL DEFAULT '',
	`sickid` INT(255) NOT NULL DEFAULT 0,
	`status` VARCHAR(50) NOT NULL DEFAULT '',
	`system_quota` VARCHAR(50) NOT NULL DEFAULT '',
	`tracking_code` VARCHAR(50) NOT NULL DEFAULT '',
	`params` text NOT NULL,
	`published` TINYINT(3) NOT NULL DEFAULT 1,
	`created_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`modified_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`created` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`modified` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`checked_out` int(11) unsigned NOT NULL DEFAULT 0,
	`checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00
00:00:00',
	`version` INT(10) unsigned NOT NULL DEFAULT 1,
	`hits` INT(10) unsigned NOT NULL DEFAULT 0,
	`access` INT(10) unsigned NOT NULL DEFAULT 0,
	`ordering` INT(11) NOT NULL DEFAULT 0,
	PRIMARY KEY  (`id`),
	KEY `idx_appointmentid` (`appointmentid`),
	KEY `idx_access` (`access`),
	KEY `idx_checkout` (`checked_out`),
	KEY `idx_createdby` (`created_by`),
	KEY `idx_modifiedby` (`modified_by`),
	KEY `idx_state` (`published`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 DEFAULT
COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;

CREATE TABLE IF NOT EXISTS `#__reservation_bbbclass` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`asset_id` INT(10) unsigned NOT NULL DEFAULT 0 COMMENT 'FK to the
#__assets table.',
	`exmid` VARCHAR(255) NOT NULL DEFAULT '',
	`inmid` VARCHAR(255) NOT NULL DEFAULT '',
	`mpass` VARCHAR(255) NOT NULL DEFAULT '',
	`name` VARCHAR(255) NOT NULL DEFAULT '',
	`planid` INT(100) NOT NULL DEFAULT 0,
	`seid` INT(255) NOT NULL DEFAULT 0,
	`vpass` VARCHAR(255) NOT NULL DEFAULT '',
	`params` text NOT NULL,
	`published` TINYINT(3) NOT NULL DEFAULT 1,
	`created_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`modified_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`created` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`modified` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`checked_out` int(11) unsigned NOT NULL DEFAULT 0,
	`checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00
00:00:00',
	`version` INT(10) unsigned NOT NULL DEFAULT 1,
	`hits` INT(10) unsigned NOT NULL DEFAULT 0,
	`access` INT(10) unsigned NOT NULL DEFAULT 0,
	`ordering` INT(11) NOT NULL DEFAULT 0,
	PRIMARY KEY  (`id`),
	KEY `idx_name` (`name`),
	KEY `idx_exmid` (`exmid`),
	KEY `idx_access` (`access`),
	KEY `idx_checkout` (`checked_out`),
	KEY `idx_createdby` (`created_by`),
	KEY `idx_modifiedby` (`modified_by`),
	KEY `idx_state` (`published`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 DEFAULT
COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;

CREATE TABLE IF NOT EXISTS `#__reservation_doctor` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`asset_id` INT(10) unsigned NOT NULL DEFAULT 0 COMMENT 'FK to the
#__assets table.',
	`address` TEXT NOT NULL,
	`alt` VARCHAR(255) NOT NULL DEFAULT '',
	`capitalid` INT(255) NOT NULL DEFAULT 0,
	`catid` INT(50) NOT NULL DEFAULT 0,
	`cityid` INT(255) NOT NULL DEFAULT 0,
	`image` VARCHAR(255) NOT NULL DEFAULT '',
	`msn` VARCHAR(50) NOT NULL DEFAULT '',
	`officephone` VARCHAR(50) NOT NULL DEFAULT '',
	`phonenumber` VARCHAR(100) NOT NULL DEFAULT '',
	`presence` TEXT NOT NULL,
	`userid` INT(255) NOT NULL DEFAULT 0,
	`params` text NOT NULL,
	`published` TINYINT(3) NOT NULL DEFAULT 1,
	`created_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`modified_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`created` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`modified` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`checked_out` int(11) unsigned NOT NULL DEFAULT 0,
	`checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00
00:00:00',
	`version` INT(10) unsigned NOT NULL DEFAULT 1,
	`hits` INT(10) unsigned NOT NULL DEFAULT 0,
	`access` INT(10) unsigned NOT NULL DEFAULT 0,
	`ordering` INT(11) NOT NULL DEFAULT 0,
	PRIMARY KEY  (`id`),
	KEY `idx_userid` (`userid`),
	KEY `idx_catid` (`catid`),
	KEY `idx_access` (`access`),
	KEY `idx_checkout` (`checked_out`),
	KEY `idx_createdby` (`created_by`),
	KEY `idx_modifiedby` (`modified_by`),
	KEY `idx_state` (`published`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 DEFAULT
COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;

CREATE TABLE IF NOT EXISTS `#__reservation_appointment` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`asset_id` INT(10) unsigned NOT NULL DEFAULT 0 COMMENT 'FK to the
#__assets table.',
	`appointment` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
	`doctorid` INT(100) NOT NULL DEFAULT 0,
	`title` VARCHAR(255) NOT NULL DEFAULT '',
	`params` text NOT NULL,
	`published` TINYINT(3) NOT NULL DEFAULT 1,
	`created_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`modified_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`created` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`modified` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`checked_out` int(11) unsigned NOT NULL DEFAULT 0,
	`checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00
00:00:00',
	`version` INT(10) unsigned NOT NULL DEFAULT 1,
	`hits` INT(10) unsigned NOT NULL DEFAULT 0,
	`access` INT(10) unsigned NOT NULL DEFAULT 0,
	`ordering` INT(11) NOT NULL DEFAULT 0,
	PRIMARY KEY  (`id`),
	KEY `idx_title` (`title`),
	KEY `idx_access` (`access`),
	KEY `idx_checkout` (`checked_out`),
	KEY `idx_createdby` (`created_by`),
	KEY `idx_modifiedby` (`modified_by`),
	KEY `idx_state` (`published`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 DEFAULT
COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;

CREATE TABLE IF NOT EXISTS `#__reservation_capital` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`asset_id` INT(10) unsigned NOT NULL DEFAULT 0 COMMENT 'FK to the
#__assets table.',
	`capitalid` INT(255) NOT NULL DEFAULT 0,
	`name` VARCHAR(255) NOT NULL DEFAULT '',
	`params` text NOT NULL,
	`published` TINYINT(3) NOT NULL DEFAULT 1,
	`created_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`modified_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`created` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`modified` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`checked_out` int(11) unsigned NOT NULL DEFAULT 0,
	`checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00
00:00:00',
	`version` INT(10) unsigned NOT NULL DEFAULT 1,
	`hits` INT(10) unsigned NOT NULL DEFAULT 0,
	`access` INT(10) unsigned NOT NULL DEFAULT 0,
	`ordering` INT(11) NOT NULL DEFAULT 0,
	PRIMARY KEY  (`id`),
	KEY `idx_name` (`name`),
	KEY `idx_access` (`access`),
	KEY `idx_checkout` (`checked_out`),
	KEY `idx_createdby` (`created_by`),
	KEY `idx_modifiedby` (`modified_by`),
	KEY `idx_state` (`published`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 DEFAULT
COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;

CREATE TABLE IF NOT EXISTS `#__reservation_comment` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`asset_id` INT(10) unsigned NOT NULL DEFAULT 0 COMMENT 'FK to the
#__assets table.',
	`consultantid` INT(255) NOT NULL DEFAULT 0,
	`rate` FLOAT(10) NOT NULL DEFAULT 0,
	`seid` INT(255) NOT NULL DEFAULT 0,
	`sickid` INT(255) NOT NULL DEFAULT 0,
	`text` TEXT NOT NULL,
	`token` VARCHAR(255) NOT NULL DEFAULT '',
	`params` text NOT NULL,
	`published` TINYINT(3) NOT NULL DEFAULT 1,
	`created_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`modified_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`created` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`modified` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`checked_out` int(11) unsigned NOT NULL DEFAULT 0,
	`checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00
00:00:00',
	`version` INT(10) unsigned NOT NULL DEFAULT 1,
	`hits` INT(10) unsigned NOT NULL DEFAULT 0,
	`access` INT(10) unsigned NOT NULL DEFAULT 0,
	`ordering` INT(11) NOT NULL DEFAULT 0,
	PRIMARY KEY  (`id`),
	KEY `idx_access` (`access`),
	KEY `idx_checkout` (`checked_out`),
	KEY `idx_createdby` (`created_by`),
	KEY `idx_modifiedby` (`modified_by`),
	KEY `idx_state` (`published`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 DEFAULT
COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;

CREATE TABLE IF NOT EXISTS `#__reservation_session` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`asset_id` INT(10) unsigned NOT NULL DEFAULT 0 COMMENT 'FK to the
#__assets table.',
	`channel_token` VARCHAR(255) NOT NULL DEFAULT '',
	`finish` TINYINT(7) NOT NULL DEFAULT 0,
	`firsttext` VARCHAR(255) NOT NULL DEFAULT '',
	`pay` INT(7) NOT NULL DEFAULT 0,
	`planid` INT(100) NOT NULL DEFAULT 0,
	`sickid` INT(255) NOT NULL DEFAULT 0,
	`params` text NOT NULL,
	`published` TINYINT(3) NOT NULL DEFAULT 1,
	`created_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`modified_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`created` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`modified` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`checked_out` int(11) unsigned NOT NULL DEFAULT 0,
	`checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00
00:00:00',
	`version` INT(10) unsigned NOT NULL DEFAULT 1,
	`hits` INT(10) unsigned NOT NULL DEFAULT 0,
	`access` INT(10) unsigned NOT NULL DEFAULT 0,
	`ordering` INT(11) NOT NULL DEFAULT 0,
	PRIMARY KEY  (`id`),
	KEY `idx_sickid` (`sickid`),
	KEY `idx_access` (`access`),
	KEY `idx_checkout` (`checked_out`),
	KEY `idx_createdby` (`created_by`),
	KEY `idx_modifiedby` (`modified_by`),
	KEY `idx_state` (`published`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 DEFAULT
COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;

CREATE TABLE IF NOT EXISTS `#__reservation_sick` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`asset_id` INT(10) unsigned NOT NULL DEFAULT 0 COMMENT 'FK to the
#__assets table.',
	`alt` VARCHAR(255) NOT NULL DEFAULT '',
	`capitalid` INT(255) NOT NULL DEFAULT 0,
	`cardnumber` VARCHAR(64) NOT NULL DEFAULT '',
	`cityid` INT(255) NOT NULL DEFAULT 0,
	`image` VARCHAR(255) NOT NULL DEFAULT '',
	`phonenumber` VARCHAR(100) NOT NULL DEFAULT '',
	`userid` INT(255) NOT NULL DEFAULT 0,
	`params` text NOT NULL,
	`published` TINYINT(3) NOT NULL DEFAULT 1,
	`created_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`modified_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`created` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`modified` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`checked_out` int(11) unsigned NOT NULL DEFAULT 0,
	`checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00
00:00:00',
	`version` INT(10) unsigned NOT NULL DEFAULT 1,
	`hits` INT(10) unsigned NOT NULL DEFAULT 0,
	`access` INT(10) unsigned NOT NULL DEFAULT 0,
	`ordering` INT(11) NOT NULL DEFAULT 0,
	PRIMARY KEY  (`id`),
	KEY `idx_userid` (`userid`),
	KEY `idx_access` (`access`),
	KEY `idx_checkout` (`checked_out`),
	KEY `idx_createdby` (`created_by`),
	KEY `idx_modifiedby` (`modified_by`),
	KEY `idx_state` (`published`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 DEFAULT
COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;

CREATE TABLE IF NOT EXISTS `#__reservation_plan` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`asset_id` INT(10) unsigned NOT NULL DEFAULT 0 COMMENT 'FK to the
#__assets table.',
	`consultantid` INT(255) NOT NULL DEFAULT 0,
	`plantype` VARCHAR(7) NOT NULL DEFAULT '',
	`price` VARCHAR(50) NOT NULL DEFAULT '',
	`time` VARCHAR(50) NOT NULL DEFAULT '',
	`waitingtime` VARCHAR(50) NOT NULL DEFAULT '',
	`params` text NOT NULL,
	`published` TINYINT(3) NOT NULL DEFAULT 1,
	`created_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`modified_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`created` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`modified` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`checked_out` int(11) unsigned NOT NULL DEFAULT 0,
	`checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00
00:00:00',
	`version` INT(10) unsigned NOT NULL DEFAULT 1,
	`hits` INT(10) unsigned NOT NULL DEFAULT 0,
	`access` INT(10) unsigned NOT NULL DEFAULT 0,
	`ordering` INT(11) NOT NULL DEFAULT 0,
	PRIMARY KEY  (`id`),
	KEY `idx_plantype` (`plantype`),
	KEY `idx_access` (`access`),
	KEY `idx_checkout` (`checked_out`),
	KEY `idx_createdby` (`created_by`),
	KEY `idx_modifiedby` (`modified_by`),
	KEY `idx_state` (`published`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 DEFAULT
COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;

CREATE TABLE IF NOT EXISTS `#__reservation_consultant` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`asset_id` INT(10) unsigned NOT NULL DEFAULT 0 COMMENT 'FK to the
#__assets table.',
	`account` VARCHAR(50) NOT NULL DEFAULT '',
	`address` TEXT NOT NULL,
	`alt` VARCHAR(255) NOT NULL DEFAULT '',
	`capitalid` INT(255) NOT NULL DEFAULT 0,
	`catid` INT(50) NOT NULL DEFAULT 0,
	`cityid` INT(255) NOT NULL DEFAULT 0,
	`experience` VARCHAR(10) NOT NULL DEFAULT '',
	`image` VARCHAR(255) NOT NULL DEFAULT '',
	`introduction` TEXT NOT NULL,
	`msn` VARCHAR(50) NOT NULL DEFAULT '',
	`nationalnumber` VARCHAR(100) NOT NULL DEFAULT '',
	`officephone` VARCHAR(50) NOT NULL DEFAULT '',
	`phonenumber` VARCHAR(100) NOT NULL DEFAULT '',
	`presence` TEXT NOT NULL,
	`shortlink` VARCHAR(255) NOT NULL DEFAULT '',
	`userid` INT(255) NOT NULL DEFAULT 0,
	`video` VARCHAR(50) NOT NULL DEFAULT '',
	`params` text NOT NULL,
	`published` TINYINT(3) NOT NULL DEFAULT 1,
	`created_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`modified_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`created` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`modified` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`checked_out` int(11) unsigned NOT NULL DEFAULT 0,
	`checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00
00:00:00',
	`version` INT(10) unsigned NOT NULL DEFAULT 1,
	`hits` INT(10) unsigned NOT NULL DEFAULT 0,
	`access` INT(10) unsigned NOT NULL DEFAULT 0,
	`ordering` INT(11) NOT NULL DEFAULT 0,
	PRIMARY KEY  (`id`),
	KEY `idx_userid` (`userid`),
	KEY `idx_catid` (`catid`),
	KEY `idx_access` (`access`),
	KEY `idx_checkout` (`checked_out`),
	KEY `idx_createdby` (`created_by`),
	KEY `idx_modifiedby` (`modified_by`),
	KEY `idx_state` (`published`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 DEFAULT
COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;

CREATE TABLE IF NOT EXISTS `#__reservation_message` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`asset_id` INT(10) unsigned NOT NULL DEFAULT 0 COMMENT 'FK to the
#__assets table.',
	`from` INT(11) NOT NULL DEFAULT 0,
	`message` TEXT NOT NULL,
	`read` TINYINT(1) NOT NULL DEFAULT 0,
	`reply` INT(11) NOT NULL DEFAULT 0,
	`seen` TINYINT(1) NOT NULL DEFAULT 0,
	`seid` INT(255) NOT NULL DEFAULT 0,
	`to` INT(11) NOT NULL DEFAULT 0,
	`params` text NOT NULL,
	`published` TINYINT(3) NOT NULL DEFAULT 1,
	`created_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`modified_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`created` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`modified` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`checked_out` int(11) unsigned NOT NULL DEFAULT 0,
	`checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00
00:00:00',
	`version` INT(10) unsigned NOT NULL DEFAULT 1,
	`hits` INT(10) unsigned NOT NULL DEFAULT 0,
	`access` INT(10) unsigned NOT NULL DEFAULT 0,
	`ordering` INT(11) NOT NULL DEFAULT 0,
	PRIMARY KEY  (`id`),
	KEY `idx_access` (`access`),
	KEY `idx_checkout` (`checked_out`),
	KEY `idx_createdby` (`created_by`),
	KEY `idx_modifiedby` (`modified_by`),
	KEY `idx_state` (`published`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 DEFAULT
COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;



--
-- Always insure this column rules is large enough for all the access
control values.
--
ALTER TABLE `#__assets` CHANGE `rules` `rules` TEXT NOT NULL COMMENT
'JSON encoded access control. Enlarged to TEXT by JCB';
PK5~�[������sql/uninstall.mysql.utf8.sqlnu�[���DROP
TABLE IF EXISTS `#__reservation_reserve`;
DROP TABLE IF EXISTS `#__reservation_bbbclass`;
DROP TABLE IF EXISTS `#__reservation_doctor`;
DROP TABLE IF EXISTS `#__reservation_appointment`;
DROP TABLE IF EXISTS `#__reservation_capital`;
DROP TABLE IF EXISTS `#__reservation_comment`;
DROP TABLE IF EXISTS `#__reservation_session`;
DROP TABLE IF EXISTS `#__reservation_sick`;
DROP TABLE IF EXISTS `#__reservation_plan`;
DROP TABLE IF EXISTS `#__reservation_consultant`;
DROP TABLE IF EXISTS `#__reservation_message`;


--
-- Always insure this column rules is reversed to Joomla defaults on
uninstall. (as on 1st Dec 2020)
--
ALTER TABLE `#__assets` CHANGE `rules` `rules` varchar(5120) NOT NULL
COMMENT 'JSON encoded access control.';
PK5~�[�#o,,sql/updates/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[FW�:
 sql/updates/mysql/1.0.0.sqlnu�[���CREATE TABLE IF NOT EXISTS
`#__reservation_consultant` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`asset_id` INT(10) unsigned NOT NULL DEFAULT 0 COMMENT 'FK to the
#__assets table.',
	`capital` VARCHAR(50) NOT NULL DEFAULT '',
	`catid` INT(50) NOT NULL DEFAULT 0,
	`experience` VARCHAR(10) NOT NULL DEFAULT '',
	`image` VARCHAR(255) NOT NULL DEFAULT '',
	`introduction` TEXT NOT NULL,
	`msn` VARCHAR(50) NOT NULL DEFAULT '',
	`nationalnumber` VARCHAR(100) NOT NULL DEFAULT '',
	`phonenumber` VARCHAR(100) NOT NULL DEFAULT '',
	`userid` INT(255) NOT NULL DEFAULT 0,
	`video` VARCHAR(50) NOT NULL DEFAULT '',
	`params` text NOT NULL,
	`published` TINYINT(3) NOT NULL DEFAULT 1,
	`created_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`modified_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`created` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`modified` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`checked_out` int(11) unsigned NOT NULL DEFAULT 0,
	`checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00
00:00:00',
	`version` INT(10) unsigned NOT NULL DEFAULT 1,
	`hits` INT(10) unsigned NOT NULL DEFAULT 0,
	`access` INT(10) unsigned NOT NULL DEFAULT 0,
	`ordering` INT(11) NOT NULL DEFAULT 0,
	PRIMARY KEY  (`id`),
	KEY `idx_catid` (`catid`),
	KEY `idx_access` (`access`),
	KEY `idx_checkout` (`checked_out`),
	KEY `idx_createdby` (`created_by`),
	KEY `idx_modifiedby` (`modified_by`),
	KEY `idx_state` (`published`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 DEFAULT
COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
PK5~�[���%PPsql/updates/mysql/1.0.1.sqlnu�[���CREATE
TABLE IF NOT EXISTS `#__reservation_plan` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`asset_id` INT(10) unsigned NOT NULL DEFAULT 0 COMMENT 'FK to the
#__assets table.',
	`consultantid` INT(255) NOT NULL DEFAULT 0,
	`plantype` VARCHAR(10) NOT NULL DEFAULT '',
	`price` VARCHAR(50) NOT NULL DEFAULT '',
	`time` VARCHAR(50) NOT NULL DEFAULT '',
	`waitingtime` VARCHAR(50) NOT NULL DEFAULT '',
	`params` text NOT NULL,
	`published` TINYINT(3) NOT NULL DEFAULT 1,
	`created_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`modified_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`created` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`modified` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`checked_out` int(11) unsigned NOT NULL DEFAULT 0,
	`checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00
00:00:00',
	`version` INT(10) unsigned NOT NULL DEFAULT 1,
	`hits` INT(10) unsigned NOT NULL DEFAULT 0,
	`access` INT(10) unsigned NOT NULL DEFAULT 0,
	`ordering` INT(11) NOT NULL DEFAULT 0,
	PRIMARY KEY  (`id`),
	KEY `idx_plantype` (`plantype`),
	KEY `idx_access` (`access`),
	KEY `idx_checkout` (`checked_out`),
	KEY `idx_createdby` (`created_by`),
	KEY `idx_modifiedby` (`modified_by`),
	KEY `idx_state` (`published`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 DEFAULT
COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
PK5~�[��5�[[sql/updates/mysql/1.0.10.sqlnu�[���ALTER
TABLE `#__reservation_sick` ADD `capitalid` INT(255) NOT NULL DEFAULT 0
AFTER `alt`;
PK5~�[Βy__sql/updates/mysql/1.0.11.sqlnu�[���ALTER TABLE
`#__reservation_message` ADD `planid` INT(100) NOT NULL DEFAULT 0 AFTER
`message`;
PK5~�[����sql/updates/mysql/1.0.12.sqlnu�[���ALTER
TABLE `#__reservation_session` ADD `finish` TINYINT(7) NOT NULL DEFAULT 0
AFTER `asset_id`;

ALTER TABLE `#__reservation_session` ADD `firsttext` VARCHAR(255) NOT NULL
DEFAULT '' AFTER `finish`;
PK5~�[���ZZsql/updates/mysql/1.0.13.sqlnu�[���ALTER
TABLE `#__reservation_message` ADD `seid` INT(255) NOT NULL DEFAULT 0 AFTER
`seen`;
PK5~�[�z�,``sql/updates/mysql/1.0.14.sqlnu�[���ALTER
TABLE `#__reservation_consultant` ADD `catid` INT(50) NOT NULL DEFAULT 0
AFTER `capital`;
PK5~�[X��sql/updates/mysql/1.0.15.sqlnu�[���CREATE
TABLE IF NOT EXISTS `#__reservation_comment` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`asset_id` INT(10) unsigned NOT NULL DEFAULT 0 COMMENT 'FK to the
#__assets table.',
	`consultantid` INT(255) NOT NULL DEFAULT 0,
	`rate` FLOAT(10) NOT NULL DEFAULT 0,
	`sickid` INT(255) NOT NULL DEFAULT 0,
	`text` TEXT NOT NULL,
	`token` VARCHAR(255) NOT NULL DEFAULT '',
	`params` text NOT NULL,
	`published` TINYINT(3) NOT NULL DEFAULT 1,
	`created_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`modified_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`created` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`modified` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`checked_out` int(11) unsigned NOT NULL DEFAULT 0,
	`checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00
00:00:00',
	`version` INT(10) unsigned NOT NULL DEFAULT 1,
	`hits` INT(10) unsigned NOT NULL DEFAULT 0,
	`access` INT(10) unsigned NOT NULL DEFAULT 0,
	`ordering` INT(11) NOT NULL DEFAULT 0,
	PRIMARY KEY  (`id`),
	KEY `idx_access` (`access`),
	KEY `idx_checkout` (`checked_out`),
	KEY `idx_createdby` (`created_by`),
	KEY `idx_modifiedby` (`modified_by`),
	KEY `idx_state` (`published`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 DEFAULT
COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
PK5~�[�"ڎ�sql/updates/mysql/1.0.16.sqlnu�[���ALTER
TABLE `#__reservation_comment` ADD `consultantid` INT(255) NOT NULL DEFAULT
0 AFTER `asset_id`;

ALTER TABLE `#__reservation_comment` ADD `rate` FLOAT(10) NOT NULL DEFAULT
0 AFTER `consultantid`;

ALTER TABLE `#__reservation_comment` ADD `sickid` INT(255) NOT NULL DEFAULT
0 AFTER `rate`;

ALTER TABLE `#__reservation_comment` ADD `token` VARCHAR(255) NOT NULL
DEFAULT '' AFTER `text`;
PK5~�[ڳ��ZZsql/updates/mysql/1.0.17.sqlnu�[���ALTER
TABLE `#__reservation_comment` ADD `seid` INT(255) NOT NULL DEFAULT 0 AFTER
`rate`;
PK5~�[S��bbsql/updates/mysql/1.0.18.sqlnu�[���ALTER
TABLE `#__reservation_doctor` ADD `userid` INT(255) NOT NULL DEFAULT 0
AFTER `phonenumber`;
PK5~�[�+1��sql/updates/mysql/1.0.19.sqlnu�[���ALTER
TABLE `#__reservation_doctor` ADD `alt` VARCHAR(255) NOT NULL DEFAULT
'' AFTER `address`;

ALTER TABLE `#__reservation_doctor` ADD `image` VARCHAR(255) NOT NULL
DEFAULT '' AFTER `catid`;
PK5~�[��G���sql/updates/mysql/1.0.2.sqlnu�[���ALTER
TABLE `#__reservation_plan` ADD `consultantid` INT(255) NOT NULL DEFAULT 0
AFTER `asset_id`;

ALTER TABLE `#__reservation_plan` ADD `plantype` VARCHAR(10) NOT NULL
DEFAULT '' AFTER `consultantid`;
PK5~�[+&iisql/updates/mysql/1.0.20.sqlnu�[���ALTER
TABLE `#__reservation_doctor` ADD `presence` VARCHAR(255) NOT NULL DEFAULT
'' AFTER `phonenumber`;
PK5~�[�sql/updates/mysql/1.0.21.sqlnu�[���ALTER
TABLE `#__reservation_doctor` ADD `capitalid` INT(255) NOT NULL DEFAULT 0
AFTER `alt`;

ALTER TABLE `#__reservation_doctor` ADD `cityid` INT(255) NOT NULL DEFAULT
0 AFTER `catid`;
PK5~�[Y��q��sql/updates/mysql/1.0.22.sqlnu�[���CREATE
TABLE IF NOT EXISTS `#__reservation_appointment` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`asset_id` INT(10) unsigned NOT NULL DEFAULT 0 COMMENT 'FK to the
#__assets table.',
	`appointment` DATETIME NOT NULL DEFAULT '',
	`doctorid` INT(100) NOT NULL DEFAULT 0,
	`title` VARCHAR(255) NOT NULL DEFAULT '',
	`params` text NOT NULL,
	`published` TINYINT(3) NOT NULL DEFAULT 1,
	`created_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`modified_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`created` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`modified` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`checked_out` int(11) unsigned NOT NULL DEFAULT 0,
	`checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00
00:00:00',
	`version` INT(10) unsigned NOT NULL DEFAULT 1,
	`hits` INT(10) unsigned NOT NULL DEFAULT 0,
	`access` INT(10) unsigned NOT NULL DEFAULT 0,
	`ordering` INT(11) NOT NULL DEFAULT 0,
	PRIMARY KEY  (`id`),
	KEY `idx_title` (`title`),
	KEY `idx_access` (`access`),
	KEY `idx_checkout` (`checked_out`),
	KEY `idx_createdby` (`created_by`),
	KEY `idx_modifiedby` (`modified_by`),
	KEY `idx_state` (`published`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 DEFAULT
COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
PK5~�[���jjsql/updates/mysql/1.0.23.sqlnu�[���ALTER
TABLE `#__reservation_appointment` ADD `appointment` DATETIME NOT NULL
DEFAULT '' AFTER `asset_id`;
PK5~�[��
]ffsql/updates/mysql/1.0.24.sqlnu�[���ALTER TABLE
`#__reservation_appointment` CHANGE `appointment` `appointment` DATE NOT
NULL DEFAULT '';
PK5~�[�FZppsql/updates/mysql/1.0.25.sqlnu�[���ALTER
TABLE `#__reservation_appointment` ADD `dateofbirth` DATE NOT NULL DEFAULT
'0000-00-00' AFTER `asset_id`;
PK5~�[��{[sql/updates/mysql/1.0.26.sqlnu�[���CREATE
TABLE IF NOT EXISTS `#__reservation_appointment` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`asset_id` INT(10) unsigned NOT NULL DEFAULT 0 COMMENT 'FK to the
#__assets table.',
	`appointment` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
	`doctorid` INT(100) NOT NULL DEFAULT 0,
	`title` VARCHAR(255) NOT NULL DEFAULT '',
	`params` text NOT NULL,
	`published` TINYINT(3) NOT NULL DEFAULT 1,
	`created_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`modified_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`created` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`modified` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`checked_out` int(11) unsigned NOT NULL DEFAULT 0,
	`checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00
00:00:00',
	`version` INT(10) unsigned NOT NULL DEFAULT 1,
	`hits` INT(10) unsigned NOT NULL DEFAULT 0,
	`access` INT(10) unsigned NOT NULL DEFAULT 0,
	`ordering` INT(11) NOT NULL DEFAULT 0,
	PRIMARY KEY  (`id`),
	KEY `idx_title` (`title`),
	KEY `idx_access` (`access`),
	KEY `idx_checkout` (`checked_out`),
	KEY `idx_createdby` (`created_by`),
	KEY `idx_modifiedby` (`modified_by`),
	KEY `idx_state` (`published`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 DEFAULT
COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
PK5~�[��!!sql/updates/mysql/1.0.27.sqlnu�[���CREATE
TABLE IF NOT EXISTS `#__reservation_reserve` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`asset_id` INT(10) unsigned NOT NULL DEFAULT 0 COMMENT 'FK to the
#__assets table.',
	`appointmentid` INT(100) NOT NULL DEFAULT 0,
	`checkout` TINYINT(7) NOT NULL DEFAULT 0,
	`pay` INT(7) NOT NULL DEFAULT 0,
	`userid` INT(255) NOT NULL DEFAULT 0,
	`params` text NOT NULL,
	`published` TINYINT(3) NOT NULL DEFAULT 1,
	`created_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`modified_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`created` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`modified` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`checked_out` int(11) unsigned NOT NULL DEFAULT 0,
	`checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00
00:00:00',
	`version` INT(10) unsigned NOT NULL DEFAULT 1,
	`hits` INT(10) unsigned NOT NULL DEFAULT 0,
	`access` INT(10) unsigned NOT NULL DEFAULT 0,
	`ordering` INT(11) NOT NULL DEFAULT 0,
	PRIMARY KEY  (`id`),
	KEY `idx_appointmentid` (`appointmentid`),
	KEY `idx_access` (`access`),
	KEY `idx_checkout` (`checked_out`),
	KEY `idx_createdby` (`created_by`),
	KEY `idx_modifiedby` (`modified_by`),
	KEY `idx_state` (`published`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 DEFAULT
COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
PK5~�[Z���[[sql/updates/mysql/1.0.28.sqlnu�[���ALTER
TABLE `#__reservation_reserve` ADD `sickid` INT(255) NOT NULL DEFAULT 0
AFTER `pay`;
PK5~�[��!!sql/updates/mysql/1.0.29.sqlnu�[���CREATE
TABLE IF NOT EXISTS `#__reservation_reserve` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`asset_id` INT(10) unsigned NOT NULL DEFAULT 0 COMMENT 'FK to the
#__assets table.',
	`appointmentid` INT(100) NOT NULL DEFAULT 0,
	`checkout` TINYINT(7) NOT NULL DEFAULT 0,
	`pay` INT(7) NOT NULL DEFAULT 0,
	`sickid` INT(255) NOT NULL DEFAULT 0,
	`params` text NOT NULL,
	`published` TINYINT(3) NOT NULL DEFAULT 1,
	`created_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`modified_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`created` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`modified` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`checked_out` int(11) unsigned NOT NULL DEFAULT 0,
	`checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00
00:00:00',
	`version` INT(10) unsigned NOT NULL DEFAULT 1,
	`hits` INT(10) unsigned NOT NULL DEFAULT 0,
	`access` INT(10) unsigned NOT NULL DEFAULT 0,
	`ordering` INT(11) NOT NULL DEFAULT 0,
	PRIMARY KEY  (`id`),
	KEY `idx_appointmentid` (`appointmentid`),
	KEY `idx_access` (`access`),
	KEY `idx_checkout` (`checked_out`),
	KEY `idx_createdby` (`created_by`),
	KEY `idx_modifiedby` (`modified_by`),
	KEY `idx_state` (`published`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 DEFAULT
COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
PK5~�[�u�ggsql/updates/mysql/1.0.3.sqlnu�[���ALTER
TABLE `#__reservation_plan` ADD `plantype` VARCHAR(10) NOT NULL DEFAULT
'' AFTER `consultantid`;
PK5~�[a��xTTsql/updates/mysql/1.0.30.sqlnu�[���CREATE
TABLE IF NOT EXISTS `#__reservation_order` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`asset_id` INT(10) unsigned NOT NULL DEFAULT 0 COMMENT 'FK to the
#__assets table.',
	`doctor_quota` VARCHAR(50) NOT NULL DEFAULT '',
	`full_price` VARCHAR(100) NOT NULL DEFAULT '',
	`sickid` INT(255) NOT NULL DEFAULT 0,
	`status` VARCHAR(50) NOT NULL DEFAULT '',
	`system_quota` VARCHAR(50) NOT NULL DEFAULT '',
	`params` text NOT NULL,
	`published` TINYINT(3) NOT NULL DEFAULT 1,
	`created_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`modified_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`created` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`modified` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`checked_out` int(11) unsigned NOT NULL DEFAULT 0,
	`checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00
00:00:00',
	`version` INT(10) unsigned NOT NULL DEFAULT 1,
	`hits` INT(10) unsigned NOT NULL DEFAULT 0,
	`access` INT(10) unsigned NOT NULL DEFAULT 0,
	`ordering` INT(11) NOT NULL DEFAULT 0,
	PRIMARY KEY  (`id`),
	KEY `idx_sickid` (`sickid`),
	KEY `idx_access` (`access`),
	KEY `idx_checkout` (`checked_out`),
	KEY `idx_createdby` (`created_by`),
	KEY `idx_modifiedby` (`modified_by`),
	KEY `idx_state` (`published`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 DEFAULT
COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
PK5~�[��ǯ�sql/updates/mysql/1.0.31.sqlnu�[���ALTER
TABLE `#__reservation_reserve` ADD `doctor_quota` VARCHAR(50) NOT NULL
DEFAULT '' AFTER `appointmentid`;

ALTER TABLE `#__reservation_reserve` ADD `full_price` VARCHAR(100) NOT NULL
DEFAULT '' AFTER `doctor_quota`;

ALTER TABLE `#__reservation_reserve` ADD `status` VARCHAR(50) NOT NULL
DEFAULT '' AFTER `sickid`;

ALTER TABLE `#__reservation_reserve` ADD `system_quota` VARCHAR(50) NOT
NULL DEFAULT '' AFTER `status`;
PK5~�[^�����sql/updates/mysql/1.0.32.sqlnu�[���ALTER
TABLE `#__reservation_reserve` ADD `payment_method` VARCHAR(50) NOT NULL
DEFAULT '' AFTER `full_price`;

ALTER TABLE `#__reservation_reserve` ADD `tracking_code` VARCHAR(50) NOT
NULL DEFAULT '' AFTER `system_quota`;
PK5~�[z��[��sql/updates/mysql/1.0.33.sqlnu�[���CREATE
TABLE IF NOT EXISTS `#__reservation_consultant` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `asset_id` INT(10) unsigned NOT NULL DEFAULT 0 COMMENT 'FK to the
#__assets table.',
    `account` VARCHAR(50) NOT NULL DEFAULT '',
    `address` TEXT NOT NULL,
    `alt` VARCHAR(255) NOT NULL DEFAULT '',
    `capitalid` INT(255) NOT NULL DEFAULT 0,
    `catid` INT(50) NOT NULL DEFAULT 0,
    `cityid` INT(255) NOT NULL DEFAULT 0,
    `experience` VARCHAR(10) NOT NULL DEFAULT '',
    `image` VARCHAR(255) NOT NULL DEFAULT '',
    `introduction` TEXT NOT NULL,
    `msn` VARCHAR(50) NOT NULL DEFAULT '',
    `nationalnumber` VARCHAR(100) NOT NULL DEFAULT '',
    `officephone` VARCHAR(50) NOT NULL DEFAULT '',
    `phonenumber` VARCHAR(100) NOT NULL DEFAULT '',
    `presence` VARCHAR(255) NOT NULL DEFAULT '',
    `userid` INT(255) NOT NULL DEFAULT 0,
    `video` VARCHAR(50) NOT NULL DEFAULT '',
    `params` text NOT NULL,
    `published` TINYINT(3) NOT NULL DEFAULT 1,
    `created_by` INT(10) unsigned NOT NULL DEFAULT 0,
    `modified_by` INT(10) unsigned NOT NULL DEFAULT 0,
    `created` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
    `modified` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
    `checked_out` int(11) unsigned NOT NULL DEFAULT 0,
    `checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00
00:00:00',
    `version` INT(10) unsigned NOT NULL DEFAULT 1,
    `hits` INT(10) unsigned NOT NULL DEFAULT 0,
    `access` INT(10) unsigned NOT NULL DEFAULT 0,
    `ordering` INT(11) NOT NULL DEFAULT 0,
    PRIMARY KEY  (`id`),
    KEY `idx_userid` (`userid`),
    KEY `idx_catid` (`catid`),
    KEY `idx_access` (`access`),
    KEY `idx_checkout` (`checked_out`),
    KEY `idx_createdby` (`created_by`),
    KEY `idx_modifiedby` (`modified_by`),
    KEY `idx_state` (`published`)
    ) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 DEFAULT
COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
PK5~�[�|���sql/updates/mysql/1.0.34.sqlnu�[���ALTER
TABLE `#__reservation_doctor` CHANGE `presence` `presence` VARCHAR(2048)
NOT NULL DEFAULT '';

ALTER TABLE `#__reservation_consultant` CHANGE `presence` `presence`
VARCHAR(2048) NOT NULL DEFAULT '';
PK5~�[ɨ����sql/updates/mysql/1.0.35.sqlnu�[���ALTER
TABLE `#__reservation_doctor` CHANGE `presence` `presence` TEXT NOT NULL;

ALTER TABLE `#__reservation_consultant` CHANGE `presence` `presence` TEXT
NOT NULL;
PK5~�[c}�QQsql/updates/mysql/1.0.36.sqlnu�[���CREATE
TABLE IF NOT EXISTS `#__reservation_bbbclass` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`asset_id` INT(10) unsigned NOT NULL DEFAULT 0 COMMENT 'FK to the
#__assets table.',
	`exmid` VARCHAR(255) NOT NULL DEFAULT '',
	`inmid` VARCHAR(255) NOT NULL DEFAULT '',
	`mpass` VARCHAR(255) NOT NULL DEFAULT '',
	`name` VARCHAR(255) NOT NULL DEFAULT '',
	`planid` INT(100) NOT NULL DEFAULT 0,
	`vpass` VARCHAR(255) NOT NULL DEFAULT '',
	`params` text NOT NULL,
	`published` TINYINT(3) NOT NULL DEFAULT 1,
	`created_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`modified_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`created` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`modified` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`checked_out` int(11) unsigned NOT NULL DEFAULT 0,
	`checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00
00:00:00',
	`version` INT(10) unsigned NOT NULL DEFAULT 1,
	`hits` INT(10) unsigned NOT NULL DEFAULT 0,
	`access` INT(10) unsigned NOT NULL DEFAULT 0,
	`ordering` INT(11) NOT NULL DEFAULT 0,
	PRIMARY KEY  (`id`),
	KEY `idx_name` (`name`),
	KEY `idx_access` (`access`),
	KEY `idx_checkout` (`checked_out`),
	KEY `idx_createdby` (`created_by`),
	KEY `idx_modifiedby` (`modified_by`),
	KEY `idx_state` (`published`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 DEFAULT
COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
PK5~�[U��bccsql/updates/mysql/1.0.4.sqlnu�[���ALTER
TABLE `#__reservation_plan` ADD `consultantid` INT(255) NOT NULL DEFAULT 0
AFTER `asset_id`;
PK5~�[5�G���sql/updates/mysql/1.0.5.sqlnu�[���CREATE
TABLE IF NOT EXISTS `#__reservation_sick` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`asset_id` INT(10) unsigned NOT NULL DEFAULT 0 COMMENT 'FK to the
#__assets table.',
	`phonenumber` VARCHAR(100) NOT NULL DEFAULT '',
	`userid` INT(255) NOT NULL DEFAULT 0,
	`params` text NOT NULL,
	`published` TINYINT(3) NOT NULL DEFAULT 1,
	`created_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`modified_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`created` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`modified` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`checked_out` int(11) unsigned NOT NULL DEFAULT 0,
	`checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00
00:00:00',
	`version` INT(10) unsigned NOT NULL DEFAULT 1,
	`hits` INT(10) unsigned NOT NULL DEFAULT 0,
	`access` INT(10) unsigned NOT NULL DEFAULT 0,
	`ordering` INT(11) NOT NULL DEFAULT 0,
	PRIMARY KEY  (`id`),
	KEY `idx_userid` (`userid`),
	KEY `idx_access` (`access`),
	KEY `idx_checkout` (`checked_out`),
	KEY `idx_createdby` (`created_by`),
	KEY `idx_modifiedby` (`modified_by`),
	KEY `idx_state` (`published`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 DEFAULT
COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
PK5~�[*NJ���sql/updates/mysql/1.0.6.sqlnu�[���CREATE
TABLE IF NOT EXISTS `#__reservation_session` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`asset_id` INT(10) unsigned NOT NULL DEFAULT 0 COMMENT 'FK to the
#__assets table.',
	`pay` INT(7) NOT NULL DEFAULT 0,
	`planid` INT(100) NOT NULL DEFAULT 0,
	`sickid` INT(255) NOT NULL DEFAULT 0,
	`params` text NOT NULL,
	`published` TINYINT(3) NOT NULL DEFAULT 1,
	`created_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`modified_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`created` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`modified` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`checked_out` int(11) unsigned NOT NULL DEFAULT 0,
	`checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00
00:00:00',
	`version` INT(10) unsigned NOT NULL DEFAULT 1,
	`hits` INT(10) unsigned NOT NULL DEFAULT 0,
	`access` INT(10) unsigned NOT NULL DEFAULT 0,
	`ordering` INT(11) NOT NULL DEFAULT 0,
	PRIMARY KEY  (`id`),
	KEY `idx_sickid` (`sickid`),
	KEY `idx_access` (`access`),
	KEY `idx_checkout` (`checked_out`),
	KEY `idx_createdby` (`created_by`),
	KEY `idx_modifiedby` (`modified_by`),
	KEY `idx_state` (`published`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 DEFAULT
COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
PK5~�[,J�__sql/updates/mysql/1.0.7.sqlnu�[���ALTER TABLE
`#__reservation_plan` CHANGE `plantype` `plantype` VARCHAR(7) NOT NULL
DEFAULT '';
PK5~�[���JJsql/updates/mysql/1.0.8.sqlnu�[���ALTER
TABLE `#__reservation_sick` ADD `alt` VARCHAR(255) NOT NULL DEFAULT
'' AFTER `asset_id`;

ALTER TABLE `#__reservation_sick` ADD `cardnumber` VARCHAR(64) NOT NULL
DEFAULT '' AFTER `alt`;

ALTER TABLE `#__reservation_sick` ADD `catid` INT(255) NOT NULL DEFAULT 0
AFTER `cardnumber`;

ALTER TABLE `#__reservation_sick` ADD `cityid` INT(255) NOT NULL DEFAULT 0
AFTER `catid`;

ALTER TABLE `#__reservation_sick` ADD `image` VARCHAR(255) NOT NULL DEFAULT
'' AFTER `cityid`;

ALTER TABLE `#__reservation_consultant` ADD `alt` VARCHAR(255) NOT NULL
DEFAULT '' AFTER `asset_id`;
PK5~�[v�z6��sql/updates/mysql/1.0.9.sqlnu�[���CREATE
TABLE IF NOT EXISTS `#__reservation_capital` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`asset_id` INT(10) unsigned NOT NULL DEFAULT 0 COMMENT 'FK to the
#__assets table.',
	`capitalid` INT(255) NOT NULL DEFAULT 0,
	`name` VARCHAR(255) NOT NULL DEFAULT '',
	`params` text NOT NULL,
	`published` TINYINT(3) NOT NULL DEFAULT 1,
	`created_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`modified_by` INT(10) unsigned NOT NULL DEFAULT 0,
	`created` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`modified` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`checked_out` int(11) unsigned NOT NULL DEFAULT 0,
	`checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00
00:00:00',
	`version` INT(10) unsigned NOT NULL DEFAULT 1,
	`hits` INT(10) unsigned NOT NULL DEFAULT 0,
	`access` INT(10) unsigned NOT NULL DEFAULT 0,
	`ordering` INT(11) NOT NULL DEFAULT 0,
	PRIMARY KEY  (`id`),
	KEY `idx_name` (`name`),
	KEY `idx_access` (`access`),
	KEY `idx_checkout` (`checked_out`),
	KEY `idx_createdby` (`created_by`),
	KEY `idx_modifiedby` (`modified_by`),
	KEY `idx_state` (`published`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 DEFAULT
COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
PK5~�[�#o,,sql/updates/mysql/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[ׇ{�kksql/updates/mysql/1.0.37.sqlnu�[���ALTER
TABLE `#__reservation_consultant` ADD `shortlink` VARCHAR(255) NOT NULL
DEFAULT '' AFTER `presence`;
PK5~�[�j4S]]sql/updates/mysql/1.0.38.sqlnu�[���ALTER
TABLE `#__reservation_bbbclass` ADD `seid` INT(255) NOT NULL DEFAULT 0
AFTER `planid`;
PK5~�[{��,�!�!tables/appointment.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		appointment.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Registry\Registry;
use Joomla\String\StringHelper;
use Joomla\Utilities\ArrayHelper;

/**
 * Appointments Table class
 */
class ReservationTableAppointment extends JTable
{
	/**
	 * Ensure the params and metadata in json encoded in the bind method
	 *
	 * @var    array
	 * @since  3.3
	 */
	protected $_jsonEncode = array('params', 'metadata');
    
	/**
	 * Constructor
	 *
	 * @param object Database connector object
	 */
	function __construct(&$db) 
	{
		parent::__construct('#__reservation_appointment',
'id', $db);

		// Adding History Options
		JTableObserverContenthistory::createObserver($this,
array('typeAlias' =>
'com_reservation.appointment'));
	}	
 
	public function bind($array, $ignore = '')
	{
    
		if (isset($array['params']) &&
is_array($array['params']))
		{
			$registry = new JRegistry;
			$registry->loadArray($array['params']);
			$array['params'] = (string) $registry;
		}

		if (isset($array['metadata']) &&
is_array($array['metadata']))
		{
			$registry = new JRegistry;
			$registry->loadArray($array['metadata']);
			$array['metadata'] = (string) $registry;
		}
        
		// Bind the rules. 
		if (isset($array['rules']) &&
is_array($array['rules']))
		{ 
			$rules = new JAccessRules($array['rules']); 
			$this->setRules($rules); 
		}
		return parent::bind($array, $ignore);
	}
    
	/**
	 * Overload the store method for the Appointment table.
	 *
	 * @param   boolean	Toggle whether null values should be updated.
	 * @return  boolean  True on success, false on failure.
	 * @since   1.6
	 */
	public function store($updateNulls = false)
	{
		$date	= JFactory::getDate();
		$user	= JFactory::getUser();

		if ($this->id)
		{
			// Existing item
			$this->modified		= $date->toSql();
			$this->modified_by	= $user->get('id');
		}
		else
		{
			// New appointment. A appointment created and created_by field can be
set by the user,
			// so we don't touch either of these if they are set.
			if (!(int) $this->created)
			{
				$this->created = $date->toSql();
			}
			if (empty($this->created_by))
			{
				$this->created_by = $user->get('id');
			}
		}
		
		if (isset($this->alias))
		{
			// Verify that the alias is unique
			$table = JTable::getInstance('appointment',
'ReservationTable');

			if ($table->load(array('alias' => $this->alias))
&& ($table->id != $this->id || $this->id == 0))
			{
				$this->setError(JText::_('COM_RESERVATION_APPOINTMENT_ERROR_UNIQUE_ALIAS'));
				return false;
			}
		}
		
		if (isset($this->url))
		{
			// Convert IDN urls to punycode
			$this->url = JStringPunycode::urlToPunycode($this->url);
		}
		if (isset($this->website))
		{
			// Convert IDN urls to punycode
			$this->website = JStringPunycode::urlToPunycode($this->website);
		}

		return parent::store($updateNulls);
	}
    
	/**
	 * Overloaded check method to ensure data integrity.
	 *
	 * @return  boolean  True on success.
	 */
	public function check()
	{
		if (isset($this->alias))
		{
			// Generate a valid alias
			$this->generateAlias();
            
			$table = JTable::getInstance('appointment',
'reservationTable');

			while ($table->load(array('alias' => $this->alias))
&& ($table->id != $this->id || $this->id == 0))
			{
				$this->alias = StringHelper::increment($this->alias,
'dash');
			}
		}
		
		/*
		 * Clean up keywords -- eliminate extra spaces between phrases
		 * and cr (\r) and lf (\n) characters from string.
		 * Only process if not empty.
 		 */
		if (!empty($this->metakey))
		{
			// Array of characters to remove.
			$bad_characters = array("\n", "\r",
"\"", "<", ">");

			// Remove bad characters.
			$after_clean = StringHelper::str_ireplace($bad_characters, "",
$this->metakey);

			// Create array using commas as delimiter.
			$keys = explode(',', $after_clean);
			$clean_keys = array();

			foreach ($keys as $key)
			{
				// Ignore blank keywords.
				if (trim($key))
				{
					$clean_keys[] = trim($key);
				}
			}

			// Put array back together delimited by ", "
			$this->metakey = implode(", ", $clean_keys);
		}

		// Clean up description -- eliminate quotes and <> brackets
		if (!empty($this->metadesc))
		{
			// Only process if not empty
			$bad_characters = array("\"", "<",
">");
			$this->metadesc = StringHelper::str_ireplace($bad_characters,
"", $this->metadesc);
		}

		// If we don't have any access rules set at this point just use an
empty JAccessRules class
		if (!$this->getRules())
		{
			$rules =
$this->getDefaultAssetValues('com_reservation.appointment.'.$this->id);
			$this->setRules($rules);
		}
        
		// Set ordering
		if ($this->published < 0)
		{
			// Set ordering to 0 if state is archived or trashed
			$this->ordering = 0;
		}

		return true;
	}

	/**
	 * Gets the default asset values for a component.
	 *
	 * @param   $string  $component  The component asset name to search for
	 *
	 * @return  JAccessRules  The JAccessRules object for the asset
	 */
	protected function getDefaultAssetValues($component, $try = true)
	{
		// Need to find the asset id by the name of the component.
		$db = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select($db->quoteName('id'))
			->from($db->quoteName('#__assets'))
			->where($db->quoteName('name') . ' = ' .
$db->quote($component));
		$db->setQuery($query);
		$db->execute();
		if ($db->loadRowList())
		{
			// asset already set so use saved rules
			$assetId = (int) $db->loadResult();
			return JAccess::getAssetRules($assetId); // (TODO) instead of keeping
inherited Allowed it becomes Allowed.
		}
		// try again
		elseif ($try)
		{
			$try = explode('.',$component);
			$result =  $this->getDefaultAssetValues($try[0], false);
			if ($result instanceof JAccessRules)
			{
				if (isset($try[1]))
				{
					$_result = (string) $result;
					$_result = json_decode($_result);
					foreach ($_result as $name => &$rule)
					{
						$v = explode('.', $name);
						if ($try[1] !== $v[0])
						{
							// remove since it is not part of this view
							unset($_result->$name);
						}
						else
						{
							// clear the value since we inherit
							$rule = array();
						}
					}
					// check if there are any view values remaining
					if (count( (array) $_result))
					{
						$_result = json_encode($_result);
						$_result = array($_result);
						// Instantiate and return the JAccessRules object for the asset
rules.
						$rules = new JAccessRules;
						$rules->mergeCollection($_result);

						return $rules;
					}
				}
				return $result;
			}
		}
		return JAccess::getAssetRules(0);
	}

	/**
	 * Method to compute the default name of the asset.
	 * The default name is in the form 'table_name.id'
	 * where id is the value of the primary key of the table.
	 *
	 * @return	string
	 * @since	2.5
	 */
	protected function _getAssetName()
	{
		$k = $this->_tbl_key;
		return 'com_reservation.appointment.'.(int) $this->$k;
	}

	/**
	 * Method to return the title to use for the asset table.
	 *
	 * @return	string
	 * @since	2.5
	 */
	protected function _getAssetTitle()
	{
		if (isset($this->title))
		{
			return $this->title;
		}
		return '';
	}

	/**
	 * Get the parent asset id for the record
	 *
	 * @return	int
	 * @since	2.5
	 */
	protected function _getAssetParentId(JTable $table = NULL, $id = NULL) 
	{
		$asset = JTable::getInstance('Asset');
		$asset->loadByName('com_reservation');

		return $asset->id;
	}

	/**
	 * This view does not actually have an alias
	 *
	 * @return  bool
	 */
	public function generateAlias()
	{
		return false;
	}

}
PK5~�[���}!}!tables/bbbclass.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		bbbclass.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Registry\Registry;
use Joomla\String\StringHelper;
use Joomla\Utilities\ArrayHelper;

/**
 * Bbbclasses Table class
 */
class ReservationTableBbbclass extends JTable
{
	/**
	 * Ensure the params and metadata in json encoded in the bind method
	 *
	 * @var    array
	 * @since  3.3
	 */
	protected $_jsonEncode = array('params', 'metadata');
    
	/**
	 * Constructor
	 *
	 * @param object Database connector object
	 */
	function __construct(&$db) 
	{
		parent::__construct('#__reservation_bbbclass', 'id',
$db);

		// Adding History Options
		JTableObserverContenthistory::createObserver($this,
array('typeAlias' => 'com_reservation.bbbclass'));
	}	
 
	public function bind($array, $ignore = '')
	{
    
		if (isset($array['params']) &&
is_array($array['params']))
		{
			$registry = new JRegistry;
			$registry->loadArray($array['params']);
			$array['params'] = (string) $registry;
		}

		if (isset($array['metadata']) &&
is_array($array['metadata']))
		{
			$registry = new JRegistry;
			$registry->loadArray($array['metadata']);
			$array['metadata'] = (string) $registry;
		}
        
		// Bind the rules. 
		if (isset($array['rules']) &&
is_array($array['rules']))
		{ 
			$rules = new JAccessRules($array['rules']); 
			$this->setRules($rules); 
		}
		return parent::bind($array, $ignore);
	}
    
	/**
	 * Overload the store method for the Bbbclass table.
	 *
	 * @param   boolean	Toggle whether null values should be updated.
	 * @return  boolean  True on success, false on failure.
	 * @since   1.6
	 */
	public function store($updateNulls = false)
	{
		$date	= JFactory::getDate();
		$user	= JFactory::getUser();

		if ($this->id)
		{
			// Existing item
			$this->modified		= $date->toSql();
			$this->modified_by	= $user->get('id');
		}
		else
		{
			// New bbbclass. A bbbclass created and created_by field can be set by
the user,
			// so we don't touch either of these if they are set.
			if (!(int) $this->created)
			{
				$this->created = $date->toSql();
			}
			if (empty($this->created_by))
			{
				$this->created_by = $user->get('id');
			}
		}
		
		if (isset($this->alias))
		{
			// Verify that the alias is unique
			$table = JTable::getInstance('bbbclass',
'ReservationTable');

			if ($table->load(array('alias' => $this->alias))
&& ($table->id != $this->id || $this->id == 0))
			{
				$this->setError(JText::_('COM_RESERVATION_BBBCLASS_ERROR_UNIQUE_ALIAS'));
				return false;
			}
		}
		
		if (isset($this->url))
		{
			// Convert IDN urls to punycode
			$this->url = JStringPunycode::urlToPunycode($this->url);
		}
		if (isset($this->website))
		{
			// Convert IDN urls to punycode
			$this->website = JStringPunycode::urlToPunycode($this->website);
		}

		return parent::store($updateNulls);
	}
    
	/**
	 * Overloaded check method to ensure data integrity.
	 *
	 * @return  boolean  True on success.
	 */
	public function check()
	{
		if (isset($this->alias))
		{
			// Generate a valid alias
			$this->generateAlias();
            
			$table = JTable::getInstance('bbbclass',
'reservationTable');

			while ($table->load(array('alias' => $this->alias))
&& ($table->id != $this->id || $this->id == 0))
			{
				$this->alias = StringHelper::increment($this->alias,
'dash');
			}
		}
		
		/*
		 * Clean up keywords -- eliminate extra spaces between phrases
		 * and cr (\r) and lf (\n) characters from string.
		 * Only process if not empty.
 		 */
		if (!empty($this->metakey))
		{
			// Array of characters to remove.
			$bad_characters = array("\n", "\r",
"\"", "<", ">");

			// Remove bad characters.
			$after_clean = StringHelper::str_ireplace($bad_characters, "",
$this->metakey);

			// Create array using commas as delimiter.
			$keys = explode(',', $after_clean);
			$clean_keys = array();

			foreach ($keys as $key)
			{
				// Ignore blank keywords.
				if (trim($key))
				{
					$clean_keys[] = trim($key);
				}
			}

			// Put array back together delimited by ", "
			$this->metakey = implode(", ", $clean_keys);
		}

		// Clean up description -- eliminate quotes and <> brackets
		if (!empty($this->metadesc))
		{
			// Only process if not empty
			$bad_characters = array("\"", "<",
">");
			$this->metadesc = StringHelper::str_ireplace($bad_characters,
"", $this->metadesc);
		}

		// If we don't have any access rules set at this point just use an
empty JAccessRules class
		if (!$this->getRules())
		{
			$rules =
$this->getDefaultAssetValues('com_reservation.bbbclass.'.$this->id);
			$this->setRules($rules);
		}
        
		// Set ordering
		if ($this->published < 0)
		{
			// Set ordering to 0 if state is archived or trashed
			$this->ordering = 0;
		}

		return true;
	}

	/**
	 * Gets the default asset values for a component.
	 *
	 * @param   $string  $component  The component asset name to search for
	 *
	 * @return  JAccessRules  The JAccessRules object for the asset
	 */
	protected function getDefaultAssetValues($component, $try = true)
	{
		// Need to find the asset id by the name of the component.
		$db = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select($db->quoteName('id'))
			->from($db->quoteName('#__assets'))
			->where($db->quoteName('name') . ' = ' .
$db->quote($component));
		$db->setQuery($query);
		$db->execute();
		if ($db->loadRowList())
		{
			// asset already set so use saved rules
			$assetId = (int) $db->loadResult();
			return JAccess::getAssetRules($assetId); // (TODO) instead of keeping
inherited Allowed it becomes Allowed.
		}
		// try again
		elseif ($try)
		{
			$try = explode('.',$component);
			$result =  $this->getDefaultAssetValues($try[0], false);
			if ($result instanceof JAccessRules)
			{
				if (isset($try[1]))
				{
					$_result = (string) $result;
					$_result = json_decode($_result);
					foreach ($_result as $name => &$rule)
					{
						$v = explode('.', $name);
						if ($try[1] !== $v[0])
						{
							// remove since it is not part of this view
							unset($_result->$name);
						}
						else
						{
							// clear the value since we inherit
							$rule = array();
						}
					}
					// check if there are any view values remaining
					if (count( (array) $_result))
					{
						$_result = json_encode($_result);
						$_result = array($_result);
						// Instantiate and return the JAccessRules object for the asset
rules.
						$rules = new JAccessRules;
						$rules->mergeCollection($_result);

						return $rules;
					}
				}
				return $result;
			}
		}
		return JAccess::getAssetRules(0);
	}

	/**
	 * Method to compute the default name of the asset.
	 * The default name is in the form 'table_name.id'
	 * where id is the value of the primary key of the table.
	 *
	 * @return	string
	 * @since	2.5
	 */
	protected function _getAssetName()
	{
		$k = $this->_tbl_key;
		return 'com_reservation.bbbclass.'.(int) $this->$k;
	}

	/**
	 * Method to return the title to use for the asset table.
	 *
	 * @return	string
	 * @since	2.5
	 */
	protected function _getAssetTitle()
	{
		if (isset($this->title))
		{
			return $this->title;
		}
		return '';
	}

	/**
	 * Get the parent asset id for the record
	 *
	 * @return	int
	 * @since	2.5
	 */
	protected function _getAssetParentId(JTable $table = NULL, $id = NULL) 
	{
		$asset = JTable::getInstance('Asset');
		$asset->loadByName('com_reservation');

		return $asset->id;
	}

	/**
	 * This view does not actually have an alias
	 *
	 * @return  bool
	 */
	public function generateAlias()
	{
		return false;
	}

}
PK5~�[�˳fo!o!tables/capital.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		capital.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Registry\Registry;
use Joomla\String\StringHelper;
use Joomla\Utilities\ArrayHelper;

/**
 * Capitals Table class
 */
class ReservationTableCapital extends JTable
{
	/**
	 * Ensure the params and metadata in json encoded in the bind method
	 *
	 * @var    array
	 * @since  3.3
	 */
	protected $_jsonEncode = array('params', 'metadata');
    
	/**
	 * Constructor
	 *
	 * @param object Database connector object
	 */
	function __construct(&$db) 
	{
		parent::__construct('#__reservation_capital', 'id',
$db);

		// Adding History Options
		JTableObserverContenthistory::createObserver($this,
array('typeAlias' => 'com_reservation.capital'));
	}	
 
	public function bind($array, $ignore = '')
	{
    
		if (isset($array['params']) &&
is_array($array['params']))
		{
			$registry = new JRegistry;
			$registry->loadArray($array['params']);
			$array['params'] = (string) $registry;
		}

		if (isset($array['metadata']) &&
is_array($array['metadata']))
		{
			$registry = new JRegistry;
			$registry->loadArray($array['metadata']);
			$array['metadata'] = (string) $registry;
		}
        
		// Bind the rules. 
		if (isset($array['rules']) &&
is_array($array['rules']))
		{ 
			$rules = new JAccessRules($array['rules']); 
			$this->setRules($rules); 
		}
		return parent::bind($array, $ignore);
	}
    
	/**
	 * Overload the store method for the Capital table.
	 *
	 * @param   boolean	Toggle whether null values should be updated.
	 * @return  boolean  True on success, false on failure.
	 * @since   1.6
	 */
	public function store($updateNulls = false)
	{
		$date	= JFactory::getDate();
		$user	= JFactory::getUser();

		if ($this->id)
		{
			// Existing item
			$this->modified		= $date->toSql();
			$this->modified_by	= $user->get('id');
		}
		else
		{
			// New capital. A capital created and created_by field can be set by the
user,
			// so we don't touch either of these if they are set.
			if (!(int) $this->created)
			{
				$this->created = $date->toSql();
			}
			if (empty($this->created_by))
			{
				$this->created_by = $user->get('id');
			}
		}
		
		if (isset($this->alias))
		{
			// Verify that the alias is unique
			$table = JTable::getInstance('capital',
'ReservationTable');

			if ($table->load(array('alias' => $this->alias))
&& ($table->id != $this->id || $this->id == 0))
			{
				$this->setError(JText::_('COM_RESERVATION_CAPITAL_ERROR_UNIQUE_ALIAS'));
				return false;
			}
		}
		
		if (isset($this->url))
		{
			// Convert IDN urls to punycode
			$this->url = JStringPunycode::urlToPunycode($this->url);
		}
		if (isset($this->website))
		{
			// Convert IDN urls to punycode
			$this->website = JStringPunycode::urlToPunycode($this->website);
		}

		return parent::store($updateNulls);
	}
    
	/**
	 * Overloaded check method to ensure data integrity.
	 *
	 * @return  boolean  True on success.
	 */
	public function check()
	{
		if (isset($this->alias))
		{
			// Generate a valid alias
			$this->generateAlias();
            
			$table = JTable::getInstance('capital',
'reservationTable');

			while ($table->load(array('alias' => $this->alias))
&& ($table->id != $this->id || $this->id == 0))
			{
				$this->alias = StringHelper::increment($this->alias,
'dash');
			}
		}
		
		/*
		 * Clean up keywords -- eliminate extra spaces between phrases
		 * and cr (\r) and lf (\n) characters from string.
		 * Only process if not empty.
 		 */
		if (!empty($this->metakey))
		{
			// Array of characters to remove.
			$bad_characters = array("\n", "\r",
"\"", "<", ">");

			// Remove bad characters.
			$after_clean = StringHelper::str_ireplace($bad_characters, "",
$this->metakey);

			// Create array using commas as delimiter.
			$keys = explode(',', $after_clean);
			$clean_keys = array();

			foreach ($keys as $key)
			{
				// Ignore blank keywords.
				if (trim($key))
				{
					$clean_keys[] = trim($key);
				}
			}

			// Put array back together delimited by ", "
			$this->metakey = implode(", ", $clean_keys);
		}

		// Clean up description -- eliminate quotes and <> brackets
		if (!empty($this->metadesc))
		{
			// Only process if not empty
			$bad_characters = array("\"", "<",
">");
			$this->metadesc = StringHelper::str_ireplace($bad_characters,
"", $this->metadesc);
		}

		// If we don't have any access rules set at this point just use an
empty JAccessRules class
		if (!$this->getRules())
		{
			$rules =
$this->getDefaultAssetValues('com_reservation.capital.'.$this->id);
			$this->setRules($rules);
		}
        
		// Set ordering
		if ($this->published < 0)
		{
			// Set ordering to 0 if state is archived or trashed
			$this->ordering = 0;
		}

		return true;
	}

	/**
	 * Gets the default asset values for a component.
	 *
	 * @param   $string  $component  The component asset name to search for
	 *
	 * @return  JAccessRules  The JAccessRules object for the asset
	 */
	protected function getDefaultAssetValues($component, $try = true)
	{
		// Need to find the asset id by the name of the component.
		$db = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select($db->quoteName('id'))
			->from($db->quoteName('#__assets'))
			->where($db->quoteName('name') . ' = ' .
$db->quote($component));
		$db->setQuery($query);
		$db->execute();
		if ($db->loadRowList())
		{
			// asset already set so use saved rules
			$assetId = (int) $db->loadResult();
			return JAccess::getAssetRules($assetId); // (TODO) instead of keeping
inherited Allowed it becomes Allowed.
		}
		// try again
		elseif ($try)
		{
			$try = explode('.',$component);
			$result =  $this->getDefaultAssetValues($try[0], false);
			if ($result instanceof JAccessRules)
			{
				if (isset($try[1]))
				{
					$_result = (string) $result;
					$_result = json_decode($_result);
					foreach ($_result as $name => &$rule)
					{
						$v = explode('.', $name);
						if ($try[1] !== $v[0])
						{
							// remove since it is not part of this view
							unset($_result->$name);
						}
						else
						{
							// clear the value since we inherit
							$rule = array();
						}
					}
					// check if there are any view values remaining
					if (count( (array) $_result))
					{
						$_result = json_encode($_result);
						$_result = array($_result);
						// Instantiate and return the JAccessRules object for the asset
rules.
						$rules = new JAccessRules;
						$rules->mergeCollection($_result);

						return $rules;
					}
				}
				return $result;
			}
		}
		return JAccess::getAssetRules(0);
	}

	/**
	 * Method to compute the default name of the asset.
	 * The default name is in the form 'table_name.id'
	 * where id is the value of the primary key of the table.
	 *
	 * @return	string
	 * @since	2.5
	 */
	protected function _getAssetName()
	{
		$k = $this->_tbl_key;
		return 'com_reservation.capital.'.(int) $this->$k;
	}

	/**
	 * Method to return the title to use for the asset table.
	 *
	 * @return	string
	 * @since	2.5
	 */
	protected function _getAssetTitle()
	{
		if (isset($this->title))
		{
			return $this->title;
		}
		return '';
	}

	/**
	 * Get the parent asset id for the record
	 *
	 * @return	int
	 * @since	2.5
	 */
	protected function _getAssetParentId(JTable $table = NULL, $id = NULL) 
	{
		$asset = JTable::getInstance('Asset');
		$asset->loadByName('com_reservation');

		return $asset->id;
	}

	/**
	 * This view does not actually have an alias
	 *
	 * @return  bool
	 */
	public function generateAlias()
	{
		return false;
	}

}
PK5~�[���o!o!tables/comment.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		comment.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Registry\Registry;
use Joomla\String\StringHelper;
use Joomla\Utilities\ArrayHelper;

/**
 * Comments Table class
 */
class ReservationTableComment extends JTable
{
	/**
	 * Ensure the params and metadata in json encoded in the bind method
	 *
	 * @var    array
	 * @since  3.3
	 */
	protected $_jsonEncode = array('params', 'metadata');
    
	/**
	 * Constructor
	 *
	 * @param object Database connector object
	 */
	function __construct(&$db) 
	{
		parent::__construct('#__reservation_comment', 'id',
$db);

		// Adding History Options
		JTableObserverContenthistory::createObserver($this,
array('typeAlias' => 'com_reservation.comment'));
	}	
 
	public function bind($array, $ignore = '')
	{
    
		if (isset($array['params']) &&
is_array($array['params']))
		{
			$registry = new JRegistry;
			$registry->loadArray($array['params']);
			$array['params'] = (string) $registry;
		}

		if (isset($array['metadata']) &&
is_array($array['metadata']))
		{
			$registry = new JRegistry;
			$registry->loadArray($array['metadata']);
			$array['metadata'] = (string) $registry;
		}
        
		// Bind the rules. 
		if (isset($array['rules']) &&
is_array($array['rules']))
		{ 
			$rules = new JAccessRules($array['rules']); 
			$this->setRules($rules); 
		}
		return parent::bind($array, $ignore);
	}
    
	/**
	 * Overload the store method for the Comment table.
	 *
	 * @param   boolean	Toggle whether null values should be updated.
	 * @return  boolean  True on success, false on failure.
	 * @since   1.6
	 */
	public function store($updateNulls = false)
	{
		$date	= JFactory::getDate();
		$user	= JFactory::getUser();

		if ($this->id)
		{
			// Existing item
			$this->modified		= $date->toSql();
			$this->modified_by	= $user->get('id');
		}
		else
		{
			// New comment. A comment created and created_by field can be set by the
user,
			// so we don't touch either of these if they are set.
			if (!(int) $this->created)
			{
				$this->created = $date->toSql();
			}
			if (empty($this->created_by))
			{
				$this->created_by = $user->get('id');
			}
		}
		
		if (isset($this->alias))
		{
			// Verify that the alias is unique
			$table = JTable::getInstance('comment',
'ReservationTable');

			if ($table->load(array('alias' => $this->alias))
&& ($table->id != $this->id || $this->id == 0))
			{
				$this->setError(JText::_('COM_RESERVATION_COMMENT_ERROR_UNIQUE_ALIAS'));
				return false;
			}
		}
		
		if (isset($this->url))
		{
			// Convert IDN urls to punycode
			$this->url = JStringPunycode::urlToPunycode($this->url);
		}
		if (isset($this->website))
		{
			// Convert IDN urls to punycode
			$this->website = JStringPunycode::urlToPunycode($this->website);
		}

		return parent::store($updateNulls);
	}
    
	/**
	 * Overloaded check method to ensure data integrity.
	 *
	 * @return  boolean  True on success.
	 */
	public function check()
	{
		if (isset($this->alias))
		{
			// Generate a valid alias
			$this->generateAlias();
            
			$table = JTable::getInstance('comment',
'reservationTable');

			while ($table->load(array('alias' => $this->alias))
&& ($table->id != $this->id || $this->id == 0))
			{
				$this->alias = StringHelper::increment($this->alias,
'dash');
			}
		}
		
		/*
		 * Clean up keywords -- eliminate extra spaces between phrases
		 * and cr (\r) and lf (\n) characters from string.
		 * Only process if not empty.
 		 */
		if (!empty($this->metakey))
		{
			// Array of characters to remove.
			$bad_characters = array("\n", "\r",
"\"", "<", ">");

			// Remove bad characters.
			$after_clean = StringHelper::str_ireplace($bad_characters, "",
$this->metakey);

			// Create array using commas as delimiter.
			$keys = explode(',', $after_clean);
			$clean_keys = array();

			foreach ($keys as $key)
			{
				// Ignore blank keywords.
				if (trim($key))
				{
					$clean_keys[] = trim($key);
				}
			}

			// Put array back together delimited by ", "
			$this->metakey = implode(", ", $clean_keys);
		}

		// Clean up description -- eliminate quotes and <> brackets
		if (!empty($this->metadesc))
		{
			// Only process if not empty
			$bad_characters = array("\"", "<",
">");
			$this->metadesc = StringHelper::str_ireplace($bad_characters,
"", $this->metadesc);
		}

		// If we don't have any access rules set at this point just use an
empty JAccessRules class
		if (!$this->getRules())
		{
			$rules =
$this->getDefaultAssetValues('com_reservation.comment.'.$this->id);
			$this->setRules($rules);
		}
        
		// Set ordering
		if ($this->published < 0)
		{
			// Set ordering to 0 if state is archived or trashed
			$this->ordering = 0;
		}

		return true;
	}

	/**
	 * Gets the default asset values for a component.
	 *
	 * @param   $string  $component  The component asset name to search for
	 *
	 * @return  JAccessRules  The JAccessRules object for the asset
	 */
	protected function getDefaultAssetValues($component, $try = true)
	{
		// Need to find the asset id by the name of the component.
		$db = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select($db->quoteName('id'))
			->from($db->quoteName('#__assets'))
			->where($db->quoteName('name') . ' = ' .
$db->quote($component));
		$db->setQuery($query);
		$db->execute();
		if ($db->loadRowList())
		{
			// asset already set so use saved rules
			$assetId = (int) $db->loadResult();
			return JAccess::getAssetRules($assetId); // (TODO) instead of keeping
inherited Allowed it becomes Allowed.
		}
		// try again
		elseif ($try)
		{
			$try = explode('.',$component);
			$result =  $this->getDefaultAssetValues($try[0], false);
			if ($result instanceof JAccessRules)
			{
				if (isset($try[1]))
				{
					$_result = (string) $result;
					$_result = json_decode($_result);
					foreach ($_result as $name => &$rule)
					{
						$v = explode('.', $name);
						if ($try[1] !== $v[0])
						{
							// remove since it is not part of this view
							unset($_result->$name);
						}
						else
						{
							// clear the value since we inherit
							$rule = array();
						}
					}
					// check if there are any view values remaining
					if (count( (array) $_result))
					{
						$_result = json_encode($_result);
						$_result = array($_result);
						// Instantiate and return the JAccessRules object for the asset
rules.
						$rules = new JAccessRules;
						$rules->mergeCollection($_result);

						return $rules;
					}
				}
				return $result;
			}
		}
		return JAccess::getAssetRules(0);
	}

	/**
	 * Method to compute the default name of the asset.
	 * The default name is in the form 'table_name.id'
	 * where id is the value of the primary key of the table.
	 *
	 * @return	string
	 * @since	2.5
	 */
	protected function _getAssetName()
	{
		$k = $this->_tbl_key;
		return 'com_reservation.comment.'.(int) $this->$k;
	}

	/**
	 * Method to return the title to use for the asset table.
	 *
	 * @return	string
	 * @since	2.5
	 */
	protected function _getAssetTitle()
	{
		if (isset($this->title))
		{
			return $this->title;
		}
		return '';
	}

	/**
	 * Get the parent asset id for the record
	 *
	 * @return	int
	 * @since	2.5
	 */
	protected function _getAssetParentId(JTable $table = NULL, $id = NULL) 
	{
		$asset = JTable::getInstance('Asset');
		$asset->loadByName('com_reservation');

		return $asset->id;
	}

	/**
	 * This view does not actually have an alias
	 *
	 * @return  bool
	 */
	public function generateAlias()
	{
		return false;
	}

}
PK5~�[	�8��!�!tables/consultant.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		consultant.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Registry\Registry;
use Joomla\String\StringHelper;
use Joomla\Utilities\ArrayHelper;

/**
 * Consultants Table class
 */
class ReservationTableConsultant extends JTable
{
	/**
	 * Ensure the params and metadata in json encoded in the bind method
	 *
	 * @var    array
	 * @since  3.3
	 */
	protected $_jsonEncode = array('params', 'metadata');
    
	/**
	 * Constructor
	 *
	 * @param object Database connector object
	 */
	function __construct(&$db) 
	{
		parent::__construct('#__reservation_consultant',
'id', $db);

		// Adding History Options
		JTableObserverContenthistory::createObserver($this,
array('typeAlias' => 'com_reservation.consultant'));
	}	
 
	public function bind($array, $ignore = '')
	{
    
		if (isset($array['params']) &&
is_array($array['params']))
		{
			$registry = new JRegistry;
			$registry->loadArray($array['params']);
			$array['params'] = (string) $registry;
		}

		if (isset($array['metadata']) &&
is_array($array['metadata']))
		{
			$registry = new JRegistry;
			$registry->loadArray($array['metadata']);
			$array['metadata'] = (string) $registry;
		}
        
		// Bind the rules. 
		if (isset($array['rules']) &&
is_array($array['rules']))
		{ 
			$rules = new JAccessRules($array['rules']); 
			$this->setRules($rules); 
		}
		return parent::bind($array, $ignore);
	}
    
	/**
	 * Overload the store method for the Consultant table.
	 *
	 * @param   boolean	Toggle whether null values should be updated.
	 * @return  boolean  True on success, false on failure.
	 * @since   1.6
	 */
	public function store($updateNulls = false)
	{
		$date	= JFactory::getDate();
		$user	= JFactory::getUser();

		if ($this->id)
		{
			// Existing item
			$this->modified		= $date->toSql();
			$this->modified_by	= $user->get('id');
		}
		else
		{
			// New consultant. A consultant created and created_by field can be set
by the user,
			// so we don't touch either of these if they are set.
			if (!(int) $this->created)
			{
				$this->created = $date->toSql();
			}
			if (empty($this->created_by))
			{
				$this->created_by = $user->get('id');
			}
		}
		
		if (isset($this->alias))
		{
			// Verify that the alias is unique
			$table = JTable::getInstance('consultant',
'ReservationTable');

			if ($table->load(array('alias' => $this->alias,
'catid' => $this->catid)) && ($table->id !=
$this->id || $this->id == 0))
			{
				$this->setError(JText::_('COM_RESERVATION_CONSULTANT_ERROR_UNIQUE_ALIAS'));
				return false;
			}
		}
		
		if (isset($this->url))
		{
			// Convert IDN urls to punycode
			$this->url = JStringPunycode::urlToPunycode($this->url);
		}
		if (isset($this->website))
		{
			// Convert IDN urls to punycode
			$this->website = JStringPunycode::urlToPunycode($this->website);
		}

		return parent::store($updateNulls);
	}
    
	/**
	 * Overloaded check method to ensure data integrity.
	 *
	 * @return  boolean  True on success.
	 */
	public function check()
	{
		if (isset($this->alias))
		{
			// Generate a valid alias
			$this->generateAlias();
            
			$table = JTable::getInstance('consultant',
'reservationTable');

			while ($table->load(array('alias' => $this->alias))
&& ($table->id != $this->id || $this->id == 0))
			{
				$this->alias = StringHelper::increment($this->alias,
'dash');
			}
		}
		
		/*
		 * Clean up keywords -- eliminate extra spaces between phrases
		 * and cr (\r) and lf (\n) characters from string.
		 * Only process if not empty.
 		 */
		if (!empty($this->metakey))
		{
			// Array of characters to remove.
			$bad_characters = array("\n", "\r",
"\"", "<", ">");

			// Remove bad characters.
			$after_clean = StringHelper::str_ireplace($bad_characters, "",
$this->metakey);

			// Create array using commas as delimiter.
			$keys = explode(',', $after_clean);
			$clean_keys = array();

			foreach ($keys as $key)
			{
				// Ignore blank keywords.
				if (trim($key))
				{
					$clean_keys[] = trim($key);
				}
			}

			// Put array back together delimited by ", "
			$this->metakey = implode(", ", $clean_keys);
		}

		// Clean up description -- eliminate quotes and <> brackets
		if (!empty($this->metadesc))
		{
			// Only process if not empty
			$bad_characters = array("\"", "<",
">");
			$this->metadesc = StringHelper::str_ireplace($bad_characters,
"", $this->metadesc);
		}

		// If we don't have any access rules set at this point just use an
empty JAccessRules class
		if (!$this->getRules())
		{
			$rules =
$this->getDefaultAssetValues('com_reservation.consultant.'.$this->id);
			$this->setRules($rules);
		}
        
		// Set ordering
		if ($this->published < 0)
		{
			// Set ordering to 0 if state is archived or trashed
			$this->ordering = 0;
		}

		return true;
	}

	/**
	 * Gets the default asset values for a component.
	 *
	 * @param   $string  $component  The component asset name to search for
	 *
	 * @return  JAccessRules  The JAccessRules object for the asset
	 */
	protected function getDefaultAssetValues($component, $try = true)
	{
		// Need to find the asset id by the name of the component.
		$db = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select($db->quoteName('id'))
			->from($db->quoteName('#__assets'))
			->where($db->quoteName('name') . ' = ' .
$db->quote($component));
		$db->setQuery($query);
		$db->execute();
		if ($db->loadRowList())
		{
			// asset already set so use saved rules
			$assetId = (int) $db->loadResult();
			return JAccess::getAssetRules($assetId); // (TODO) instead of keeping
inherited Allowed it becomes Allowed.
		}
		// try again
		elseif ($try)
		{
			$try = explode('.',$component);
			$result =  $this->getDefaultAssetValues($try[0], false);
			if ($result instanceof JAccessRules)
			{
				if (isset($try[1]))
				{
					$_result = (string) $result;
					$_result = json_decode($_result);
					foreach ($_result as $name => &$rule)
					{
						$v = explode('.', $name);
						if ($try[1] !== $v[0])
						{
							// remove since it is not part of this view
							unset($_result->$name);
						}
						else
						{
							// clear the value since we inherit
							$rule = array();
						}
					}
					// check if there are any view values remaining
					if (count( (array) $_result))
					{
						$_result = json_encode($_result);
						$_result = array($_result);
						// Instantiate and return the JAccessRules object for the asset
rules.
						$rules = new JAccessRules;
						$rules->mergeCollection($_result);

						return $rules;
					}
				}
				return $result;
			}
		}
		return JAccess::getAssetRules(0);
	}

	/**
	 * Method to compute the default name of the asset.
	 * The default name is in the form 'table_name.id'
	 * where id is the value of the primary key of the table.
	 *
	 * @return	string
	 * @since	2.5
	 */
	protected function _getAssetName()
	{
		$k = $this->_tbl_key;
		return 'com_reservation.consultant.'.(int) $this->$k;
	}

	/**
	 * Method to return the title to use for the asset table.
	 *
	 * @return	string
	 * @since	2.5
	 */
	protected function _getAssetTitle()
	{
		if (isset($this->title))
		{
			return $this->title;
		}
		return '';
	}

	/**
	 * Get the parent asset id for the record
	 *
	 * @return	int
	 * @since	2.5
	 */
	protected function _getAssetParentId(JTable $table = NULL, $id = NULL) 
	{
		$asset = JTable::getInstance('Asset');
		$asset->loadByName('com_reservation');

		return $asset->id;
	}

	/**
	 * This view does not actually have an alias
	 *
	 * @return  bool
	 */
	public function generateAlias()
	{
		return false;
	}

}
PK5~�[�Th{!{!tables/doctor.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		doctor.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Registry\Registry;
use Joomla\String\StringHelper;
use Joomla\Utilities\ArrayHelper;

/**
 * Doctors Table class
 */
class ReservationTableDoctor extends JTable
{
	/**
	 * Ensure the params and metadata in json encoded in the bind method
	 *
	 * @var    array
	 * @since  3.3
	 */
	protected $_jsonEncode = array('params', 'metadata');
    
	/**
	 * Constructor
	 *
	 * @param object Database connector object
	 */
	function __construct(&$db) 
	{
		parent::__construct('#__reservation_doctor', 'id',
$db);

		// Adding History Options
		JTableObserverContenthistory::createObserver($this,
array('typeAlias' => 'com_reservation.doctor'));
	}	
 
	public function bind($array, $ignore = '')
	{
    
		if (isset($array['params']) &&
is_array($array['params']))
		{
			$registry = new JRegistry;
			$registry->loadArray($array['params']);
			$array['params'] = (string) $registry;
		}

		if (isset($array['metadata']) &&
is_array($array['metadata']))
		{
			$registry = new JRegistry;
			$registry->loadArray($array['metadata']);
			$array['metadata'] = (string) $registry;
		}
        
		// Bind the rules. 
		if (isset($array['rules']) &&
is_array($array['rules']))
		{ 
			$rules = new JAccessRules($array['rules']); 
			$this->setRules($rules); 
		}
		return parent::bind($array, $ignore);
	}
    
	/**
	 * Overload the store method for the Doctor table.
	 *
	 * @param   boolean	Toggle whether null values should be updated.
	 * @return  boolean  True on success, false on failure.
	 * @since   1.6
	 */
	public function store($updateNulls = false)
	{
		$date	= JFactory::getDate();
		$user	= JFactory::getUser();

		if ($this->id)
		{
			// Existing item
			$this->modified		= $date->toSql();
			$this->modified_by	= $user->get('id');
		}
		else
		{
			// New doctor. A doctor created and created_by field can be set by the
user,
			// so we don't touch either of these if they are set.
			if (!(int) $this->created)
			{
				$this->created = $date->toSql();
			}
			if (empty($this->created_by))
			{
				$this->created_by = $user->get('id');
			}
		}
		
		if (isset($this->alias))
		{
			// Verify that the alias is unique
			$table = JTable::getInstance('doctor',
'ReservationTable');

			if ($table->load(array('alias' => $this->alias,
'catid' => $this->catid)) && ($table->id !=
$this->id || $this->id == 0))
			{
				$this->setError(JText::_('COM_RESERVATION_DOCTOR_ERROR_UNIQUE_ALIAS'));
				return false;
			}
		}
		
		if (isset($this->url))
		{
			// Convert IDN urls to punycode
			$this->url = JStringPunycode::urlToPunycode($this->url);
		}
		if (isset($this->website))
		{
			// Convert IDN urls to punycode
			$this->website = JStringPunycode::urlToPunycode($this->website);
		}

		return parent::store($updateNulls);
	}
    
	/**
	 * Overloaded check method to ensure data integrity.
	 *
	 * @return  boolean  True on success.
	 */
	public function check()
	{
		if (isset($this->alias))
		{
			// Generate a valid alias
			$this->generateAlias();
            
			$table = JTable::getInstance('doctor',
'reservationTable');

			while ($table->load(array('alias' => $this->alias))
&& ($table->id != $this->id || $this->id == 0))
			{
				$this->alias = StringHelper::increment($this->alias,
'dash');
			}
		}
		
		/*
		 * Clean up keywords -- eliminate extra spaces between phrases
		 * and cr (\r) and lf (\n) characters from string.
		 * Only process if not empty.
 		 */
		if (!empty($this->metakey))
		{
			// Array of characters to remove.
			$bad_characters = array("\n", "\r",
"\"", "<", ">");

			// Remove bad characters.
			$after_clean = StringHelper::str_ireplace($bad_characters, "",
$this->metakey);

			// Create array using commas as delimiter.
			$keys = explode(',', $after_clean);
			$clean_keys = array();

			foreach ($keys as $key)
			{
				// Ignore blank keywords.
				if (trim($key))
				{
					$clean_keys[] = trim($key);
				}
			}

			// Put array back together delimited by ", "
			$this->metakey = implode(", ", $clean_keys);
		}

		// Clean up description -- eliminate quotes and <> brackets
		if (!empty($this->metadesc))
		{
			// Only process if not empty
			$bad_characters = array("\"", "<",
">");
			$this->metadesc = StringHelper::str_ireplace($bad_characters,
"", $this->metadesc);
		}

		// If we don't have any access rules set at this point just use an
empty JAccessRules class
		if (!$this->getRules())
		{
			$rules =
$this->getDefaultAssetValues('com_reservation.doctor.'.$this->id);
			$this->setRules($rules);
		}
        
		// Set ordering
		if ($this->published < 0)
		{
			// Set ordering to 0 if state is archived or trashed
			$this->ordering = 0;
		}

		return true;
	}

	/**
	 * Gets the default asset values for a component.
	 *
	 * @param   $string  $component  The component asset name to search for
	 *
	 * @return  JAccessRules  The JAccessRules object for the asset
	 */
	protected function getDefaultAssetValues($component, $try = true)
	{
		// Need to find the asset id by the name of the component.
		$db = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select($db->quoteName('id'))
			->from($db->quoteName('#__assets'))
			->where($db->quoteName('name') . ' = ' .
$db->quote($component));
		$db->setQuery($query);
		$db->execute();
		if ($db->loadRowList())
		{
			// asset already set so use saved rules
			$assetId = (int) $db->loadResult();
			return JAccess::getAssetRules($assetId); // (TODO) instead of keeping
inherited Allowed it becomes Allowed.
		}
		// try again
		elseif ($try)
		{
			$try = explode('.',$component);
			$result =  $this->getDefaultAssetValues($try[0], false);
			if ($result instanceof JAccessRules)
			{
				if (isset($try[1]))
				{
					$_result = (string) $result;
					$_result = json_decode($_result);
					foreach ($_result as $name => &$rule)
					{
						$v = explode('.', $name);
						if ($try[1] !== $v[0])
						{
							// remove since it is not part of this view
							unset($_result->$name);
						}
						else
						{
							// clear the value since we inherit
							$rule = array();
						}
					}
					// check if there are any view values remaining
					if (count( (array) $_result))
					{
						$_result = json_encode($_result);
						$_result = array($_result);
						// Instantiate and return the JAccessRules object for the asset
rules.
						$rules = new JAccessRules;
						$rules->mergeCollection($_result);

						return $rules;
					}
				}
				return $result;
			}
		}
		return JAccess::getAssetRules(0);
	}

	/**
	 * Method to compute the default name of the asset.
	 * The default name is in the form 'table_name.id'
	 * where id is the value of the primary key of the table.
	 *
	 * @return	string
	 * @since	2.5
	 */
	protected function _getAssetName()
	{
		$k = $this->_tbl_key;
		return 'com_reservation.doctor.'.(int) $this->$k;
	}

	/**
	 * Method to return the title to use for the asset table.
	 *
	 * @return	string
	 * @since	2.5
	 */
	protected function _getAssetTitle()
	{
		if (isset($this->title))
		{
			return $this->title;
		}
		return '';
	}

	/**
	 * Get the parent asset id for the record
	 *
	 * @return	int
	 * @since	2.5
	 */
	protected function _getAssetParentId(JTable $table = NULL, $id = NULL) 
	{
		$asset = JTable::getInstance('Asset');
		$asset->loadByName('com_reservation');

		return $asset->id;
	}

	/**
	 * This view does not actually have an alias
	 *
	 * @return  bool
	 */
	public function generateAlias()
	{
		return false;
	}

}
PK5~�[�#o,,tables/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[wҤ�o!o!tables/message.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		message.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Registry\Registry;
use Joomla\String\StringHelper;
use Joomla\Utilities\ArrayHelper;

/**
 * Messages Table class
 */
class ReservationTableMessage extends JTable
{
	/**
	 * Ensure the params and metadata in json encoded in the bind method
	 *
	 * @var    array
	 * @since  3.3
	 */
	protected $_jsonEncode = array('params', 'metadata');
    
	/**
	 * Constructor
	 *
	 * @param object Database connector object
	 */
	function __construct(&$db) 
	{
		parent::__construct('#__reservation_message', 'id',
$db);

		// Adding History Options
		JTableObserverContenthistory::createObserver($this,
array('typeAlias' => 'com_reservation.message'));
	}	
 
	public function bind($array, $ignore = '')
	{
    
		if (isset($array['params']) &&
is_array($array['params']))
		{
			$registry = new JRegistry;
			$registry->loadArray($array['params']);
			$array['params'] = (string) $registry;
		}

		if (isset($array['metadata']) &&
is_array($array['metadata']))
		{
			$registry = new JRegistry;
			$registry->loadArray($array['metadata']);
			$array['metadata'] = (string) $registry;
		}
        
		// Bind the rules. 
		if (isset($array['rules']) &&
is_array($array['rules']))
		{ 
			$rules = new JAccessRules($array['rules']); 
			$this->setRules($rules); 
		}
		return parent::bind($array, $ignore);
	}
    
	/**
	 * Overload the store method for the Message table.
	 *
	 * @param   boolean	Toggle whether null values should be updated.
	 * @return  boolean  True on success, false on failure.
	 * @since   1.6
	 */
	public function store($updateNulls = false)
	{
		$date	= JFactory::getDate();
		$user	= JFactory::getUser();

		if ($this->id)
		{
			// Existing item
			$this->modified		= $date->toSql();
			$this->modified_by	= $user->get('id');
		}
		else
		{
			// New message. A message created and created_by field can be set by the
user,
			// so we don't touch either of these if they are set.
			if (!(int) $this->created)
			{
				$this->created = $date->toSql();
			}
			if (empty($this->created_by))
			{
				$this->created_by = $user->get('id');
			}
		}
		
		if (isset($this->alias))
		{
			// Verify that the alias is unique
			$table = JTable::getInstance('message',
'ReservationTable');

			if ($table->load(array('alias' => $this->alias))
&& ($table->id != $this->id || $this->id == 0))
			{
				$this->setError(JText::_('COM_RESERVATION_MESSAGE_ERROR_UNIQUE_ALIAS'));
				return false;
			}
		}
		
		if (isset($this->url))
		{
			// Convert IDN urls to punycode
			$this->url = JStringPunycode::urlToPunycode($this->url);
		}
		if (isset($this->website))
		{
			// Convert IDN urls to punycode
			$this->website = JStringPunycode::urlToPunycode($this->website);
		}

		return parent::store($updateNulls);
	}
    
	/**
	 * Overloaded check method to ensure data integrity.
	 *
	 * @return  boolean  True on success.
	 */
	public function check()
	{
		if (isset($this->alias))
		{
			// Generate a valid alias
			$this->generateAlias();
            
			$table = JTable::getInstance('message',
'reservationTable');

			while ($table->load(array('alias' => $this->alias))
&& ($table->id != $this->id || $this->id == 0))
			{
				$this->alias = StringHelper::increment($this->alias,
'dash');
			}
		}
		
		/*
		 * Clean up keywords -- eliminate extra spaces between phrases
		 * and cr (\r) and lf (\n) characters from string.
		 * Only process if not empty.
 		 */
		if (!empty($this->metakey))
		{
			// Array of characters to remove.
			$bad_characters = array("\n", "\r",
"\"", "<", ">");

			// Remove bad characters.
			$after_clean = StringHelper::str_ireplace($bad_characters, "",
$this->metakey);

			// Create array using commas as delimiter.
			$keys = explode(',', $after_clean);
			$clean_keys = array();

			foreach ($keys as $key)
			{
				// Ignore blank keywords.
				if (trim($key))
				{
					$clean_keys[] = trim($key);
				}
			}

			// Put array back together delimited by ", "
			$this->metakey = implode(", ", $clean_keys);
		}

		// Clean up description -- eliminate quotes and <> brackets
		if (!empty($this->metadesc))
		{
			// Only process if not empty
			$bad_characters = array("\"", "<",
">");
			$this->metadesc = StringHelper::str_ireplace($bad_characters,
"", $this->metadesc);
		}

		// If we don't have any access rules set at this point just use an
empty JAccessRules class
		if (!$this->getRules())
		{
			$rules =
$this->getDefaultAssetValues('com_reservation.message.'.$this->id);
			$this->setRules($rules);
		}
        
		// Set ordering
		if ($this->published < 0)
		{
			// Set ordering to 0 if state is archived or trashed
			$this->ordering = 0;
		}

		return true;
	}

	/**
	 * Gets the default asset values for a component.
	 *
	 * @param   $string  $component  The component asset name to search for
	 *
	 * @return  JAccessRules  The JAccessRules object for the asset
	 */
	protected function getDefaultAssetValues($component, $try = true)
	{
		// Need to find the asset id by the name of the component.
		$db = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select($db->quoteName('id'))
			->from($db->quoteName('#__assets'))
			->where($db->quoteName('name') . ' = ' .
$db->quote($component));
		$db->setQuery($query);
		$db->execute();
		if ($db->loadRowList())
		{
			// asset already set so use saved rules
			$assetId = (int) $db->loadResult();
			return JAccess::getAssetRules($assetId); // (TODO) instead of keeping
inherited Allowed it becomes Allowed.
		}
		// try again
		elseif ($try)
		{
			$try = explode('.',$component);
			$result =  $this->getDefaultAssetValues($try[0], false);
			if ($result instanceof JAccessRules)
			{
				if (isset($try[1]))
				{
					$_result = (string) $result;
					$_result = json_decode($_result);
					foreach ($_result as $name => &$rule)
					{
						$v = explode('.', $name);
						if ($try[1] !== $v[0])
						{
							// remove since it is not part of this view
							unset($_result->$name);
						}
						else
						{
							// clear the value since we inherit
							$rule = array();
						}
					}
					// check if there are any view values remaining
					if (count( (array) $_result))
					{
						$_result = json_encode($_result);
						$_result = array($_result);
						// Instantiate and return the JAccessRules object for the asset
rules.
						$rules = new JAccessRules;
						$rules->mergeCollection($_result);

						return $rules;
					}
				}
				return $result;
			}
		}
		return JAccess::getAssetRules(0);
	}

	/**
	 * Method to compute the default name of the asset.
	 * The default name is in the form 'table_name.id'
	 * where id is the value of the primary key of the table.
	 *
	 * @return	string
	 * @since	2.5
	 */
	protected function _getAssetName()
	{
		$k = $this->_tbl_key;
		return 'com_reservation.message.'.(int) $this->$k;
	}

	/**
	 * Method to return the title to use for the asset table.
	 *
	 * @return	string
	 * @since	2.5
	 */
	protected function _getAssetTitle()
	{
		if (isset($this->title))
		{
			return $this->title;
		}
		return '';
	}

	/**
	 * Get the parent asset id for the record
	 *
	 * @return	int
	 * @since	2.5
	 */
	protected function _getAssetParentId(JTable $table = NULL, $id = NULL) 
	{
		$asset = JTable::getInstance('Asset');
		$asset->loadByName('com_reservation');

		return $asset->id;
	}

	/**
	 * This view does not actually have an alias
	 *
	 * @return  bool
	 */
	public function generateAlias()
	{
		return false;
	}

}
PK5~�[ّ"�"tables/order.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.31
	@build			8th May, 2021
	@created		17th December, 2020
	@package		Reservation
	@subpackage		order.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Registry\Registry;
use Joomla\String\StringHelper;
use Joomla\Utilities\ArrayHelper;

/**
 * Orders Table class
 */
class ReservationTableOrder extends JTable
{
	/**
	 * Ensure the params and metadata in json encoded in the bind method
	 *
	 * @var    array
	 * @since  3.3
	 */
	protected $_jsonEncode = array('params', 'metadata');
    
	/**
	 * Constructor
	 *
	 * @param object Database connector object
	 */
	function __construct(&$db) 
	{
		parent::__construct('#__reservation_order', 'id',
$db);

		// Adding History Options
		JTableObserverContenthistory::createObserver($this,
array('typeAlias' => 'com_reservation.order'));
	}	
 
	public function bind($array, $ignore = '')
	{
    
		if (isset($array['params']) &&
is_array($array['params']))
		{
			$registry = new JRegistry;
			$registry->loadArray($array['params']);
			$array['params'] = (string) $registry;
		}

		if (isset($array['metadata']) &&
is_array($array['metadata']))
		{
			$registry = new JRegistry;
			$registry->loadArray($array['metadata']);
			$array['metadata'] = (string) $registry;
		}
        
		// Bind the rules. 
		if (isset($array['rules']) &&
is_array($array['rules']))
		{ 
			$rules = new JAccessRules($array['rules']); 
			$this->setRules($rules); 
		}
		return parent::bind($array, $ignore);
	}
    
	/**
	 * Overload the store method for the Order table.
	 *
	 * @param   boolean	Toggle whether null values should be updated.
	 * @return  boolean  True on success, false on failure.
	 * @since   1.6
	 */
	public function store($updateNulls = false)
	{
		$date	= JFactory::getDate();
		$user	= JFactory::getUser();

		if ($this->id)
		{
			// Existing item
			$this->modified		= $date->toSql();
			$this->modified_by	= $user->get('id');
		}
		else
		{
			// New order. A order created and created_by field can be set by the
user,
			// so we don't touch either of these if they are set.
			if (!(int) $this->created)
			{
				$this->created = $date->toSql();
			}
			if (empty($this->created_by))
			{
				$this->created_by = $user->get('id');
			}
		}
		
		if (isset($this->alias))
		{
			// Verify that the alias is unique
			$table = JTable::getInstance('order',
'ReservationTable');

			if ($table->load(array('alias' => $this->alias))
&& ($table->id != $this->id || $this->id == 0))
			{
				$this->setError(JText::_('COM_RESERVATION_ORDER_ERROR_UNIQUE_ALIAS'));
				return false;
			}
		}
		
		if (isset($this->url))
		{
			// Convert IDN urls to punycode
			$this->url = JStringPunycode::urlToPunycode($this->url);
		}
		if (isset($this->website))
		{
			// Convert IDN urls to punycode
			$this->website = JStringPunycode::urlToPunycode($this->website);
		}

		return parent::store($updateNulls);
	}
    
	/**
	 * Overloaded check method to ensure data integrity.
	 *
	 * @return  boolean  True on success.
	 */
	public function check()
	{
		if (isset($this->alias))
		{
			// Generate a valid alias
			$this->generateAlias();
            
			$table = JTable::getInstance('order',
'reservationTable');

			while ($table->load(array('alias' => $this->alias))
&& ($table->id != $this->id || $this->id == 0))
			{
				$this->alias = StringHelper::increment($this->alias,
'dash');
			}
		}
		
		/*
		 * Clean up keywords -- eliminate extra spaces between phrases
		 * and cr (\r) and lf (\n) characters from string.
		 * Only process if not empty.
 		 */
		if (!empty($this->metakey))
		{
			// Array of characters to remove.
			$bad_characters = array("\n", "\r",
"\"", "<", ">");

			// Remove bad characters.
			$after_clean = StringHelper::str_ireplace($bad_characters, "",
$this->metakey);

			// Create array using commas as delimiter.
			$keys = explode(',', $after_clean);
			$clean_keys = array();

			foreach ($keys as $key)
			{
				// Ignore blank keywords.
				if (trim($key))
				{
					$clean_keys[] = trim($key);
				}
			}

			// Put array back together delimited by ", "
			$this->metakey = implode(", ", $clean_keys);
		}

		// Clean up description -- eliminate quotes and <> brackets
		if (!empty($this->metadesc))
		{
			// Only process if not empty
			$bad_characters = array("\"", "<",
">");
			$this->metadesc = StringHelper::str_ireplace($bad_characters,
"", $this->metadesc);
		}

		// If we don't have any access rules set at this point just use an
empty JAccessRules class
		if (!$this->getRules())
		{
			$rules =
$this->getDefaultAssetValues('com_reservation.order.'.$this->id);
			$this->setRules($rules);
		}
        
		// Set ordering
		if ($this->published < 0)
		{
			// Set ordering to 0 if state is archived or trashed
			$this->ordering = 0;
		}

		return true;
	}

	/**
	 * Gets the default asset values for a component.
	 *
	 * @param   $string  $component  The component asset name to search for
	 *
	 * @return  JAccessRules  The JAccessRules object for the asset
	 */
	protected function getDefaultAssetValues($component, $try = true)
	{
		// Need to find the asset id by the name of the component.
		$db = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select($db->quoteName('id'))
			->from($db->quoteName('#__assets'))
			->where($db->quoteName('name') . ' = ' .
$db->quote($component));
		$db->setQuery($query);
		$db->execute();
		if ($db->loadRowList())
		{
			// asset already set so use saved rules
			$assetId = (int) $db->loadResult();
			return JAccess::getAssetRules($assetId); // (TODO) instead of keeping
inherited Allowed it becomes Allowed.
		}
		// try again
		elseif ($try)
		{
			$try = explode('.',$component);
			$result =  $this->getDefaultAssetValues($try[0], false);
			if ($result instanceof JAccessRules)
			{
				if (isset($try[1]))
				{
					$_result = (string) $result;
					$_result = json_decode($_result);
					foreach ($_result as $name => &$rule)
					{
						$v = explode('.', $name);
						if ($try[1] !== $v[0])
						{
							// remove since it is not part of this view
							unset($_result->$name);
						}
						else
						{
							// clear the value since we inherit
							$rule = array();
						}
					}
					// check if there are any view values remaining
					if (count( (array) $_result))
					{
						$_result = json_encode($_result);
						$_result = array($_result);
						// Instantiate and return the JAccessRules object for the asset
rules.
						$rules = new JAccessRules;
						$rules->mergeCollection($_result);

						return $rules;
					}
				}
				return $result;
			}
		}
		return JAccess::getAssetRules(0);
	}

	/**
	 * Method to compute the default name of the asset.
	 * The default name is in the form 'table_name.id'
	 * where id is the value of the primary key of the table.
	 *
	 * @return	string
	 * @since	2.5
	 */
	protected function _getAssetName()
	{
		$k = $this->_tbl_key;
		return 'com_reservation.order.'.(int) $this->$k;
	}

	/**
	 * Method to return the title to use for the asset table.
	 *
	 * @return	string
	 * @since	2.5
	 */
	protected function _getAssetTitle()
	{
		if (isset($this->title))
		{
			return $this->title;
		}
		return '';
	}

	/**
	 * Get the parent asset id for the record
	 *
	 * @return	int
	 * @since	2.5
	 */
	protected function _getAssetParentId(JTable $table = NULL, $id = NULL) 
	{
		$asset = JTable::getInstance('Asset');
		$asset->loadByName('com_reservation');

		return $asset->id;
	}

	/**
	 * This view does not actually have an alias
	 *
	 * @return  bool
	 */
	public function generateAlias()
	{
		return false;
	}

}
PK5~�[���H!H!tables/plan.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		plan.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Registry\Registry;
use Joomla\String\StringHelper;
use Joomla\Utilities\ArrayHelper;

/**
 * Plans Table class
 */
class ReservationTablePlan extends JTable
{
	/**
	 * Ensure the params and metadata in json encoded in the bind method
	 *
	 * @var    array
	 * @since  3.3
	 */
	protected $_jsonEncode = array('params', 'metadata');
    
	/**
	 * Constructor
	 *
	 * @param object Database connector object
	 */
	function __construct(&$db) 
	{
		parent::__construct('#__reservation_plan', 'id',
$db);

		// Adding History Options
		JTableObserverContenthistory::createObserver($this,
array('typeAlias' => 'com_reservation.plan'));
	}	
 
	public function bind($array, $ignore = '')
	{
    
		if (isset($array['params']) &&
is_array($array['params']))
		{
			$registry = new JRegistry;
			$registry->loadArray($array['params']);
			$array['params'] = (string) $registry;
		}

		if (isset($array['metadata']) &&
is_array($array['metadata']))
		{
			$registry = new JRegistry;
			$registry->loadArray($array['metadata']);
			$array['metadata'] = (string) $registry;
		}
        
		// Bind the rules. 
		if (isset($array['rules']) &&
is_array($array['rules']))
		{ 
			$rules = new JAccessRules($array['rules']); 
			$this->setRules($rules); 
		}
		return parent::bind($array, $ignore);
	}
    
	/**
	 * Overload the store method for the Plan table.
	 *
	 * @param   boolean	Toggle whether null values should be updated.
	 * @return  boolean  True on success, false on failure.
	 * @since   1.6
	 */
	public function store($updateNulls = false)
	{
		$date	= JFactory::getDate();
		$user	= JFactory::getUser();

		if ($this->id)
		{
			// Existing item
			$this->modified		= $date->toSql();
			$this->modified_by	= $user->get('id');
		}
		else
		{
			// New plan. A plan created and created_by field can be set by the user,
			// so we don't touch either of these if they are set.
			if (!(int) $this->created)
			{
				$this->created = $date->toSql();
			}
			if (empty($this->created_by))
			{
				$this->created_by = $user->get('id');
			}
		}
		
		if (isset($this->alias))
		{
			// Verify that the alias is unique
			$table = JTable::getInstance('plan',
'ReservationTable');

			if ($table->load(array('alias' => $this->alias))
&& ($table->id != $this->id || $this->id == 0))
			{
				$this->setError(JText::_('COM_RESERVATION_PLAN_ERROR_UNIQUE_ALIAS'));
				return false;
			}
		}
		
		if (isset($this->url))
		{
			// Convert IDN urls to punycode
			$this->url = JStringPunycode::urlToPunycode($this->url);
		}
		if (isset($this->website))
		{
			// Convert IDN urls to punycode
			$this->website = JStringPunycode::urlToPunycode($this->website);
		}

		return parent::store($updateNulls);
	}
    
	/**
	 * Overloaded check method to ensure data integrity.
	 *
	 * @return  boolean  True on success.
	 */
	public function check()
	{
		if (isset($this->alias))
		{
			// Generate a valid alias
			$this->generateAlias();
            
			$table = JTable::getInstance('plan',
'reservationTable');

			while ($table->load(array('alias' => $this->alias))
&& ($table->id != $this->id || $this->id == 0))
			{
				$this->alias = StringHelper::increment($this->alias,
'dash');
			}
		}
		
		/*
		 * Clean up keywords -- eliminate extra spaces between phrases
		 * and cr (\r) and lf (\n) characters from string.
		 * Only process if not empty.
 		 */
		if (!empty($this->metakey))
		{
			// Array of characters to remove.
			$bad_characters = array("\n", "\r",
"\"", "<", ">");

			// Remove bad characters.
			$after_clean = StringHelper::str_ireplace($bad_characters, "",
$this->metakey);

			// Create array using commas as delimiter.
			$keys = explode(',', $after_clean);
			$clean_keys = array();

			foreach ($keys as $key)
			{
				// Ignore blank keywords.
				if (trim($key))
				{
					$clean_keys[] = trim($key);
				}
			}

			// Put array back together delimited by ", "
			$this->metakey = implode(", ", $clean_keys);
		}

		// Clean up description -- eliminate quotes and <> brackets
		if (!empty($this->metadesc))
		{
			// Only process if not empty
			$bad_characters = array("\"", "<",
">");
			$this->metadesc = StringHelper::str_ireplace($bad_characters,
"", $this->metadesc);
		}

		// If we don't have any access rules set at this point just use an
empty JAccessRules class
		if (!$this->getRules())
		{
			$rules =
$this->getDefaultAssetValues('com_reservation.plan.'.$this->id);
			$this->setRules($rules);
		}
        
		// Set ordering
		if ($this->published < 0)
		{
			// Set ordering to 0 if state is archived or trashed
			$this->ordering = 0;
		}

		return true;
	}

	/**
	 * Gets the default asset values for a component.
	 *
	 * @param   $string  $component  The component asset name to search for
	 *
	 * @return  JAccessRules  The JAccessRules object for the asset
	 */
	protected function getDefaultAssetValues($component, $try = true)
	{
		// Need to find the asset id by the name of the component.
		$db = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select($db->quoteName('id'))
			->from($db->quoteName('#__assets'))
			->where($db->quoteName('name') . ' = ' .
$db->quote($component));
		$db->setQuery($query);
		$db->execute();
		if ($db->loadRowList())
		{
			// asset already set so use saved rules
			$assetId = (int) $db->loadResult();
			return JAccess::getAssetRules($assetId); // (TODO) instead of keeping
inherited Allowed it becomes Allowed.
		}
		// try again
		elseif ($try)
		{
			$try = explode('.',$component);
			$result =  $this->getDefaultAssetValues($try[0], false);
			if ($result instanceof JAccessRules)
			{
				if (isset($try[1]))
				{
					$_result = (string) $result;
					$_result = json_decode($_result);
					foreach ($_result as $name => &$rule)
					{
						$v = explode('.', $name);
						if ($try[1] !== $v[0])
						{
							// remove since it is not part of this view
							unset($_result->$name);
						}
						else
						{
							// clear the value since we inherit
							$rule = array();
						}
					}
					// check if there are any view values remaining
					if (count( (array) $_result))
					{
						$_result = json_encode($_result);
						$_result = array($_result);
						// Instantiate and return the JAccessRules object for the asset
rules.
						$rules = new JAccessRules;
						$rules->mergeCollection($_result);

						return $rules;
					}
				}
				return $result;
			}
		}
		return JAccess::getAssetRules(0);
	}

	/**
	 * Method to compute the default name of the asset.
	 * The default name is in the form 'table_name.id'
	 * where id is the value of the primary key of the table.
	 *
	 * @return	string
	 * @since	2.5
	 */
	protected function _getAssetName()
	{
		$k = $this->_tbl_key;
		return 'com_reservation.plan.'.(int) $this->$k;
	}

	/**
	 * Method to return the title to use for the asset table.
	 *
	 * @return	string
	 * @since	2.5
	 */
	protected function _getAssetTitle()
	{
		if (isset($this->title))
		{
			return $this->title;
		}
		return '';
	}

	/**
	 * Get the parent asset id for the record
	 *
	 * @return	int
	 * @since	2.5
	 */
	protected function _getAssetParentId(JTable $table = NULL, $id = NULL) 
	{
		$asset = JTable::getInstance('Asset');
		$asset->loadByName('com_reservation');

		return $asset->id;
	}

	/**
	 * This view does not actually have an alias
	 *
	 * @return  bool
	 */
	public function generateAlias()
	{
		return false;
	}

}
PK5~�[�g
o!o!tables/reserve.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		reserve.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Registry\Registry;
use Joomla\String\StringHelper;
use Joomla\Utilities\ArrayHelper;

/**
 * Reserves Table class
 */
class ReservationTableReserve extends JTable
{
	/**
	 * Ensure the params and metadata in json encoded in the bind method
	 *
	 * @var    array
	 * @since  3.3
	 */
	protected $_jsonEncode = array('params', 'metadata');
    
	/**
	 * Constructor
	 *
	 * @param object Database connector object
	 */
	function __construct(&$db) 
	{
		parent::__construct('#__reservation_reserve', 'id',
$db);

		// Adding History Options
		JTableObserverContenthistory::createObserver($this,
array('typeAlias' => 'com_reservation.reserve'));
	}	
 
	public function bind($array, $ignore = '')
	{
    
		if (isset($array['params']) &&
is_array($array['params']))
		{
			$registry = new JRegistry;
			$registry->loadArray($array['params']);
			$array['params'] = (string) $registry;
		}

		if (isset($array['metadata']) &&
is_array($array['metadata']))
		{
			$registry = new JRegistry;
			$registry->loadArray($array['metadata']);
			$array['metadata'] = (string) $registry;
		}
        
		// Bind the rules. 
		if (isset($array['rules']) &&
is_array($array['rules']))
		{ 
			$rules = new JAccessRules($array['rules']); 
			$this->setRules($rules); 
		}
		return parent::bind($array, $ignore);
	}
    
	/**
	 * Overload the store method for the Reserve table.
	 *
	 * @param   boolean	Toggle whether null values should be updated.
	 * @return  boolean  True on success, false on failure.
	 * @since   1.6
	 */
	public function store($updateNulls = false)
	{
		$date	= JFactory::getDate();
		$user	= JFactory::getUser();

		if ($this->id)
		{
			// Existing item
			$this->modified		= $date->toSql();
			$this->modified_by	= $user->get('id');
		}
		else
		{
			// New reserve. A reserve created and created_by field can be set by the
user,
			// so we don't touch either of these if they are set.
			if (!(int) $this->created)
			{
				$this->created = $date->toSql();
			}
			if (empty($this->created_by))
			{
				$this->created_by = $user->get('id');
			}
		}
		
		if (isset($this->alias))
		{
			// Verify that the alias is unique
			$table = JTable::getInstance('reserve',
'ReservationTable');

			if ($table->load(array('alias' => $this->alias))
&& ($table->id != $this->id || $this->id == 0))
			{
				$this->setError(JText::_('COM_RESERVATION_RESERVE_ERROR_UNIQUE_ALIAS'));
				return false;
			}
		}
		
		if (isset($this->url))
		{
			// Convert IDN urls to punycode
			$this->url = JStringPunycode::urlToPunycode($this->url);
		}
		if (isset($this->website))
		{
			// Convert IDN urls to punycode
			$this->website = JStringPunycode::urlToPunycode($this->website);
		}

		return parent::store($updateNulls);
	}
    
	/**
	 * Overloaded check method to ensure data integrity.
	 *
	 * @return  boolean  True on success.
	 */
	public function check()
	{
		if (isset($this->alias))
		{
			// Generate a valid alias
			$this->generateAlias();
            
			$table = JTable::getInstance('reserve',
'reservationTable');

			while ($table->load(array('alias' => $this->alias))
&& ($table->id != $this->id || $this->id == 0))
			{
				$this->alias = StringHelper::increment($this->alias,
'dash');
			}
		}
		
		/*
		 * Clean up keywords -- eliminate extra spaces between phrases
		 * and cr (\r) and lf (\n) characters from string.
		 * Only process if not empty.
 		 */
		if (!empty($this->metakey))
		{
			// Array of characters to remove.
			$bad_characters = array("\n", "\r",
"\"", "<", ">");

			// Remove bad characters.
			$after_clean = StringHelper::str_ireplace($bad_characters, "",
$this->metakey);

			// Create array using commas as delimiter.
			$keys = explode(',', $after_clean);
			$clean_keys = array();

			foreach ($keys as $key)
			{
				// Ignore blank keywords.
				if (trim($key))
				{
					$clean_keys[] = trim($key);
				}
			}

			// Put array back together delimited by ", "
			$this->metakey = implode(", ", $clean_keys);
		}

		// Clean up description -- eliminate quotes and <> brackets
		if (!empty($this->metadesc))
		{
			// Only process if not empty
			$bad_characters = array("\"", "<",
">");
			$this->metadesc = StringHelper::str_ireplace($bad_characters,
"", $this->metadesc);
		}

		// If we don't have any access rules set at this point just use an
empty JAccessRules class
		if (!$this->getRules())
		{
			$rules =
$this->getDefaultAssetValues('com_reservation.reserve.'.$this->id);
			$this->setRules($rules);
		}
        
		// Set ordering
		if ($this->published < 0)
		{
			// Set ordering to 0 if state is archived or trashed
			$this->ordering = 0;
		}

		return true;
	}

	/**
	 * Gets the default asset values for a component.
	 *
	 * @param   $string  $component  The component asset name to search for
	 *
	 * @return  JAccessRules  The JAccessRules object for the asset
	 */
	protected function getDefaultAssetValues($component, $try = true)
	{
		// Need to find the asset id by the name of the component.
		$db = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select($db->quoteName('id'))
			->from($db->quoteName('#__assets'))
			->where($db->quoteName('name') . ' = ' .
$db->quote($component));
		$db->setQuery($query);
		$db->execute();
		if ($db->loadRowList())
		{
			// asset already set so use saved rules
			$assetId = (int) $db->loadResult();
			return JAccess::getAssetRules($assetId); // (TODO) instead of keeping
inherited Allowed it becomes Allowed.
		}
		// try again
		elseif ($try)
		{
			$try = explode('.',$component);
			$result =  $this->getDefaultAssetValues($try[0], false);
			if ($result instanceof JAccessRules)
			{
				if (isset($try[1]))
				{
					$_result = (string) $result;
					$_result = json_decode($_result);
					foreach ($_result as $name => &$rule)
					{
						$v = explode('.', $name);
						if ($try[1] !== $v[0])
						{
							// remove since it is not part of this view
							unset($_result->$name);
						}
						else
						{
							// clear the value since we inherit
							$rule = array();
						}
					}
					// check if there are any view values remaining
					if (count( (array) $_result))
					{
						$_result = json_encode($_result);
						$_result = array($_result);
						// Instantiate and return the JAccessRules object for the asset
rules.
						$rules = new JAccessRules;
						$rules->mergeCollection($_result);

						return $rules;
					}
				}
				return $result;
			}
		}
		return JAccess::getAssetRules(0);
	}

	/**
	 * Method to compute the default name of the asset.
	 * The default name is in the form 'table_name.id'
	 * where id is the value of the primary key of the table.
	 *
	 * @return	string
	 * @since	2.5
	 */
	protected function _getAssetName()
	{
		$k = $this->_tbl_key;
		return 'com_reservation.reserve.'.(int) $this->$k;
	}

	/**
	 * Method to return the title to use for the asset table.
	 *
	 * @return	string
	 * @since	2.5
	 */
	protected function _getAssetTitle()
	{
		if (isset($this->title))
		{
			return $this->title;
		}
		return '';
	}

	/**
	 * Get the parent asset id for the record
	 *
	 * @return	int
	 * @since	2.5
	 */
	protected function _getAssetParentId(JTable $table = NULL, $id = NULL) 
	{
		$asset = JTable::getInstance('Asset');
		$asset->loadByName('com_reservation');

		return $asset->id;
	}

	/**
	 * This view does not actually have an alias
	 *
	 * @return  bool
	 */
	public function generateAlias()
	{
		return false;
	}

}
PK5~�[��Do!o!tables/session.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		session.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Registry\Registry;
use Joomla\String\StringHelper;
use Joomla\Utilities\ArrayHelper;

/**
 * Sessions Table class
 */
class ReservationTableSession extends JTable
{
	/**
	 * Ensure the params and metadata in json encoded in the bind method
	 *
	 * @var    array
	 * @since  3.3
	 */
	protected $_jsonEncode = array('params', 'metadata');
    
	/**
	 * Constructor
	 *
	 * @param object Database connector object
	 */
	function __construct(&$db) 
	{
		parent::__construct('#__reservation_session', 'id',
$db);

		// Adding History Options
		JTableObserverContenthistory::createObserver($this,
array('typeAlias' => 'com_reservation.session'));
	}	
 
	public function bind($array, $ignore = '')
	{
    
		if (isset($array['params']) &&
is_array($array['params']))
		{
			$registry = new JRegistry;
			$registry->loadArray($array['params']);
			$array['params'] = (string) $registry;
		}

		if (isset($array['metadata']) &&
is_array($array['metadata']))
		{
			$registry = new JRegistry;
			$registry->loadArray($array['metadata']);
			$array['metadata'] = (string) $registry;
		}
        
		// Bind the rules. 
		if (isset($array['rules']) &&
is_array($array['rules']))
		{ 
			$rules = new JAccessRules($array['rules']); 
			$this->setRules($rules); 
		}
		return parent::bind($array, $ignore);
	}
    
	/**
	 * Overload the store method for the Session table.
	 *
	 * @param   boolean	Toggle whether null values should be updated.
	 * @return  boolean  True on success, false on failure.
	 * @since   1.6
	 */
	public function store($updateNulls = false)
	{
		$date	= JFactory::getDate();
		$user	= JFactory::getUser();

		if ($this->id)
		{
			// Existing item
			$this->modified		= $date->toSql();
			$this->modified_by	= $user->get('id');
		}
		else
		{
			// New session. A session created and created_by field can be set by the
user,
			// so we don't touch either of these if they are set.
			if (!(int) $this->created)
			{
				$this->created = $date->toSql();
			}
			if (empty($this->created_by))
			{
				$this->created_by = $user->get('id');
			}
		}
		
		if (isset($this->alias))
		{
			// Verify that the alias is unique
			$table = JTable::getInstance('session',
'ReservationTable');

			if ($table->load(array('alias' => $this->alias))
&& ($table->id != $this->id || $this->id == 0))
			{
				$this->setError(JText::_('COM_RESERVATION_SESSION_ERROR_UNIQUE_ALIAS'));
				return false;
			}
		}
		
		if (isset($this->url))
		{
			// Convert IDN urls to punycode
			$this->url = JStringPunycode::urlToPunycode($this->url);
		}
		if (isset($this->website))
		{
			// Convert IDN urls to punycode
			$this->website = JStringPunycode::urlToPunycode($this->website);
		}

		return parent::store($updateNulls);
	}
    
	/**
	 * Overloaded check method to ensure data integrity.
	 *
	 * @return  boolean  True on success.
	 */
	public function check()
	{
		if (isset($this->alias))
		{
			// Generate a valid alias
			$this->generateAlias();
            
			$table = JTable::getInstance('session',
'reservationTable');

			while ($table->load(array('alias' => $this->alias))
&& ($table->id != $this->id || $this->id == 0))
			{
				$this->alias = StringHelper::increment($this->alias,
'dash');
			}
		}
		
		/*
		 * Clean up keywords -- eliminate extra spaces between phrases
		 * and cr (\r) and lf (\n) characters from string.
		 * Only process if not empty.
 		 */
		if (!empty($this->metakey))
		{
			// Array of characters to remove.
			$bad_characters = array("\n", "\r",
"\"", "<", ">");

			// Remove bad characters.
			$after_clean = StringHelper::str_ireplace($bad_characters, "",
$this->metakey);

			// Create array using commas as delimiter.
			$keys = explode(',', $after_clean);
			$clean_keys = array();

			foreach ($keys as $key)
			{
				// Ignore blank keywords.
				if (trim($key))
				{
					$clean_keys[] = trim($key);
				}
			}

			// Put array back together delimited by ", "
			$this->metakey = implode(", ", $clean_keys);
		}

		// Clean up description -- eliminate quotes and <> brackets
		if (!empty($this->metadesc))
		{
			// Only process if not empty
			$bad_characters = array("\"", "<",
">");
			$this->metadesc = StringHelper::str_ireplace($bad_characters,
"", $this->metadesc);
		}

		// If we don't have any access rules set at this point just use an
empty JAccessRules class
		if (!$this->getRules())
		{
			$rules =
$this->getDefaultAssetValues('com_reservation.session.'.$this->id);
			$this->setRules($rules);
		}
        
		// Set ordering
		if ($this->published < 0)
		{
			// Set ordering to 0 if state is archived or trashed
			$this->ordering = 0;
		}

		return true;
	}

	/**
	 * Gets the default asset values for a component.
	 *
	 * @param   $string  $component  The component asset name to search for
	 *
	 * @return  JAccessRules  The JAccessRules object for the asset
	 */
	protected function getDefaultAssetValues($component, $try = true)
	{
		// Need to find the asset id by the name of the component.
		$db = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select($db->quoteName('id'))
			->from($db->quoteName('#__assets'))
			->where($db->quoteName('name') . ' = ' .
$db->quote($component));
		$db->setQuery($query);
		$db->execute();
		if ($db->loadRowList())
		{
			// asset already set so use saved rules
			$assetId = (int) $db->loadResult();
			return JAccess::getAssetRules($assetId); // (TODO) instead of keeping
inherited Allowed it becomes Allowed.
		}
		// try again
		elseif ($try)
		{
			$try = explode('.',$component);
			$result =  $this->getDefaultAssetValues($try[0], false);
			if ($result instanceof JAccessRules)
			{
				if (isset($try[1]))
				{
					$_result = (string) $result;
					$_result = json_decode($_result);
					foreach ($_result as $name => &$rule)
					{
						$v = explode('.', $name);
						if ($try[1] !== $v[0])
						{
							// remove since it is not part of this view
							unset($_result->$name);
						}
						else
						{
							// clear the value since we inherit
							$rule = array();
						}
					}
					// check if there are any view values remaining
					if (count( (array) $_result))
					{
						$_result = json_encode($_result);
						$_result = array($_result);
						// Instantiate and return the JAccessRules object for the asset
rules.
						$rules = new JAccessRules;
						$rules->mergeCollection($_result);

						return $rules;
					}
				}
				return $result;
			}
		}
		return JAccess::getAssetRules(0);
	}

	/**
	 * Method to compute the default name of the asset.
	 * The default name is in the form 'table_name.id'
	 * where id is the value of the primary key of the table.
	 *
	 * @return	string
	 * @since	2.5
	 */
	protected function _getAssetName()
	{
		$k = $this->_tbl_key;
		return 'com_reservation.session.'.(int) $this->$k;
	}

	/**
	 * Method to return the title to use for the asset table.
	 *
	 * @return	string
	 * @since	2.5
	 */
	protected function _getAssetTitle()
	{
		if (isset($this->title))
		{
			return $this->title;
		}
		return '';
	}

	/**
	 * Get the parent asset id for the record
	 *
	 * @return	int
	 * @since	2.5
	 */
	protected function _getAssetParentId(JTable $table = NULL, $id = NULL) 
	{
		$asset = JTable::getInstance('Asset');
		$asset->loadByName('com_reservation');

		return $asset->id;
	}

	/**
	 * This view does not actually have an alias
	 *
	 * @return  bool
	 */
	public function generateAlias()
	{
		return false;
	}

}
PK5~�[�i�H!H!tables/sick.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		sick.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\Registry\Registry;
use Joomla\String\StringHelper;
use Joomla\Utilities\ArrayHelper;

/**
 * Sicks Table class
 */
class ReservationTableSick extends JTable
{
	/**
	 * Ensure the params and metadata in json encoded in the bind method
	 *
	 * @var    array
	 * @since  3.3
	 */
	protected $_jsonEncode = array('params', 'metadata');
    
	/**
	 * Constructor
	 *
	 * @param object Database connector object
	 */
	function __construct(&$db) 
	{
		parent::__construct('#__reservation_sick', 'id',
$db);

		// Adding History Options
		JTableObserverContenthistory::createObserver($this,
array('typeAlias' => 'com_reservation.sick'));
	}	
 
	public function bind($array, $ignore = '')
	{
    
		if (isset($array['params']) &&
is_array($array['params']))
		{
			$registry = new JRegistry;
			$registry->loadArray($array['params']);
			$array['params'] = (string) $registry;
		}

		if (isset($array['metadata']) &&
is_array($array['metadata']))
		{
			$registry = new JRegistry;
			$registry->loadArray($array['metadata']);
			$array['metadata'] = (string) $registry;
		}
        
		// Bind the rules. 
		if (isset($array['rules']) &&
is_array($array['rules']))
		{ 
			$rules = new JAccessRules($array['rules']); 
			$this->setRules($rules); 
		}
		return parent::bind($array, $ignore);
	}
    
	/**
	 * Overload the store method for the Sick table.
	 *
	 * @param   boolean	Toggle whether null values should be updated.
	 * @return  boolean  True on success, false on failure.
	 * @since   1.6
	 */
	public function store($updateNulls = false)
	{
		$date	= JFactory::getDate();
		$user	= JFactory::getUser();

		if ($this->id)
		{
			// Existing item
			$this->modified		= $date->toSql();
			$this->modified_by	= $user->get('id');
		}
		else
		{
			// New sick. A sick created and created_by field can be set by the user,
			// so we don't touch either of these if they are set.
			if (!(int) $this->created)
			{
				$this->created = $date->toSql();
			}
			if (empty($this->created_by))
			{
				$this->created_by = $user->get('id');
			}
		}
		
		if (isset($this->alias))
		{
			// Verify that the alias is unique
			$table = JTable::getInstance('sick',
'ReservationTable');

			if ($table->load(array('alias' => $this->alias))
&& ($table->id != $this->id || $this->id == 0))
			{
				$this->setError(JText::_('COM_RESERVATION_SICK_ERROR_UNIQUE_ALIAS'));
				return false;
			}
		}
		
		if (isset($this->url))
		{
			// Convert IDN urls to punycode
			$this->url = JStringPunycode::urlToPunycode($this->url);
		}
		if (isset($this->website))
		{
			// Convert IDN urls to punycode
			$this->website = JStringPunycode::urlToPunycode($this->website);
		}

		return parent::store($updateNulls);
	}
    
	/**
	 * Overloaded check method to ensure data integrity.
	 *
	 * @return  boolean  True on success.
	 */
	public function check()
	{
		if (isset($this->alias))
		{
			// Generate a valid alias
			$this->generateAlias();
            
			$table = JTable::getInstance('sick',
'reservationTable');

			while ($table->load(array('alias' => $this->alias))
&& ($table->id != $this->id || $this->id == 0))
			{
				$this->alias = StringHelper::increment($this->alias,
'dash');
			}
		}
		
		/*
		 * Clean up keywords -- eliminate extra spaces between phrases
		 * and cr (\r) and lf (\n) characters from string.
		 * Only process if not empty.
 		 */
		if (!empty($this->metakey))
		{
			// Array of characters to remove.
			$bad_characters = array("\n", "\r",
"\"", "<", ">");

			// Remove bad characters.
			$after_clean = StringHelper::str_ireplace($bad_characters, "",
$this->metakey);

			// Create array using commas as delimiter.
			$keys = explode(',', $after_clean);
			$clean_keys = array();

			foreach ($keys as $key)
			{
				// Ignore blank keywords.
				if (trim($key))
				{
					$clean_keys[] = trim($key);
				}
			}

			// Put array back together delimited by ", "
			$this->metakey = implode(", ", $clean_keys);
		}

		// Clean up description -- eliminate quotes and <> brackets
		if (!empty($this->metadesc))
		{
			// Only process if not empty
			$bad_characters = array("\"", "<",
">");
			$this->metadesc = StringHelper::str_ireplace($bad_characters,
"", $this->metadesc);
		}

		// If we don't have any access rules set at this point just use an
empty JAccessRules class
		if (!$this->getRules())
		{
			$rules =
$this->getDefaultAssetValues('com_reservation.sick.'.$this->id);
			$this->setRules($rules);
		}
        
		// Set ordering
		if ($this->published < 0)
		{
			// Set ordering to 0 if state is archived or trashed
			$this->ordering = 0;
		}

		return true;
	}

	/**
	 * Gets the default asset values for a component.
	 *
	 * @param   $string  $component  The component asset name to search for
	 *
	 * @return  JAccessRules  The JAccessRules object for the asset
	 */
	protected function getDefaultAssetValues($component, $try = true)
	{
		// Need to find the asset id by the name of the component.
		$db = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select($db->quoteName('id'))
			->from($db->quoteName('#__assets'))
			->where($db->quoteName('name') . ' = ' .
$db->quote($component));
		$db->setQuery($query);
		$db->execute();
		if ($db->loadRowList())
		{
			// asset already set so use saved rules
			$assetId = (int) $db->loadResult();
			return JAccess::getAssetRules($assetId); // (TODO) instead of keeping
inherited Allowed it becomes Allowed.
		}
		// try again
		elseif ($try)
		{
			$try = explode('.',$component);
			$result =  $this->getDefaultAssetValues($try[0], false);
			if ($result instanceof JAccessRules)
			{
				if (isset($try[1]))
				{
					$_result = (string) $result;
					$_result = json_decode($_result);
					foreach ($_result as $name => &$rule)
					{
						$v = explode('.', $name);
						if ($try[1] !== $v[0])
						{
							// remove since it is not part of this view
							unset($_result->$name);
						}
						else
						{
							// clear the value since we inherit
							$rule = array();
						}
					}
					// check if there are any view values remaining
					if (count( (array) $_result))
					{
						$_result = json_encode($_result);
						$_result = array($_result);
						// Instantiate and return the JAccessRules object for the asset
rules.
						$rules = new JAccessRules;
						$rules->mergeCollection($_result);

						return $rules;
					}
				}
				return $result;
			}
		}
		return JAccess::getAssetRules(0);
	}

	/**
	 * Method to compute the default name of the asset.
	 * The default name is in the form 'table_name.id'
	 * where id is the value of the primary key of the table.
	 *
	 * @return	string
	 * @since	2.5
	 */
	protected function _getAssetName()
	{
		$k = $this->_tbl_key;
		return 'com_reservation.sick.'.(int) $this->$k;
	}

	/**
	 * Method to return the title to use for the asset table.
	 *
	 * @return	string
	 * @since	2.5
	 */
	protected function _getAssetTitle()
	{
		if (isset($this->title))
		{
			return $this->title;
		}
		return '';
	}

	/**
	 * Get the parent asset id for the record
	 *
	 * @return	int
	 * @since	2.5
	 */
	protected function _getAssetParentId(JTable $table = NULL, $id = NULL) 
	{
		$asset = JTable::getInstance('Asset');
		$asset->loadByName('com_reservation');

		return $asset->id;
	}

	/**
	 * This view does not actually have an alias
	 *
	 * @return  bool
	 */
	public function generateAlias()
	{
		return false;
	}

}
PK5~�[/�;+��!views/appointment/submitbutton.jsnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		submitbutton.js
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

Joomla.submitbutton = function(task)
{
	if (task == ''){
		return false;
	} else { 
		var action = task.split('.');
		if (action[1] == 'cancel' || action[1] == 'close' ||
document.formvalidator.isValid(document.getElementById("adminForm"))){
			Joomla.submitform(task, document.getElementById("adminForm"));
			return true;
		} else {
			alert(Joomla.JText._('appointment, some values are not
acceptable.','Some values are unacceptable'));
			return false;
		}
	}
}PK5~�[õ���views/appointment/tmpl/edit.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		edit.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');
JHtml::_('behavior.tooltip');
JHtml::_('behavior.formvalidation');
JHtml::_('formbehavior.chosen', 'select');
JHtml::_('behavior.keepalive');
$componentParams = $this->params; // will be removed just use
$this->params instead
?>
<script type="text/javascript">
	// waiting spinner
	var outerDiv = jQuery('body');
	jQuery('<div id="loading"></div>')
		.css("background", "rgba(255, 255, 255, .8)
url('components/com_reservation/assets/images/import.gif') 50%
15% no-repeat")
		.css("top", outerDiv.position().top -
jQuery(window).scrollTop())
		.css("left", outerDiv.position().left -
jQuery(window).scrollLeft())
		.css("width", outerDiv.width())
		.css("height", outerDiv.height())
		.css("position", "fixed")
		.css("opacity", "0.80")
		.css("-ms-filter",
"progid:DXImageTransform.Microsoft.Alpha(Opacity = 80)")
		.css("filter", "alpha(opacity = 80)")
		.css("display", "none")
		.appendTo(outerDiv);
	jQuery('#loading').show();
	// when page is ready remove and show
	jQuery(window).load(function() {
		jQuery('#reservation_loader').fadeIn('fast');
		jQuery('#loading').hide();
	});
</script>
<div id="reservation_loader" style="display:
none;">
<form action="<?php echo
JRoute::_('index.php?option=com_reservation&layout=edit&id='.
(int) $this->item->id . $this->referral); ?>"
method="post" name="adminForm" id="adminForm"
class="form-validate" enctype="multipart/form-data">

<div class="form-horizontal">

	<?php echo JHtml::_('bootstrap.startTabSet',
'appointmentTab', array('active' =>
'details')); ?>

	<?php echo JHtml::_('bootstrap.addTab',
'appointmentTab', 'details',
JText::_('COM_RESERVATION_APPOINTMENT_DETAILS', true)); ?>
		<div class="row-fluid form-horizontal-desktop">
			<div class="span6">
				<?php echo
JLayoutHelper::render('appointment.details_left', $this); ?>
			</div>
			<div class="span6">
				<?php echo
JLayoutHelper::render('appointment.details_right', $this); ?>
			</div>
		</div>
	<?php echo JHtml::_('bootstrap.endTab'); ?>

	<?php $this->ignore_fieldsets =
array('details','metadata','vdmmetadata','accesscontrol');
?>
	<?php $this->tab_name = 'appointmentTab'; ?>
	<?php echo JLayoutHelper::render('joomla.edit.params',
$this); ?>

	<?php if ($this->canDo->get('core.edit.created_by') ||
$this->canDo->get('core.edit.created') ||
$this->canDo->get('core.edit.state') ||
($this->canDo->get('core.delete') &&
$this->canDo->get('core.edit.state'))) : ?>
	<?php echo JHtml::_('bootstrap.addTab',
'appointmentTab', 'publishing',
JText::_('COM_RESERVATION_APPOINTMENT_PUBLISHING', true)); ?>
		<div class="row-fluid form-horizontal-desktop">
			<div class="span6">
				<?php echo JLayoutHelper::render('appointment.publishing',
$this); ?>
			</div>
			<div class="span6">
				<?php echo JLayoutHelper::render('appointment.publlshing',
$this); ?>
			</div>
		</div>
	<?php echo JHtml::_('bootstrap.endTab'); ?>
	<?php endif; ?>

	<?php echo JHtml::_('bootstrap.endTabSet'); ?>

	<div>
		<input type="hidden" name="task"
value="appointment.edit" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</div>
</form>
</div>
PK5~�[�#o,,!views/appointment/tmpl/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[E�:LXXviews/appointment/view.html.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		view.html.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

/**
 * Appointment View class
 */
class ReservationViewAppointment extends JViewLegacy
{
	/**
	 * display method of View
	 * @return void
	 */
	public function display($tpl = null)
	{
		// set params
		$this->params =
JComponentHelper::getParams('com_reservation');
		// Assign the variables
		$this->form = $this->get('Form');
		$this->item = $this->get('Item');
		$this->script = $this->get('Script');
		$this->state = $this->get('State');
		// get action permissions
		$this->canDo = ReservationHelper::getActions('appointment',
$this->item);
		// get input
		$jinput = JFactory::getApplication()->input;
		$this->ref = $jinput->get('ref', 0, 'word');
		$this->refid = $jinput->get('refid', 0, 'int');
		$return = $jinput->get('return', null, 'base64');
		// set the referral string
		$this->referral = '';
		if ($this->refid && $this->ref)
		{
			// return to the item that referred to this item
			$this->referral = '&ref=' . (string)$this->ref .
'&refid=' . (int)$this->refid;
		}
		elseif($this->ref)
		{
			// return to the list view that referred to this item
			$this->referral = '&ref=' . (string)$this->ref;
		}
		// check return value
		if (!is_null($return))
		{
			// add the return value
			$this->referral .= '&return=' . (string)$return;
		}

		// Set the toolbar
		$this->addToolBar();
		
		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		// Display the template
		parent::display($tpl);

		// Set the document
		$this->setDocument();
	}


	/**
	 * Setting the toolbar
	 */
	protected function addToolBar()
	{
		JFactory::getApplication()->input->set('hidemainmenu',
true);
		$user = JFactory::getUser();
		$userId	= $user->id;
		$isNew = $this->item->id == 0;

		JToolbarHelper::title( JText::_($isNew ?
'COM_RESERVATION_APPOINTMENT_NEW' :
'COM_RESERVATION_APPOINTMENT_EDIT'), 'pencil-2
article-add');
		// Built the actions for new and existing records.
		if (ReservationHelper::checkString($this->referral))
		{
			if ($this->canDo->get('core.create') && $isNew)
			{
				// We can create the record.
				JToolBarHelper::save('appointment.save',
'JTOOLBAR_SAVE');
			}
			elseif ($this->canDo->get('core.edit'))
			{
				// We can save the record.
				JToolBarHelper::save('appointment.save',
'JTOOLBAR_SAVE');
			}
			if ($isNew)
			{
				// Do not creat but cancel.
				JToolBarHelper::cancel('appointment.cancel',
'JTOOLBAR_CANCEL');
			}
			else
			{
				// We can close it.
				JToolBarHelper::cancel('appointment.cancel',
'JTOOLBAR_CLOSE');
			}
		}
		else
		{
			if ($isNew)
			{
				// For new records, check the create permission.
				if ($this->canDo->get('core.create'))
				{
					JToolBarHelper::apply('appointment.apply',
'JTOOLBAR_APPLY');
					JToolBarHelper::save('appointment.save',
'JTOOLBAR_SAVE');
					JToolBarHelper::custom('appointment.save2new',
'save-new.png', 'save-new_f2.png',
'JTOOLBAR_SAVE_AND_NEW', false);
				};
				JToolBarHelper::cancel('appointment.cancel',
'JTOOLBAR_CANCEL');
			}
			else
			{
				if ($this->canDo->get('core.edit'))
				{
					// We can save the new record
					JToolBarHelper::apply('appointment.apply',
'JTOOLBAR_APPLY');
					JToolBarHelper::save('appointment.save',
'JTOOLBAR_SAVE');
					// We can save this record, but check the create permission to see
					// if we can return to make a new one.
					if ($this->canDo->get('core.create'))
					{
						JToolBarHelper::custom('appointment.save2new',
'save-new.png', 'save-new_f2.png',
'JTOOLBAR_SAVE_AND_NEW', false);
					}
				}
				$canVersion = ($this->canDo->get('core.version')
&& $this->canDo->get('appointment.version'));
				if ($this->state->params->get('save_history', 1)
&& $this->canDo->get('core.edit') &&
$canVersion)
				{
					JToolbarHelper::versions('com_reservation.appointment',
$this->item->id);
				}
				if ($this->canDo->get('core.create'))
				{
					JToolBarHelper::custom('appointment.save2copy',
'save-copy.png', 'save-copy_f2.png',
'JTOOLBAR_SAVE_AS_COPY', false);
				}
				JToolBarHelper::cancel('appointment.cancel',
'JTOOLBAR_CLOSE');
			}
		}
		JToolbarHelper::divider();
		// set help url for this view if found
		$help_url = ReservationHelper::getHelpUrl('appointment');
		if (ReservationHelper::checkString($help_url))
		{
			JToolbarHelper::help('COM_RESERVATION_HELP_MANAGER', false,
$help_url);
		}
	}

	/**
	 * Escapes a value for output in a view script.
	 *
	 * @param   mixed  $var  The output to escape.
	 *
	 * @return  mixed  The escaped value.
	 */
	public function escape($var)
	{
		if(strlen($var) > 30)
		{
    		// use the helper htmlEscape method instead and shorten the string
			return ReservationHelper::htmlEscape($var, $this->_charset, true,
30);
		}
		// use the helper htmlEscape method instead.
		return ReservationHelper::htmlEscape($var, $this->_charset);
	}

	/**
	 * Method to set up the document properties
	 *
	 * @return void
	 */
	protected function setDocument()
	{
		$isNew = ($this->item->id < 1);
		if (!isset($this->document))
		{
			$this->document = JFactory::getDocument();
		}
		$this->document->setTitle(JText::_($isNew ?
'COM_RESERVATION_APPOINTMENT_NEW' :
'COM_RESERVATION_APPOINTMENT_EDIT'));
		$this->document->addStyleSheet(JURI::root() .
"administrator/components/com_reservation/assets/css/appointment.css",
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') : 'text/css');
		$this->document->addScript(JURI::root() . $this->script,
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') :
'text/javascript');
		$this->document->addScript(JURI::root() .
"administrator/components/com_reservation/views/appointment/submitbutton.js",
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') :
'text/javascript'); 
		JText::script('view not acceptable. Error');
	}
}
PK5~�[�#o,,views/appointments/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[+m%%#views/appointments/tmpl/default.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

JHtml::_('behavior.tooltip');
JHtml::_('behavior.multiselect');
JHtml::_('dropdown.init');
JHtml::_('formbehavior.chosen',
'.multipleAccessLevels', null,
array('placeholder_text_multiple' => '- ' .
JText::_('COM_RESERVATION_FILTER_SELECT_ACCESS') . '
-'));
JHtml::_('formbehavior.chosen', 'select');
if ($this->saveOrder)
{
	$saveOrderingUrl =
'index.php?option=com_reservation&task=appointments.saveOrderAjax&tmpl=component';
	JHtml::_('sortablelist.sortable', 'appointmentList',
'adminForm', strtolower($this->listDirn), $saveOrderingUrl);
}
?>
<form action="<?php echo
JRoute::_('index.php?option=com_reservation&view=appointments');
?>" method="post" name="adminForm"
id="adminForm">
<?php if(!empty( $this->sidebar)): ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif; ?>
<?php
	// Add the searchtools
	echo JLayoutHelper::render('joomla.searchtools.default',
array('view' => $this));
?>
<?php if (empty($this->items)): ?>
	<div class="alert alert-no-items">
		<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
	</div>
<?php else : ?>
	<table class="table table-striped"
id="appointmentList">
		<thead><?php echo
$this->loadTemplate('head');?></thead>
		<tfoot><?php echo
$this->loadTemplate('foot');?></tfoot>
		<tbody><?php echo
$this->loadTemplate('body');?></tbody>
	</table>
	<?php // Load the batch processing form. ?>
	<?php if ($this->canCreate && $this->canEdit) : ?>
		<?php echo JHtml::_(
			'bootstrap.renderModal',
			'collapseModal',
			array(
				'title' =>
JText::_('COM_RESERVATION_APPOINTMENTS_BATCH_OPTIONS'),
				'footer' =>
$this->loadTemplate('batch_footer')
			),
			$this->loadTemplate('batch_body')
		); ?>
	<?php endif; ?>
	<input type="hidden" name="boxchecked"
value="0" />
	</div>
<?php endif; ?>
	<input type="hidden" name="task" value=""
/>
	<?php echo JHtml::_('form.token'); ?>
</form>
PK5~�[��{P��.views/appointments/tmpl/default_batch_body.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_batch_body.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>

<p><?php echo
JText::_('COM_RESERVATION_APPOINTMENTS_BATCH_TIP');
?></p>
<?php echo $this->batchDisplay;
?>PK5~�[GE����0views/appointments/tmpl/default_batch_footer.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_batch_footer.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<!-- clear the batch values if cancel -->
<button class="btn" type="button"
onclick="" data-dismiss="modal">
	<?php echo JText::_('JCANCEL'); ?>
</button>
<!-- post the batch values if process -->
<button class="btn btn-success" type="submit"
onclick="Joomla.submitbutton('appointment.batch');">
	<?php echo JText::_('JGLOBAL_BATCH_PROCESS'); ?>
</button>PK5~�[Ќ�d��(views/appointments/tmpl/default_body.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_body.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

$edit =
"index.php?option=com_reservation&view=appointments&task=appointment.edit";

?>
<?php foreach ($this->items as $i => $item): ?>
	<?php
		$canCheckin = $this->user->authorise('core.manage',
'com_checkin') || $item->checked_out == $this->user->id
|| $item->checked_out == 0;
		$userChkOut = JFactory::getUser($item->checked_out);
		$canDo =
ReservationHelper::getActions('appointment',$item,'appointments');
	?>
	<tr class="row<?php echo $i % 2; ?>">
		<td class="order nowrap center hidden-phone">
		<?php if ($canDo->get('core.edit.state')): ?>
			<?php
				$iconClass = '';
				if (!$this->saveOrder)
				{
					$iconClass = ' inactive tip-top" hasTooltip"
title="' . JHtml::tooltipText('JORDERINGDISABLED');
				}
			?>
			<span class="sortable-handler<?php echo $iconClass;
?>">
				<i class="icon-menu"></i>
			</span>
			<?php if ($this->saveOrder) : ?>
				<input type="text" style="display:none"
name="order[]" size="5"
				value="<?php echo $item->ordering; ?>"
class="width-20 text-area-order " />
			<?php endif; ?>
		<?php else: ?>
			&#8942;
		<?php endif; ?>
		</td>
		<td class="nowrap center">
		<?php if ($canDo->get('core.edit')): ?>
				<?php if ($item->checked_out) : ?>
					<?php if ($canCheckin) : ?>
						<?php echo JHtml::_('grid.id', $i, $item->id); ?>
					<?php else: ?>
						&#9633;
					<?php endif; ?>
				<?php else: ?>
					<?php echo JHtml::_('grid.id', $i, $item->id); ?>
				<?php endif; ?>
		<?php else: ?>
			&#9633;
		<?php endif; ?>
		</td>
		<td class="nowrap">
			<div class="name">
				<?php if ($canDo->get('core.edit')): ?>
					<a href="<?php echo $edit; ?>&id=<?php echo
$item->id; ?>"><?php echo
$this->escape($item->title); ?></a>
					<?php if ($item->checked_out): ?>
						<?php echo JHtml::_('jgrid.checkedout', $i,
$userChkOut->name, $item->checked_out_time,
'appointments.', $canCheckin); ?>
					<?php endif; ?>
				<?php else: ?>
					<?php echo $this->escape($item->title); ?>
				<?php endif; ?>
			</div>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->appointment); ?>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->doctorid_id); ?>
		</td>
		<td class="center">
		<?php if ($canDo->get('core.edit.state')) : ?>
				<?php if ($item->checked_out) : ?>
					<?php if ($canCheckin) : ?>
						<?php echo JHtml::_('jgrid.published',
$item->published, $i, 'appointments.', true, 'cb');
?>
					<?php else: ?>
						<?php echo JHtml::_('jgrid.published',
$item->published, $i, 'appointments.', false, 'cb');
?>
					<?php endif; ?>
				<?php else: ?>
					<?php echo JHtml::_('jgrid.published',
$item->published, $i, 'appointments.', true, 'cb');
?>
				<?php endif; ?>
		<?php else: ?>
			<?php echo JHtml::_('jgrid.published', $item->published,
$i, 'appointments.', false, 'cb'); ?>
		<?php endif; ?>
		</td>
		<td class="nowrap center hidden-phone">
			<?php echo $item->id; ?>
		</td>
	</tr>
<?php endforeach;
?>PK5~�[}�A{��(views/appointments/tmpl/default_foot.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_foot.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<tr>
	<td colspan="7"><?php echo
$this->pagination->getListFooter(); ?></td>
</tr>PK5~�[,z
qD
D
(views/appointments/tmpl/default_head.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_head.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<tr>
	<?php if ($this->canEdit&& $this->canState): ?>
		<th width="1%" class="nowrap center
hidden-phone">
			<?php echo JHtml::_('searchtools.sort', '',
'a.ordering', $this->listDirn, $this->listOrder, null,
'asc', 'JGRID_HEADING_ORDERING',
'icon-menu-2'); ?>
		</th>
		<th width="20" class="nowrap center">
			<?php echo JHtml::_('grid.checkall'); ?>
		</th>
	<?php else: ?>
		<th width="20" class="nowrap center
hidden-phone">
			&#9662;
		</th>
		<th width="20" class="nowrap center">
			&#9632;
		</th>
	<?php endif; ?>
	<th class="nowrap" >
			<?php echo
JText::_('COM_RESERVATION_APPOINTMENT_TITLE_LABEL'); ?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo JHtml::_('searchtools.sort',
'COM_RESERVATION_APPOINTMENT_APPOINTMENT_LABEL',
'a.appointment', $this->listDirn, $this->listOrder); ?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo
JText::_('COM_RESERVATION_APPOINTMENT_DOCTORID_LABEL'); ?>
	</th>
	<?php if ($this->canState): ?>
		<th width="10" class="nowrap center" >
			<?php echo JHtml::_('searchtools.sort',
'COM_RESERVATION_APPOINTMENT_STATUS', 'a.published',
$this->listDirn, $this->listOrder); ?>
		</th>
	<?php else: ?>
		<th width="10" class="nowrap center" >
			<?php echo JText::_('COM_RESERVATION_APPOINTMENT_STATUS');
?>
		</th>
	<?php endif; ?>
	<th width="5" class="nowrap center hidden-phone"
>
			<?php echo JHtml::_('searchtools.sort',
'COM_RESERVATION_APPOINTMENT_ID', 'a.id',
$this->listDirn, $this->listOrder); ?>
	</th>
</tr>PK5~�[�hJ�99+views/appointments/tmpl/default_toolbar.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_toolbar.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<div id="filter-bar" class="btn-toolbar">
        <div class="filter-search btn-group pull-left">
            <label for="filter_search"
class="element-invisible"><?php echo
JText::_('Search');?></label>
            <input type="text" name="filter_search"
id="filter_search" placeholder="<?php echo
JText::_('JSEARCH_FILTER'); ?>" value="<?php echo
$this->escape($this->state->get('filter.search'));
?>" class="hasTooltip" title="<?php echo
JHtml::tooltipText('Search Appointments'); ?>" />
        </div>
        <div class="btn-group pull-left">
            <button type="submit" class="btn
hasTooltip" title="<?php echo
JHtml::tooltipText('JSEARCH_FILTER_SUBMIT'); ?>"><i
class="icon-search"></i></button>
            <button type="button" class="btn
hasTooltip" title="<?php echo
JHtml::tooltipText('JSEARCH_FILTER_CLEAR'); ?>"
onclick="document.id('filter_search').value='';this.form.submit();"><i
class="icon-remove"></i></button>
        </div>
        <div class="btn-group pull-right hidden-phone">
            <label for="limit"
class="element-invisible"><?php echo
JText::_('JFIELD_PLG_SEARCH_SEARCHLIMIT_DESC');?></label>
            <?php echo $this->pagination->getLimitBox(); ?>
        </div>
        <div class="btn-group pull-right hidden-phone">
            <label for="directionTable"
class="element-invisible"><?php echo
JText::_('JFIELD_ORDERING_DESC');?></label>
            <select name="directionTable"
id="directionTable" class="input-medium"
onchange="Joomla.orderTable()">
                <option value=""><?php echo
JText::_('JFIELD_ORDERING_DESC');?></option>
                <option value="asc" <?php if
($this->listDirn == 'asc') echo
'selected="selected"'; ?>><?php echo
JText::_('JGLOBAL_ORDER_ASCENDING');?></option>
                <option value="desc" <?php if
($this->listDirn == 'desc') echo
'selected="selected"'; ?>><?php echo
JText::_('JGLOBAL_ORDER_DESCENDING');?></option>
            </select>
        </div>
        <div class="btn-group pull-right">
            <label for="sortTable"
class="element-invisible"><?php echo
JText::_('JGLOBAL_SORT_BY');?></label>
            <select name="sortTable" id="sortTable"
class="input-medium" onchange="Joomla.orderTable()">
                <option value=""><?php echo
JText::_('JGLOBAL_SORT_BY');?></option>
                <?php echo JHtml::_('select.options',
$this->getSortFields(), 'value', 'text',
$this->listOrder);?>
            </select>
        </div>
    </div>
<div class="clearfix">
</div>PK5~�[�#o,,"views/appointments/tmpl/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[���++
views/appointments/view.html.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		view.html.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

/**
 * Reservation View class for the Appointments
 */
class ReservationViewAppointments extends JViewLegacy
{
	/**
	 * Appointments view display method
	 * @return void
	 */
	function display($tpl = null)
	{
		if ($this->getLayout() !== 'modal')
		{
			// Include helper submenu
			ReservationHelper::addSubmenu('appointments');
		}

		// Assign data to the view
		$this->items = $this->get('Items');
		$this->pagination = $this->get('Pagination');
		$this->state = $this->get('State');
		$this->user = JFactory::getUser();
		// Load the filter form from xml.
		$this->filterForm = $this->get('FilterForm');
		// Load the active filters.
		$this->activeFilters = $this->get('ActiveFilters');
		// Add the list ordering clause.
		$this->listOrder =
$this->escape($this->state->get('list.ordering',
'a.id'));
		$this->listDirn =
$this->escape($this->state->get('list.direction',
'DESC'));
		$this->saveOrder = $this->listOrder == 'a.ordering';
		// set the return here value
		$this->return_here = urlencode(base64_encode((string)
JUri::getInstance()));
		// get global action permissions
		$this->canDo = ReservationHelper::getActions('appointment');
		$this->canEdit = $this->canDo->get('core.edit');
		$this->canState =
$this->canDo->get('core.edit.state');
		$this->canCreate = $this->canDo->get('core.create');
		$this->canDelete = $this->canDo->get('core.delete');
		$this->canBatch = $this->canDo->get('core.batch');

		// We don't need toolbar in the modal window.
		if ($this->getLayout() !== 'modal')
		{
			$this->addToolbar();
			$this->sidebar = JHtmlSidebar::render();
			// load the batch html
			if ($this->canCreate && $this->canEdit &&
$this->canState)
			{
				$this->batchDisplay = JHtmlBatch_::render();
			}
		}
		
		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		// Display the template
		parent::display($tpl);

		// Set the document
		$this->setDocument();
	}

	/**
	 * Setting the toolbar
	 */
	protected function addToolBar()
	{
		JToolBarHelper::title(JText::_('COM_RESERVATION_APPOINTMENTS'),
'joomla');
		JHtmlSidebar::setAction('index.php?option=com_reservation&view=appointments');
		JFormHelper::addFieldPath(JPATH_COMPONENT . '/models/fields');

		if ($this->canCreate)
		{
			JToolBarHelper::addNew('appointment.add');
		}

		// Only load if there are items
		if (ReservationHelper::checkArray($this->items))
		{
			if ($this->canEdit)
			{
				JToolBarHelper::editList('appointment.edit');
			}

			if ($this->canState)
			{
				JToolBarHelper::publishList('appointments.publish');
				JToolBarHelper::unpublishList('appointments.unpublish');
				JToolBarHelper::archiveList('appointments.archive');

				if ($this->canDo->get('core.admin'))
				{
					JToolBarHelper::checkin('appointments.checkin');
				}
			}

			// Add a batch button
			if ($this->canBatch && $this->canCreate &&
$this->canEdit && $this->canState)
			{
				// Get the toolbar object instance
				$bar = JToolBar::getInstance('toolbar');
				// set the batch button name
				$title = JText::_('JTOOLBAR_BATCH');
				// Instantiate a new JLayoutFile instance and render the batch button
				$layout = new JLayoutFile('joomla.toolbar.batch');
				// add the button to the page
				$dhtml = $layout->render(array('title' => $title));
				$bar->appendButton('Custom', $dhtml, 'batch');
			}

			if ($this->state->get('filter.published') == -2
&& ($this->canState && $this->canDelete))
			{
				JToolbarHelper::deleteList('',
'appointments.delete', 'JTOOLBAR_EMPTY_TRASH');
			}
			elseif ($this->canState && $this->canDelete)
			{
				JToolbarHelper::trash('appointments.trash');
			}

			if ($this->canDo->get('core.export') &&
$this->canDo->get('appointment.export'))
			{
				JToolBarHelper::custom('appointments.exportData',
'download', '',
'COM_RESERVATION_EXPORT_DATA', true);
			}
		}

		if ($this->canDo->get('core.import') &&
$this->canDo->get('appointment.import'))
		{
			JToolBarHelper::custom('appointments.importData',
'upload', '', 'COM_RESERVATION_IMPORT_DATA',
false);
		}

		// set help url for this view if found
		$help_url = ReservationHelper::getHelpUrl('appointments');
		if (ReservationHelper::checkString($help_url))
		{
				JToolbarHelper::help('COM_RESERVATION_HELP_MANAGER', false,
$help_url);
		}

		// add the options comp button
		if ($this->canDo->get('core.admin') ||
$this->canDo->get('core.options'))
		{
			JToolBarHelper::preferences('com_reservation');
		}

		// Only load published batch if state and batch is allowed
		if ($this->canState && $this->canBatch)
		{
			JHtmlBatch_::addListSelection(
				JText::_('COM_RESERVATION_KEEP_ORIGINAL_STATE'),
				'batch[published]',
				JHtml::_('select.options',
JHtml::_('jgrid.publishedOptions', array('all' =>
false)), 'value', 'text', '', true)
			);
		}

		// Only load access batch if create, edit and batch is allowed
		if ($this->canBatch && $this->canCreate &&
$this->canEdit)
		{
			JHtmlBatch_::addListSelection(
				JText::_('COM_RESERVATION_KEEP_ORIGINAL_ACCESS'),
				'batch[access]',
				JHtml::_('select.options',
JHtml::_('access.assetgroups'), 'value',
'text')
			);
		}
	}

	/**
	 * Method to set up the document properties
	 *
	 * @return void
	 */
	protected function setDocument()
	{
		if (!isset($this->document))
		{
			$this->document = JFactory::getDocument();
		}
		$this->document->setTitle(JText::_('COM_RESERVATION_APPOINTMENTS'));
		$this->document->addStyleSheet(JURI::root() .
"administrator/components/com_reservation/assets/css/appointments.css",
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') : 'text/css');
	}

	/**
	 * Escapes a value for output in a view script.
	 *
	 * @param   mixed  $var  The output to escape.
	 *
	 * @return  mixed  The escaped value.
	 */
	public function escape($var)
	{
		if(strlen($var) > 50)
		{
			// use the helper htmlEscape method instead and shorten the string
			return ReservationHelper::htmlEscape($var, $this->_charset, true);
		}
		// use the helper htmlEscape method instead.
		return ReservationHelper::htmlEscape($var, $this->_charset);
	}

	/**
	 * Returns an array of fields the table can be sorted by
	 *
	 * @return  array  Array containing the field name to sort by as the key
and display text as value
	 */
	protected function getSortFields()
	{
		return array(
			'a.ordering' =>
JText::_('JGRID_HEADING_ORDERING'),
			'a.published' => JText::_('JSTATUS'),
			'a.appointment' =>
JText::_('COM_RESERVATION_APPOINTMENT_APPOINTMENT_LABEL'),
			'a.id' => JText::_('JGRID_HEADING_ID')
		);
	}
}
PK5~�[��cK��views/bbbclass/submitbutton.jsnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		submitbutton.js
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

Joomla.submitbutton = function(task)
{
	if (task == ''){
		return false;
	} else { 
		var action = task.split('.');
		if (action[1] == 'cancel' || action[1] == 'close' ||
document.formvalidator.isValid(document.getElementById("adminForm"))){
			Joomla.submitform(task, document.getElementById("adminForm"));
			return true;
		} else {
			alert(Joomla.JText._('bbbclass, some values are not
acceptable.','Some values are unacceptable'));
			return false;
		}
	}
}PK5~�[1����views/bbbclass/tmpl/edit.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		edit.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');
JHtml::_('behavior.tooltip');
JHtml::_('behavior.formvalidation');
JHtml::_('formbehavior.chosen', 'select');
JHtml::_('behavior.keepalive');
$componentParams = $this->params; // will be removed just use
$this->params instead
?>
<script type="text/javascript">
	// waiting spinner
	var outerDiv = jQuery('body');
	jQuery('<div id="loading"></div>')
		.css("background", "rgba(255, 255, 255, .8)
url('components/com_reservation/assets/images/import.gif') 50%
15% no-repeat")
		.css("top", outerDiv.position().top -
jQuery(window).scrollTop())
		.css("left", outerDiv.position().left -
jQuery(window).scrollLeft())
		.css("width", outerDiv.width())
		.css("height", outerDiv.height())
		.css("position", "fixed")
		.css("opacity", "0.80")
		.css("-ms-filter",
"progid:DXImageTransform.Microsoft.Alpha(Opacity = 80)")
		.css("filter", "alpha(opacity = 80)")
		.css("display", "none")
		.appendTo(outerDiv);
	jQuery('#loading').show();
	// when page is ready remove and show
	jQuery(window).load(function() {
		jQuery('#reservation_loader').fadeIn('fast');
		jQuery('#loading').hide();
	});
</script>
<div id="reservation_loader" style="display:
none;">
<form action="<?php echo
JRoute::_('index.php?option=com_reservation&layout=edit&id='.
(int) $this->item->id . $this->referral); ?>"
method="post" name="adminForm" id="adminForm"
class="form-validate" enctype="multipart/form-data">

<div class="form-horizontal">

	<?php echo JHtml::_('bootstrap.startTabSet',
'bbbclassTab', array('active' =>
'details')); ?>

	<?php echo JHtml::_('bootstrap.addTab',
'bbbclassTab', 'details',
JText::_('COM_RESERVATION_BBBCLASS_DETAILS', true)); ?>
		<div class="row-fluid form-horizontal-desktop">
			<div class="span12">
				<?php echo JLayoutHelper::render('bbbclass.details_left',
$this); ?>
			</div>
		</div>
	<?php echo JHtml::_('bootstrap.endTab'); ?>

	<?php $this->ignore_fieldsets =
array('details','metadata','vdmmetadata','accesscontrol');
?>
	<?php $this->tab_name = 'bbbclassTab'; ?>
	<?php echo JLayoutHelper::render('joomla.edit.params',
$this); ?>

	<?php if ($this->canDo->get('core.edit.created_by') ||
$this->canDo->get('core.edit.created') ||
$this->canDo->get('core.edit.state') ||
($this->canDo->get('core.delete') &&
$this->canDo->get('core.edit.state'))) : ?>
	<?php echo JHtml::_('bootstrap.addTab',
'bbbclassTab', 'publishing',
JText::_('COM_RESERVATION_BBBCLASS_PUBLISHING', true)); ?>
		<div class="row-fluid form-horizontal-desktop">
			<div class="span6">
				<?php echo JLayoutHelper::render('bbbclass.publishing',
$this); ?>
			</div>
			<div class="span6">
				<?php echo JLayoutHelper::render('bbbclass.publlshing',
$this); ?>
			</div>
		</div>
	<?php echo JHtml::_('bootstrap.endTab'); ?>
	<?php endif; ?>

	<?php if ($this->canDo->get('core.admin')) : ?>
	<?php echo JHtml::_('bootstrap.addTab',
'bbbclassTab', 'permissions',
JText::_('COM_RESERVATION_BBBCLASS_PERMISSION', true)); ?>
		<div class="row-fluid form-horizontal-desktop">
			<div class="span12">
				<fieldset class="adminform">
					<div class="adminformlist">
					<?php foreach
($this->form->getFieldset('accesscontrol') as $field):
?>
						<div>
							<?php echo $field->label; echo $field->input;?>
						</div>
						<div class="clearfix"></div>
					<?php endforeach; ?>
					</div>
				</fieldset>
			</div>
		</div>
	<?php echo JHtml::_('bootstrap.endTab'); ?>
	<?php endif; ?>

	<?php echo JHtml::_('bootstrap.endTabSet'); ?>

	<div>
		<input type="hidden" name="task"
value="bbbclass.edit" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</div>
</form>
</div>
PK5~�[�#o,,views/bbbclass/tmpl/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[�Z�yyviews/bbbclass/view.html.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		view.html.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

/**
 * Bbbclass View class
 */
class ReservationViewBbbclass extends JViewLegacy
{
	/**
	 * display method of View
	 * @return void
	 */
	public function display($tpl = null)
	{
		// set params
		$this->params =
JComponentHelper::getParams('com_reservation');
		// Assign the variables
		$this->form = $this->get('Form');
		$this->item = $this->get('Item');
		$this->script = $this->get('Script');
		$this->state = $this->get('State');
		// get action permissions
		$this->canDo = ReservationHelper::getActions('bbbclass',
$this->item);
		// get input
		$jinput = JFactory::getApplication()->input;
		$this->ref = $jinput->get('ref', 0, 'word');
		$this->refid = $jinput->get('refid', 0, 'int');
		$return = $jinput->get('return', null, 'base64');
		// set the referral string
		$this->referral = '';
		if ($this->refid && $this->ref)
		{
			// return to the item that referred to this item
			$this->referral = '&ref=' . (string)$this->ref .
'&refid=' . (int)$this->refid;
		}
		elseif($this->ref)
		{
			// return to the list view that referred to this item
			$this->referral = '&ref=' . (string)$this->ref;
		}
		// check return value
		if (!is_null($return))
		{
			// add the return value
			$this->referral .= '&return=' . (string)$return;
		}

		// Set the toolbar
		$this->addToolBar();
		
		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		// Display the template
		parent::display($tpl);

		// Set the document
		$this->setDocument();
	}


	/**
	 * Setting the toolbar
	 */
	protected function addToolBar()
	{
		JFactory::getApplication()->input->set('hidemainmenu',
true);
		$user = JFactory::getUser();
		$userId	= $user->id;
		$isNew = $this->item->id == 0;

		JToolbarHelper::title( JText::_($isNew ?
'COM_RESERVATION_BBBCLASS_NEW' :
'COM_RESERVATION_BBBCLASS_EDIT'), 'pencil-2
article-add');
		// Built the actions for new and existing records.
		if (ReservationHelper::checkString($this->referral))
		{
			if ($this->canDo->get('core.create') && $isNew)
			{
				// We can create the record.
				JToolBarHelper::save('bbbclass.save',
'JTOOLBAR_SAVE');
			}
			elseif ($this->canDo->get('core.edit'))
			{
				// We can save the record.
				JToolBarHelper::save('bbbclass.save',
'JTOOLBAR_SAVE');
			}
			if ($isNew)
			{
				// Do not creat but cancel.
				JToolBarHelper::cancel('bbbclass.cancel',
'JTOOLBAR_CANCEL');
			}
			else
			{
				// We can close it.
				JToolBarHelper::cancel('bbbclass.cancel',
'JTOOLBAR_CLOSE');
			}
		}
		else
		{
			if ($isNew)
			{
				// For new records, check the create permission.
				if ($this->canDo->get('core.create'))
				{
					JToolBarHelper::apply('bbbclass.apply',
'JTOOLBAR_APPLY');
					JToolBarHelper::save('bbbclass.save',
'JTOOLBAR_SAVE');
					JToolBarHelper::custom('bbbclass.save2new',
'save-new.png', 'save-new_f2.png',
'JTOOLBAR_SAVE_AND_NEW', false);
				};
				JToolBarHelper::cancel('bbbclass.cancel',
'JTOOLBAR_CANCEL');
			}
			else
			{
				if ($this->canDo->get('core.edit'))
				{
					// We can save the new record
					JToolBarHelper::apply('bbbclass.apply',
'JTOOLBAR_APPLY');
					JToolBarHelper::save('bbbclass.save',
'JTOOLBAR_SAVE');
					// We can save this record, but check the create permission to see
					// if we can return to make a new one.
					if ($this->canDo->get('core.create'))
					{
						JToolBarHelper::custom('bbbclass.save2new',
'save-new.png', 'save-new_f2.png',
'JTOOLBAR_SAVE_AND_NEW', false);
					}
				}
				$canVersion = ($this->canDo->get('core.version')
&& $this->canDo->get('bbbclass.version'));
				if ($this->state->params->get('save_history', 1)
&& $this->canDo->get('core.edit') &&
$canVersion)
				{
					JToolbarHelper::versions('com_reservation.bbbclass',
$this->item->id);
				}
				if ($this->canDo->get('core.create'))
				{
					JToolBarHelper::custom('bbbclass.save2copy',
'save-copy.png', 'save-copy_f2.png',
'JTOOLBAR_SAVE_AS_COPY', false);
				}
				JToolBarHelper::cancel('bbbclass.cancel',
'JTOOLBAR_CLOSE');
			}
		}
		JToolbarHelper::divider();
		// set help url for this view if found
		$help_url = ReservationHelper::getHelpUrl('bbbclass');
		if (ReservationHelper::checkString($help_url))
		{
			JToolbarHelper::help('COM_RESERVATION_HELP_MANAGER', false,
$help_url);
		}
	}

	/**
	 * Escapes a value for output in a view script.
	 *
	 * @param   mixed  $var  The output to escape.
	 *
	 * @return  mixed  The escaped value.
	 */
	public function escape($var)
	{
		if(strlen($var) > 30)
		{
    		// use the helper htmlEscape method instead and shorten the string
			return ReservationHelper::htmlEscape($var, $this->_charset, true,
30);
		}
		// use the helper htmlEscape method instead.
		return ReservationHelper::htmlEscape($var, $this->_charset);
	}

	/**
	 * Method to set up the document properties
	 *
	 * @return void
	 */
	protected function setDocument()
	{
		$isNew = ($this->item->id < 1);
		if (!isset($this->document))
		{
			$this->document = JFactory::getDocument();
		}
		$this->document->setTitle(JText::_($isNew ?
'COM_RESERVATION_BBBCLASS_NEW' :
'COM_RESERVATION_BBBCLASS_EDIT'));
		$this->document->addStyleSheet(JURI::root() .
"administrator/components/com_reservation/assets/css/bbbclass.css",
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') : 'text/css');
		// Add Ajax Token
		$this->document->addScriptDeclaration("var token =
'".JSession::getFormToken()."';");
		$this->document->addScript(JURI::root() . $this->script,
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') :
'text/javascript');
		$this->document->addScript(JURI::root() .
"administrator/components/com_reservation/views/bbbclass/submitbutton.js",
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') :
'text/javascript'); 
		JText::script('view not acceptable. Error');
	}
}
PK5~�[�#o,,views/bbbclasses/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[�
��!views/bbbclasses/tmpl/default.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

JHtml::_('behavior.tooltip');
JHtml::_('behavior.multiselect');
JHtml::_('dropdown.init');
JHtml::_('formbehavior.chosen',
'.multipleAccessLevels', null,
array('placeholder_text_multiple' => '- ' .
JText::_('COM_RESERVATION_FILTER_SELECT_ACCESS') . '
-'));
JHtml::_('formbehavior.chosen', 'select');
if ($this->saveOrder)
{
	$saveOrderingUrl =
'index.php?option=com_reservation&task=bbbclasses.saveOrderAjax&tmpl=component';
	JHtml::_('sortablelist.sortable', 'bbbclassList',
'adminForm', strtolower($this->listDirn), $saveOrderingUrl);
}
?>
<form action="<?php echo
JRoute::_('index.php?option=com_reservation&view=bbbclasses');
?>" method="post" name="adminForm"
id="adminForm">
<?php if(!empty( $this->sidebar)): ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif; ?>
<?php
	// Add the searchtools
	echo JLayoutHelper::render('joomla.searchtools.default',
array('view' => $this));
?>
<?php if (empty($this->items)): ?>
	<div class="alert alert-no-items">
		<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
	</div>
<?php else : ?>
	<table class="table table-striped"
id="bbbclassList">
		<thead><?php echo
$this->loadTemplate('head');?></thead>
		<tfoot><?php echo
$this->loadTemplate('foot');?></tfoot>
		<tbody><?php echo
$this->loadTemplate('body');?></tbody>
	</table>
	<?php // Load the batch processing form. ?>
	<?php if ($this->canCreate && $this->canEdit) : ?>
		<?php echo JHtml::_(
			'bootstrap.renderModal',
			'collapseModal',
			array(
				'title' =>
JText::_('COM_RESERVATION_BBBCLASSES_BATCH_OPTIONS'),
				'footer' =>
$this->loadTemplate('batch_footer')
			),
			$this->loadTemplate('batch_body')
		); ?>
	<?php endif; ?>
	<input type="hidden" name="boxchecked"
value="0" />
	</div>
<?php endif; ?>
	<input type="hidden" name="task" value=""
/>
	<?php echo JHtml::_('form.token'); ?>
</form>
PK5~�[�S����,views/bbbclasses/tmpl/default_batch_body.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_batch_body.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>

<p><?php echo
JText::_('COM_RESERVATION_BBBCLASSES_BATCH_TIP'); ?></p>
<?php echo $this->batchDisplay;
?>PK5~�[��=i��.views/bbbclasses/tmpl/default_batch_footer.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_batch_footer.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<!-- clear the batch values if cancel -->
<button class="btn" type="button"
onclick="" data-dismiss="modal">
	<?php echo JText::_('JCANCEL'); ?>
</button>
<!-- post the batch values if process -->
<button class="btn btn-success" type="submit"
onclick="Joomla.submitbutton('bbbclass.batch');">
	<?php echo JText::_('JGLOBAL_BATCH_PROCESS'); ?>
</button>PK5~�["�&views/bbbclasses/tmpl/default_body.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_body.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

$edit =
"index.php?option=com_reservation&view=bbbclasses&task=bbbclass.edit";

?>
<?php foreach ($this->items as $i => $item): ?>
	<?php
		$canCheckin = $this->user->authorise('core.manage',
'com_checkin') || $item->checked_out == $this->user->id
|| $item->checked_out == 0;
		$userChkOut = JFactory::getUser($item->checked_out);
		$canDo =
ReservationHelper::getActions('bbbclass',$item,'bbbclasses');
	?>
	<tr class="row<?php echo $i % 2; ?>">
		<td class="order nowrap center hidden-phone">
		<?php if ($canDo->get('core.edit.state')): ?>
			<?php
				$iconClass = '';
				if (!$this->saveOrder)
				{
					$iconClass = ' inactive tip-top" hasTooltip"
title="' . JHtml::tooltipText('JORDERINGDISABLED');
				}
			?>
			<span class="sortable-handler<?php echo $iconClass;
?>">
				<i class="icon-menu"></i>
			</span>
			<?php if ($this->saveOrder) : ?>
				<input type="text" style="display:none"
name="order[]" size="5"
				value="<?php echo $item->ordering; ?>"
class="width-20 text-area-order " />
			<?php endif; ?>
		<?php else: ?>
			&#8942;
		<?php endif; ?>
		</td>
		<td class="nowrap center">
		<?php if ($canDo->get('core.edit')): ?>
				<?php if ($item->checked_out) : ?>
					<?php if ($canCheckin) : ?>
						<?php echo JHtml::_('grid.id', $i, $item->id); ?>
					<?php else: ?>
						&#9633;
					<?php endif; ?>
				<?php else: ?>
					<?php echo JHtml::_('grid.id', $i, $item->id); ?>
				<?php endif; ?>
		<?php else: ?>
			&#9633;
		<?php endif; ?>
		</td>
		<td class="nowrap">
			<div class="name">
				<?php if ($canDo->get('core.edit')): ?>
					<a href="<?php echo $edit; ?>&id=<?php echo
$item->id; ?>"><?php echo
$this->escape($item->name); ?></a>
					<?php if ($item->checked_out): ?>
						<?php echo JHtml::_('jgrid.checkedout', $i,
$userChkOut->name, $item->checked_out_time, 'bbbclasses.',
$canCheckin); ?>
					<?php endif; ?>
				<?php else: ?>
					<?php echo $this->escape($item->name); ?>
				<?php endif; ?>
			</div>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->planid_id); ?>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->seid); ?>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->exmid); ?>
		</td>
		<td class="center">
		<?php if ($canDo->get('core.edit.state')) : ?>
				<?php if ($item->checked_out) : ?>
					<?php if ($canCheckin) : ?>
						<?php echo JHtml::_('jgrid.published',
$item->published, $i, 'bbbclasses.', true, 'cb');
?>
					<?php else: ?>
						<?php echo JHtml::_('jgrid.published',
$item->published, $i, 'bbbclasses.', false, 'cb');
?>
					<?php endif; ?>
				<?php else: ?>
					<?php echo JHtml::_('jgrid.published',
$item->published, $i, 'bbbclasses.', true, 'cb');
?>
				<?php endif; ?>
		<?php else: ?>
			<?php echo JHtml::_('jgrid.published', $item->published,
$i, 'bbbclasses.', false, 'cb'); ?>
		<?php endif; ?>
		</td>
		<td class="nowrap center hidden-phone">
			<?php echo $item->id; ?>
		</td>
	</tr>
<?php endforeach; ?>PK5~�[�
���&views/bbbclasses/tmpl/default_foot.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_foot.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<tr>
	<td colspan="8"><?php echo
$this->pagination->getListFooter(); ?></td>
</tr>PK5~�[�MT��
�
&views/bbbclasses/tmpl/default_head.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_head.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<tr>
	<?php if ($this->canEdit&& $this->canState): ?>
		<th width="1%" class="nowrap center
hidden-phone">
			<?php echo JHtml::_('searchtools.sort', '',
'a.ordering', $this->listDirn, $this->listOrder, null,
'asc', 'JGRID_HEADING_ORDERING',
'icon-menu-2'); ?>
		</th>
		<th width="20" class="nowrap center">
			<?php echo JHtml::_('grid.checkall'); ?>
		</th>
	<?php else: ?>
		<th width="20" class="nowrap center
hidden-phone">
			&#9662;
		</th>
		<th width="20" class="nowrap center">
			&#9632;
		</th>
	<?php endif; ?>
	<th class="nowrap" >
			<?php echo JHtml::_('searchtools.sort',
'COM_RESERVATION_BBBCLASS_NAME_LABEL', 'a.name',
$this->listDirn, $this->listOrder); ?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo JHtml::_('searchtools.sort',
'COM_RESERVATION_BBBCLASS_PLANID_LABEL', 'g.id',
$this->listDirn, $this->listOrder); ?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo JText::_('COM_RESERVATION_BBBCLASS_SEID_LABEL');
?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo
JText::_('COM_RESERVATION_BBBCLASS_EXMID_LABEL'); ?>
	</th>
	<?php if ($this->canState): ?>
		<th width="10" class="nowrap center" >
			<?php echo JHtml::_('searchtools.sort',
'COM_RESERVATION_BBBCLASS_STATUS', 'a.published',
$this->listDirn, $this->listOrder); ?>
		</th>
	<?php else: ?>
		<th width="10" class="nowrap center" >
			<?php echo JText::_('COM_RESERVATION_BBBCLASS_STATUS');
?>
		</th>
	<?php endif; ?>
	<th width="5" class="nowrap center hidden-phone"
>
			<?php echo JHtml::_('searchtools.sort',
'COM_RESERVATION_BBBCLASS_ID', 'a.id',
$this->listDirn, $this->listOrder); ?>
	</th>
</tr>PK5~�[&V77)views/bbbclasses/tmpl/default_toolbar.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_toolbar.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<div id="filter-bar" class="btn-toolbar">
        <div class="filter-search btn-group pull-left">
            <label for="filter_search"
class="element-invisible"><?php echo
JText::_('Search');?></label>
            <input type="text" name="filter_search"
id="filter_search" placeholder="<?php echo
JText::_('JSEARCH_FILTER'); ?>" value="<?php echo
$this->escape($this->state->get('filter.search'));
?>" class="hasTooltip" title="<?php echo
JHtml::tooltipText('Search Bbbclasses'); ?>" />
        </div>
        <div class="btn-group pull-left">
            <button type="submit" class="btn
hasTooltip" title="<?php echo
JHtml::tooltipText('JSEARCH_FILTER_SUBMIT'); ?>"><i
class="icon-search"></i></button>
            <button type="button" class="btn
hasTooltip" title="<?php echo
JHtml::tooltipText('JSEARCH_FILTER_CLEAR'); ?>"
onclick="document.id('filter_search').value='';this.form.submit();"><i
class="icon-remove"></i></button>
        </div>
        <div class="btn-group pull-right hidden-phone">
            <label for="limit"
class="element-invisible"><?php echo
JText::_('JFIELD_PLG_SEARCH_SEARCHLIMIT_DESC');?></label>
            <?php echo $this->pagination->getLimitBox(); ?>
        </div>
        <div class="btn-group pull-right hidden-phone">
            <label for="directionTable"
class="element-invisible"><?php echo
JText::_('JFIELD_ORDERING_DESC');?></label>
            <select name="directionTable"
id="directionTable" class="input-medium"
onchange="Joomla.orderTable()">
                <option value=""><?php echo
JText::_('JFIELD_ORDERING_DESC');?></option>
                <option value="asc" <?php if
($this->listDirn == 'asc') echo
'selected="selected"'; ?>><?php echo
JText::_('JGLOBAL_ORDER_ASCENDING');?></option>
                <option value="desc" <?php if
($this->listDirn == 'desc') echo
'selected="selected"'; ?>><?php echo
JText::_('JGLOBAL_ORDER_DESCENDING');?></option>
            </select>
        </div>
        <div class="btn-group pull-right">
            <label for="sortTable"
class="element-invisible"><?php echo
JText::_('JGLOBAL_SORT_BY');?></label>
            <select name="sortTable" id="sortTable"
class="input-medium" onchange="Joomla.orderTable()">
                <option value=""><?php echo
JText::_('JGLOBAL_SORT_BY');?></option>
                <?php echo JHtml::_('select.options',
$this->getSortFields(), 'value', 'text',
$this->listOrder);?>
            </select>
        </div>
    </div>
<div class="clearfix"> </div>PK5~�[�#o,,
views/bbbclasses/tmpl/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[?D}5))views/bbbclasses/view.html.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		view.html.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

/**
 * Reservation View class for the Bbbclasses
 */
class ReservationViewBbbclasses extends JViewLegacy
{
	/**
	 * Bbbclasses view display method
	 * @return void
	 */
	function display($tpl = null)
	{
		if ($this->getLayout() !== 'modal')
		{
			// Include helper submenu
			ReservationHelper::addSubmenu('bbbclasses');
		}

		// Assign data to the view
		$this->items = $this->get('Items');
		$this->pagination = $this->get('Pagination');
		$this->state = $this->get('State');
		$this->user = JFactory::getUser();
		// Load the filter form from xml.
		$this->filterForm = $this->get('FilterForm');
		// Load the active filters.
		$this->activeFilters = $this->get('ActiveFilters');
		// Add the list ordering clause.
		$this->listOrder =
$this->escape($this->state->get('list.ordering',
'a.id'));
		$this->listDirn =
$this->escape($this->state->get('list.direction',
'DESC'));
		$this->saveOrder = $this->listOrder == 'a.ordering';
		// set the return here value
		$this->return_here = urlencode(base64_encode((string)
JUri::getInstance()));
		// get global action permissions
		$this->canDo = ReservationHelper::getActions('bbbclass');
		$this->canEdit = $this->canDo->get('core.edit');
		$this->canState =
$this->canDo->get('core.edit.state');
		$this->canCreate = $this->canDo->get('core.create');
		$this->canDelete = $this->canDo->get('core.delete');
		$this->canBatch = $this->canDo->get('core.batch');

		// We don't need toolbar in the modal window.
		if ($this->getLayout() !== 'modal')
		{
			$this->addToolbar();
			$this->sidebar = JHtmlSidebar::render();
			// load the batch html
			if ($this->canCreate && $this->canEdit &&
$this->canState)
			{
				$this->batchDisplay = JHtmlBatch_::render();
			}
		}
		
		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		// Display the template
		parent::display($tpl);

		// Set the document
		$this->setDocument();
	}

	/**
	 * Setting the toolbar
	 */
	protected function addToolBar()
	{
		JToolBarHelper::title(JText::_('COM_RESERVATION_BBBCLASSES'),
'joomla');
		JHtmlSidebar::setAction('index.php?option=com_reservation&view=bbbclasses');
		JFormHelper::addFieldPath(JPATH_COMPONENT . '/models/fields');

		if ($this->canCreate)
		{
			JToolBarHelper::addNew('bbbclass.add');
		}

		// Only load if there are items
		if (ReservationHelper::checkArray($this->items))
		{
			if ($this->canEdit)
			{
				JToolBarHelper::editList('bbbclass.edit');
			}

			if ($this->canState)
			{
				JToolBarHelper::publishList('bbbclasses.publish');
				JToolBarHelper::unpublishList('bbbclasses.unpublish');
				JToolBarHelper::archiveList('bbbclasses.archive');

				if ($this->canDo->get('core.admin'))
				{
					JToolBarHelper::checkin('bbbclasses.checkin');
				}
			}

			// Add a batch button
			if ($this->canBatch && $this->canCreate &&
$this->canEdit && $this->canState)
			{
				// Get the toolbar object instance
				$bar = JToolBar::getInstance('toolbar');
				// set the batch button name
				$title = JText::_('JTOOLBAR_BATCH');
				// Instantiate a new JLayoutFile instance and render the batch button
				$layout = new JLayoutFile('joomla.toolbar.batch');
				// add the button to the page
				$dhtml = $layout->render(array('title' => $title));
				$bar->appendButton('Custom', $dhtml, 'batch');
			}

			if ($this->state->get('filter.published') == -2
&& ($this->canState && $this->canDelete))
			{
				JToolbarHelper::deleteList('', 'bbbclasses.delete',
'JTOOLBAR_EMPTY_TRASH');
			}
			elseif ($this->canState && $this->canDelete)
			{
				JToolbarHelper::trash('bbbclasses.trash');
			}

			if ($this->canDo->get('core.export') &&
$this->canDo->get('bbbclass.export'))
			{
				JToolBarHelper::custom('bbbclasses.exportData',
'download', '',
'COM_RESERVATION_EXPORT_DATA', true);
			}
		}

		if ($this->canDo->get('core.import') &&
$this->canDo->get('bbbclass.import'))
		{
			JToolBarHelper::custom('bbbclasses.importData',
'upload', '', 'COM_RESERVATION_IMPORT_DATA',
false);
		}

		// set help url for this view if found
		$help_url = ReservationHelper::getHelpUrl('bbbclasses');
		if (ReservationHelper::checkString($help_url))
		{
				JToolbarHelper::help('COM_RESERVATION_HELP_MANAGER', false,
$help_url);
		}

		// add the options comp button
		if ($this->canDo->get('core.admin') ||
$this->canDo->get('core.options'))
		{
			JToolBarHelper::preferences('com_reservation');
		}

		// Only load published batch if state and batch is allowed
		if ($this->canState && $this->canBatch)
		{
			JHtmlBatch_::addListSelection(
				JText::_('COM_RESERVATION_KEEP_ORIGINAL_STATE'),
				'batch[published]',
				JHtml::_('select.options',
JHtml::_('jgrid.publishedOptions', array('all' =>
false)), 'value', 'text', '', true)
			);
		}

		// Only load access batch if create, edit and batch is allowed
		if ($this->canBatch && $this->canCreate &&
$this->canEdit)
		{
			JHtmlBatch_::addListSelection(
				JText::_('COM_RESERVATION_KEEP_ORIGINAL_ACCESS'),
				'batch[access]',
				JHtml::_('select.options',
JHtml::_('access.assetgroups'), 'value',
'text')
			);
		}
	}

	/**
	 * Method to set up the document properties
	 *
	 * @return void
	 */
	protected function setDocument()
	{
		if (!isset($this->document))
		{
			$this->document = JFactory::getDocument();
		}
		$this->document->setTitle(JText::_('COM_RESERVATION_BBBCLASSES'));
		$this->document->addStyleSheet(JURI::root() .
"administrator/components/com_reservation/assets/css/bbbclasses.css",
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') : 'text/css');
	}

	/**
	 * Escapes a value for output in a view script.
	 *
	 * @param   mixed  $var  The output to escape.
	 *
	 * @return  mixed  The escaped value.
	 */
	public function escape($var)
	{
		if(strlen($var) > 50)
		{
			// use the helper htmlEscape method instead and shorten the string
			return ReservationHelper::htmlEscape($var, $this->_charset, true);
		}
		// use the helper htmlEscape method instead.
		return ReservationHelper::htmlEscape($var, $this->_charset);
	}

	/**
	 * Returns an array of fields the table can be sorted by
	 *
	 * @return  array  Array containing the field name to sort by as the key
and display text as value
	 */
	protected function getSortFields()
	{
		return array(
			'a.ordering' =>
JText::_('JGRID_HEADING_ORDERING'),
			'a.published' => JText::_('JSTATUS'),
			'a.name' =>
JText::_('COM_RESERVATION_BBBCLASS_NAME_LABEL'),
			'g.id' =>
JText::_('COM_RESERVATION_BBBCLASS_PLANID_LABEL'),
			'a.id' => JText::_('JGRID_HEADING_ID')
		);
	}
}
PK5~�[[���views/capital/submitbutton.jsnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		submitbutton.js
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

Joomla.submitbutton = function(task)
{
	if (task == ''){
		return false;
	} else { 
		var action = task.split('.');
		if (action[1] == 'cancel' || action[1] == 'close' ||
document.formvalidator.isValid(document.getElementById("adminForm"))){
			Joomla.submitform(task, document.getElementById("adminForm"));
			return true;
		} else {
			alert(Joomla.JText._('capital, some values are not
acceptable.','Some values are unacceptable'));
			return false;
		}
	}
}PK5~�[��r���views/capital/tmpl/edit.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		edit.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');
JHtml::_('behavior.tooltip');
JHtml::_('behavior.formvalidation');
JHtml::_('formbehavior.chosen', 'select');
JHtml::_('behavior.keepalive');
$componentParams = $this->params; // will be removed just use
$this->params instead
?>
<script type="text/javascript">
	// waiting spinner
	var outerDiv = jQuery('body');
	jQuery('<div id="loading"></div>')
		.css("background", "rgba(255, 255, 255, .8)
url('components/com_reservation/assets/images/import.gif') 50%
15% no-repeat")
		.css("top", outerDiv.position().top -
jQuery(window).scrollTop())
		.css("left", outerDiv.position().left -
jQuery(window).scrollLeft())
		.css("width", outerDiv.width())
		.css("height", outerDiv.height())
		.css("position", "fixed")
		.css("opacity", "0.80")
		.css("-ms-filter",
"progid:DXImageTransform.Microsoft.Alpha(Opacity = 80)")
		.css("filter", "alpha(opacity = 80)")
		.css("display", "none")
		.appendTo(outerDiv);
	jQuery('#loading').show();
	// when page is ready remove and show
	jQuery(window).load(function() {
		jQuery('#reservation_loader').fadeIn('fast');
		jQuery('#loading').hide();
	});
</script>
<div id="reservation_loader" style="display:
none;">
<form action="<?php echo
JRoute::_('index.php?option=com_reservation&layout=edit&id='.
(int) $this->item->id . $this->referral); ?>"
method="post" name="adminForm" id="adminForm"
class="form-validate" enctype="multipart/form-data">

<div class="form-horizontal">

	<?php echo JHtml::_('bootstrap.startTabSet',
'capitalTab', array('active' =>
'details')); ?>

	<?php echo JHtml::_('bootstrap.addTab',
'capitalTab', 'details',
JText::_('COM_RESERVATION_CAPITAL_DETAILS', true)); ?>
		<div class="row-fluid form-horizontal-desktop">
			<div class="span6">
				<?php echo JLayoutHelper::render('capital.details_left',
$this); ?>
			</div>
			<div class="span6">
				<?php echo JLayoutHelper::render('capital.details_right',
$this); ?>
			</div>
		</div>
	<?php echo JHtml::_('bootstrap.endTab'); ?>

	<?php $this->ignore_fieldsets =
array('details','metadata','vdmmetadata','accesscontrol');
?>
	<?php $this->tab_name = 'capitalTab'; ?>
	<?php echo JLayoutHelper::render('joomla.edit.params',
$this); ?>

	<?php if ($this->canDo->get('core.edit.created_by') ||
$this->canDo->get('core.edit.created') ||
$this->canDo->get('core.edit.state') ||
($this->canDo->get('core.delete') &&
$this->canDo->get('core.edit.state'))) : ?>
	<?php echo JHtml::_('bootstrap.addTab',
'capitalTab', 'publishing',
JText::_('COM_RESERVATION_CAPITAL_PUBLISHING', true)); ?>
		<div class="row-fluid form-horizontal-desktop">
			<div class="span6">
				<?php echo JLayoutHelper::render('capital.publishing',
$this); ?>
			</div>
			<div class="span6">
				<?php echo JLayoutHelper::render('capital.publlshing',
$this); ?>
			</div>
		</div>
	<?php echo JHtml::_('bootstrap.endTab'); ?>
	<?php endif; ?>

	<?php if ($this->canDo->get('core.admin')) : ?>
	<?php echo JHtml::_('bootstrap.addTab',
'capitalTab', 'permissions',
JText::_('COM_RESERVATION_CAPITAL_PERMISSION', true)); ?>
		<div class="row-fluid form-horizontal-desktop">
			<div class="span12">
				<fieldset class="adminform">
					<div class="adminformlist">
					<?php foreach
($this->form->getFieldset('accesscontrol') as $field):
?>
						<div>
							<?php echo $field->label; echo $field->input;?>
						</div>
						<div class="clearfix"></div>
					<?php endforeach; ?>
					</div>
				</fieldset>
			</div>
		</div>
	<?php echo JHtml::_('bootstrap.endTab'); ?>
	<?php endif; ?>

	<?php echo JHtml::_('bootstrap.endTabSet'); ?>

	<div>
		<input type="hidden" name="task"
value="capital.edit" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</div>
</form>
</div>
PK5~�[�#o,,views/capital/tmpl/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[�%=��views/capital/view.html.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		view.html.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

/**
 * Capital View class
 */
class ReservationViewCapital extends JViewLegacy
{
	/**
	 * display method of View
	 * @return void
	 */
	public function display($tpl = null)
	{
		// set params
		$this->params =
JComponentHelper::getParams('com_reservation');
		// Assign the variables
		$this->form = $this->get('Form');
		$this->item = $this->get('Item');
		$this->script = $this->get('Script');
		$this->state = $this->get('State');
		// get action permissions
		$this->canDo = ReservationHelper::getActions('capital',
$this->item);
		// get input
		$jinput = JFactory::getApplication()->input;
		$this->ref = $jinput->get('ref', 0, 'word');
		$this->refid = $jinput->get('refid', 0, 'int');
		$return = $jinput->get('return', null, 'base64');
		// set the referral string
		$this->referral = '';
		if ($this->refid && $this->ref)
		{
			// return to the item that referred to this item
			$this->referral = '&ref=' . (string)$this->ref .
'&refid=' . (int)$this->refid;
		}
		elseif($this->ref)
		{
			// return to the list view that referred to this item
			$this->referral = '&ref=' . (string)$this->ref;
		}
		// check return value
		if (!is_null($return))
		{
			// add the return value
			$this->referral .= '&return=' . (string)$return;
		}

		// Set the toolbar
		$this->addToolBar();
		
		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		// Display the template
		parent::display($tpl);

		// Set the document
		$this->setDocument();
	}


	/**
	 * Setting the toolbar
	 */
	protected function addToolBar()
	{
		JFactory::getApplication()->input->set('hidemainmenu',
true);
		$user = JFactory::getUser();
		$userId	= $user->id;
		$isNew = $this->item->id == 0;

		JToolbarHelper::title( JText::_($isNew ?
'COM_RESERVATION_CAPITAL_NEW' :
'COM_RESERVATION_CAPITAL_EDIT'), 'pencil-2
article-add');
		// Built the actions for new and existing records.
		if (ReservationHelper::checkString($this->referral))
		{
			if ($this->canDo->get('core.create') && $isNew)
			{
				// We can create the record.
				JToolBarHelper::save('capital.save',
'JTOOLBAR_SAVE');
			}
			elseif ($this->canDo->get('core.edit'))
			{
				// We can save the record.
				JToolBarHelper::save('capital.save',
'JTOOLBAR_SAVE');
			}
			if ($isNew)
			{
				// Do not creat but cancel.
				JToolBarHelper::cancel('capital.cancel',
'JTOOLBAR_CANCEL');
			}
			else
			{
				// We can close it.
				JToolBarHelper::cancel('capital.cancel',
'JTOOLBAR_CLOSE');
			}
		}
		else
		{
			if ($isNew)
			{
				// For new records, check the create permission.
				if ($this->canDo->get('core.create'))
				{
					JToolBarHelper::apply('capital.apply',
'JTOOLBAR_APPLY');
					JToolBarHelper::save('capital.save',
'JTOOLBAR_SAVE');
					JToolBarHelper::custom('capital.save2new',
'save-new.png', 'save-new_f2.png',
'JTOOLBAR_SAVE_AND_NEW', false);
				};
				JToolBarHelper::cancel('capital.cancel',
'JTOOLBAR_CANCEL');
			}
			else
			{
				if ($this->canDo->get('core.edit'))
				{
					// We can save the new record
					JToolBarHelper::apply('capital.apply',
'JTOOLBAR_APPLY');
					JToolBarHelper::save('capital.save',
'JTOOLBAR_SAVE');
					// We can save this record, but check the create permission to see
					// if we can return to make a new one.
					if ($this->canDo->get('core.create'))
					{
						JToolBarHelper::custom('capital.save2new',
'save-new.png', 'save-new_f2.png',
'JTOOLBAR_SAVE_AND_NEW', false);
					}
				}
				$canVersion = ($this->canDo->get('core.version')
&& $this->canDo->get('capital.version'));
				if ($this->state->params->get('save_history', 1)
&& $this->canDo->get('core.edit') &&
$canVersion)
				{
					JToolbarHelper::versions('com_reservation.capital',
$this->item->id);
				}
				if ($this->canDo->get('core.create'))
				{
					JToolBarHelper::custom('capital.save2copy',
'save-copy.png', 'save-copy_f2.png',
'JTOOLBAR_SAVE_AS_COPY', false);
				}
				JToolBarHelper::cancel('capital.cancel',
'JTOOLBAR_CLOSE');
			}
		}
		JToolbarHelper::divider();
		// set help url for this view if found
		$help_url = ReservationHelper::getHelpUrl('capital');
		if (ReservationHelper::checkString($help_url))
		{
			JToolbarHelper::help('COM_RESERVATION_HELP_MANAGER', false,
$help_url);
		}
	}

	/**
	 * Escapes a value for output in a view script.
	 *
	 * @param   mixed  $var  The output to escape.
	 *
	 * @return  mixed  The escaped value.
	 */
	public function escape($var)
	{
		if(strlen($var) > 30)
		{
    		// use the helper htmlEscape method instead and shorten the string
			return ReservationHelper::htmlEscape($var, $this->_charset, true,
30);
		}
		// use the helper htmlEscape method instead.
		return ReservationHelper::htmlEscape($var, $this->_charset);
	}

	/**
	 * Method to set up the document properties
	 *
	 * @return void
	 */
	protected function setDocument()
	{
		$isNew = ($this->item->id < 1);
		if (!isset($this->document))
		{
			$this->document = JFactory::getDocument();
		}
		$this->document->setTitle(JText::_($isNew ?
'COM_RESERVATION_CAPITAL_NEW' :
'COM_RESERVATION_CAPITAL_EDIT'));
		$this->document->addStyleSheet(JURI::root() .
"administrator/components/com_reservation/assets/css/capital.css",
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') : 'text/css');
		$this->document->addScript(JURI::root() . $this->script,
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') :
'text/javascript');
		$this->document->addScript(JURI::root() .
"administrator/components/com_reservation/views/capital/submitbutton.js",
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') :
'text/javascript'); 
		JText::script('view not acceptable. Error');
	}
}
PK5~�[�#o,,views/capitals/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[X5�views/capitals/tmpl/default.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

JHtml::_('behavior.tooltip');
JHtml::_('behavior.multiselect');
JHtml::_('dropdown.init');
JHtml::_('formbehavior.chosen',
'.multipleAccessLevels', null,
array('placeholder_text_multiple' => '- ' .
JText::_('COM_RESERVATION_FILTER_SELECT_ACCESS') . '
-'));
JHtml::_('formbehavior.chosen', 'select');
if ($this->saveOrder)
{
	$saveOrderingUrl =
'index.php?option=com_reservation&task=capitals.saveOrderAjax&tmpl=component';
	JHtml::_('sortablelist.sortable', 'capitalList',
'adminForm', strtolower($this->listDirn), $saveOrderingUrl);
}
?>
<form action="<?php echo
JRoute::_('index.php?option=com_reservation&view=capitals');
?>" method="post" name="adminForm"
id="adminForm">
<?php if(!empty( $this->sidebar)): ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif; ?>
<?php
	// Add the searchtools
	echo JLayoutHelper::render('joomla.searchtools.default',
array('view' => $this));
?>
<?php if (empty($this->items)): ?>
	<div class="alert alert-no-items">
		<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
	</div>
<?php else : ?>
	<table class="table table-striped"
id="capitalList">
		<thead><?php echo
$this->loadTemplate('head');?></thead>
		<tfoot><?php echo
$this->loadTemplate('foot');?></tfoot>
		<tbody><?php echo
$this->loadTemplate('body');?></tbody>
	</table>
	<?php // Load the batch processing form. ?>
	<?php if ($this->canCreate && $this->canEdit) : ?>
		<?php echo JHtml::_(
			'bootstrap.renderModal',
			'collapseModal',
			array(
				'title' =>
JText::_('COM_RESERVATION_CAPITALS_BATCH_OPTIONS'),
				'footer' =>
$this->loadTemplate('batch_footer')
			),
			$this->loadTemplate('batch_body')
		); ?>
	<?php endif; ?>
	<input type="hidden" name="boxchecked"
value="0" />
	</div>
<?php endif; ?>
	<input type="hidden" name="task" value=""
/>
	<?php echo JHtml::_('form.token'); ?>
</form>
PK5~�[�(m
��*views/capitals/tmpl/default_batch_body.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_batch_body.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>

<p><?php echo
JText::_('COM_RESERVATION_CAPITALS_BATCH_TIP'); ?></p>
<?php echo $this->batchDisplay;
?>PK5~�[�C��,views/capitals/tmpl/default_batch_footer.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_batch_footer.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<!-- clear the batch values if cancel -->
<button class="btn" type="button"
onclick="" data-dismiss="modal">
	<?php echo JText::_('JCANCEL'); ?>
</button>
<!-- post the batch values if process -->
<button class="btn btn-success" type="submit"
onclick="Joomla.submitbutton('capital.batch');">
	<?php echo JText::_('JGLOBAL_BATCH_PROCESS'); ?>
</button>PK5~�[Z(�kOO$views/capitals/tmpl/default_body.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_body.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

$edit =
"index.php?option=com_reservation&view=capitals&task=capital.edit";

?>
<?php foreach ($this->items as $i => $item): ?>
	<?php
		$canCheckin = $this->user->authorise('core.manage',
'com_checkin') || $item->checked_out == $this->user->id
|| $item->checked_out == 0;
		$userChkOut = JFactory::getUser($item->checked_out);
		$canDo =
ReservationHelper::getActions('capital',$item,'capitals');
	?>
	<tr class="row<?php echo $i % 2; ?>">
		<td class="order nowrap center hidden-phone">
		<?php if ($canDo->get('core.edit.state')): ?>
			<?php
				$iconClass = '';
				if (!$this->saveOrder)
				{
					$iconClass = ' inactive tip-top" hasTooltip"
title="' . JHtml::tooltipText('JORDERINGDISABLED');
				}
			?>
			<span class="sortable-handler<?php echo $iconClass;
?>">
				<i class="icon-menu"></i>
			</span>
			<?php if ($this->saveOrder) : ?>
				<input type="text" style="display:none"
name="order[]" size="5"
				value="<?php echo $item->ordering; ?>"
class="width-20 text-area-order " />
			<?php endif; ?>
		<?php else: ?>
			&#8942;
		<?php endif; ?>
		</td>
		<td class="nowrap center">
		<?php if ($canDo->get('core.edit')): ?>
				<?php if ($item->checked_out) : ?>
					<?php if ($canCheckin) : ?>
						<?php echo JHtml::_('grid.id', $i, $item->id); ?>
					<?php else: ?>
						&#9633;
					<?php endif; ?>
				<?php else: ?>
					<?php echo JHtml::_('grid.id', $i, $item->id); ?>
				<?php endif; ?>
		<?php else: ?>
			&#9633;
		<?php endif; ?>
		</td>
		<td class="nowrap">
			<div class="name">
				<?php if ($canDo->get('core.edit')): ?>
					<a href="<?php echo $edit; ?>&id=<?php echo
$item->id; ?>"><?php echo $item->name; ?></a>
					<?php if ($item->checked_out): ?>
						<?php echo JHtml::_('jgrid.checkedout', $i,
$userChkOut->name, $item->checked_out_time, 'capitals.',
$canCheckin); ?>
					<?php endif; ?>
				<?php else: ?>
					<?php echo $item->name; ?>
				<?php endif; ?>
			</div>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->capitalid_name); ?>
		</td>
		<td class="center">
		<?php if ($canDo->get('core.edit.state')) : ?>
				<?php if ($item->checked_out) : ?>
					<?php if ($canCheckin) : ?>
						<?php echo JHtml::_('jgrid.published',
$item->published, $i, 'capitals.', true, 'cb');
?>
					<?php else: ?>
						<?php echo JHtml::_('jgrid.published',
$item->published, $i, 'capitals.', false, 'cb');
?>
					<?php endif; ?>
				<?php else: ?>
					<?php echo JHtml::_('jgrid.published',
$item->published, $i, 'capitals.', true, 'cb');
?>
				<?php endif; ?>
		<?php else: ?>
			<?php echo JHtml::_('jgrid.published', $item->published,
$i, 'capitals.', false, 'cb'); ?>
		<?php endif; ?>
		</td>
		<td class="nowrap center hidden-phone">
			<?php echo $item->id; ?>
		</td>
	</tr>
<?php endforeach;
?>PK5~�[���+��$views/capitals/tmpl/default_foot.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_foot.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<tr>
	<td colspan="6"><?php echo
$this->pagination->getListFooter(); ?></td>
</tr>PK5~�[�
"A�	�	$views/capitals/tmpl/default_head.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_head.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<tr>
	<?php if ($this->canEdit&& $this->canState): ?>
		<th width="1%" class="nowrap center
hidden-phone">
			<?php echo JHtml::_('searchtools.sort', '',
'a.ordering', $this->listDirn, $this->listOrder, null,
'asc', 'JGRID_HEADING_ORDERING',
'icon-menu-2'); ?>
		</th>
		<th width="20" class="nowrap center">
			<?php echo JHtml::_('grid.checkall'); ?>
		</th>
	<?php else: ?>
		<th width="20" class="nowrap center
hidden-phone">
			&#9662;
		</th>
		<th width="20" class="nowrap center">
			&#9632;
		</th>
	<?php endif; ?>
	<th class="nowrap" >
			<?php echo JHtml::_('searchtools.sort',
'COM_RESERVATION_CAPITAL_NAME_LABEL', 'a.name',
$this->listDirn, $this->listOrder); ?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo JHtml::_('searchtools.sort',
'COM_RESERVATION_CAPITAL_CAPITALID_LABEL', 'g.name',
$this->listDirn, $this->listOrder); ?>
	</th>
	<?php if ($this->canState): ?>
		<th width="10" class="nowrap center" >
			<?php echo JHtml::_('searchtools.sort',
'COM_RESERVATION_CAPITAL_STATUS', 'a.published',
$this->listDirn, $this->listOrder); ?>
		</th>
	<?php else: ?>
		<th width="10" class="nowrap center" >
			<?php echo JText::_('COM_RESERVATION_CAPITAL_STATUS');
?>
		</th>
	<?php endif; ?>
	<th width="5" class="nowrap center hidden-phone"
>
			<?php echo JHtml::_('searchtools.sort',
'COM_RESERVATION_CAPITAL_ID', 'a.id',
$this->listDirn, $this->listOrder); ?>
	</th>
</tr>PK5~�[��55'views/capitals/tmpl/default_toolbar.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_toolbar.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<div id="filter-bar" class="btn-toolbar">
        <div class="filter-search btn-group pull-left">
            <label for="filter_search"
class="element-invisible"><?php echo
JText::_('Search');?></label>
            <input type="text" name="filter_search"
id="filter_search" placeholder="<?php echo
JText::_('JSEARCH_FILTER'); ?>" value="<?php echo
$this->escape($this->state->get('filter.search'));
?>" class="hasTooltip" title="<?php echo
JHtml::tooltipText('Search Capitals'); ?>" />
        </div>
        <div class="btn-group pull-left">
            <button type="submit" class="btn
hasTooltip" title="<?php echo
JHtml::tooltipText('JSEARCH_FILTER_SUBMIT'); ?>"><i
class="icon-search"></i></button>
            <button type="button" class="btn
hasTooltip" title="<?php echo
JHtml::tooltipText('JSEARCH_FILTER_CLEAR'); ?>"
onclick="document.id('filter_search').value='';this.form.submit();"><i
class="icon-remove"></i></button>
        </div>
        <div class="btn-group pull-right hidden-phone">
            <label for="limit"
class="element-invisible"><?php echo
JText::_('JFIELD_PLG_SEARCH_SEARCHLIMIT_DESC');?></label>
            <?php echo $this->pagination->getLimitBox(); ?>
        </div>
        <div class="btn-group pull-right hidden-phone">
            <label for="directionTable"
class="element-invisible"><?php echo
JText::_('JFIELD_ORDERING_DESC');?></label>
            <select name="directionTable"
id="directionTable" class="input-medium"
onchange="Joomla.orderTable()">
                <option value=""><?php echo
JText::_('JFIELD_ORDERING_DESC');?></option>
                <option value="asc" <?php if
($this->listDirn == 'asc') echo
'selected="selected"'; ?>><?php echo
JText::_('JGLOBAL_ORDER_ASCENDING');?></option>
                <option value="desc" <?php if
($this->listDirn == 'desc') echo
'selected="selected"'; ?>><?php echo
JText::_('JGLOBAL_ORDER_DESCENDING');?></option>
            </select>
        </div>
        <div class="btn-group pull-right">
            <label for="sortTable"
class="element-invisible"><?php echo
JText::_('JGLOBAL_SORT_BY');?></label>
            <select name="sortTable" id="sortTable"
class="input-medium" onchange="Joomla.orderTable()">
                <option value=""><?php echo
JText::_('JGLOBAL_SORT_BY');?></option>
                <?php echo JHtml::_('select.options',
$this->getSortFields(), 'value', 'text',
$this->listOrder);?>
            </select>
        </div>
    </div>
<div class="clearfix">
</div>PK5~�[�#o,,views/capitals/tmpl/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[(4views/capitals/view.html.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		view.html.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

/**
 * Reservation View class for the Capitals
 */
class ReservationViewCapitals extends JViewLegacy
{
	/**
	 * Capitals view display method
	 * @return void
	 */
	function display($tpl = null)
	{
		if ($this->getLayout() !== 'modal')
		{
			// Include helper submenu
			ReservationHelper::addSubmenu('capitals');
		}

		// Assign data to the view
		$this->items = $this->get('Items');
		$this->pagination = $this->get('Pagination');
		$this->state = $this->get('State');
		$this->user = JFactory::getUser();
		// Load the filter form from xml.
		$this->filterForm = $this->get('FilterForm');
		// Load the active filters.
		$this->activeFilters = $this->get('ActiveFilters');
		// Add the list ordering clause.
		$this->listOrder =
$this->escape($this->state->get('list.ordering',
'a.id'));
		$this->listDirn =
$this->escape($this->state->get('list.direction',
'DESC'));
		$this->saveOrder = $this->listOrder == 'a.ordering';
		// set the return here value
		$this->return_here = urlencode(base64_encode((string)
JUri::getInstance()));
		// get global action permissions
		$this->canDo = ReservationHelper::getActions('capital');
		$this->canEdit = $this->canDo->get('core.edit');
		$this->canState =
$this->canDo->get('core.edit.state');
		$this->canCreate = $this->canDo->get('core.create');
		$this->canDelete = $this->canDo->get('core.delete');
		$this->canBatch = $this->canDo->get('core.batch');

		// We don't need toolbar in the modal window.
		if ($this->getLayout() !== 'modal')
		{
			$this->addToolbar();
			$this->sidebar = JHtmlSidebar::render();
			// load the batch html
			if ($this->canCreate && $this->canEdit &&
$this->canState)
			{
				$this->batchDisplay = JHtmlBatch_::render();
			}
		}
		
		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		// Display the template
		parent::display($tpl);

		// Set the document
		$this->setDocument();
	}

	/**
	 * Setting the toolbar
	 */
	protected function addToolBar()
	{
		JToolBarHelper::title(JText::_('COM_RESERVATION_CAPITALS'),
'joomla');
		JHtmlSidebar::setAction('index.php?option=com_reservation&view=capitals');
		JFormHelper::addFieldPath(JPATH_COMPONENT . '/models/fields');

		if ($this->canCreate)
		{
			JToolBarHelper::addNew('capital.add');
		}

		// Only load if there are items
		if (ReservationHelper::checkArray($this->items))
		{
			if ($this->canEdit)
			{
				JToolBarHelper::editList('capital.edit');
			}

			if ($this->canState)
			{
				JToolBarHelper::publishList('capitals.publish');
				JToolBarHelper::unpublishList('capitals.unpublish');
				JToolBarHelper::archiveList('capitals.archive');

				if ($this->canDo->get('core.admin'))
				{
					JToolBarHelper::checkin('capitals.checkin');
				}
			}

			// Add a batch button
			if ($this->canBatch && $this->canCreate &&
$this->canEdit && $this->canState)
			{
				// Get the toolbar object instance
				$bar = JToolBar::getInstance('toolbar');
				// set the batch button name
				$title = JText::_('JTOOLBAR_BATCH');
				// Instantiate a new JLayoutFile instance and render the batch button
				$layout = new JLayoutFile('joomla.toolbar.batch');
				// add the button to the page
				$dhtml = $layout->render(array('title' => $title));
				$bar->appendButton('Custom', $dhtml, 'batch');
			}

			if ($this->state->get('filter.published') == -2
&& ($this->canState && $this->canDelete))
			{
				JToolbarHelper::deleteList('', 'capitals.delete',
'JTOOLBAR_EMPTY_TRASH');
			}
			elseif ($this->canState && $this->canDelete)
			{
				JToolbarHelper::trash('capitals.trash');
			}

			if ($this->canDo->get('core.export') &&
$this->canDo->get('capital.export'))
			{
				JToolBarHelper::custom('capitals.exportData',
'download', '',
'COM_RESERVATION_EXPORT_DATA', true);
			}
		}

		if ($this->canDo->get('core.import') &&
$this->canDo->get('capital.import'))
		{
			JToolBarHelper::custom('capitals.importData',
'upload', '', 'COM_RESERVATION_IMPORT_DATA',
false);
		}

		// set help url for this view if found
		$help_url = ReservationHelper::getHelpUrl('capitals');
		if (ReservationHelper::checkString($help_url))
		{
				JToolbarHelper::help('COM_RESERVATION_HELP_MANAGER', false,
$help_url);
		}

		// add the options comp button
		if ($this->canDo->get('core.admin') ||
$this->canDo->get('core.options'))
		{
			JToolBarHelper::preferences('com_reservation');
		}

		// Only load published batch if state and batch is allowed
		if ($this->canState && $this->canBatch)
		{
			JHtmlBatch_::addListSelection(
				JText::_('COM_RESERVATION_KEEP_ORIGINAL_STATE'),
				'batch[published]',
				JHtml::_('select.options',
JHtml::_('jgrid.publishedOptions', array('all' =>
false)), 'value', 'text', '', true)
			);
		}

		// Only load access batch if create, edit and batch is allowed
		if ($this->canBatch && $this->canCreate &&
$this->canEdit)
		{
			JHtmlBatch_::addListSelection(
				JText::_('COM_RESERVATION_KEEP_ORIGINAL_ACCESS'),
				'batch[access]',
				JHtml::_('select.options',
JHtml::_('access.assetgroups'), 'value',
'text')
			);
		}
	}

	/**
	 * Method to set up the document properties
	 *
	 * @return void
	 */
	protected function setDocument()
	{
		if (!isset($this->document))
		{
			$this->document = JFactory::getDocument();
		}
		$this->document->setTitle(JText::_('COM_RESERVATION_CAPITALS'));
		$this->document->addStyleSheet(JURI::root() .
"administrator/components/com_reservation/assets/css/capitals.css",
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') : 'text/css');
	}

	/**
	 * Escapes a value for output in a view script.
	 *
	 * @param   mixed  $var  The output to escape.
	 *
	 * @return  mixed  The escaped value.
	 */
	public function escape($var)
	{
		if(strlen($var) > 50)
		{
			// use the helper htmlEscape method instead and shorten the string
			return ReservationHelper::htmlEscape($var, $this->_charset, true);
		}
		// use the helper htmlEscape method instead.
		return ReservationHelper::htmlEscape($var, $this->_charset);
	}

	/**
	 * Returns an array of fields the table can be sorted by
	 *
	 * @return  array  Array containing the field name to sort by as the key
and display text as value
	 */
	protected function getSortFields()
	{
		return array(
			'a.ordering' =>
JText::_('JGRID_HEADING_ORDERING'),
			'a.published' => JText::_('JSTATUS'),
			'a.name' =>
JText::_('COM_RESERVATION_CAPITAL_NAME_LABEL'),
			'g.name' =>
JText::_('COM_RESERVATION_CAPITAL_CAPITALID_LABEL'),
			'a.id' => JText::_('JGRID_HEADING_ID')
		);
	}
}
PK5~�[秃���views/comment/submitbutton.jsnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		submitbutton.js
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

Joomla.submitbutton = function(task)
{
	if (task == ''){
		return false;
	} else { 
		var action = task.split('.');
		if (action[1] == 'cancel' || action[1] == 'close' ||
document.formvalidator.isValid(document.getElementById("adminForm"))){
			Joomla.submitform(task, document.getElementById("adminForm"));
			return true;
		} else {
			alert(Joomla.JText._('comment, some values are not
acceptable.','Some values are unacceptable'));
			return false;
		}
	}
}PK5~�[V�.���views/comment/tmpl/edit.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		edit.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');
JHtml::_('behavior.tooltip');
JHtml::_('behavior.formvalidation');
JHtml::_('formbehavior.chosen', 'select');
JHtml::_('behavior.keepalive');
$componentParams = $this->params; // will be removed just use
$this->params instead
?>
<script type="text/javascript">
	// waiting spinner
	var outerDiv = jQuery('body');
	jQuery('<div id="loading"></div>')
		.css("background", "rgba(255, 255, 255, .8)
url('components/com_reservation/assets/images/import.gif') 50%
15% no-repeat")
		.css("top", outerDiv.position().top -
jQuery(window).scrollTop())
		.css("left", outerDiv.position().left -
jQuery(window).scrollLeft())
		.css("width", outerDiv.width())
		.css("height", outerDiv.height())
		.css("position", "fixed")
		.css("opacity", "0.80")
		.css("-ms-filter",
"progid:DXImageTransform.Microsoft.Alpha(Opacity = 80)")
		.css("filter", "alpha(opacity = 80)")
		.css("display", "none")
		.appendTo(outerDiv);
	jQuery('#loading').show();
	// when page is ready remove and show
	jQuery(window).load(function() {
		jQuery('#reservation_loader').fadeIn('fast');
		jQuery('#loading').hide();
	});
</script>
<div id="reservation_loader" style="display:
none;">
<form action="<?php echo
JRoute::_('index.php?option=com_reservation&layout=edit&id='.
(int) $this->item->id . $this->referral); ?>"
method="post" name="adminForm" id="adminForm"
class="form-validate" enctype="multipart/form-data">

<div class="form-horizontal">

	<?php echo JHtml::_('bootstrap.startTabSet',
'commentTab', array('active' =>
'details')); ?>

	<?php echo JHtml::_('bootstrap.addTab',
'commentTab', 'details',
JText::_('COM_RESERVATION_COMMENT_DETAILS', true)); ?>
		<div class="row-fluid form-horizontal-desktop">
			<div class="span6">
				<?php echo JLayoutHelper::render('comment.details_left',
$this); ?>
			</div>
			<div class="span6">
				<?php echo JLayoutHelper::render('comment.details_right',
$this); ?>
			</div>
		</div>
		<div class="row-fluid form-horizontal-desktop">
			<div class="span12">
				<?php echo
JLayoutHelper::render('comment.details_fullwidth', $this); ?>
			</div>
		</div>
	<?php echo JHtml::_('bootstrap.endTab'); ?>

	<?php $this->ignore_fieldsets =
array('details','metadata','vdmmetadata','accesscontrol');
?>
	<?php $this->tab_name = 'commentTab'; ?>
	<?php echo JLayoutHelper::render('joomla.edit.params',
$this); ?>

	<?php if ($this->canDo->get('core.edit.created_by') ||
$this->canDo->get('core.edit.created') ||
$this->canDo->get('core.edit.state') ||
($this->canDo->get('core.delete') &&
$this->canDo->get('core.edit.state'))) : ?>
	<?php echo JHtml::_('bootstrap.addTab',
'commentTab', 'publishing',
JText::_('COM_RESERVATION_COMMENT_PUBLISHING', true)); ?>
		<div class="row-fluid form-horizontal-desktop">
			<div class="span6">
				<?php echo JLayoutHelper::render('comment.publishing',
$this); ?>
			</div>
			<div class="span6">
				<?php echo JLayoutHelper::render('comment.publlshing',
$this); ?>
			</div>
		</div>
	<?php echo JHtml::_('bootstrap.endTab'); ?>
	<?php endif; ?>

	<?php if ($this->canDo->get('core.admin')) : ?>
	<?php echo JHtml::_('bootstrap.addTab',
'commentTab', 'permissions',
JText::_('COM_RESERVATION_COMMENT_PERMISSION', true)); ?>
		<div class="row-fluid form-horizontal-desktop">
			<div class="span12">
				<fieldset class="adminform">
					<div class="adminformlist">
					<?php foreach
($this->form->getFieldset('accesscontrol') as $field):
?>
						<div>
							<?php echo $field->label; echo $field->input;?>
						</div>
						<div class="clearfix"></div>
					<?php endforeach; ?>
					</div>
				</fieldset>
			</div>
		</div>
	<?php echo JHtml::_('bootstrap.endTab'); ?>
	<?php endif; ?>

	<?php echo JHtml::_('bootstrap.endTabSet'); ?>

	<div>
		<input type="hidden" name="task"
value="comment.edit" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</div>
</form>
</div>
PK5~�[�#o,,views/comment/tmpl/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[�G���views/comment/view.html.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		view.html.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

/**
 * Comment View class
 */
class ReservationViewComment extends JViewLegacy
{
	/**
	 * display method of View
	 * @return void
	 */
	public function display($tpl = null)
	{
		// set params
		$this->params =
JComponentHelper::getParams('com_reservation');
		// Assign the variables
		$this->form = $this->get('Form');
		$this->item = $this->get('Item');
		$this->script = $this->get('Script');
		$this->state = $this->get('State');
		// get action permissions
		$this->canDo = ReservationHelper::getActions('comment',
$this->item);
		// get input
		$jinput = JFactory::getApplication()->input;
		$this->ref = $jinput->get('ref', 0, 'word');
		$this->refid = $jinput->get('refid', 0, 'int');
		$return = $jinput->get('return', null, 'base64');
		// set the referral string
		$this->referral = '';
		if ($this->refid && $this->ref)
		{
			// return to the item that referred to this item
			$this->referral = '&ref=' . (string)$this->ref .
'&refid=' . (int)$this->refid;
		}
		elseif($this->ref)
		{
			// return to the list view that referred to this item
			$this->referral = '&ref=' . (string)$this->ref;
		}
		// check return value
		if (!is_null($return))
		{
			// add the return value
			$this->referral .= '&return=' . (string)$return;
		}

		// Set the toolbar
		$this->addToolBar();
		
		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		// Display the template
		parent::display($tpl);

		// Set the document
		$this->setDocument();
	}


	/**
	 * Setting the toolbar
	 */
	protected function addToolBar()
	{
		JFactory::getApplication()->input->set('hidemainmenu',
true);
		$user = JFactory::getUser();
		$userId	= $user->id;
		$isNew = $this->item->id == 0;

		JToolbarHelper::title( JText::_($isNew ?
'COM_RESERVATION_COMMENT_NEW' :
'COM_RESERVATION_COMMENT_EDIT'), 'pencil-2
article-add');
		// Built the actions for new and existing records.
		if (ReservationHelper::checkString($this->referral))
		{
			if ($this->canDo->get('core.create') && $isNew)
			{
				// We can create the record.
				JToolBarHelper::save('comment.save',
'JTOOLBAR_SAVE');
			}
			elseif ($this->canDo->get('core.edit'))
			{
				// We can save the record.
				JToolBarHelper::save('comment.save',
'JTOOLBAR_SAVE');
			}
			if ($isNew)
			{
				// Do not creat but cancel.
				JToolBarHelper::cancel('comment.cancel',
'JTOOLBAR_CANCEL');
			}
			else
			{
				// We can close it.
				JToolBarHelper::cancel('comment.cancel',
'JTOOLBAR_CLOSE');
			}
		}
		else
		{
			if ($isNew)
			{
				// For new records, check the create permission.
				if ($this->canDo->get('core.create'))
				{
					JToolBarHelper::apply('comment.apply',
'JTOOLBAR_APPLY');
					JToolBarHelper::save('comment.save',
'JTOOLBAR_SAVE');
					JToolBarHelper::custom('comment.save2new',
'save-new.png', 'save-new_f2.png',
'JTOOLBAR_SAVE_AND_NEW', false);
				};
				JToolBarHelper::cancel('comment.cancel',
'JTOOLBAR_CANCEL');
			}
			else
			{
				if ($this->canDo->get('core.edit'))
				{
					// We can save the new record
					JToolBarHelper::apply('comment.apply',
'JTOOLBAR_APPLY');
					JToolBarHelper::save('comment.save',
'JTOOLBAR_SAVE');
					// We can save this record, but check the create permission to see
					// if we can return to make a new one.
					if ($this->canDo->get('core.create'))
					{
						JToolBarHelper::custom('comment.save2new',
'save-new.png', 'save-new_f2.png',
'JTOOLBAR_SAVE_AND_NEW', false);
					}
				}
				$canVersion = ($this->canDo->get('core.version')
&& $this->canDo->get('comment.version'));
				if ($this->state->params->get('save_history', 1)
&& $this->canDo->get('core.edit') &&
$canVersion)
				{
					JToolbarHelper::versions('com_reservation.comment',
$this->item->id);
				}
				if ($this->canDo->get('core.create'))
				{
					JToolBarHelper::custom('comment.save2copy',
'save-copy.png', 'save-copy_f2.png',
'JTOOLBAR_SAVE_AS_COPY', false);
				}
				JToolBarHelper::cancel('comment.cancel',
'JTOOLBAR_CLOSE');
			}
		}
		JToolbarHelper::divider();
		// set help url for this view if found
		$help_url = ReservationHelper::getHelpUrl('comment');
		if (ReservationHelper::checkString($help_url))
		{
			JToolbarHelper::help('COM_RESERVATION_HELP_MANAGER', false,
$help_url);
		}
	}

	/**
	 * Escapes a value for output in a view script.
	 *
	 * @param   mixed  $var  The output to escape.
	 *
	 * @return  mixed  The escaped value.
	 */
	public function escape($var)
	{
		if(strlen($var) > 30)
		{
    		// use the helper htmlEscape method instead and shorten the string
			return ReservationHelper::htmlEscape($var, $this->_charset, true,
30);
		}
		// use the helper htmlEscape method instead.
		return ReservationHelper::htmlEscape($var, $this->_charset);
	}

	/**
	 * Method to set up the document properties
	 *
	 * @return void
	 */
	protected function setDocument()
	{
		$isNew = ($this->item->id < 1);
		if (!isset($this->document))
		{
			$this->document = JFactory::getDocument();
		}
		$this->document->setTitle(JText::_($isNew ?
'COM_RESERVATION_COMMENT_NEW' :
'COM_RESERVATION_COMMENT_EDIT'));
		$this->document->addStyleSheet(JURI::root() .
"administrator/components/com_reservation/assets/css/comment.css",
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') : 'text/css');
		$this->document->addScript(JURI::root() . $this->script,
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') :
'text/javascript');
		$this->document->addScript(JURI::root() .
"administrator/components/com_reservation/views/comment/submitbutton.js",
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') :
'text/javascript'); 
		JText::script('view not acceptable. Error');
	}
}
PK5~�[�#o,,views/comments/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[��\�views/comments/tmpl/default.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

JHtml::_('behavior.tooltip');
JHtml::_('behavior.multiselect');
JHtml::_('dropdown.init');
JHtml::_('formbehavior.chosen',
'.multipleAccessLevels', null,
array('placeholder_text_multiple' => '- ' .
JText::_('COM_RESERVATION_FILTER_SELECT_ACCESS') . '
-'));
JHtml::_('formbehavior.chosen', 'select');
if ($this->saveOrder)
{
	$saveOrderingUrl =
'index.php?option=com_reservation&task=comments.saveOrderAjax&tmpl=component';
	JHtml::_('sortablelist.sortable', 'commentList',
'adminForm', strtolower($this->listDirn), $saveOrderingUrl);
}
?>
<form action="<?php echo
JRoute::_('index.php?option=com_reservation&view=comments');
?>" method="post" name="adminForm"
id="adminForm">
<?php if(!empty( $this->sidebar)): ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif; ?>
<?php
	// Add the searchtools
	echo JLayoutHelper::render('joomla.searchtools.default',
array('view' => $this));
?>
<?php if (empty($this->items)): ?>
	<div class="alert alert-no-items">
		<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
	</div>
<?php else : ?>
	<table class="table table-striped"
id="commentList">
		<thead><?php echo
$this->loadTemplate('head');?></thead>
		<tfoot><?php echo
$this->loadTemplate('foot');?></tfoot>
		<tbody><?php echo
$this->loadTemplate('body');?></tbody>
	</table>
	<?php // Load the batch processing form. ?>
	<?php if ($this->canCreate && $this->canEdit) : ?>
		<?php echo JHtml::_(
			'bootstrap.renderModal',
			'collapseModal',
			array(
				'title' =>
JText::_('COM_RESERVATION_COMMENTS_BATCH_OPTIONS'),
				'footer' =>
$this->loadTemplate('batch_footer')
			),
			$this->loadTemplate('batch_body')
		); ?>
	<?php endif; ?>
	<input type="hidden" name="boxchecked"
value="0" />
	</div>
<?php endif; ?>
	<input type="hidden" name="task" value=""
/>
	<?php echo JHtml::_('form.token'); ?>
</form>
PK5~�[�;�|��*views/comments/tmpl/default_batch_body.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_batch_body.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>

<p><?php echo
JText::_('COM_RESERVATION_COMMENTS_BATCH_TIP'); ?></p>
<?php echo $this->batchDisplay;
?>PK5~�[�SdH��,views/comments/tmpl/default_batch_footer.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_batch_footer.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<!-- clear the batch values if cancel -->
<button class="btn" type="button"
onclick="" data-dismiss="modal">
	<?php echo JText::_('JCANCEL'); ?>
</button>
<!-- post the batch values if process -->
<button class="btn btn-success" type="submit"
onclick="Joomla.submitbutton('comment.batch');">
	<?php echo JText::_('JGLOBAL_BATCH_PROCESS'); ?>
</button>PK5~�[45�oo$views/comments/tmpl/default_body.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_body.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

$edit =
"index.php?option=com_reservation&view=comments&task=comment.edit";

?>
<?php foreach ($this->items as $i => $item): ?>
	<?php
		$canCheckin = $this->user->authorise('core.manage',
'com_checkin') || $item->checked_out == $this->user->id
|| $item->checked_out == 0;
		$userChkOut = JFactory::getUser($item->checked_out);
		$canDo =
ReservationHelper::getActions('comment',$item,'comments');
	?>
	<tr class="row<?php echo $i % 2; ?>">
		<td class="order nowrap center hidden-phone">
		<?php if ($canDo->get('core.edit.state')): ?>
			<?php
				$iconClass = '';
				if (!$this->saveOrder)
				{
					$iconClass = ' inactive tip-top" hasTooltip"
title="' . JHtml::tooltipText('JORDERINGDISABLED');
				}
			?>
			<span class="sortable-handler<?php echo $iconClass;
?>">
				<i class="icon-menu"></i>
			</span>
			<?php if ($this->saveOrder) : ?>
				<input type="text" style="display:none"
name="order[]" size="5"
				value="<?php echo $item->ordering; ?>"
class="width-20 text-area-order " />
			<?php endif; ?>
		<?php else: ?>
			&#8942;
		<?php endif; ?>
		</td>
		<td class="nowrap center">
		<?php if ($canDo->get('core.edit')): ?>
				<?php if ($item->checked_out) : ?>
					<?php if ($canCheckin) : ?>
						<?php echo JHtml::_('grid.id', $i, $item->id); ?>
					<?php else: ?>
						&#9633;
					<?php endif; ?>
				<?php else: ?>
					<?php echo JHtml::_('grid.id', $i, $item->id); ?>
				<?php endif; ?>
		<?php else: ?>
			&#9633;
		<?php endif; ?>
		</td>
		<td class="nowrap">
			<div class="name">
				<?php if ($canDo->get('core.edit')): ?>
					<a href="<?php echo $edit; ?>&id=<?php echo
$item->id; ?>"><?php echo
$this->escape($item->text); ?></a>
					<?php if ($item->checked_out): ?>
						<?php echo JHtml::_('jgrid.checkedout', $i,
$userChkOut->name, $item->checked_out_time, 'comments.',
$canCheckin); ?>
					<?php endif; ?>
				<?php else: ?>
					<?php echo $this->escape($item->text); ?>
				<?php endif; ?>
			</div>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->consultantid_id); ?>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->sickid_phonenumber); ?>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->rate); ?>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->seid); ?>
		</td>
		<td class="center">
		<?php if ($canDo->get('core.edit.state')) : ?>
				<?php if ($item->checked_out) : ?>
					<?php if ($canCheckin) : ?>
						<?php echo JHtml::_('jgrid.published',
$item->published, $i, 'comments.', true, 'cb');
?>
					<?php else: ?>
						<?php echo JHtml::_('jgrid.published',
$item->published, $i, 'comments.', false, 'cb');
?>
					<?php endif; ?>
				<?php else: ?>
					<?php echo JHtml::_('jgrid.published',
$item->published, $i, 'comments.', true, 'cb');
?>
				<?php endif; ?>
		<?php else: ?>
			<?php echo JHtml::_('jgrid.published', $item->published,
$i, 'comments.', false, 'cb'); ?>
		<?php endif; ?>
		</td>
		<td class="nowrap center hidden-phone">
			<?php echo $item->id; ?>
		</td>
	</tr>
<?php endforeach;
?>PK5~�[����$views/comments/tmpl/default_foot.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_foot.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<tr>
	<td colspan="9"><?php echo
$this->pagination->getListFooter(); ?></td>
</tr>PK5~�[5e�>�
�
$views/comments/tmpl/default_head.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_head.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<tr>
	<?php if ($this->canEdit&& $this->canState): ?>
		<th width="1%" class="nowrap center
hidden-phone">
			<?php echo JHtml::_('searchtools.sort', '',
'a.ordering', $this->listDirn, $this->listOrder, null,
'asc', 'JGRID_HEADING_ORDERING',
'icon-menu-2'); ?>
		</th>
		<th width="20" class="nowrap center">
			<?php echo JHtml::_('grid.checkall'); ?>
		</th>
	<?php else: ?>
		<th width="20" class="nowrap center
hidden-phone">
			&#9662;
		</th>
		<th width="20" class="nowrap center">
			&#9632;
		</th>
	<?php endif; ?>
	<th class="nowrap" >
			<?php echo JText::_('COM_RESERVATION_COMMENT_TEXT_LABEL');
?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo
JText::_('COM_RESERVATION_COMMENT_CONSULTANTID_LABEL'); ?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo
JText::_('COM_RESERVATION_COMMENT_SICKID_LABEL'); ?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo JText::_('COM_RESERVATION_COMMENT_RATE_LABEL');
?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo JText::_('COM_RESERVATION_COMMENT_SEID_LABEL');
?>
	</th>
	<?php if ($this->canState): ?>
		<th width="10" class="nowrap center" >
			<?php echo JHtml::_('searchtools.sort',
'COM_RESERVATION_COMMENT_STATUS', 'a.published',
$this->listDirn, $this->listOrder); ?>
		</th>
	<?php else: ?>
		<th width="10" class="nowrap center" >
			<?php echo JText::_('COM_RESERVATION_COMMENT_STATUS');
?>
		</th>
	<?php endif; ?>
	<th width="5" class="nowrap center hidden-phone"
>
			<?php echo JHtml::_('searchtools.sort',
'COM_RESERVATION_COMMENT_ID', 'a.id',
$this->listDirn, $this->listOrder); ?>
	</th>
</tr>PK5~�[eGg55'views/comments/tmpl/default_toolbar.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_toolbar.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<div id="filter-bar" class="btn-toolbar">
        <div class="filter-search btn-group pull-left">
            <label for="filter_search"
class="element-invisible"><?php echo
JText::_('Search');?></label>
            <input type="text" name="filter_search"
id="filter_search" placeholder="<?php echo
JText::_('JSEARCH_FILTER'); ?>" value="<?php echo
$this->escape($this->state->get('filter.search'));
?>" class="hasTooltip" title="<?php echo
JHtml::tooltipText('Search Comments'); ?>" />
        </div>
        <div class="btn-group pull-left">
            <button type="submit" class="btn
hasTooltip" title="<?php echo
JHtml::tooltipText('JSEARCH_FILTER_SUBMIT'); ?>"><i
class="icon-search"></i></button>
            <button type="button" class="btn
hasTooltip" title="<?php echo
JHtml::tooltipText('JSEARCH_FILTER_CLEAR'); ?>"
onclick="document.id('filter_search').value='';this.form.submit();"><i
class="icon-remove"></i></button>
        </div>
        <div class="btn-group pull-right hidden-phone">
            <label for="limit"
class="element-invisible"><?php echo
JText::_('JFIELD_PLG_SEARCH_SEARCHLIMIT_DESC');?></label>
            <?php echo $this->pagination->getLimitBox(); ?>
        </div>
        <div class="btn-group pull-right hidden-phone">
            <label for="directionTable"
class="element-invisible"><?php echo
JText::_('JFIELD_ORDERING_DESC');?></label>
            <select name="directionTable"
id="directionTable" class="input-medium"
onchange="Joomla.orderTable()">
                <option value=""><?php echo
JText::_('JFIELD_ORDERING_DESC');?></option>
                <option value="asc" <?php if
($this->listDirn == 'asc') echo
'selected="selected"'; ?>><?php echo
JText::_('JGLOBAL_ORDER_ASCENDING');?></option>
                <option value="desc" <?php if
($this->listDirn == 'desc') echo
'selected="selected"'; ?>><?php echo
JText::_('JGLOBAL_ORDER_DESCENDING');?></option>
            </select>
        </div>
        <div class="btn-group pull-right">
            <label for="sortTable"
class="element-invisible"><?php echo
JText::_('JGLOBAL_SORT_BY');?></label>
            <select name="sortTable" id="sortTable"
class="input-medium" onchange="Joomla.orderTable()">
                <option value=""><?php echo
JText::_('JGLOBAL_SORT_BY');?></option>
                <?php echo JHtml::_('select.options',
$this->getSortFields(), 'value', 'text',
$this->listOrder);?>
            </select>
        </div>
    </div>
<div class="clearfix">
</div>PK5~�[�#o,,views/comments/tmpl/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[�얺��views/comments/view.html.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		view.html.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

/**
 * Reservation View class for the Comments
 */
class ReservationViewComments extends JViewLegacy
{
	/**
	 * Comments view display method
	 * @return void
	 */
	function display($tpl = null)
	{
		if ($this->getLayout() !== 'modal')
		{
			// Include helper submenu
			ReservationHelper::addSubmenu('comments');
		}

		// Assign data to the view
		$this->items = $this->get('Items');
		$this->pagination = $this->get('Pagination');
		$this->state = $this->get('State');
		$this->user = JFactory::getUser();
		// Load the filter form from xml.
		$this->filterForm = $this->get('FilterForm');
		// Load the active filters.
		$this->activeFilters = $this->get('ActiveFilters');
		// Add the list ordering clause.
		$this->listOrder =
$this->escape($this->state->get('list.ordering',
'a.id'));
		$this->listDirn =
$this->escape($this->state->get('list.direction',
'DESC'));
		$this->saveOrder = $this->listOrder == 'a.ordering';
		// set the return here value
		$this->return_here = urlencode(base64_encode((string)
JUri::getInstance()));
		// get global action permissions
		$this->canDo = ReservationHelper::getActions('comment');
		$this->canEdit = $this->canDo->get('core.edit');
		$this->canState =
$this->canDo->get('core.edit.state');
		$this->canCreate = $this->canDo->get('core.create');
		$this->canDelete = $this->canDo->get('core.delete');
		$this->canBatch = $this->canDo->get('core.batch');

		// We don't need toolbar in the modal window.
		if ($this->getLayout() !== 'modal')
		{
			$this->addToolbar();
			$this->sidebar = JHtmlSidebar::render();
			// load the batch html
			if ($this->canCreate && $this->canEdit &&
$this->canState)
			{
				$this->batchDisplay = JHtmlBatch_::render();
			}
		}
		
		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		// Display the template
		parent::display($tpl);

		// Set the document
		$this->setDocument();
	}

	/**
	 * Setting the toolbar
	 */
	protected function addToolBar()
	{
		JToolBarHelper::title(JText::_('COM_RESERVATION_COMMENTS'),
'joomla');
		JHtmlSidebar::setAction('index.php?option=com_reservation&view=comments');
		JFormHelper::addFieldPath(JPATH_COMPONENT . '/models/fields');

		if ($this->canCreate)
		{
			JToolBarHelper::addNew('comment.add');
		}

		// Only load if there are items
		if (ReservationHelper::checkArray($this->items))
		{
			if ($this->canEdit)
			{
				JToolBarHelper::editList('comment.edit');
			}

			if ($this->canState)
			{
				JToolBarHelper::publishList('comments.publish');
				JToolBarHelper::unpublishList('comments.unpublish');
				JToolBarHelper::archiveList('comments.archive');

				if ($this->canDo->get('core.admin'))
				{
					JToolBarHelper::checkin('comments.checkin');
				}
			}

			// Add a batch button
			if ($this->canBatch && $this->canCreate &&
$this->canEdit && $this->canState)
			{
				// Get the toolbar object instance
				$bar = JToolBar::getInstance('toolbar');
				// set the batch button name
				$title = JText::_('JTOOLBAR_BATCH');
				// Instantiate a new JLayoutFile instance and render the batch button
				$layout = new JLayoutFile('joomla.toolbar.batch');
				// add the button to the page
				$dhtml = $layout->render(array('title' => $title));
				$bar->appendButton('Custom', $dhtml, 'batch');
			}

			if ($this->state->get('filter.published') == -2
&& ($this->canState && $this->canDelete))
			{
				JToolbarHelper::deleteList('', 'comments.delete',
'JTOOLBAR_EMPTY_TRASH');
			}
			elseif ($this->canState && $this->canDelete)
			{
				JToolbarHelper::trash('comments.trash');
			}

			if ($this->canDo->get('core.export') &&
$this->canDo->get('comment.export'))
			{
				JToolBarHelper::custom('comments.exportData',
'download', '',
'COM_RESERVATION_EXPORT_DATA', true);
			}
		}

		if ($this->canDo->get('core.import') &&
$this->canDo->get('comment.import'))
		{
			JToolBarHelper::custom('comments.importData',
'upload', '', 'COM_RESERVATION_IMPORT_DATA',
false);
		}

		// set help url for this view if found
		$help_url = ReservationHelper::getHelpUrl('comments');
		if (ReservationHelper::checkString($help_url))
		{
				JToolbarHelper::help('COM_RESERVATION_HELP_MANAGER', false,
$help_url);
		}

		// add the options comp button
		if ($this->canDo->get('core.admin') ||
$this->canDo->get('core.options'))
		{
			JToolBarHelper::preferences('com_reservation');
		}

		// Only load published batch if state and batch is allowed
		if ($this->canState && $this->canBatch)
		{
			JHtmlBatch_::addListSelection(
				JText::_('COM_RESERVATION_KEEP_ORIGINAL_STATE'),
				'batch[published]',
				JHtml::_('select.options',
JHtml::_('jgrid.publishedOptions', array('all' =>
false)), 'value', 'text', '', true)
			);
		}

		// Only load access batch if create, edit and batch is allowed
		if ($this->canBatch && $this->canCreate &&
$this->canEdit)
		{
			JHtmlBatch_::addListSelection(
				JText::_('COM_RESERVATION_KEEP_ORIGINAL_ACCESS'),
				'batch[access]',
				JHtml::_('select.options',
JHtml::_('access.assetgroups'), 'value',
'text')
			);
		}
	}

	/**
	 * Method to set up the document properties
	 *
	 * @return void
	 */
	protected function setDocument()
	{
		if (!isset($this->document))
		{
			$this->document = JFactory::getDocument();
		}
		$this->document->setTitle(JText::_('COM_RESERVATION_COMMENTS'));
		$this->document->addStyleSheet(JURI::root() .
"administrator/components/com_reservation/assets/css/comments.css",
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') : 'text/css');
	}

	/**
	 * Escapes a value for output in a view script.
	 *
	 * @param   mixed  $var  The output to escape.
	 *
	 * @return  mixed  The escaped value.
	 */
	public function escape($var)
	{
		if(strlen($var) > 50)
		{
			// use the helper htmlEscape method instead and shorten the string
			return ReservationHelper::htmlEscape($var, $this->_charset, true);
		}
		// use the helper htmlEscape method instead.
		return ReservationHelper::htmlEscape($var, $this->_charset);
	}

	/**
	 * Returns an array of fields the table can be sorted by
	 *
	 * @return  array  Array containing the field name to sort by as the key
and display text as value
	 */
	protected function getSortFields()
	{
		return array(
			'a.ordering' =>
JText::_('JGRID_HEADING_ORDERING'),
			'a.published' => JText::_('JSTATUS'),
			'a.id' => JText::_('JGRID_HEADING_ID')
		);
	}
}
PK5~�[��4��
views/consultant/submitbutton.jsnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		submitbutton.js
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

Joomla.submitbutton = function(task)
{
	if (task == ''){
		return false;
	} else { 
		var action = task.split('.');
		if (action[1] == 'cancel' || action[1] == 'close' ||
document.formvalidator.isValid(document.getElementById("adminForm"))){
			Joomla.submitform(task, document.getElementById("adminForm"));
			return true;
		} else {
			alert(Joomla.JText._('consultant, some values are not
acceptable.','Some values are unacceptable'));
			return false;
		}
	}
}PK5~�[�d��77views/consultant/tmpl/edit.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		edit.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');
JHtml::_('behavior.tooltip');
JHtml::_('behavior.formvalidation');
JHtml::_('formbehavior.chosen', 'select');
JHtml::_('behavior.keepalive');
$componentParams = $this->params; // will be removed just use
$this->params instead
?>
<script type="text/javascript">
	// waiting spinner
	var outerDiv = jQuery('body');
	jQuery('<div id="loading"></div>')
		.css("background", "rgba(255, 255, 255, .8)
url('components/com_reservation/assets/images/import.gif') 50%
15% no-repeat")
		.css("top", outerDiv.position().top -
jQuery(window).scrollTop())
		.css("left", outerDiv.position().left -
jQuery(window).scrollLeft())
		.css("width", outerDiv.width())
		.css("height", outerDiv.height())
		.css("position", "fixed")
		.css("opacity", "0.80")
		.css("-ms-filter",
"progid:DXImageTransform.Microsoft.Alpha(Opacity = 80)")
		.css("filter", "alpha(opacity = 80)")
		.css("display", "none")
		.appendTo(outerDiv);
	jQuery('#loading').show();
	// when page is ready remove and show
	jQuery(window).load(function() {
		jQuery('#reservation_loader').fadeIn('fast');
		jQuery('#loading').hide();
	});
</script>
<div id="reservation_loader" style="display:
none;">
<form action="<?php echo
JRoute::_('index.php?option=com_reservation&layout=edit&id='.
(int) $this->item->id . $this->referral); ?>"
method="post" name="adminForm" id="adminForm"
class="form-validate" enctype="multipart/form-data">

<div class="form-horizontal">

	<?php echo JHtml::_('bootstrap.startTabSet',
'consultantTab', array('active' =>
'details')); ?>

	<?php echo JHtml::_('bootstrap.addTab',
'consultantTab', 'details',
JText::_('COM_RESERVATION_CONSULTANT_DETAILS', true)); ?>
		<div class="row-fluid form-horizontal-desktop">
			<div class="span6">
				<?php echo
JLayoutHelper::render('consultant.details_left', $this); ?>
			</div>
			<div class="span6">
				<?php echo
JLayoutHelper::render('consultant.details_right', $this); ?>
			</div>
		</div>
	<?php echo JHtml::_('bootstrap.endTab'); ?>

	<?php $this->ignore_fieldsets =
array('details','metadata','vdmmetadata','accesscontrol');
?>
	<?php $this->tab_name = 'consultantTab'; ?>
	<?php echo JLayoutHelper::render('joomla.edit.params',
$this); ?>

	<?php if ($this->canDo->get('core.edit.created_by') ||
$this->canDo->get('core.edit.created') ||
$this->canDo->get('core.edit.state') ||
($this->canDo->get('core.delete') &&
$this->canDo->get('core.edit.state'))) : ?>
	<?php echo JHtml::_('bootstrap.addTab',
'consultantTab', 'publishing',
JText::_('COM_RESERVATION_CONSULTANT_PUBLISHING', true)); ?>
		<div class="row-fluid form-horizontal-desktop">
			<div class="span6">
				<?php echo JLayoutHelper::render('consultant.publishing',
$this); ?>
			</div>
			<div class="span6">
				<?php echo JLayoutHelper::render('consultant.publlshing',
$this); ?>
			</div>
		</div>
	<?php echo JHtml::_('bootstrap.endTab'); ?>
	<?php endif; ?>

	<?php if ($this->canDo->get('core.admin')) : ?>
	<?php echo JHtml::_('bootstrap.addTab',
'consultantTab', 'permissions',
JText::_('COM_RESERVATION_CONSULTANT_PERMISSION', true)); ?>
		<div class="row-fluid form-horizontal-desktop">
			<div class="span12">
				<fieldset class="adminform">
					<div class="adminformlist">
					<?php foreach
($this->form->getFieldset('accesscontrol') as $field):
?>
						<div>
							<?php echo $field->label; echo $field->input;?>
						</div>
						<div class="clearfix"></div>
					<?php endforeach; ?>
					</div>
				</fieldset>
			</div>
		</div>
	<?php echo JHtml::_('bootstrap.endTab'); ?>
	<?php endif; ?>

	<?php echo JHtml::_('bootstrap.endTabSet'); ?>

	<div>
		<input type="hidden" name="task"
value="consultant.edit" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</div>
</form>
</div>

<script type="text/javascript">



/***[JCBGUI.field.javascript_view_footer.1038.$$$$]***/
jQuery(document).ready(function($){

   var gettoken= Joomla.getOptions('token');


   $('select#jform_capitalid').change(function () {

      var capitalid= $(this).val();
      var token= gettoken;

      $.ajax({
         url: 'index.php?option=com_reservation',
         method: 'post',
         dataType: 'json',
         data: {[token] : '1',task:'ajax.getCity',
format: 'json' , raw: 'true' , capitalid: capitalid},
         success: function (msg) {

            var temp='<option value="">Select an
option</option>';
            msg.each(function(value, index){

               temp += '<option
value="'+value.id+'">'+value.name+'</option>';

            });

            $('select#jform_cityid').html(temp);
            $( "select#jform_cityid" ).trigger(
"liszt:updated" );
         },
         error: function (err) {
            console.log(err);
         }
      });


   });


});/***[/JCBGUI$$$$]***/

</script>
PK5~�[�#o,,
views/consultant/tmpl/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[D���GGviews/consultant/view.html.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		view.html.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

/**
 * Consultant View class
 */
class ReservationViewConsultant extends JViewLegacy
{
	/**
	 * display method of View
	 * @return void
	 */
	public function display($tpl = null)
	{
		// set params
		$this->params =
JComponentHelper::getParams('com_reservation');
		// Assign the variables
		$this->form = $this->get('Form');
		$this->item = $this->get('Item');
		$this->script = $this->get('Script');
		$this->state = $this->get('State');
		// get action permissions
		$this->canDo = ReservationHelper::getActions('consultant',
$this->item);
		// get input
		$jinput = JFactory::getApplication()->input;
		$this->ref = $jinput->get('ref', 0, 'word');
		$this->refid = $jinput->get('refid', 0, 'int');
		$return = $jinput->get('return', null, 'base64');
		// set the referral string
		$this->referral = '';
		if ($this->refid && $this->ref)
		{
			// return to the item that referred to this item
			$this->referral = '&ref=' . (string)$this->ref .
'&refid=' . (int)$this->refid;
		}
		elseif($this->ref)
		{
			// return to the list view that referred to this item
			$this->referral = '&ref=' . (string)$this->ref;
		}
		// check return value
		if (!is_null($return))
		{
			// add the return value
			$this->referral .= '&return=' . (string)$return;
		}

		// Set the toolbar
		$this->addToolBar();
		
		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		// Display the template
		parent::display($tpl);

		// Set the document
		$this->setDocument();
	}


	/**
	 * Setting the toolbar
	 */
	protected function addToolBar()
	{
		JFactory::getApplication()->input->set('hidemainmenu',
true);
		$user = JFactory::getUser();
		$userId	= $user->id;
		$isNew = $this->item->id == 0;

		JToolbarHelper::title( JText::_($isNew ?
'COM_RESERVATION_CONSULTANT_NEW' :
'COM_RESERVATION_CONSULTANT_EDIT'), 'pencil-2
article-add');
		// Built the actions for new and existing records.
		if (ReservationHelper::checkString($this->referral))
		{
			if ($this->canDo->get('core.create') && $isNew)
			{
				// We can create the record.
				JToolBarHelper::save('consultant.save',
'JTOOLBAR_SAVE');
			}
			elseif ($this->canDo->get('core.edit'))
			{
				// We can save the record.
				JToolBarHelper::save('consultant.save',
'JTOOLBAR_SAVE');
			}
			if ($isNew)
			{
				// Do not creat but cancel.
				JToolBarHelper::cancel('consultant.cancel',
'JTOOLBAR_CANCEL');
			}
			else
			{
				// We can close it.
				JToolBarHelper::cancel('consultant.cancel',
'JTOOLBAR_CLOSE');
			}
		}
		else
		{
			if ($isNew)
			{
				// For new records, check the create permission.
				if ($this->canDo->get('core.create'))
				{
					JToolBarHelper::apply('consultant.apply',
'JTOOLBAR_APPLY');
					JToolBarHelper::save('consultant.save',
'JTOOLBAR_SAVE');
					JToolBarHelper::custom('consultant.save2new',
'save-new.png', 'save-new_f2.png',
'JTOOLBAR_SAVE_AND_NEW', false);
				};
				JToolBarHelper::cancel('consultant.cancel',
'JTOOLBAR_CANCEL');
			}
			else
			{
				if ($this->canDo->get('core.edit'))
				{
					// We can save the new record
					JToolBarHelper::apply('consultant.apply',
'JTOOLBAR_APPLY');
					JToolBarHelper::save('consultant.save',
'JTOOLBAR_SAVE');
					// We can save this record, but check the create permission to see
					// if we can return to make a new one.
					if ($this->canDo->get('core.create'))
					{
						JToolBarHelper::custom('consultant.save2new',
'save-new.png', 'save-new_f2.png',
'JTOOLBAR_SAVE_AND_NEW', false);
					}
				}
				$canVersion = ($this->canDo->get('core.version')
&& $this->canDo->get('consultant.version'));
				if ($this->state->params->get('save_history', 1)
&& $this->canDo->get('core.edit') &&
$canVersion)
				{
					JToolbarHelper::versions('com_reservation.consultant',
$this->item->id);
				}
				if ($this->canDo->get('core.create'))
				{
					JToolBarHelper::custom('consultant.save2copy',
'save-copy.png', 'save-copy_f2.png',
'JTOOLBAR_SAVE_AS_COPY', false);
				}
				JToolBarHelper::cancel('consultant.cancel',
'JTOOLBAR_CLOSE');
			}
		}
		JToolbarHelper::divider();
		// set help url for this view if found
		$help_url = ReservationHelper::getHelpUrl('consultant');
		if (ReservationHelper::checkString($help_url))
		{
			JToolbarHelper::help('COM_RESERVATION_HELP_MANAGER', false,
$help_url);
		}
	}

	/**
	 * Escapes a value for output in a view script.
	 *
	 * @param   mixed  $var  The output to escape.
	 *
	 * @return  mixed  The escaped value.
	 */
	public function escape($var)
	{
		if(strlen($var) > 30)
		{
    		// use the helper htmlEscape method instead and shorten the string
			return ReservationHelper::htmlEscape($var, $this->_charset, true,
30);
		}
		// use the helper htmlEscape method instead.
		return ReservationHelper::htmlEscape($var, $this->_charset);
	}

	/**
	 * Method to set up the document properties
	 *
	 * @return void
	 */
	protected function setDocument()
	{
		$isNew = ($this->item->id < 1);
		if (!isset($this->document))
		{
			$this->document = JFactory::getDocument();
		}
		$this->document->setTitle(JText::_($isNew ?
'COM_RESERVATION_CONSULTANT_NEW' :
'COM_RESERVATION_CONSULTANT_EDIT'));
		$this->document->addStyleSheet(JURI::root() .
"administrator/components/com_reservation/assets/css/consultant.css",
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') : 'text/css');
		// Add Ajax Token
		$this->document->addScriptDeclaration("var token =
'".JSession::getFormToken()."';");
		$this->document->addScript(JURI::root() . $this->script,
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') :
'text/javascript');
		$this->document->addScript(JURI::root() .
"administrator/components/com_reservation/views/consultant/submitbutton.js",
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') :
'text/javascript'); 

/***[JCBGUI.admin_view.php_document.110.$$$$]***/
$this->document->addScriptOptions('token',JFactory::getSession()->getFormToken());/***[/JCBGUI$$$$]***/

		JText::script('view not acceptable. Error');
	}
}
PK5~�[�#o,,views/consultants/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[�A�
  "views/consultants/tmpl/default.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

JHtml::_('behavior.tooltip');
JHtml::_('behavior.multiselect');
JHtml::_('dropdown.init');
JHtml::_('formbehavior.chosen',
'.multipleAccessLevels', null,
array('placeholder_text_multiple' => '- ' .
JText::_('COM_RESERVATION_FILTER_SELECT_ACCESS') . '
-'));
JHtml::_('formbehavior.chosen', 'select');
if ($this->saveOrder)
{
	$saveOrderingUrl =
'index.php?option=com_reservation&task=consultants.saveOrderAjax&tmpl=component';
	JHtml::_('sortablelist.sortable', 'consultantList',
'adminForm', strtolower($this->listDirn), $saveOrderingUrl);
}
?>
<form action="<?php echo
JRoute::_('index.php?option=com_reservation&view=consultants');
?>" method="post" name="adminForm"
id="adminForm">
<?php if(!empty( $this->sidebar)): ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif; ?>
<?php
	// Add the searchtools
	echo JLayoutHelper::render('joomla.searchtools.default',
array('view' => $this));
?>
<?php if (empty($this->items)): ?>
	<div class="alert alert-no-items">
		<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
	</div>
<?php else : ?>
	<table class="table table-striped"
id="consultantList">
		<thead><?php echo
$this->loadTemplate('head');?></thead>
		<tfoot><?php echo
$this->loadTemplate('foot');?></tfoot>
		<tbody><?php echo
$this->loadTemplate('body');?></tbody>
	</table>
	<?php // Load the batch processing form. ?>
	<?php if ($this->canCreate && $this->canEdit) : ?>
		<?php echo JHtml::_(
			'bootstrap.renderModal',
			'collapseModal',
			array(
				'title' =>
JText::_('COM_RESERVATION_CONSULTANTS_BATCH_OPTIONS'),
				'footer' =>
$this->loadTemplate('batch_footer')
			),
			$this->loadTemplate('batch_body')
		); ?>
	<?php endif; ?>
	<input type="hidden" name="boxchecked"
value="0" />
	</div>
<?php endif; ?>
	<input type="hidden" name="task" value=""
/>
	<?php echo JHtml::_('form.token'); ?>
</form>
PK5~�[������-views/consultants/tmpl/default_batch_body.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_batch_body.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>

<p><?php echo
JText::_('COM_RESERVATION_CONSULTANTS_BATCH_TIP');
?></p>
<?php echo $this->batchDisplay;
?>PK5~�[������/views/consultants/tmpl/default_batch_footer.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_batch_footer.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<!-- clear the batch values if cancel -->
<button class="btn" type="button"
onclick="" data-dismiss="modal">
	<?php echo JText::_('JCANCEL'); ?>
</button>
<!-- post the batch values if process -->
<button class="btn btn-success" type="submit"
onclick="Joomla.submitbutton('consultant.batch');">
	<?php echo JText::_('JGLOBAL_BATCH_PROCESS'); ?>
</button>PK5~�[�����'views/consultants/tmpl/default_body.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_body.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

$edit =
"index.php?option=com_reservation&view=consultants&task=consultant.edit";

?>
<?php foreach ($this->items as $i => $item): ?>
	<?php
		$canCheckin = $this->user->authorise('core.manage',
'com_checkin') || $item->checked_out == $this->user->id
|| $item->checked_out == 0;
		$userChkOut = JFactory::getUser($item->checked_out);
		$canDo =
ReservationHelper::getActions('consultant',$item,'consultants');
	?>
	<tr class="row<?php echo $i % 2; ?>">
		<td class="order nowrap center hidden-phone">
		<?php if ($canDo->get('core.edit.state')): ?>
			<?php
				$iconClass = '';
				if (!$this->saveOrder)
				{
					$iconClass = ' inactive tip-top" hasTooltip"
title="' . JHtml::tooltipText('JORDERINGDISABLED');
				}
			?>
			<span class="sortable-handler<?php echo $iconClass;
?>">
				<i class="icon-menu"></i>
			</span>
			<?php if ($this->saveOrder) : ?>
				<input type="text" style="display:none"
name="order[]" size="5"
				value="<?php echo $item->ordering; ?>"
class="width-20 text-area-order " />
			<?php endif; ?>
		<?php else: ?>
			&#8942;
		<?php endif; ?>
		</td>
		<td class="nowrap center">
		<?php if ($canDo->get('core.edit')): ?>
				<?php if ($item->checked_out) : ?>
					<?php if ($canCheckin) : ?>
						<?php echo JHtml::_('grid.id', $i, $item->id); ?>
					<?php else: ?>
						&#9633;
					<?php endif; ?>
				<?php else: ?>
					<?php echo JHtml::_('grid.id', $i, $item->id); ?>
				<?php endif; ?>
		<?php else: ?>
			&#9633;
		<?php endif; ?>
		</td>
		<td class="nowrap">
			<div class="name">
				<?php if ($canDo->get('core.edit')): ?>
					<a href="<?php echo $edit; ?>&id=<?php echo
$item->id; ?>"><?php echo
JFactory::getUser((int)$item->userid)->name; ?></a>
					<?php if ($item->checked_out): ?>
						<?php echo JHtml::_('jgrid.checkedout', $i,
$userChkOut->name, $item->checked_out_time, 'consultants.',
$canCheckin); ?>
					<?php endif; ?>
				<?php else: ?>
					<?php echo JFactory::getUser((int)$item->userid)->name; ?>
				<?php endif; ?>
			</div>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->nationalnumber); ?>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->category_title); ?>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->image); ?>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->experience); ?>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->msn); ?>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->phonenumber); ?>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->shortlink); ?>
		</td>
		<td class="hidden-phone">
			<?php echo JText::_($item->account); ?>
		</td>
		<td class="center">
		<?php if ($canDo->get('core.edit.state')) : ?>
				<?php if ($item->checked_out) : ?>
					<?php if ($canCheckin) : ?>
						<?php echo JHtml::_('jgrid.published',
$item->published, $i, 'consultants.', true, 'cb');
?>
					<?php else: ?>
						<?php echo JHtml::_('jgrid.published',
$item->published, $i, 'consultants.', false, 'cb');
?>
					<?php endif; ?>
				<?php else: ?>
					<?php echo JHtml::_('jgrid.published',
$item->published, $i, 'consultants.', true, 'cb');
?>
				<?php endif; ?>
		<?php else: ?>
			<?php echo JHtml::_('jgrid.published', $item->published,
$i, 'consultants.', false, 'cb'); ?>
		<?php endif; ?>
		</td>
		<td class="nowrap center hidden-phone">
			<?php echo $item->id; ?>
		</td>
	</tr>
<?php endforeach;
?>PK5~�[�S���'views/consultants/tmpl/default_foot.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_foot.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<tr>
	<td colspan="13"><?php echo
$this->pagination->getListFooter(); ?></td>
</tr>PK5~�[��{���'views/consultants/tmpl/default_head.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_head.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<tr>
	<?php if ($this->canEdit&& $this->canState): ?>
		<th width="1%" class="nowrap center
hidden-phone">
			<?php echo JHtml::_('searchtools.sort', '',
'a.ordering', $this->listDirn, $this->listOrder, null,
'asc', 'JGRID_HEADING_ORDERING',
'icon-menu-2'); ?>
		</th>
		<th width="20" class="nowrap center">
			<?php echo JHtml::_('grid.checkall'); ?>
		</th>
	<?php else: ?>
		<th width="20" class="nowrap center
hidden-phone">
			&#9662;
		</th>
		<th width="20" class="nowrap center">
			&#9632;
		</th>
	<?php endif; ?>
	<th class="nowrap" >
			<?php echo
JText::_('COM_RESERVATION_CONSULTANT_USERID_LABEL'); ?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo
JText::_('COM_RESERVATION_CONSULTANT_NATIONALNUMBER_LABEL');
?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo
JText::_('COM_RESERVATION_CONSULTANT_CONSULTANTS_CATEGORIES');
?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo
JText::_('COM_RESERVATION_CONSULTANT_IMAGE_LABEL'); ?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo JHtml::_('searchtools.sort',
'COM_RESERVATION_CONSULTANT_EXPERIENCE_LABEL',
'a.experience', $this->listDirn, $this->listOrder); ?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo
JText::_('COM_RESERVATION_CONSULTANT_MSN_LABEL'); ?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo
JText::_('COM_RESERVATION_CONSULTANT_PHONENUMBER_LABEL'); ?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo
JText::_('COM_RESERVATION_CONSULTANT_SHORTLINK_LABEL'); ?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo
JText::_('COM_RESERVATION_CONSULTANT_ACCOUNT_LABEL'); ?>
	</th>
	<?php if ($this->canState): ?>
		<th width="10" class="nowrap center" >
			<?php echo JHtml::_('searchtools.sort',
'COM_RESERVATION_CONSULTANT_STATUS', 'a.published',
$this->listDirn, $this->listOrder); ?>
		</th>
	<?php else: ?>
		<th width="10" class="nowrap center" >
			<?php echo JText::_('COM_RESERVATION_CONSULTANT_STATUS');
?>
		</th>
	<?php endif; ?>
	<th width="5" class="nowrap center hidden-phone"
>
			<?php echo JHtml::_('searchtools.sort',
'COM_RESERVATION_CONSULTANT_ID', 'a.id',
$this->listDirn, $this->listOrder); ?>
	</th>
</tr>PK5~�[��v,88*views/consultants/tmpl/default_toolbar.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_toolbar.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<div id="filter-bar" class="btn-toolbar">
        <div class="filter-search btn-group pull-left">
            <label for="filter_search"
class="element-invisible"><?php echo
JText::_('Search');?></label>
            <input type="text" name="filter_search"
id="filter_search" placeholder="<?php echo
JText::_('JSEARCH_FILTER'); ?>" value="<?php echo
$this->escape($this->state->get('filter.search'));
?>" class="hasTooltip" title="<?php echo
JHtml::tooltipText('Search Consultants'); ?>" />
        </div>
        <div class="btn-group pull-left">
            <button type="submit" class="btn
hasTooltip" title="<?php echo
JHtml::tooltipText('JSEARCH_FILTER_SUBMIT'); ?>"><i
class="icon-search"></i></button>
            <button type="button" class="btn
hasTooltip" title="<?php echo
JHtml::tooltipText('JSEARCH_FILTER_CLEAR'); ?>"
onclick="document.id('filter_search').value='';this.form.submit();"><i
class="icon-remove"></i></button>
        </div>
        <div class="btn-group pull-right hidden-phone">
            <label for="limit"
class="element-invisible"><?php echo
JText::_('JFIELD_PLG_SEARCH_SEARCHLIMIT_DESC');?></label>
            <?php echo $this->pagination->getLimitBox(); ?>
        </div>
        <div class="btn-group pull-right hidden-phone">
            <label for="directionTable"
class="element-invisible"><?php echo
JText::_('JFIELD_ORDERING_DESC');?></label>
            <select name="directionTable"
id="directionTable" class="input-medium"
onchange="Joomla.orderTable()">
                <option value=""><?php echo
JText::_('JFIELD_ORDERING_DESC');?></option>
                <option value="asc" <?php if
($this->listDirn == 'asc') echo
'selected="selected"'; ?>><?php echo
JText::_('JGLOBAL_ORDER_ASCENDING');?></option>
                <option value="desc" <?php if
($this->listDirn == 'desc') echo
'selected="selected"'; ?>><?php echo
JText::_('JGLOBAL_ORDER_DESCENDING');?></option>
            </select>
        </div>
        <div class="btn-group pull-right">
            <label for="sortTable"
class="element-invisible"><?php echo
JText::_('JGLOBAL_SORT_BY');?></label>
            <select name="sortTable" id="sortTable"
class="input-medium" onchange="Joomla.orderTable()">
                <option value=""><?php echo
JText::_('JGLOBAL_SORT_BY');?></option>
                <?php echo JHtml::_('select.options',
$this->getSortFields(), 'value', 'text',
$this->listOrder);?>
            </select>
        </div>
    </div>
<div class="clearfix">
</div>PK5~�[�#o,,!views/consultants/tmpl/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[��1PPviews/consultants/view.html.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		view.html.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

/**
 * Reservation View class for the Consultants
 */
class ReservationViewConsultants extends JViewLegacy
{
	/**
	 * Consultants view display method
	 * @return void
	 */
	function display($tpl = null)
	{
		if ($this->getLayout() !== 'modal')
		{
			// Include helper submenu
			ReservationHelper::addSubmenu('consultants');
		}

		// Assign data to the view
		$this->items = $this->get('Items');
		$this->pagination = $this->get('Pagination');
		$this->state = $this->get('State');
		$this->user = JFactory::getUser();
		// Load the filter form from xml.
		$this->filterForm = $this->get('FilterForm');
		// Load the active filters.
		$this->activeFilters = $this->get('ActiveFilters');
		// Add the list ordering clause.
		$this->listOrder =
$this->escape($this->state->get('list.ordering',
'a.id'));
		$this->listDirn =
$this->escape($this->state->get('list.direction',
'DESC'));
		$this->saveOrder = $this->listOrder == 'a.ordering';
		// set the return here value
		$this->return_here = urlencode(base64_encode((string)
JUri::getInstance()));
		// get global action permissions
		$this->canDo = ReservationHelper::getActions('consultant');
		$this->canEdit = $this->canDo->get('core.edit');
		$this->canState =
$this->canDo->get('core.edit.state');
		$this->canCreate = $this->canDo->get('core.create');
		$this->canDelete = $this->canDo->get('core.delete');
		$this->canBatch = $this->canDo->get('core.batch');

		// We don't need toolbar in the modal window.
		if ($this->getLayout() !== 'modal')
		{
			$this->addToolbar();
			$this->sidebar = JHtmlSidebar::render();
			// load the batch html
			if ($this->canCreate && $this->canEdit &&
$this->canState)
			{
				$this->batchDisplay = JHtmlBatch_::render();
			}
		}
		
		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		// Display the template
		parent::display($tpl);

		// Set the document
		$this->setDocument();
	}

	/**
	 * Setting the toolbar
	 */
	protected function addToolBar()
	{
		JToolBarHelper::title(JText::_('COM_RESERVATION_CONSULTANTS'),
'joomla');
		JHtmlSidebar::setAction('index.php?option=com_reservation&view=consultants');
		JFormHelper::addFieldPath(JPATH_COMPONENT . '/models/fields');

		if ($this->canCreate)
		{
			JToolBarHelper::addNew('consultant.add');
		}

		// Only load if there are items
		if (ReservationHelper::checkArray($this->items))
		{
			if ($this->canEdit)
			{
				JToolBarHelper::editList('consultant.edit');
			}

			if ($this->canState)
			{
				JToolBarHelper::publishList('consultants.publish');
				JToolBarHelper::unpublishList('consultants.unpublish');
				JToolBarHelper::archiveList('consultants.archive');

				if ($this->canDo->get('core.admin'))
				{
					JToolBarHelper::checkin('consultants.checkin');
				}
			}

			// Add a batch button
			if ($this->canBatch && $this->canCreate &&
$this->canEdit && $this->canState)
			{
				// Get the toolbar object instance
				$bar = JToolBar::getInstance('toolbar');
				// set the batch button name
				$title = JText::_('JTOOLBAR_BATCH');
				// Instantiate a new JLayoutFile instance and render the batch button
				$layout = new JLayoutFile('joomla.toolbar.batch');
				// add the button to the page
				$dhtml = $layout->render(array('title' => $title));
				$bar->appendButton('Custom', $dhtml, 'batch');
			}

			if ($this->state->get('filter.published') == -2
&& ($this->canState && $this->canDelete))
			{
				JToolbarHelper::deleteList('',
'consultants.delete', 'JTOOLBAR_EMPTY_TRASH');
			}
			elseif ($this->canState && $this->canDelete)
			{
				JToolbarHelper::trash('consultants.trash');
			}

			if ($this->canDo->get('core.export') &&
$this->canDo->get('consultant.export'))
			{
				JToolBarHelper::custom('consultants.exportData',
'download', '',
'COM_RESERVATION_EXPORT_DATA', true);
			}
		}

		if ($this->canDo->get('core.import') &&
$this->canDo->get('consultant.import'))
		{
			JToolBarHelper::custom('consultants.importData',
'upload', '', 'COM_RESERVATION_IMPORT_DATA',
false);
		}

		// set help url for this view if found
		$help_url = ReservationHelper::getHelpUrl('consultants');
		if (ReservationHelper::checkString($help_url))
		{
				JToolbarHelper::help('COM_RESERVATION_HELP_MANAGER', false,
$help_url);
		}

		// add the options comp button
		if ($this->canDo->get('core.admin') ||
$this->canDo->get('core.options'))
		{
			JToolBarHelper::preferences('com_reservation');
		}

		// Only load published batch if state and batch is allowed
		if ($this->canState && $this->canBatch)
		{
			JHtmlBatch_::addListSelection(
				JText::_('COM_RESERVATION_KEEP_ORIGINAL_STATE'),
				'batch[published]',
				JHtml::_('select.options',
JHtml::_('jgrid.publishedOptions', array('all' =>
false)), 'value', 'text', '', true)
			);
		}

		// Only load access batch if create, edit and batch is allowed
		if ($this->canBatch && $this->canCreate &&
$this->canEdit)
		{
			JHtmlBatch_::addListSelection(
				JText::_('COM_RESERVATION_KEEP_ORIGINAL_ACCESS'),
				'batch[access]',
				JHtml::_('select.options',
JHtml::_('access.assetgroups'), 'value',
'text')
			);
		}

		if ($this->canBatch && $this->canCreate &&
$this->canEdit)
		{
			// Category Batch selection.
			JHtmlBatch_::addListSelection(
				JText::_('COM_RESERVATION_KEEP_ORIGINAL_CATEGORY'),
				'batch[category]',
				JHtml::_('select.options',
JHtml::_('category.options', 'com_reservation'),
'value', 'text')
			);
		}
	}

	/**
	 * Method to set up the document properties
	 *
	 * @return void
	 */
	protected function setDocument()
	{
		if (!isset($this->document))
		{
			$this->document = JFactory::getDocument();
		}
		$this->document->setTitle(JText::_('COM_RESERVATION_CONSULTANTS'));
		$this->document->addStyleSheet(JURI::root() .
"administrator/components/com_reservation/assets/css/consultants.css",
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') : 'text/css');
	}

	/**
	 * Escapes a value for output in a view script.
	 *
	 * @param   mixed  $var  The output to escape.
	 *
	 * @return  mixed  The escaped value.
	 */
	public function escape($var)
	{
		if(strlen($var) > 50)
		{
			// use the helper htmlEscape method instead and shorten the string
			return ReservationHelper::htmlEscape($var, $this->_charset, true);
		}
		// use the helper htmlEscape method instead.
		return ReservationHelper::htmlEscape($var, $this->_charset);
	}

	/**
	 * Returns an array of fields the table can be sorted by
	 *
	 * @return  array  Array containing the field name to sort by as the key
and display text as value
	 */
	protected function getSortFields()
	{
		return array(
			'a.ordering' =>
JText::_('JGRID_HEADING_ORDERING'),
			'a.published' => JText::_('JSTATUS'),
			'a.experience' =>
JText::_('COM_RESERVATION_CONSULTANT_EXPERIENCE_LABEL'),
			'a.id' => JText::_('JGRID_HEADING_ID')
		);
	}
}
PK5~�[�����views/doctor/submitbutton.jsnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		submitbutton.js
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

Joomla.submitbutton = function(task)
{
	if (task == ''){
		return false;
	} else { 
		var action = task.split('.');
		if (action[1] == 'cancel' || action[1] == 'close' ||
document.formvalidator.isValid(document.getElementById("adminForm"))){
			Joomla.submitform(task, document.getElementById("adminForm"));
			return true;
		} else {
			alert(Joomla.JText._('doctor, some values are not
acceptable.','Some values are unacceptable'));
			return false;
		}
	}
}PK5~�[�Y���views/doctor/tmpl/edit.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		edit.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');
JHtml::_('behavior.tooltip');
JHtml::_('behavior.formvalidation');
JHtml::_('formbehavior.chosen', 'select');
JHtml::_('behavior.keepalive');
$componentParams = $this->params; // will be removed just use
$this->params instead
?>
<script type="text/javascript">
	// waiting spinner
	var outerDiv = jQuery('body');
	jQuery('<div id="loading"></div>')
		.css("background", "rgba(255, 255, 255, .8)
url('components/com_reservation/assets/images/import.gif') 50%
15% no-repeat")
		.css("top", outerDiv.position().top -
jQuery(window).scrollTop())
		.css("left", outerDiv.position().left -
jQuery(window).scrollLeft())
		.css("width", outerDiv.width())
		.css("height", outerDiv.height())
		.css("position", "fixed")
		.css("opacity", "0.80")
		.css("-ms-filter",
"progid:DXImageTransform.Microsoft.Alpha(Opacity = 80)")
		.css("filter", "alpha(opacity = 80)")
		.css("display", "none")
		.appendTo(outerDiv);
	jQuery('#loading').show();
	// when page is ready remove and show
	jQuery(window).load(function() {
		jQuery('#reservation_loader').fadeIn('fast');
		jQuery('#loading').hide();
	});
</script>
<div id="reservation_loader" style="display:
none;">
<form action="<?php echo
JRoute::_('index.php?option=com_reservation&layout=edit&id='.
(int) $this->item->id . $this->referral); ?>"
method="post" name="adminForm" id="adminForm"
class="form-validate" enctype="multipart/form-data">

<div class="form-horizontal">

	<?php echo JHtml::_('bootstrap.startTabSet',
'doctorTab', array('active' =>
'details')); ?>

	<?php echo JHtml::_('bootstrap.addTab',
'doctorTab', 'details',
JText::_('COM_RESERVATION_DOCTOR_DETAILS', true)); ?>
		<div class="row-fluid form-horizontal-desktop">
			<div class="span6">
				<?php echo JLayoutHelper::render('doctor.details_left',
$this); ?>
			</div>
			<div class="span6">
				<?php echo JLayoutHelper::render('doctor.details_right',
$this); ?>
			</div>
		</div>
		<div class="row-fluid form-horizontal-desktop">
			<div class="span12">
				<?php echo
JLayoutHelper::render('doctor.details_fullwidth', $this); ?>
			</div>
		</div>
	<?php echo JHtml::_('bootstrap.endTab'); ?>

	<?php $this->ignore_fieldsets =
array('details','metadata','vdmmetadata','accesscontrol');
?>
	<?php $this->tab_name = 'doctorTab'; ?>
	<?php echo JLayoutHelper::render('joomla.edit.params',
$this); ?>

	<?php if ($this->canDo->get('core.edit.created_by') ||
$this->canDo->get('core.edit.created') ||
$this->canDo->get('core.edit.state') ||
($this->canDo->get('core.delete') &&
$this->canDo->get('core.edit.state'))) : ?>
	<?php echo JHtml::_('bootstrap.addTab',
'doctorTab', 'publishing',
JText::_('COM_RESERVATION_DOCTOR_PUBLISHING', true)); ?>
		<div class="row-fluid form-horizontal-desktop">
			<div class="span6">
				<?php echo JLayoutHelper::render('doctor.publishing',
$this); ?>
			</div>
			<div class="span6">
				<?php echo JLayoutHelper::render('doctor.publlshing',
$this); ?>
			</div>
		</div>
	<?php echo JHtml::_('bootstrap.endTab'); ?>
	<?php endif; ?>

	<?php if ($this->canDo->get('core.admin')) : ?>
	<?php echo JHtml::_('bootstrap.addTab',
'doctorTab', 'permissions',
JText::_('COM_RESERVATION_DOCTOR_PERMISSION', true)); ?>
		<div class="row-fluid form-horizontal-desktop">
			<div class="span12">
				<fieldset class="adminform">
					<div class="adminformlist">
					<?php foreach
($this->form->getFieldset('accesscontrol') as $field):
?>
						<div>
							<?php echo $field->label; echo $field->input;?>
						</div>
						<div class="clearfix"></div>
					<?php endforeach; ?>
					</div>
				</fieldset>
			</div>
		</div>
	<?php echo JHtml::_('bootstrap.endTab'); ?>
	<?php endif; ?>

	<?php echo JHtml::_('bootstrap.endTabSet'); ?>

	<div>
		<input type="hidden" name="task"
value="doctor.edit" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</div>
</form>
</div>

<script type="text/javascript">



/***[JCBGUI.field.javascript_view_footer.1038.$$$$]***/
jQuery(document).ready(function($){

   var gettoken= Joomla.getOptions('token');


   $('select#jform_capitalid').change(function () {

      var capitalid= $(this).val();
      var token= gettoken;

      $.ajax({
         url: 'index.php?option=com_reservation',
         method: 'post',
         dataType: 'json',
         data: {[token] : '1',task:'ajax.getCity',
format: 'json' , raw: 'true' , capitalid: capitalid},
         success: function (msg) {

            var temp='<option value="">Select an
option</option>';
            msg.each(function(value, index){

               temp += '<option
value="'+value.id+'">'+value.name+'</option>';

            });

            $('select#jform_cityid').html(temp);
            $( "select#jform_cityid" ).trigger(
"liszt:updated" );
         },
         error: function (err) {
            console.log(err);
         }
      });


   });


});/***[/JCBGUI$$$$]***/

</script>
PK5~�[�#o,,views/doctor/tmpl/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[�P'��views/doctor/view.html.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		view.html.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

/**
 * Doctor View class
 */
class ReservationViewDoctor extends JViewLegacy
{
	/**
	 * display method of View
	 * @return void
	 */
	public function display($tpl = null)
	{
		// set params
		$this->params =
JComponentHelper::getParams('com_reservation');
		// Assign the variables
		$this->form = $this->get('Form');
		$this->item = $this->get('Item');
		$this->script = $this->get('Script');
		$this->state = $this->get('State');
		// get action permissions
		$this->canDo = ReservationHelper::getActions('doctor',
$this->item);
		// get input
		$jinput = JFactory::getApplication()->input;
		$this->ref = $jinput->get('ref', 0, 'word');
		$this->refid = $jinput->get('refid', 0, 'int');
		$return = $jinput->get('return', null, 'base64');
		// set the referral string
		$this->referral = '';
		if ($this->refid && $this->ref)
		{
			// return to the item that referred to this item
			$this->referral = '&ref=' . (string)$this->ref .
'&refid=' . (int)$this->refid;
		}
		elseif($this->ref)
		{
			// return to the list view that referred to this item
			$this->referral = '&ref=' . (string)$this->ref;
		}
		// check return value
		if (!is_null($return))
		{
			// add the return value
			$this->referral .= '&return=' . (string)$return;
		}

		// Set the toolbar
		$this->addToolBar();
		
		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		// Display the template
		parent::display($tpl);

		// Set the document
		$this->setDocument();
	}


	/**
	 * Setting the toolbar
	 */
	protected function addToolBar()
	{
		JFactory::getApplication()->input->set('hidemainmenu',
true);
		$user = JFactory::getUser();
		$userId	= $user->id;
		$isNew = $this->item->id == 0;

		JToolbarHelper::title( JText::_($isNew ?
'COM_RESERVATION_DOCTOR_NEW' :
'COM_RESERVATION_DOCTOR_EDIT'), 'pencil-2
article-add');
		// Built the actions for new and existing records.
		if (ReservationHelper::checkString($this->referral))
		{
			if ($this->canDo->get('core.create') && $isNew)
			{
				// We can create the record.
				JToolBarHelper::save('doctor.save',
'JTOOLBAR_SAVE');
			}
			elseif ($this->canDo->get('core.edit'))
			{
				// We can save the record.
				JToolBarHelper::save('doctor.save',
'JTOOLBAR_SAVE');
			}
			if ($isNew)
			{
				// Do not creat but cancel.
				JToolBarHelper::cancel('doctor.cancel',
'JTOOLBAR_CANCEL');
			}
			else
			{
				// We can close it.
				JToolBarHelper::cancel('doctor.cancel',
'JTOOLBAR_CLOSE');
			}
		}
		else
		{
			if ($isNew)
			{
				// For new records, check the create permission.
				if ($this->canDo->get('core.create'))
				{
					JToolBarHelper::apply('doctor.apply',
'JTOOLBAR_APPLY');
					JToolBarHelper::save('doctor.save',
'JTOOLBAR_SAVE');
					JToolBarHelper::custom('doctor.save2new',
'save-new.png', 'save-new_f2.png',
'JTOOLBAR_SAVE_AND_NEW', false);
				};
				JToolBarHelper::cancel('doctor.cancel',
'JTOOLBAR_CANCEL');
			}
			else
			{
				if ($this->canDo->get('core.edit'))
				{
					// We can save the new record
					JToolBarHelper::apply('doctor.apply',
'JTOOLBAR_APPLY');
					JToolBarHelper::save('doctor.save',
'JTOOLBAR_SAVE');
					// We can save this record, but check the create permission to see
					// if we can return to make a new one.
					if ($this->canDo->get('core.create'))
					{
						JToolBarHelper::custom('doctor.save2new',
'save-new.png', 'save-new_f2.png',
'JTOOLBAR_SAVE_AND_NEW', false);
					}
				}
				$canVersion = ($this->canDo->get('core.version')
&& $this->canDo->get('doctor.version'));
				if ($this->state->params->get('save_history', 1)
&& $this->canDo->get('core.edit') &&
$canVersion)
				{
					JToolbarHelper::versions('com_reservation.doctor',
$this->item->id);
				}
				if ($this->canDo->get('core.create'))
				{
					JToolBarHelper::custom('doctor.save2copy',
'save-copy.png', 'save-copy_f2.png',
'JTOOLBAR_SAVE_AS_COPY', false);
				}
				JToolBarHelper::cancel('doctor.cancel',
'JTOOLBAR_CLOSE');
			}
		}
		JToolbarHelper::divider();
		// set help url for this view if found
		$help_url = ReservationHelper::getHelpUrl('doctor');
		if (ReservationHelper::checkString($help_url))
		{
			JToolbarHelper::help('COM_RESERVATION_HELP_MANAGER', false,
$help_url);
		}
	}

	/**
	 * Escapes a value for output in a view script.
	 *
	 * @param   mixed  $var  The output to escape.
	 *
	 * @return  mixed  The escaped value.
	 */
	public function escape($var)
	{
		if(strlen($var) > 30)
		{
    		// use the helper htmlEscape method instead and shorten the string
			return ReservationHelper::htmlEscape($var, $this->_charset, true,
30);
		}
		// use the helper htmlEscape method instead.
		return ReservationHelper::htmlEscape($var, $this->_charset);
	}

	/**
	 * Method to set up the document properties
	 *
	 * @return void
	 */
	protected function setDocument()
	{
		$isNew = ($this->item->id < 1);
		if (!isset($this->document))
		{
			$this->document = JFactory::getDocument();
		}
		$this->document->setTitle(JText::_($isNew ?
'COM_RESERVATION_DOCTOR_NEW' :
'COM_RESERVATION_DOCTOR_EDIT'));
		$this->document->addStyleSheet(JURI::root() .
"administrator/components/com_reservation/assets/css/doctor.css",
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') : 'text/css');
		// Add Ajax Token
		$this->document->addScriptDeclaration("var token =
'".JSession::getFormToken()."';");
		$this->document->addScript(JURI::root() . $this->script,
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') :
'text/javascript');
		$this->document->addScript(JURI::root() .
"administrator/components/com_reservation/views/doctor/submitbutton.js",
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') :
'text/javascript'); 

/***[JCBGUI.admin_view.php_document.121.$$$$]***/
$this->document->addScriptOptions('token',JFactory::getSession()->getFormToken());/***[/JCBGUI$$$$]***/

		JText::script('view not acceptable. Error');
	}
}
PK5~�[�#o,,views/doctors/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[��t��views/doctors/tmpl/default.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

JHtml::_('behavior.tooltip');
JHtml::_('behavior.multiselect');
JHtml::_('dropdown.init');
JHtml::_('formbehavior.chosen', '.multiple', null,
array('placeholder_text_multiple' => '- ' .
JText::_('COM_RESERVATION_FILTER_SELECT_DOCTORS_CATEGORIES') .
' -'));
JHtml::_('formbehavior.chosen',
'.multipleAccessLevels', null,
array('placeholder_text_multiple' => '- ' .
JText::_('COM_RESERVATION_FILTER_SELECT_ACCESS') . '
-'));
JHtml::_('formbehavior.chosen', 'select');
if ($this->saveOrder)
{
	$saveOrderingUrl =
'index.php?option=com_reservation&task=doctors.saveOrderAjax&tmpl=component';
	JHtml::_('sortablelist.sortable', 'doctorList',
'adminForm', strtolower($this->listDirn), $saveOrderingUrl);
}
?>
<form action="<?php echo
JRoute::_('index.php?option=com_reservation&view=doctors');
?>" method="post" name="adminForm"
id="adminForm">
<?php if(!empty( $this->sidebar)): ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif; ?>
<?php
	// Add the searchtools
	echo JLayoutHelper::render('joomla.searchtools.default',
array('view' => $this));
?>
<?php if (empty($this->items)): ?>
	<div class="alert alert-no-items">
		<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
	</div>
<?php else : ?>
	<table class="table table-striped"
id="doctorList">
		<thead><?php echo
$this->loadTemplate('head');?></thead>
		<tfoot><?php echo
$this->loadTemplate('foot');?></tfoot>
		<tbody><?php echo
$this->loadTemplate('body');?></tbody>
	</table>
	<?php // Load the batch processing form. ?>
	<?php if ($this->canCreate && $this->canEdit) : ?>
		<?php echo JHtml::_(
			'bootstrap.renderModal',
			'collapseModal',
			array(
				'title' =>
JText::_('COM_RESERVATION_DOCTORS_BATCH_OPTIONS'),
				'footer' =>
$this->loadTemplate('batch_footer')
			),
			$this->loadTemplate('batch_body')
		); ?>
	<?php endif; ?>
	<input type="hidden" name="boxchecked"
value="0" />
	</div>
<?php endif; ?>
	<input type="hidden" name="task" value=""
/>
	<?php echo JHtml::_('form.token'); ?>
</form>
PK5~�[~u����)views/doctors/tmpl/default_batch_body.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_batch_body.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>

<p><?php echo
JText::_('COM_RESERVATION_DOCTORS_BATCH_TIP'); ?></p>
<?php echo $this->batchDisplay;
?>PK5~�[I=����+views/doctors/tmpl/default_batch_footer.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_batch_footer.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<!-- clear the batch values if cancel -->
<button class="btn" type="button"
onclick="" data-dismiss="modal">
	<?php echo JText::_('JCANCEL'); ?>
</button>
<!-- post the batch values if process -->
<button class="btn btn-success" type="submit"
onclick="Joomla.submitbutton('doctor.batch');">
	<?php echo JText::_('JGLOBAL_BATCH_PROCESS'); ?>
</button>PK5~�[�|}�44#views/doctors/tmpl/default_body.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_body.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

$edit =
"index.php?option=com_reservation&view=doctors&task=doctor.edit";

?>
<?php foreach ($this->items as $i => $item): ?>
	<?php
		$canCheckin = $this->user->authorise('core.manage',
'com_checkin') || $item->checked_out == $this->user->id
|| $item->checked_out == 0;
		$userChkOut = JFactory::getUser($item->checked_out);
		$canDo =
ReservationHelper::getActions('doctor',$item,'doctors');
	?>
	<tr class="row<?php echo $i % 2; ?>">
		<td class="order nowrap center hidden-phone">
		<?php if ($canDo->get('core.edit.state')): ?>
			<?php
				$iconClass = '';
				if (!$this->saveOrder)
				{
					$iconClass = ' inactive tip-top" hasTooltip"
title="' . JHtml::tooltipText('JORDERINGDISABLED');
				}
			?>
			<span class="sortable-handler<?php echo $iconClass;
?>">
				<i class="icon-menu"></i>
			</span>
			<?php if ($this->saveOrder) : ?>
				<input type="text" style="display:none"
name="order[]" size="5"
				value="<?php echo $item->ordering; ?>"
class="width-20 text-area-order " />
			<?php endif; ?>
		<?php else: ?>
			&#8942;
		<?php endif; ?>
		</td>
		<td class="nowrap center">
		<?php if ($canDo->get('core.edit')): ?>
				<?php if ($item->checked_out) : ?>
					<?php if ($canCheckin) : ?>
						<?php echo JHtml::_('grid.id', $i, $item->id); ?>
					<?php else: ?>
						&#9633;
					<?php endif; ?>
				<?php else: ?>
					<?php echo JHtml::_('grid.id', $i, $item->id); ?>
				<?php endif; ?>
		<?php else: ?>
			&#9633;
		<?php endif; ?>
		</td>
		<td class="nowrap">
			<div class="name">
				<?php if ($canDo->get('core.edit')): ?>
					<a href="<?php echo $edit; ?>&id=<?php echo
$item->id; ?>"><?php echo
JFactory::getUser((int)$item->userid)->name; ?></a>
					<?php if ($item->checked_out): ?>
						<?php echo JHtml::_('jgrid.checkedout', $i,
$userChkOut->name, $item->checked_out_time, 'doctors.',
$canCheckin); ?>
					<?php endif; ?>
				<?php else: ?>
					<?php echo JFactory::getUser((int)$item->userid)->name; ?>
				<?php endif; ?>
			</div>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->msn); ?>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->category_title); ?>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->phonenumber); ?>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->officephone); ?>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->address); ?>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->presence); ?>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->image); ?>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->capitalid_name); ?>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->cityid_name); ?>
		</td>
		<td class="center">
		<?php if ($canDo->get('core.edit.state')) : ?>
				<?php if ($item->checked_out) : ?>
					<?php if ($canCheckin) : ?>
						<?php echo JHtml::_('jgrid.published',
$item->published, $i, 'doctors.', true, 'cb'); ?>
					<?php else: ?>
						<?php echo JHtml::_('jgrid.published',
$item->published, $i, 'doctors.', false, 'cb');
?>
					<?php endif; ?>
				<?php else: ?>
					<?php echo JHtml::_('jgrid.published',
$item->published, $i, 'doctors.', true, 'cb'); ?>
				<?php endif; ?>
		<?php else: ?>
			<?php echo JHtml::_('jgrid.published', $item->published,
$i, 'doctors.', false, 'cb'); ?>
		<?php endif; ?>
		</td>
		<td class="nowrap center hidden-phone">
			<?php echo $item->id; ?>
		</td>
	</tr>
<?php endforeach;
?>PK5~�[�Ay���#views/doctors/tmpl/default_foot.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_foot.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<tr>
	<td colspan="14"><?php echo
$this->pagination->getListFooter(); ?></td>
</tr>PK5~�[�rߴ��#views/doctors/tmpl/default_head.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_head.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<tr>
	<?php if ($this->canEdit&& $this->canState): ?>
		<th width="1%" class="nowrap center
hidden-phone">
			<?php echo JHtml::_('searchtools.sort', '',
'a.ordering', $this->listDirn, $this->listOrder, null,
'asc', 'JGRID_HEADING_ORDERING',
'icon-menu-2'); ?>
		</th>
		<th width="20" class="nowrap center">
			<?php echo JHtml::_('grid.checkall'); ?>
		</th>
	<?php else: ?>
		<th width="20" class="nowrap center
hidden-phone">
			&#9662;
		</th>
		<th width="20" class="nowrap center">
			&#9632;
		</th>
	<?php endif; ?>
	<th class="nowrap" >
			<?php echo JText::_('COM_RESERVATION_DOCTOR_USERID_LABEL');
?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo JText::_('COM_RESERVATION_DOCTOR_MSN_LABEL');
?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo
JText::_('COM_RESERVATION_DOCTOR_DOCTORS_CATEGORIES'); ?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo
JText::_('COM_RESERVATION_DOCTOR_PHONENUMBER_LABEL'); ?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo
JText::_('COM_RESERVATION_DOCTOR_OFFICEPHONE_LABEL'); ?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo
JText::_('COM_RESERVATION_DOCTOR_ADDRESS_LABEL'); ?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo
JText::_('COM_RESERVATION_DOCTOR_PRESENCE_LABEL'); ?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo JText::_('COM_RESERVATION_DOCTOR_IMAGE_LABEL');
?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo
JText::_('COM_RESERVATION_DOCTOR_CAPITALID_LABEL'); ?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo JText::_('COM_RESERVATION_DOCTOR_CITYID_LABEL');
?>
	</th>
	<?php if ($this->canState): ?>
		<th width="10" class="nowrap center" >
			<?php echo JHtml::_('searchtools.sort',
'COM_RESERVATION_DOCTOR_STATUS', 'a.published',
$this->listDirn, $this->listOrder); ?>
		</th>
	<?php else: ?>
		<th width="10" class="nowrap center" >
			<?php echo JText::_('COM_RESERVATION_DOCTOR_STATUS'); ?>
		</th>
	<?php endif; ?>
	<th width="5" class="nowrap center hidden-phone"
>
			<?php echo JHtml::_('searchtools.sort',
'COM_RESERVATION_DOCTOR_ID', 'a.id',
$this->listDirn, $this->listOrder); ?>
	</th>
</tr>PK5~�[z.�A44&views/doctors/tmpl/default_toolbar.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_toolbar.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<div id="filter-bar" class="btn-toolbar">
        <div class="filter-search btn-group pull-left">
            <label for="filter_search"
class="element-invisible"><?php echo
JText::_('Search');?></label>
            <input type="text" name="filter_search"
id="filter_search" placeholder="<?php echo
JText::_('JSEARCH_FILTER'); ?>" value="<?php echo
$this->escape($this->state->get('filter.search'));
?>" class="hasTooltip" title="<?php echo
JHtml::tooltipText('Search Doctors'); ?>" />
        </div>
        <div class="btn-group pull-left">
            <button type="submit" class="btn
hasTooltip" title="<?php echo
JHtml::tooltipText('JSEARCH_FILTER_SUBMIT'); ?>"><i
class="icon-search"></i></button>
            <button type="button" class="btn
hasTooltip" title="<?php echo
JHtml::tooltipText('JSEARCH_FILTER_CLEAR'); ?>"
onclick="document.id('filter_search').value='';this.form.submit();"><i
class="icon-remove"></i></button>
        </div>
        <div class="btn-group pull-right hidden-phone">
            <label for="limit"
class="element-invisible"><?php echo
JText::_('JFIELD_PLG_SEARCH_SEARCHLIMIT_DESC');?></label>
            <?php echo $this->pagination->getLimitBox(); ?>
        </div>
        <div class="btn-group pull-right hidden-phone">
            <label for="directionTable"
class="element-invisible"><?php echo
JText::_('JFIELD_ORDERING_DESC');?></label>
            <select name="directionTable"
id="directionTable" class="input-medium"
onchange="Joomla.orderTable()">
                <option value=""><?php echo
JText::_('JFIELD_ORDERING_DESC');?></option>
                <option value="asc" <?php if
($this->listDirn == 'asc') echo
'selected="selected"'; ?>><?php echo
JText::_('JGLOBAL_ORDER_ASCENDING');?></option>
                <option value="desc" <?php if
($this->listDirn == 'desc') echo
'selected="selected"'; ?>><?php echo
JText::_('JGLOBAL_ORDER_DESCENDING');?></option>
            </select>
        </div>
        <div class="btn-group pull-right">
            <label for="sortTable"
class="element-invisible"><?php echo
JText::_('JGLOBAL_SORT_BY');?></label>
            <select name="sortTable" id="sortTable"
class="input-medium" onchange="Joomla.orderTable()">
                <option value=""><?php echo
JText::_('JGLOBAL_SORT_BY');?></option>
                <?php echo JHtml::_('select.options',
$this->getSortFields(), 'value', 'text',
$this->listOrder);?>
            </select>
        </div>
    </div>
<div class="clearfix">
</div>PK5~�[�#o,,views/doctors/tmpl/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[��(��views/doctors/view.html.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		view.html.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

/**
 * Reservation View class for the Doctors
 */
class ReservationViewDoctors extends JViewLegacy
{
	/**
	 * Doctors view display method
	 * @return void
	 */
	function display($tpl = null)
	{
		if ($this->getLayout() !== 'modal')
		{
			// Include helper submenu
			ReservationHelper::addSubmenu('doctors');
		}

		// Assign data to the view
		$this->items = $this->get('Items');
		$this->pagination = $this->get('Pagination');
		$this->state = $this->get('State');
		$this->user = JFactory::getUser();
		// Load the filter form from xml.
		$this->filterForm = $this->get('FilterForm');
		// Load the active filters.
		$this->activeFilters = $this->get('ActiveFilters');
		// Add the list ordering clause.
		$this->listOrder =
$this->escape($this->state->get('list.ordering',
'a.id'));
		$this->listDirn =
$this->escape($this->state->get('list.direction',
'DESC'));
		$this->saveOrder = $this->listOrder == 'a.ordering';
		// set the return here value
		$this->return_here = urlencode(base64_encode((string)
JUri::getInstance()));
		// get global action permissions
		$this->canDo = ReservationHelper::getActions('doctor');
		$this->canEdit = $this->canDo->get('core.edit');
		$this->canState =
$this->canDo->get('core.edit.state');
		$this->canCreate = $this->canDo->get('core.create');
		$this->canDelete = $this->canDo->get('core.delete');
		$this->canBatch = $this->canDo->get('core.batch');

		// We don't need toolbar in the modal window.
		if ($this->getLayout() !== 'modal')
		{
			$this->addToolbar();
			$this->sidebar = JHtmlSidebar::render();
			// load the batch html
			if ($this->canCreate && $this->canEdit &&
$this->canState)
			{
				$this->batchDisplay = JHtmlBatch_::render();
			}
		}
		
		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		// Display the template
		parent::display($tpl);

		// Set the document
		$this->setDocument();
	}

	/**
	 * Setting the toolbar
	 */
	protected function addToolBar()
	{
		JToolBarHelper::title(JText::_('COM_RESERVATION_DOCTORS'),
'joomla');
		JHtmlSidebar::setAction('index.php?option=com_reservation&view=doctors');
		JFormHelper::addFieldPath(JPATH_COMPONENT . '/models/fields');

		if ($this->canCreate)
		{
			JToolBarHelper::addNew('doctor.add');
		}

		// Only load if there are items
		if (ReservationHelper::checkArray($this->items))
		{
			if ($this->canEdit)
			{
				JToolBarHelper::editList('doctor.edit');
			}

			if ($this->canState)
			{
				JToolBarHelper::publishList('doctors.publish');
				JToolBarHelper::unpublishList('doctors.unpublish');
				JToolBarHelper::archiveList('doctors.archive');

				if ($this->canDo->get('core.admin'))
				{
					JToolBarHelper::checkin('doctors.checkin');
				}
			}

			// Add a batch button
			if ($this->canBatch && $this->canCreate &&
$this->canEdit && $this->canState)
			{
				// Get the toolbar object instance
				$bar = JToolBar::getInstance('toolbar');
				// set the batch button name
				$title = JText::_('JTOOLBAR_BATCH');
				// Instantiate a new JLayoutFile instance and render the batch button
				$layout = new JLayoutFile('joomla.toolbar.batch');
				// add the button to the page
				$dhtml = $layout->render(array('title' => $title));
				$bar->appendButton('Custom', $dhtml, 'batch');
			}

			if ($this->state->get('filter.published') == -2
&& ($this->canState && $this->canDelete))
			{
				JToolbarHelper::deleteList('', 'doctors.delete',
'JTOOLBAR_EMPTY_TRASH');
			}
			elseif ($this->canState && $this->canDelete)
			{
				JToolbarHelper::trash('doctors.trash');
			}

			if ($this->canDo->get('core.export') &&
$this->canDo->get('doctor.export'))
			{
				JToolBarHelper::custom('doctors.exportData',
'download', '',
'COM_RESERVATION_EXPORT_DATA', true);
			}
		}

		if ($this->canDo->get('core.import') &&
$this->canDo->get('doctor.import'))
		{
			JToolBarHelper::custom('doctors.importData',
'upload', '', 'COM_RESERVATION_IMPORT_DATA',
false);
		}

		// set help url for this view if found
		$help_url = ReservationHelper::getHelpUrl('doctors');
		if (ReservationHelper::checkString($help_url))
		{
				JToolbarHelper::help('COM_RESERVATION_HELP_MANAGER', false,
$help_url);
		}

		// add the options comp button
		if ($this->canDo->get('core.admin') ||
$this->canDo->get('core.options'))
		{
			JToolBarHelper::preferences('com_reservation');
		}

		// Only load published batch if state and batch is allowed
		if ($this->canState && $this->canBatch)
		{
			JHtmlBatch_::addListSelection(
				JText::_('COM_RESERVATION_KEEP_ORIGINAL_STATE'),
				'batch[published]',
				JHtml::_('select.options',
JHtml::_('jgrid.publishedOptions', array('all' =>
false)), 'value', 'text', '', true)
			);
		}

		// Only load access batch if create, edit and batch is allowed
		if ($this->canBatch && $this->canCreate &&
$this->canEdit)
		{
			JHtmlBatch_::addListSelection(
				JText::_('COM_RESERVATION_KEEP_ORIGINAL_ACCESS'),
				'batch[access]',
				JHtml::_('select.options',
JHtml::_('access.assetgroups'), 'value',
'text')
			);
		}

		if ($this->canBatch && $this->canCreate &&
$this->canEdit)
		{
			// Category Batch selection.
			JHtmlBatch_::addListSelection(
				JText::_('COM_RESERVATION_KEEP_ORIGINAL_CATEGORY'),
				'batch[category]',
				JHtml::_('select.options',
JHtml::_('category.options', 'com_reservation'),
'value', 'text')
			);
		}
	}

	/**
	 * Method to set up the document properties
	 *
	 * @return void
	 */
	protected function setDocument()
	{
		if (!isset($this->document))
		{
			$this->document = JFactory::getDocument();
		}
		$this->document->setTitle(JText::_('COM_RESERVATION_DOCTORS'));
		$this->document->addStyleSheet(JURI::root() .
"administrator/components/com_reservation/assets/css/doctors.css",
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') : 'text/css');
	}

	/**
	 * Escapes a value for output in a view script.
	 *
	 * @param   mixed  $var  The output to escape.
	 *
	 * @return  mixed  The escaped value.
	 */
	public function escape($var)
	{
		if(strlen($var) > 50)
		{
			// use the helper htmlEscape method instead and shorten the string
			return ReservationHelper::htmlEscape($var, $this->_charset, true);
		}
		// use the helper htmlEscape method instead.
		return ReservationHelper::htmlEscape($var, $this->_charset);
	}

	/**
	 * Returns an array of fields the table can be sorted by
	 *
	 * @return  array  Array containing the field name to sort by as the key
and display text as value
	 */
	protected function getSortFields()
	{
		return array(
			'a.ordering' =>
JText::_('JGRID_HEADING_ORDERING'),
			'a.published' => JText::_('JSTATUS'),
			'a.id' => JText::_('JGRID_HEADING_ID')
		);
	}
}
PK5~�[�#o,,views/import/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[�r��$�$views/import/tmpl/default.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

JHtml::_('jquery.framework');
JHtml::_('bootstrap.tooltip');
JHtml::_('script', 'system/core.js', false, true);
JHtml::_('behavior.keepalive');
?>
<script type="text/javascript">
<?php if ($this->hasPackage &&
ReservationHelper::checkArray($this->headerList)) : ?>
	Joomla.continueImport = function()
	{
		var form = document.getElementById('adminForm');
		var error = false;
		var therequired = [<?php $i = 0; foreach($this->headerList as $name
=> $title) { echo ($i != 0)? ',
"vdm_'.$name.'"':'"vdm_'.$name.'"';
$i++; } ?>];
		for(i = 0; i < therequired.length; i++)
		{
			if(jQuery('#'+therequired[i]).val() == "" )
			{
				error = true;
				break;
			}
		}
		// do field validation
		if (error)
		{
			alert("<?php echo
JText::_('COM_RESERVATION_IMPORT_MSG_PLEASE_SELECT_ALL_COLUMNS',
true); ?>");
		}
		else
		{
			jQuery('#loading').css('display',
'block');

			form.gettype.value = 'continue';
			form.submit();
		}
	};
<?php else: ?>
	Joomla.submitbutton = function()
	{
		var form = document.getElementById('adminForm');

		// do field validation
		if (form.import_package.value == "")
		{
			alert("<?php echo
JText::_('COM_RESERVATION_IMPORT_MSG_PLEASE_SELECT_A_FILE',
true); ?>");
		}
		else
		{
			jQuery('#loading').css('display',
'block');

			form.gettype.value = 'upload';
			form.submit();
		}
	};

	Joomla.submitbutton3 = function()
	{
		var form = document.getElementById('adminForm');

		// do field validation
		if (form.import_directory.value == ""){
			alert("<?php echo
JText::_('COM_RESERVATION_IMPORT_MSG_PLEASE_SELECT_A_DIRECTORY',
true); ?>");
		}
		else
		{
			jQuery('#loading').css('display',
'block');

			form.gettype.value = 'folder';
			form.submit();
		}
	};

	Joomla.submitbutton4 = function()
	{
		var form = document.getElementById('adminForm');

		// do field validation
		if (form.import_url.value == "" || form.import_url.value ==
"http://")
		{
			alert("<?php echo
JText::_('COM_RESERVATION_IMPORT_MSG_ENTER_A_URL', true);
?>");
		}
		else
		{
			jQuery('#loading').css('display',
'block');

			form.gettype.value = 'url';
			form.submit();
		}
	};
<?php endif; ?>

// Add spindle-wheel for importations:
jQuery(document).ready(function($) {
	var outerDiv = $('body');

	$('<div id="loading"></div>')
		.css("background", "rgba(255, 255, 255, .8)
url('components/com_reservation/assets/images/import.gif') 50%
15% no-repeat")
		.css("top", outerDiv.position().top - $(window).scrollTop())
		.css("left", outerDiv.position().left - $(window).scrollLeft())
		.css("width", outerDiv.width())
		.css("height", outerDiv.height())
		.css("position", "fixed")
		.css("opacity", "0.80")
		.css("-ms-filter",
"progid:DXImageTransform.Microsoft.Alpha(Opacity = 80)")
		.css("filter", "alpha(opacity = 80)")
		.css("display", "none")
		.appendTo(outerDiv);
});

</script>

<div id="installer-import" class="clearfix">
<form enctype="multipart/form-data" action="<?php echo
JRoute::_('index.php?option=com_reservation&view=import');?>"
method="post" name="adminForm" id="adminForm"
class="form-horizontal form-validate">

	<?php if (!empty( $this->sidebar)) : ?>
		<div id="j-sidebar-container" class="span2">
			<?php echo $this->sidebar; ?>
		</div>
		<div id="j-main-container" class="span10">
	<?php else : ?>
		<div id="j-main-container">
	<?php endif;?>

	<?php if ($this->hasPackage &&
ReservationHelper::checkArray($this->headerList) &&
ReservationHelper::checkArray($this->headers)) : ?>
		<fieldset class="uploadform">
			<legend><?php echo
JText::_('COM_RESERVATION_IMPORT_LINK_FILE_TO_TABLE_COLUMNS');
?></legend>
			<div class="control-group">
				<label class="control-label" ><h4><?php echo
JText::_('COM_RESERVATION_IMPORT_TABLE_COLUMNS');
?></h4></label>
				<div class="controls">
					<label class="control-label" ><h4><?php echo
JText::_('COM_RESERVATION_IMPORT_FILE_COLUMNS');
?></h4></label>
				</div>
			</div>
			<?php foreach($this->headerList as $name => $title): ?>
				<div class="control-group">
					<label for="<?php echo $name; ?>"
class="control-label" ><?php echo $title;
?></label>
					<div class="controls">
					<select  name="<?php echo $name; ?>" 
id="vdm_<?php echo $name; ?>" required class="required
input_box" >
						<option value=""><?php echo
JText::_('COM_RESERVATION_IMPORT_PLEASE_SELECT_COLUMN');
?></option>
						<option value="IGNORE"><?php echo
JText::_('COM_RESERVATION_IMPORT_IGNORE_COLUMN');
?></option>
						<?php foreach($this->headers as $value => $option): ?>
							<?php $selected = (strtolower($option) ==  strtolower ($title) ||
strtolower($option) == strtolower($name))?
'selected="selected"':''; ?>
							<option value="<?php echo
ReservationHelper::htmlEscape($value); ?>"
class="required" <?php echo $selected ?>><?php echo
ReservationHelper::htmlEscape($option); ?></option>
						<?php endforeach; ?>
					</select>
					</div>
				</div>
			<?php endforeach; ?>
			<div class="form-actions">
				<input class="btn btn-primary" type="button"
value="<?php echo
JText::_('COM_RESERVATION_IMPORT_CONTINUE'); ?>"
onclick="Joomla.continueImport()" />
			</div>
		</fieldset>
		<input type="hidden" name="gettype"
value="continue" />
	<?php else: ?>
		<?php echo JHtml::_('bootstrap.startTabSet',
'myTab', array('active' => 'upload'));
?>
		
		<?php echo JHtml::_('bootstrap.addTab', 'myTab',
'upload',
JText::_('COM_RESERVATION_IMPORT_FROM_UPLOAD', true)); ?>
			<fieldset class="uploadform">
				<legend><?php echo
JText::_('COM_RESERVATION_IMPORT_UPDATE_DATA');
?></legend>
				<div class="control-group">
					<label for="import_package"
class="control-label"><?php echo
JText::_('COM_RESERVATION_IMPORT_SELECT_FILE');
?></label>
					<div class="controls">
						<input class="input_box" id="import_package"
name="import_package" type="file" size="57"
/>
					</div>
				</div>
				<div class="form-actions">
					<input class="btn btn-primary" type="button"
value="<?php echo
JText::_('COM_RESERVATION_IMPORT_UPLOAD_BOTTON'); ?>"
onclick="Joomla.submitbutton()"
/>&nbsp;&nbsp;&nbsp;<small><?php echo
JText::_('COM_RESERVATION_IMPORT_FORMATS_ACCEPTED'); ?> (.csv
.xls .ods)</small>
				</div>
			</fieldset>
		<?php echo JHtml::_('bootstrap.endTab'); ?>
		
		<?php echo JHtml::_('bootstrap.addTab', 'myTab',
'directory',
JText::_('COM_RESERVATION_IMPORT_FROM_DIRECTORY', true)); ?>
			<fieldset class="uploadform">
				<legend><?php echo
JText::_('COM_RESERVATION_IMPORT_UPDATE_DATA');
?></legend>
				<div class="control-group">
					<label for="import_directory"
class="control-label"><?php echo
JText::_('COM_RESERVATION_IMPORT_SELECT_FILE_DIRECTORY');
?></label>
					<div class="controls">
						<input type="text" id="import_directory"
name="import_directory" class="span5 input_box"
size="70" value="<?php echo
$this->state->get('import.directory'); ?>" />
					</div>
				</div>
				<div class="form-actions">
					<input type="button" class="btn btn-primary"
value="<?php echo
JText::_('COM_RESERVATION_IMPORT_GET_BOTTON'); ?>"
onclick="Joomla.submitbutton3()"
/>&nbsp;&nbsp;&nbsp;<small><?php echo
JText::_('COM_RESERVATION_IMPORT_FORMATS_ACCEPTED'); ?> (.csv
.xls .ods)</small>
				</div>
				</fieldset>
		<?php echo JHtml::_('bootstrap.endTab'); ?>

		<?php echo JHtml::_('bootstrap.addTab', 'myTab',
'url', JText::_('COM_RESERVATION_IMPORT_FROM_URL',
true)); ?>
			<fieldset class="uploadform">
				<legend><?php echo
JText::_('COM_RESERVATION_IMPORT_UPDATE_DATA');
?></legend>
				<div class="control-group">
					<label for="import_url"
class="control-label"><?php echo
JText::_('COM_RESERVATION_IMPORT_SELECT_FILE_URL');
?></label>
					<div class="controls">
						<input type="text" id="import_url"
name="import_url" class="span5 input_box"
size="70" value="http://" />
					</div>
				</div>
				<div class="form-actions">
					<input type="button" class="btn btn-primary"
value="<?php echo
JText::_('COM_RESERVATION_IMPORT_GET_BOTTON'); ?>"
onclick="Joomla.submitbutton4()"
/>&nbsp;&nbsp;&nbsp;<small><?php echo
JText::_('COM_RESERVATION_IMPORT_FORMATS_ACCEPTED'); ?> (.csv
.xls .ods)</small>
				</div>
			</fieldset>
		<?php echo JHtml::_('bootstrap.endTab'); ?>
		<?php echo JHtml::_('bootstrap.endTabSet'); ?>
		<input type="hidden" name="gettype"
value="upload" />
	<?php endif; ?>
	<input type="hidden" name="task"
value="import.import" />
	<?php echo JHtml::_('form.token'); ?>
</form>
</div>PK5~�[�#o,,views/import/tmpl/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[��ܘ||views/import/view.html.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		view.html.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

/**
 * Reservation Import View
 */
class ReservationViewImport extends JViewLegacy
{
	protected $headerList;
	protected $hasPackage = false;
	protected $headers;
	protected $hasHeader = 0;
	protected $dataType;

	public function display($tpl = null)
	{		
		if ($this->getLayout() !== 'modal')
		{
			// Include helper submenu
			ReservationHelper::addSubmenu('import');
		}

		$paths = new stdClass;
		$paths->first = '';
		$state = $this->get('state');

		$this->paths = &$paths;
		$this->state = &$state;
                // get global action permissions
		$this->canDo = ReservationHelper::getActions('import');

		// We don't need toolbar in the modal window.
		if ($this->getLayout() !== 'modal')
		{
			$this->addToolbar();
			$this->sidebar = JHtmlSidebar::render();
		}

		// get the session object
		$session = JFactory::getSession();
		// check if it has package
		$this->hasPackage 	= $session->get('hasPackage', false);
		$this->dataType 	= $session->get('dataType', false);
		if($this->hasPackage && $this->dataType)
		{
			$this->headerList 	=
json_decode($session->get($this->dataType.'_VDM_IMPORTHEADERS',
false),true);
			$this->headers 		=
ReservationHelper::getFileHeaders($this->dataType);
			// clear the data type
			$session->clear('dataType');
		}
		
		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		// Display the template
		parent::display($tpl);
	}

	/**
	 * Setting the toolbar
	 */
	protected function addToolBar()
	{
		JToolBarHelper::title(JText::_('COM_RESERVATION_IMPORT_TITLE'),
'upload');
		JHtmlSidebar::setAction('index.php?option=com_reservation&view=import');

		if ($this->canDo->get('core.admin') ||
$this->canDo->get('core.options'))
		{
			JToolBarHelper::preferences('com_reservation');
		}

		// set help url for this view if found
		$help_url = ReservationHelper::getHelpUrl('import');
		if (ReservationHelper::checkString($help_url))
		{
			   JToolbarHelper::help('COM_RESERVATION_HELP_MANAGER', false,
$help_url);
		}
	}
}
PK5~�[�#o,,
views/import_reserves/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[t���s&s&&views/import_reserves/tmpl/default.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.30
	@build			6th March, 2021
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

JHtml::_('jquery.framework');
JHtml::_('bootstrap.tooltip');
JHtml::_('script', 'system/core.js', false, true);
JHtml::_('behavior.keepalive');
?>

<!--[JCBGUI.admin_view.html_import_view.127.$$$$]-->
<script type="text/javascript">
farhad shahbazi
<?php if ($this->hasPackage &&
ReservationHelper::checkArray($this->headerList)) : ?>
	Joomla.continueImport = function()
	{
		var form = document.getElementById('adminForm');
		var error = false;
		var therequired = [<?php $i = 0; foreach($this->headerList as $name
=> $title) { echo ($i != 0)? ',
"vdm_'.$name.'"':'"vdm_'.$name.'"';
$i++; } ?>];
		for(i = 0; i < therequired.length; i++)
		{
			if(jQuery('#'+therequired[i]).val() == "" )
			{
				error = true;
				break;
			}
		}
		// do field validation
		if (error)
		{
			alert("<?php echo
JText::_('COM_RESERVATION_IMPORT_MSG_PLEASE_SELECT_ALL_COLUMNS',
true); ?>");
		}
		else
		{
			jQuery('#loading').css('display',
'block');


			form.gettype.value = 'continue';
			form.submit();
		}
	};
<?php else: ?>
	Joomla.submitbutton = function()
	{
		var form = document.getElementById('adminForm');


		// do field validation
		if (form.import_package.value == "")
		{
			alert("<?php echo
JText::_('COM_RESERVATION_IMPORT_MSG_PLEASE_SELECT_A_FILE',
true); ?>");
		}
		else
		{
			jQuery('#loading').css('display',
'block');


			form.gettype.value = 'upload';
			form.submit();
		}
	};


	Joomla.submitbutton3 = function()
	{
		var form = document.getElementById('adminForm');


		// do field validation
		if (form.import_directory.value == ""){
			alert("<?php echo
JText::_('COM_RESERVATION_IMPORT_MSG_PLEASE_SELECT_A_DIRECTORY',
true); ?>");
		}
		else
		{
			jQuery('#loading').css('display',
'block');


			form.gettype.value = 'folder';
			form.submit();
		}
	};


	Joomla.submitbutton4 = function()
	{
		var form = document.getElementById('adminForm');


		// do field validation
		if (form.import_url.value == "" || form.import_url.value ==
"http://")
		{
			alert("<?php echo
JText::_('COM_RESERVATION_IMPORT_MSG_ENTER_A_URL', true);
?>");
		}
		else
		{
			jQuery('#loading').css('display',
'block');


			form.gettype.value = 'url';
			form.submit();
		}
	};
<?php endif; ?>


// Add spindle-wheel for importations:
jQuery(document).ready(function($) {
	var outerDiv = $('body');


	$('<div id="loading"></div>')
		.css("background", "rgba(255, 255, 255, .8)
url('components/com_reservation/assets/images/import.gif') 50%
15% no-repeat")
		.css("top", outerDiv.position().top - $(window).scrollTop())
		.css("left", outerDiv.position().left -
$(window).scrollLeft())
		.css("width", outerDiv.width())
		.css("height", outerDiv.height())
		.css("position", "fixed")
		.css("opacity", "0.80")
		.css("-ms-filter",
"progid:DXImageTransform.Microsoft.Alpha(Opacity = 80)")
		.css("filter", "alpha(opacity = 80)")
		.css("display", "none")
		.appendTo(outerDiv);
});


</script>


<div id="installer-import" class="clearfix">
<form enctype="multipart/form-data" action="<?php echo
JRoute::_('index.php?option=com_reservation&view=import_reserves');?>"
method="post" name="adminForm" id="adminForm"
class="form-horizontal form-validate">


	<?php if (!empty( $this->sidebar)) : ?>
		<div id="j-sidebar-container" class="span2">
			<?php echo $this->sidebar; ?>
		</div>
		<div id="j-main-container" class="span10">
	<?php else : ?>
		<div id="j-main-container">
	<?php endif;?>


	<?php if ($this->hasPackage &&
ReservationHelper::checkArray($this->headerList) &&
ReservationHelper::checkArray($this->headers)) : ?>
		<fieldset class="uploadform">
			<legend><?php echo
JText::_('COM_RESERVATION_IMPORT_LINK_FILE_TO_TABLE_COLUMNS');
?></legend>
			<div class="control-group">
				<label class="control-label" ><h4><?php echo
JText::_('COM_RESERVATION_IMPORT_TABLE_COLUMNS');
?></h4></label>
				<div class="controls">
					<label class="control-label" ><h4><?php echo
JText::_('COM_RESERVATION_IMPORT_FILE_COLUMNS');
?></h4></label>
				</div>
			</div>
			<?php foreach($this->headerList as $name => $title): ?>
				<div class="control-group">
					<label for="<?php echo $name; ?>"
class="control-label" ><?php echo $title;
?></label>
					<div class="controls">
						<select  name="<?php echo $name; ?>" 
id="vdm_<?php echo $name; ?>" required class="required
input_box" >
							<option value=""><?php echo
JText::_('COM_RESERVATION_IMPORT_PLEASE_SELECT_COLUMN');
?></option>
							<option value="IGNORE"><?php echo
JText::_('COM_RESERVATION_IMPORT_IGNORE_COLUMN');
?></option>
							<?php foreach($this->headers as $value => $option): ?>
								<?php $selected = (strtolower($option) ==  strtolower ($title)
|| strtolower($option) == strtolower($name))?
'selected="selected"':''; ?>
								<option value="<?php echo
ReservationHelper::htmlEscape($value); ?>"
class="required" <?php echo $selected ?>><?php echo
ReservationHelper::htmlEscape($option); ?></option>
							<?php endforeach; ?>
						</select>
					</div>
				</div>
			<?php endforeach; ?>
			<div class="form-actions">
				<input class="btn btn-primary" type="button"
value="<?php echo
JText::_('COM_RESERVATION_IMPORT_CONTINUE'); ?>"
onclick="Joomla.continueImport()" />
			</div>
		</fieldset>
		<input type="hidden" name="gettype"
value="continue" />
	<?php else: ?>
		<?php echo JHtml::_('bootstrap.startTabSet',
'myTab', array('active' => 'upload'));
?>
		
		<?php echo JHtml::_('bootstrap.addTab', 'myTab',
'upload',
JText::_('COM_RESERVATION_IMPORT_FROM_UPLOAD', true)); ?>
			<fieldset class="uploadform">
				<legend><?php echo
JText::_('COM_RESERVATION_IMPORT_UPDATE_DATA');
?></legend>
				<div class="control-group">
					<label for="import_package"
class="control-label"><?php echo
JText::_('COM_RESERVATION_IMPORT_SELECT_FILE');
?></label>
					<div class="controls">
						<input class="input_box" id="import_package"
name="import_package" type="file" size="57"
/>
					</div>
				</div>
				<div class="form-actions">
					<input class="btn btn-primary" type="button"
value="<?php echo
JText::_('COM_RESERVATION_IMPORT_UPLOAD_BOTTON'); ?>"
onclick="Joomla.submitbutton()"
/>&nbsp;&nbsp;&nbsp;<small><?php echo
JText::_('COM_RESERVATION_IMPORT_FORMATS_ACCEPTED'); ?> (.csv
.xls .ods)</small>
				</div>
			</fieldset>
		<?php echo JHtml::_('bootstrap.endTab'); ?>
		
		<?php echo JHtml::_('bootstrap.addTab', 'myTab',
'directory',
JText::_('COM_RESERVATION_IMPORT_FROM_DIRECTORY', true)); ?>
			<fieldset class="uploadform">
				<legend><?php echo
JText::_('COM_RESERVATION_IMPORT_UPDATE_DATA');
?></legend>
				<div class="control-group">
					<label for="import_directory"
class="control-label"><?php echo
JText::_('COM_RESERVATION_IMPORT_SELECT_FILE_DIRECTORY');
?></label>
					<div class="controls">
						<input type="text" id="import_directory"
name="import_directory" class="span5 input_box"
size="70" value="<?php echo
$this->state->get('import.directory'); ?>" />
					</div>
				</div>
				<div class="form-actions">
					<input type="button" class="btn btn-primary"
value="<?php echo
JText::_('COM_RESERVATION_IMPORT_GET_BOTTON'); ?>"
onclick="Joomla.submitbutton3()"
/>&nbsp;&nbsp;&nbsp;<small><?php echo
JText::_('COM_RESERVATION_IMPORT_FORMATS_ACCEPTED'); ?> (.csv
.xls .ods)</small>
				</div>
				</fieldset>
		<?php echo JHtml::_('bootstrap.endTab'); ?>


		<?php echo JHtml::_('bootstrap.addTab', 'myTab',
'url', JText::_('COM_RESERVATION_IMPORT_FROM_URL',
true)); ?>
			<fieldset class="uploadform">
				<legend><?php echo
JText::_('COM_RESERVATION_IMPORT_UPDATE_DATA');
?></legend>
				<div class="control-group">
					<label for="import_url"
class="control-label"><?php echo
JText::_('COM_RESERVATION_IMPORT_SELECT_FILE_URL');
?></label>
					<div class="controls">
						<input type="text" id="import_url"
name="import_url" class="span5 input_box"
size="70" value="http://" />
					</div>
				</div>
				<div class="form-actions">
					<input type="button" class="btn btn-primary"
value="<?php echo
JText::_('COM_RESERVATION_IMPORT_GET_BOTTON'); ?>"
onclick="Joomla.submitbutton4()"
/>&nbsp;&nbsp;&nbsp;<small><?php echo
JText::_('COM_RESERVATION_IMPORT_FORMATS_ACCEPTED'); ?> (.csv
.xls .ods)</small>
				</div>
			</fieldset>
		<?php echo JHtml::_('bootstrap.endTab'); ?>
		<?php echo JHtml::_('bootstrap.endTabSet'); ?>
		<input type="hidden" name="gettype"
value="upload" />
	<?php endif; ?>
	<input type="hidden" name="task"
value="import_reserves.import" />
	<?php echo JHtml::_('form.token'); ?>
</form>
</div><!--[/JCBGUI$$$$]-->

PK5~�[�#o,,%views/import_reserves/tmpl/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[:�:
:
#views/import_reserves/view.html.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.30
	@build			6th March, 2021
	@created		17th December, 2020
	@package		Reservation
	@subpackage		view.html.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

/**
 * Reservation Import_reserves View
 */
class ReservationViewImport_reserves extends JViewLegacy
{

/***[JCBGUI.admin_view.php_import_display.127.$$$$]***/
	protected $headerList;
	protected $hasPackage = false;
	protected $headers;
	protected $hasHeader = 0;
	protected $dataType;
	public function display($tpl = null)
	{
		if ($this->getLayout() !== 'modal')
		{
			// Include helper submenu
			ReservationHelper::addSubmenu('import');
		}

		$paths = new stdClass;
		$paths->first = '';
		$state = $this->get('state');

		$this->paths = &$paths;
		$this->state = &$state;
		// get global action permissions
		$this->canDo = ReservationHelper::getActions('import');

		// We don't need toolbar in the modal window.
		if ($this->getLayout() !== 'modal')
		{
			$this->addToolbar();
			$this->sidebar = JHtmlSidebar::render();
		}

		// get the session object
		$session = JFactory::getSession();
		// check if it has package
		$this->hasPackage	= $session->get('hasPackage', false);
		$this->dataType	= $session->get('dataType', false);
		if($this->hasPackage && $this->dataType)
		{
			$this->headerList	=
json_decode($session->get($this->dataType.'_VDM_IMPORTHEADERS',
false),true);
			$this->headers		=
ReservationHelper::getFileHeaders($this->dataType);
			// clear the data type
			$session->clear('dataType');
		}

		// Check for errors.
		if (count($errors = $this->get('Errors'))){
			throw new Exception(implode(PHP_EOL, $errors), 500);
		}

		// Display the template
		parent::display($tpl);
	}/***[/JCBGUI$$$$]***/


	/**
	 * Setting the toolbar
	 */
	protected function addToolBar()
	{
		JToolBarHelper::title(JText::_('COM_RESERVATION_IMPORT_TITLE'),
'upload');
		JHtmlSidebar::setAction('index.php?option=com_reservation&view=import_reserves');

		if ($this->canDo->get('core.admin') ||
$this->canDo->get('core.options'))
		{
			JToolBarHelper::preferences('com_reservation');
		}

		// set help url for this view if found
		$help_url = ReservationHelper::getHelpUrl('import_reserves');
		if (ReservationHelper::checkString($help_url))
		{
			   JToolbarHelper::help('COM_RESERVATION_HELP_MANAGER', false,
$help_url);
		}
	}
}
PK5~�[�#o,,views/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[�d���views/message/submitbutton.jsnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		submitbutton.js
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

Joomla.submitbutton = function(task)
{
	if (task == ''){
		return false;
	} else { 
		var action = task.split('.');
		if (action[1] == 'cancel' || action[1] == 'close' ||
document.formvalidator.isValid(document.getElementById("adminForm"))){
			Joomla.submitform(task, document.getElementById("adminForm"));
			return true;
		} else {
			alert(Joomla.JText._('message, some values are not
acceptable.','Some values are unacceptable'));
			return false;
		}
	}
}PK5~�[�g���views/message/tmpl/edit.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		edit.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');
JHtml::_('behavior.tooltip');
JHtml::_('behavior.formvalidation');
JHtml::_('formbehavior.chosen', 'select');
JHtml::_('behavior.keepalive');
$componentParams = $this->params; // will be removed just use
$this->params instead
?>
<script type="text/javascript">
	// waiting spinner
	var outerDiv = jQuery('body');
	jQuery('<div id="loading"></div>')
		.css("background", "rgba(255, 255, 255, .8)
url('components/com_reservation/assets/images/import.gif') 50%
15% no-repeat")
		.css("top", outerDiv.position().top -
jQuery(window).scrollTop())
		.css("left", outerDiv.position().left -
jQuery(window).scrollLeft())
		.css("width", outerDiv.width())
		.css("height", outerDiv.height())
		.css("position", "fixed")
		.css("opacity", "0.80")
		.css("-ms-filter",
"progid:DXImageTransform.Microsoft.Alpha(Opacity = 80)")
		.css("filter", "alpha(opacity = 80)")
		.css("display", "none")
		.appendTo(outerDiv);
	jQuery('#loading').show();
	// when page is ready remove and show
	jQuery(window).load(function() {
		jQuery('#reservation_loader').fadeIn('fast');
		jQuery('#loading').hide();
	});
</script>
<div id="reservation_loader" style="display:
none;">
<form action="<?php echo
JRoute::_('index.php?option=com_reservation&layout=edit&id='.
(int) $this->item->id . $this->referral); ?>"
method="post" name="adminForm" id="adminForm"
class="form-validate" enctype="multipart/form-data">

<div class="form-horizontal">

	<?php echo JHtml::_('bootstrap.startTabSet',
'messageTab', array('active' =>
'details')); ?>

	<?php echo JHtml::_('bootstrap.addTab',
'messageTab', 'details',
JText::_('COM_RESERVATION_MESSAGE_DETAILS', true)); ?>
		<div class="row-fluid form-horizontal-desktop">
			<div class="span6">
				<?php echo JLayoutHelper::render('message.details_left',
$this); ?>
			</div>
			<div class="span6">
				<?php echo JLayoutHelper::render('message.details_right',
$this); ?>
			</div>
		</div>
	<?php echo JHtml::_('bootstrap.endTab'); ?>

	<?php $this->ignore_fieldsets =
array('details','metadata','vdmmetadata','accesscontrol');
?>
	<?php $this->tab_name = 'messageTab'; ?>
	<?php echo JLayoutHelper::render('joomla.edit.params',
$this); ?>

	<?php if ($this->canDo->get('core.edit.created_by') ||
$this->canDo->get('core.edit.created') ||
$this->canDo->get('core.edit.state') ||
($this->canDo->get('core.delete') &&
$this->canDo->get('core.edit.state'))) : ?>
	<?php echo JHtml::_('bootstrap.addTab',
'messageTab', 'publishing',
JText::_('COM_RESERVATION_MESSAGE_PUBLISHING', true)); ?>
		<div class="row-fluid form-horizontal-desktop">
			<div class="span6">
				<?php echo JLayoutHelper::render('message.publishing',
$this); ?>
			</div>
			<div class="span6">
				<?php echo JLayoutHelper::render('message.publlshing',
$this); ?>
			</div>
		</div>
	<?php echo JHtml::_('bootstrap.endTab'); ?>
	<?php endif; ?>

	<?php if ($this->canDo->get('core.admin')) : ?>
	<?php echo JHtml::_('bootstrap.addTab',
'messageTab', 'permissions',
JText::_('COM_RESERVATION_MESSAGE_PERMISSION', true)); ?>
		<div class="row-fluid form-horizontal-desktop">
			<div class="span12">
				<fieldset class="adminform">
					<div class="adminformlist">
					<?php foreach
($this->form->getFieldset('accesscontrol') as $field):
?>
						<div>
							<?php echo $field->label; echo $field->input;?>
						</div>
						<div class="clearfix"></div>
					<?php endforeach; ?>
					</div>
				</fieldset>
			</div>
		</div>
	<?php echo JHtml::_('bootstrap.endTab'); ?>
	<?php endif; ?>

	<?php echo JHtml::_('bootstrap.endTabSet'); ?>

	<div>
		<input type="hidden" name="task"
value="message.edit" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</div>
</form>
</div>
PK5~�[�#o,,views/message/tmpl/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[N].H��views/message/view.html.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		view.html.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

/**
 * Message View class
 */
class ReservationViewMessage extends JViewLegacy
{
	/**
	 * display method of View
	 * @return void
	 */
	public function display($tpl = null)
	{
		// set params
		$this->params =
JComponentHelper::getParams('com_reservation');
		// Assign the variables
		$this->form = $this->get('Form');
		$this->item = $this->get('Item');
		$this->script = $this->get('Script');
		$this->state = $this->get('State');
		// get action permissions
		$this->canDo = ReservationHelper::getActions('message',
$this->item);
		// get input
		$jinput = JFactory::getApplication()->input;
		$this->ref = $jinput->get('ref', 0, 'word');
		$this->refid = $jinput->get('refid', 0, 'int');
		$return = $jinput->get('return', null, 'base64');
		// set the referral string
		$this->referral = '';
		if ($this->refid && $this->ref)
		{
			// return to the item that referred to this item
			$this->referral = '&ref=' . (string)$this->ref .
'&refid=' . (int)$this->refid;
		}
		elseif($this->ref)
		{
			// return to the list view that referred to this item
			$this->referral = '&ref=' . (string)$this->ref;
		}
		// check return value
		if (!is_null($return))
		{
			// add the return value
			$this->referral .= '&return=' . (string)$return;
		}

		// Set the toolbar
		$this->addToolBar();
		
		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		// Display the template
		parent::display($tpl);

		// Set the document
		$this->setDocument();
	}


	/**
	 * Setting the toolbar
	 */
	protected function addToolBar()
	{
		JFactory::getApplication()->input->set('hidemainmenu',
true);
		$user = JFactory::getUser();
		$userId	= $user->id;
		$isNew = $this->item->id == 0;

		JToolbarHelper::title( JText::_($isNew ?
'COM_RESERVATION_MESSAGE_NEW' :
'COM_RESERVATION_MESSAGE_EDIT'), 'pencil-2
article-add');
		// Built the actions for new and existing records.
		if (ReservationHelper::checkString($this->referral))
		{
			if ($this->canDo->get('core.create') && $isNew)
			{
				// We can create the record.
				JToolBarHelper::save('message.save',
'JTOOLBAR_SAVE');
			}
			elseif ($this->canDo->get('core.edit'))
			{
				// We can save the record.
				JToolBarHelper::save('message.save',
'JTOOLBAR_SAVE');
			}
			if ($isNew)
			{
				// Do not creat but cancel.
				JToolBarHelper::cancel('message.cancel',
'JTOOLBAR_CANCEL');
			}
			else
			{
				// We can close it.
				JToolBarHelper::cancel('message.cancel',
'JTOOLBAR_CLOSE');
			}
		}
		else
		{
			if ($isNew)
			{
				// For new records, check the create permission.
				if ($this->canDo->get('core.create'))
				{
					JToolBarHelper::apply('message.apply',
'JTOOLBAR_APPLY');
					JToolBarHelper::save('message.save',
'JTOOLBAR_SAVE');
					JToolBarHelper::custom('message.save2new',
'save-new.png', 'save-new_f2.png',
'JTOOLBAR_SAVE_AND_NEW', false);
				};
				JToolBarHelper::cancel('message.cancel',
'JTOOLBAR_CANCEL');
			}
			else
			{
				if ($this->canDo->get('core.edit'))
				{
					// We can save the new record
					JToolBarHelper::apply('message.apply',
'JTOOLBAR_APPLY');
					JToolBarHelper::save('message.save',
'JTOOLBAR_SAVE');
					// We can save this record, but check the create permission to see
					// if we can return to make a new one.
					if ($this->canDo->get('core.create'))
					{
						JToolBarHelper::custom('message.save2new',
'save-new.png', 'save-new_f2.png',
'JTOOLBAR_SAVE_AND_NEW', false);
					}
				}
				$canVersion = ($this->canDo->get('core.version')
&& $this->canDo->get('message.version'));
				if ($this->state->params->get('save_history', 1)
&& $this->canDo->get('core.edit') &&
$canVersion)
				{
					JToolbarHelper::versions('com_reservation.message',
$this->item->id);
				}
				if ($this->canDo->get('core.create'))
				{
					JToolBarHelper::custom('message.save2copy',
'save-copy.png', 'save-copy_f2.png',
'JTOOLBAR_SAVE_AS_COPY', false);
				}
				JToolBarHelper::cancel('message.cancel',
'JTOOLBAR_CLOSE');
			}
		}
		JToolbarHelper::divider();
		// set help url for this view if found
		$help_url = ReservationHelper::getHelpUrl('message');
		if (ReservationHelper::checkString($help_url))
		{
			JToolbarHelper::help('COM_RESERVATION_HELP_MANAGER', false,
$help_url);
		}
	}

	/**
	 * Escapes a value for output in a view script.
	 *
	 * @param   mixed  $var  The output to escape.
	 *
	 * @return  mixed  The escaped value.
	 */
	public function escape($var)
	{
		if(strlen($var) > 30)
		{
    		// use the helper htmlEscape method instead and shorten the string
			return ReservationHelper::htmlEscape($var, $this->_charset, true,
30);
		}
		// use the helper htmlEscape method instead.
		return ReservationHelper::htmlEscape($var, $this->_charset);
	}

	/**
	 * Method to set up the document properties
	 *
	 * @return void
	 */
	protected function setDocument()
	{
		$isNew = ($this->item->id < 1);
		if (!isset($this->document))
		{
			$this->document = JFactory::getDocument();
		}
		$this->document->setTitle(JText::_($isNew ?
'COM_RESERVATION_MESSAGE_NEW' :
'COM_RESERVATION_MESSAGE_EDIT'));
		$this->document->addStyleSheet(JURI::root() .
"administrator/components/com_reservation/assets/css/message.css",
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') : 'text/css');
		$this->document->addScript(JURI::root() . $this->script,
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') :
'text/javascript');
		$this->document->addScript(JURI::root() .
"administrator/components/com_reservation/views/message/submitbutton.js",
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') :
'text/javascript'); 
		JText::script('view not acceptable. Error');
	}
}
PK5~�[�#o,,views/messages/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[�;"�views/messages/tmpl/default.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

JHtml::_('behavior.tooltip');
JHtml::_('behavior.multiselect');
JHtml::_('dropdown.init');
JHtml::_('formbehavior.chosen',
'.multipleAccessLevels', null,
array('placeholder_text_multiple' => '- ' .
JText::_('COM_RESERVATION_FILTER_SELECT_ACCESS') . '
-'));
JHtml::_('formbehavior.chosen', 'select');
if ($this->saveOrder)
{
	$saveOrderingUrl =
'index.php?option=com_reservation&task=messages.saveOrderAjax&tmpl=component';
	JHtml::_('sortablelist.sortable', 'messageList',
'adminForm', strtolower($this->listDirn), $saveOrderingUrl);
}
?>
<form action="<?php echo
JRoute::_('index.php?option=com_reservation&view=messages');
?>" method="post" name="adminForm"
id="adminForm">
<?php if(!empty( $this->sidebar)): ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif; ?>
<?php
	// Add the searchtools
	echo JLayoutHelper::render('joomla.searchtools.default',
array('view' => $this));
?>
<?php if (empty($this->items)): ?>
	<div class="alert alert-no-items">
		<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
	</div>
<?php else : ?>
	<table class="table table-striped"
id="messageList">
		<thead><?php echo
$this->loadTemplate('head');?></thead>
		<tfoot><?php echo
$this->loadTemplate('foot');?></tfoot>
		<tbody><?php echo
$this->loadTemplate('body');?></tbody>
	</table>
	<?php // Load the batch processing form. ?>
	<?php if ($this->canCreate && $this->canEdit) : ?>
		<?php echo JHtml::_(
			'bootstrap.renderModal',
			'collapseModal',
			array(
				'title' =>
JText::_('COM_RESERVATION_MESSAGES_BATCH_OPTIONS'),
				'footer' =>
$this->loadTemplate('batch_footer')
			),
			$this->loadTemplate('batch_body')
		); ?>
	<?php endif; ?>
	<input type="hidden" name="boxchecked"
value="0" />
	</div>
<?php endif; ?>
	<input type="hidden" name="task" value=""
/>
	<?php echo JHtml::_('form.token'); ?>
</form>
PK5~�[¯���*views/messages/tmpl/default_batch_body.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_batch_body.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>

<p><?php echo
JText::_('COM_RESERVATION_MESSAGES_BATCH_TIP'); ?></p>
<?php echo $this->batchDisplay;
?>PK5~�[�@���,views/messages/tmpl/default_batch_footer.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_batch_footer.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<!-- clear the batch values if cancel -->
<button class="btn" type="button"
onclick="" data-dismiss="modal">
	<?php echo JText::_('JCANCEL'); ?>
</button>
<!-- post the batch values if process -->
<button class="btn btn-success" type="submit"
onclick="Joomla.submitbutton('message.batch');">
	<?php echo JText::_('JGLOBAL_BATCH_PROCESS'); ?>
</button>PK5~�[�n-:��$views/messages/tmpl/default_body.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_body.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

$edit =
"index.php?option=com_reservation&view=messages&task=message.edit";

?>
<?php foreach ($this->items as $i => $item): ?>
	<?php
		$canCheckin = $this->user->authorise('core.manage',
'com_checkin') || $item->checked_out == $this->user->id
|| $item->checked_out == 0;
		$userChkOut = JFactory::getUser($item->checked_out);
		$canDo =
ReservationHelper::getActions('message',$item,'messages');
	?>
	<tr class="row<?php echo $i % 2; ?>">
		<td class="order nowrap center hidden-phone">
		<?php if ($canDo->get('core.edit.state')): ?>
			<?php
				$iconClass = '';
				if (!$this->saveOrder)
				{
					$iconClass = ' inactive tip-top" hasTooltip"
title="' . JHtml::tooltipText('JORDERINGDISABLED');
				}
			?>
			<span class="sortable-handler<?php echo $iconClass;
?>">
				<i class="icon-menu"></i>
			</span>
			<?php if ($this->saveOrder) : ?>
				<input type="text" style="display:none"
name="order[]" size="5"
				value="<?php echo $item->ordering; ?>"
class="width-20 text-area-order " />
			<?php endif; ?>
		<?php else: ?>
			&#8942;
		<?php endif; ?>
		</td>
		<td class="nowrap center">
		<?php if ($canDo->get('core.edit')): ?>
				<?php if ($item->checked_out) : ?>
					<?php if ($canCheckin) : ?>
						<?php echo JHtml::_('grid.id', $i, $item->id); ?>
					<?php else: ?>
						&#9633;
					<?php endif; ?>
				<?php else: ?>
					<?php echo JHtml::_('grid.id', $i, $item->id); ?>
				<?php endif; ?>
		<?php else: ?>
			&#9633;
		<?php endif; ?>
		</td>
		<td class="nowrap">
			<div class="name">
				<?php if ($this->user->authorise('core.edit',
'com_users')): ?>
					<a
href="index.php?option=com_users&task=user.edit&id=<?php
echo (int) $item->from ?>"><?php echo
JFactory::getUser((int)$item->from)->name; ?></a>
				<?php else: ?>
					<?php echo JFactory::getUser((int)$item->from)->name; ?>
				<?php endif; ?>
			</div>
		</td>
		<td class="hidden-phone">
			<?php echo JFactory::getUser((int)$item->to)->name; ?>
		</td>
		<td class="hidden-phone">
			<div><div style="max-width: 150px;"><?php echo
$item->reply_message; ?></div>
			</div>
		</td>
		<td class="hidden-phone">
			<div><div style="max-width: 150px;"><?php echo
$item->message; ?></div>
			</div>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->read); ?>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->seen); ?>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->seid); ?>
		</td>
		<td class="center">
		<?php if ($canDo->get('core.edit.state')) : ?>
				<?php if ($item->checked_out) : ?>
					<?php if ($canCheckin) : ?>
						<?php echo JHtml::_('jgrid.published',
$item->published, $i, 'messages.', true, 'cb');
?>
					<?php else: ?>
						<?php echo JHtml::_('jgrid.published',
$item->published, $i, 'messages.', false, 'cb');
?>
					<?php endif; ?>
				<?php else: ?>
					<?php echo JHtml::_('jgrid.published',
$item->published, $i, 'messages.', true, 'cb');
?>
				<?php endif; ?>
		<?php else: ?>
			<?php echo JHtml::_('jgrid.published', $item->published,
$i, 'messages.', false, 'cb'); ?>
		<?php endif; ?>
		</td>
		<td class="nowrap center hidden-phone">
			<?php echo $item->id; ?>
		</td>
	</tr>
<?php endforeach;
?>PK5~�[�vg��$views/messages/tmpl/default_foot.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_foot.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<tr>
	<td colspan="11"><?php echo
$this->pagination->getListFooter(); ?></td>
</tr>PK5~�[�5�L��$views/messages/tmpl/default_head.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_head.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<tr>
	<?php if ($this->canEdit&& $this->canState): ?>
		<th width="1%" class="nowrap center
hidden-phone">
			<?php echo JHtml::_('searchtools.sort', '',
'a.ordering', $this->listDirn, $this->listOrder, null,
'asc', 'JGRID_HEADING_ORDERING',
'icon-menu-2'); ?>
		</th>
		<th width="20" class="nowrap center">
			<?php echo JHtml::_('grid.checkall'); ?>
		</th>
	<?php else: ?>
		<th width="20" class="nowrap center
hidden-phone">
			&#9662;
		</th>
		<th width="20" class="nowrap center">
			&#9632;
		</th>
	<?php endif; ?>
	<th class="nowrap" >
			<?php echo JText::_('COM_RESERVATION_MESSAGE_FROM_LABEL');
?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo JText::_('COM_RESERVATION_MESSAGE_TO_LABEL');
?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo JText::_('COM_RESERVATION_MESSAGE_REPLY_LABEL');
?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo
JText::_('COM_RESERVATION_MESSAGE_MESSAGE_LABEL'); ?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo JText::_('COM_RESERVATION_MESSAGE_READ_LABEL');
?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo JText::_('COM_RESERVATION_MESSAGE_SEEN_LABEL');
?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo JText::_('COM_RESERVATION_MESSAGE_SEID_LABEL');
?>
	</th>
	<?php if ($this->canState): ?>
		<th width="10" class="nowrap center" >
			<?php echo JHtml::_('searchtools.sort',
'COM_RESERVATION_MESSAGE_STATUS', 'a.published',
$this->listDirn, $this->listOrder); ?>
		</th>
	<?php else: ?>
		<th width="10" class="nowrap center" >
			<?php echo JText::_('COM_RESERVATION_MESSAGE_STATUS');
?>
		</th>
	<?php endif; ?>
	<th width="5" class="nowrap center hidden-phone"
>
			<?php echo JHtml::_('searchtools.sort',
'COM_RESERVATION_MESSAGE_ID', 'a.id',
$this->listDirn, $this->listOrder); ?>
	</th>
</tr>PK5~�[A�G55'views/messages/tmpl/default_toolbar.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_toolbar.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<div id="filter-bar" class="btn-toolbar">
        <div class="filter-search btn-group pull-left">
            <label for="filter_search"
class="element-invisible"><?php echo
JText::_('Search');?></label>
            <input type="text" name="filter_search"
id="filter_search" placeholder="<?php echo
JText::_('JSEARCH_FILTER'); ?>" value="<?php echo
$this->escape($this->state->get('filter.search'));
?>" class="hasTooltip" title="<?php echo
JHtml::tooltipText('Search Messages'); ?>" />
        </div>
        <div class="btn-group pull-left">
            <button type="submit" class="btn
hasTooltip" title="<?php echo
JHtml::tooltipText('JSEARCH_FILTER_SUBMIT'); ?>"><i
class="icon-search"></i></button>
            <button type="button" class="btn
hasTooltip" title="<?php echo
JHtml::tooltipText('JSEARCH_FILTER_CLEAR'); ?>"
onclick="document.id('filter_search').value='';this.form.submit();"><i
class="icon-remove"></i></button>
        </div>
        <div class="btn-group pull-right hidden-phone">
            <label for="limit"
class="element-invisible"><?php echo
JText::_('JFIELD_PLG_SEARCH_SEARCHLIMIT_DESC');?></label>
            <?php echo $this->pagination->getLimitBox(); ?>
        </div>
        <div class="btn-group pull-right hidden-phone">
            <label for="directionTable"
class="element-invisible"><?php echo
JText::_('JFIELD_ORDERING_DESC');?></label>
            <select name="directionTable"
id="directionTable" class="input-medium"
onchange="Joomla.orderTable()">
                <option value=""><?php echo
JText::_('JFIELD_ORDERING_DESC');?></option>
                <option value="asc" <?php if
($this->listDirn == 'asc') echo
'selected="selected"'; ?>><?php echo
JText::_('JGLOBAL_ORDER_ASCENDING');?></option>
                <option value="desc" <?php if
($this->listDirn == 'desc') echo
'selected="selected"'; ?>><?php echo
JText::_('JGLOBAL_ORDER_DESCENDING');?></option>
            </select>
        </div>
        <div class="btn-group pull-right">
            <label for="sortTable"
class="element-invisible"><?php echo
JText::_('JGLOBAL_SORT_BY');?></label>
            <select name="sortTable" id="sortTable"
class="input-medium" onchange="Joomla.orderTable()">
                <option value=""><?php echo
JText::_('JGLOBAL_SORT_BY');?></option>
                <?php echo JHtml::_('select.options',
$this->getSortFields(), 'value', 'text',
$this->listOrder);?>
            </select>
        </div>
    </div>
<div class="clearfix">
</div>PK5~�[�#o,,views/messages/tmpl/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[8y>��views/messages/view.html.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		view.html.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

/**
 * Reservation View class for the Messages
 */
class ReservationViewMessages extends JViewLegacy
{
	/**
	 * Messages view display method
	 * @return void
	 */
	function display($tpl = null)
	{
		if ($this->getLayout() !== 'modal')
		{
			// Include helper submenu
			ReservationHelper::addSubmenu('messages');
		}

		// Assign data to the view
		$this->items = $this->get('Items');
		$this->pagination = $this->get('Pagination');
		$this->state = $this->get('State');
		$this->user = JFactory::getUser();
		// Load the filter form from xml.
		$this->filterForm = $this->get('FilterForm');
		// Load the active filters.
		$this->activeFilters = $this->get('ActiveFilters');
		// Add the list ordering clause.
		$this->listOrder =
$this->escape($this->state->get('list.ordering',
'a.id'));
		$this->listDirn =
$this->escape($this->state->get('list.direction',
'DESC'));
		$this->saveOrder = $this->listOrder == 'a.ordering';
		// set the return here value
		$this->return_here = urlencode(base64_encode((string)
JUri::getInstance()));
		// get global action permissions
		$this->canDo = ReservationHelper::getActions('message');
		$this->canEdit = $this->canDo->get('core.edit');
		$this->canState =
$this->canDo->get('core.edit.state');
		$this->canCreate = $this->canDo->get('core.create');
		$this->canDelete = $this->canDo->get('core.delete');
		$this->canBatch = $this->canDo->get('core.batch');

		// We don't need toolbar in the modal window.
		if ($this->getLayout() !== 'modal')
		{
			$this->addToolbar();
			$this->sidebar = JHtmlSidebar::render();
			// load the batch html
			if ($this->canCreate && $this->canEdit &&
$this->canState)
			{
				$this->batchDisplay = JHtmlBatch_::render();
			}
		}
		
		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		// Display the template
		parent::display($tpl);

		// Set the document
		$this->setDocument();
	}

	/**
	 * Setting the toolbar
	 */
	protected function addToolBar()
	{
		JToolBarHelper::title(JText::_('COM_RESERVATION_MESSAGES'),
'joomla');
		JHtmlSidebar::setAction('index.php?option=com_reservation&view=messages');
		JFormHelper::addFieldPath(JPATH_COMPONENT . '/models/fields');

		if ($this->canCreate)
		{
			JToolBarHelper::addNew('message.add');
		}

		// Only load if there are items
		if (ReservationHelper::checkArray($this->items))
		{
			if ($this->canEdit)
			{
				JToolBarHelper::editList('message.edit');
			}

			if ($this->canState)
			{
				JToolBarHelper::publishList('messages.publish');
				JToolBarHelper::unpublishList('messages.unpublish');
				JToolBarHelper::archiveList('messages.archive');

				if ($this->canDo->get('core.admin'))
				{
					JToolBarHelper::checkin('messages.checkin');
				}
			}

			// Add a batch button
			if ($this->canBatch && $this->canCreate &&
$this->canEdit && $this->canState)
			{
				// Get the toolbar object instance
				$bar = JToolBar::getInstance('toolbar');
				// set the batch button name
				$title = JText::_('JTOOLBAR_BATCH');
				// Instantiate a new JLayoutFile instance and render the batch button
				$layout = new JLayoutFile('joomla.toolbar.batch');
				// add the button to the page
				$dhtml = $layout->render(array('title' => $title));
				$bar->appendButton('Custom', $dhtml, 'batch');
			}

			if ($this->state->get('filter.published') == -2
&& ($this->canState && $this->canDelete))
			{
				JToolbarHelper::deleteList('', 'messages.delete',
'JTOOLBAR_EMPTY_TRASH');
			}
			elseif ($this->canState && $this->canDelete)
			{
				JToolbarHelper::trash('messages.trash');
			}

			if ($this->canDo->get('core.export') &&
$this->canDo->get('message.export'))
			{
				JToolBarHelper::custom('messages.exportData',
'download', '',
'COM_RESERVATION_EXPORT_DATA', true);
			}
		}

		if ($this->canDo->get('core.import') &&
$this->canDo->get('message.import'))
		{
			JToolBarHelper::custom('messages.importData',
'upload', '', 'COM_RESERVATION_IMPORT_DATA',
false);
		}

		// set help url for this view if found
		$help_url = ReservationHelper::getHelpUrl('messages');
		if (ReservationHelper::checkString($help_url))
		{
				JToolbarHelper::help('COM_RESERVATION_HELP_MANAGER', false,
$help_url);
		}

		// add the options comp button
		if ($this->canDo->get('core.admin') ||
$this->canDo->get('core.options'))
		{
			JToolBarHelper::preferences('com_reservation');
		}

		// Only load published batch if state and batch is allowed
		if ($this->canState && $this->canBatch)
		{
			JHtmlBatch_::addListSelection(
				JText::_('COM_RESERVATION_KEEP_ORIGINAL_STATE'),
				'batch[published]',
				JHtml::_('select.options',
JHtml::_('jgrid.publishedOptions', array('all' =>
false)), 'value', 'text', '', true)
			);
		}

		// Only load access batch if create, edit and batch is allowed
		if ($this->canBatch && $this->canCreate &&
$this->canEdit)
		{
			JHtmlBatch_::addListSelection(
				JText::_('COM_RESERVATION_KEEP_ORIGINAL_ACCESS'),
				'batch[access]',
				JHtml::_('select.options',
JHtml::_('access.assetgroups'), 'value',
'text')
			);
		}
	}

	/**
	 * Method to set up the document properties
	 *
	 * @return void
	 */
	protected function setDocument()
	{
		if (!isset($this->document))
		{
			$this->document = JFactory::getDocument();
		}
		$this->document->setTitle(JText::_('COM_RESERVATION_MESSAGES'));
		$this->document->addStyleSheet(JURI::root() .
"administrator/components/com_reservation/assets/css/messages.css",
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') : 'text/css');
	}

	/**
	 * Escapes a value for output in a view script.
	 *
	 * @param   mixed  $var  The output to escape.
	 *
	 * @return  mixed  The escaped value.
	 */
	public function escape($var)
	{
		if(strlen($var) > 50)
		{
			// use the helper htmlEscape method instead and shorten the string
			return ReservationHelper::htmlEscape($var, $this->_charset, true);
		}
		// use the helper htmlEscape method instead.
		return ReservationHelper::htmlEscape($var, $this->_charset);
	}

	/**
	 * Returns an array of fields the table can be sorted by
	 *
	 * @return  array  Array containing the field name to sort by as the key
and display text as value
	 */
	protected function getSortFields()
	{
		return array(
			'a.ordering' =>
JText::_('JGRID_HEADING_ORDERING'),
			'a.published' => JText::_('JSTATUS'),
			'a.id' => JText::_('JGRID_HEADING_ID')
		);
	}
}
PK5~�[�)rfviews/order/submitbutton.jsnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.31
	@build			8th May, 2021
	@created		17th December, 2020
	@package		Reservation
	@subpackage		submitbutton.js
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

Joomla.submitbutton = function(task)
{
	if (task == ''){
		return false;
	} else { 
		var action = task.split('.');
		if (action[1] == 'cancel' || action[1] == 'close' ||
document.formvalidator.isValid(document.getElementById("adminForm"))){
			Joomla.submitform(task,
document.getElementById("adminForm"));
			return true;
		} else {
			alert(Joomla.JText._('order, some values are not
acceptable.','Some values are unacceptable'));
			return false;
		}
	}
}PK5~�[VZ�
��views/order/tmpl/edit.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.31
	@build			8th May, 2021
	@created		17th December, 2020
	@package		Reservation
	@subpackage		edit.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');
JHtml::_('behavior.tooltip');
JHtml::_('behavior.formvalidation');
JHtml::_('formbehavior.chosen', 'select');
JHtml::_('behavior.keepalive');
$componentParams = $this->params; // will be removed just use
$this->params instead
?>
<script type="text/javascript">
	// waiting spinner
	var outerDiv = jQuery('body');
	jQuery('<div id="loading"></div>')
		.css("background", "rgba(255, 255, 255, .8)
url('components/com_reservation/assets/images/import.gif') 50%
15% no-repeat")
		.css("top", outerDiv.position().top -
jQuery(window).scrollTop())
		.css("left", outerDiv.position().left -
jQuery(window).scrollLeft())
		.css("width", outerDiv.width())
		.css("height", outerDiv.height())
		.css("position", "fixed")
		.css("opacity", "0.80")
		.css("-ms-filter",
"progid:DXImageTransform.Microsoft.Alpha(Opacity = 80)")
		.css("filter", "alpha(opacity = 80)")
		.css("display", "none")
		.appendTo(outerDiv);
	jQuery('#loading').show();
	// when page is ready remove and show
	jQuery(window).load(function() {
		jQuery('#reservation_loader').fadeIn('fast');
		jQuery('#loading').hide();
	});
</script>
<div id="reservation_loader" style="display:
none;">
<form action="<?php echo
JRoute::_('index.php?option=com_reservation&layout=edit&id='.
(int) $this->item->id . $this->referral); ?>"
method="post" name="adminForm" id="adminForm"
class="form-validate"
enctype="multipart/form-data">

<div class="form-horizontal">

	<?php echo JHtml::_('bootstrap.startTabSet',
'orderTab', array('active' => 'details'));
?>

	<?php echo JHtml::_('bootstrap.addTab', 'orderTab',
'details', JText::_('COM_RESERVATION_ORDER_DETAILS',
true)); ?>
		<div class="row-fluid form-horizontal-desktop">
			<div class="span6">
				<?php echo JLayoutHelper::render('order.details_left',
$this); ?>
			</div>
			<div class="span6">
				<?php echo JLayoutHelper::render('order.details_right',
$this); ?>
			</div>
		</div>
	<?php echo JHtml::_('bootstrap.endTab'); ?>

	<?php $this->ignore_fieldsets =
array('details','metadata','vdmmetadata','accesscontrol');
?>
	<?php $this->tab_name = 'orderTab'; ?>
	<?php echo JLayoutHelper::render('joomla.edit.params',
$this); ?>

	<?php if ($this->canDo->get('core.edit.created_by') ||
$this->canDo->get('core.edit.created') ||
$this->canDo->get('core.edit.state') ||
($this->canDo->get('core.delete') &&
$this->canDo->get('core.edit.state'))) : ?>
	<?php echo JHtml::_('bootstrap.addTab', 'orderTab',
'publishing',
JText::_('COM_RESERVATION_ORDER_PUBLISHING', true)); ?>
		<div class="row-fluid form-horizontal-desktop">
			<div class="span6">
				<?php echo JLayoutHelper::render('order.publishing',
$this); ?>
			</div>
			<div class="span6">
				<?php echo JLayoutHelper::render('order.publlshing',
$this); ?>
			</div>
		</div>
	<?php echo JHtml::_('bootstrap.endTab'); ?>
	<?php endif; ?>

	<?php if ($this->canDo->get('core.admin')) : ?>
	<?php echo JHtml::_('bootstrap.addTab', 'orderTab',
'permissions',
JText::_('COM_RESERVATION_ORDER_PERMISSION', true)); ?>
		<div class="row-fluid form-horizontal-desktop">
			<div class="span12">
				<fieldset class="adminform">
					<div class="adminformlist">
					<?php foreach
($this->form->getFieldset('accesscontrol') as $field):
?>
						<div>
							<?php echo $field->label; echo $field->input;?>
						</div>
						<div class="clearfix"></div>
					<?php endforeach; ?>
					</div>
				</fieldset>
			</div>
		</div>
	<?php echo JHtml::_('bootstrap.endTab'); ?>
	<?php endif; ?>

	<?php echo JHtml::_('bootstrap.endTabSet'); ?>

	<div>
		<input type="hidden" name="task"
value="order.edit" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</div>
</form>
</div>
PK5~�[�#o,,views/order/tmpl/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[�R>@@views/order/view.html.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.31
	@build			8th May, 2021
	@created		17th December, 2020
	@package		Reservation
	@subpackage		view.html.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

/**
 * Order View class
 */
class ReservationViewOrder extends JViewLegacy
{
	/**
	 * display method of View
	 * @return void
	 */
	public function display($tpl = null)
	{
		// set params
		$this->params =
JComponentHelper::getParams('com_reservation');
		// Assign the variables
		$this->form = $this->get('Form');
		$this->item = $this->get('Item');
		$this->script = $this->get('Script');
		$this->state = $this->get('State');
		// get action permissions
		$this->canDo = ReservationHelper::getActions('order',
$this->item);
		// get input
		$jinput = JFactory::getApplication()->input;
		$this->ref = $jinput->get('ref', 0, 'word');
		$this->refid = $jinput->get('refid', 0,
'int');
		$return = $jinput->get('return', null, 'base64');
		// set the referral string
		$this->referral = '';
		if ($this->refid && $this->ref)
		{
			// return to the item that referred to this item
			$this->referral = '&ref=' . (string)$this->ref .
'&refid=' . (int)$this->refid;
		}
		elseif($this->ref)
		{
			// return to the list view that referred to this item
			$this->referral = '&ref=' . (string)$this->ref;
		}
		// check return value
		if (!is_null($return))
		{
			// add the return value
			$this->referral .= '&return=' . (string)$return;
		}

		// Set the toolbar
		$this->addToolBar();
		
		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		// Display the template
		parent::display($tpl);

		// Set the document
		$this->setDocument();
	}


	/**
	 * Setting the toolbar
	 */
	protected function addToolBar()
	{
		JFactory::getApplication()->input->set('hidemainmenu',
true);
		$user = JFactory::getUser();
		$userId	= $user->id;
		$isNew = $this->item->id == 0;

		JToolbarHelper::title( JText::_($isNew ?
'COM_RESERVATION_ORDER_NEW' :
'COM_RESERVATION_ORDER_EDIT'), 'pencil-2 article-add');
		// Built the actions for new and existing records.
		if (ReservationHelper::checkString($this->referral))
		{
			if ($this->canDo->get('core.create') && $isNew)
			{
				// We can create the record.
				JToolBarHelper::save('order.save',
'JTOOLBAR_SAVE');
			}
			elseif ($this->canDo->get('core.edit'))
			{
				// We can save the record.
				JToolBarHelper::save('order.save',
'JTOOLBAR_SAVE');
			}
			if ($isNew)
			{
				// Do not creat but cancel.
				JToolBarHelper::cancel('order.cancel',
'JTOOLBAR_CANCEL');
			}
			else
			{
				// We can close it.
				JToolBarHelper::cancel('order.cancel',
'JTOOLBAR_CLOSE');
			}
		}
		else
		{
			if ($isNew)
			{
				// For new records, check the create permission.
				if ($this->canDo->get('core.create'))
				{
					JToolBarHelper::apply('order.apply',
'JTOOLBAR_APPLY');
					JToolBarHelper::save('order.save',
'JTOOLBAR_SAVE');
					JToolBarHelper::custom('order.save2new',
'save-new.png', 'save-new_f2.png',
'JTOOLBAR_SAVE_AND_NEW', false);
				};
				JToolBarHelper::cancel('order.cancel',
'JTOOLBAR_CANCEL');
			}
			else
			{
				if ($this->canDo->get('core.edit'))
				{
					// We can save the new record
					JToolBarHelper::apply('order.apply',
'JTOOLBAR_APPLY');
					JToolBarHelper::save('order.save',
'JTOOLBAR_SAVE');
					// We can save this record, but check the create permission to see
					// if we can return to make a new one.
					if ($this->canDo->get('core.create'))
					{
						JToolBarHelper::custom('order.save2new',
'save-new.png', 'save-new_f2.png',
'JTOOLBAR_SAVE_AND_NEW', false);
					}
				}
				$canVersion = ($this->canDo->get('core.version')
&& $this->canDo->get('order.version'));
				if ($this->state->params->get('save_history', 1)
&& $this->canDo->get('core.edit') &&
$canVersion)
				{
					JToolbarHelper::versions('com_reservation.order',
$this->item->id);
				}
				if ($this->canDo->get('core.create'))
				{
					JToolBarHelper::custom('order.save2copy',
'save-copy.png', 'save-copy_f2.png',
'JTOOLBAR_SAVE_AS_COPY', false);
				}
				JToolBarHelper::cancel('order.cancel',
'JTOOLBAR_CLOSE');
			}
		}
		JToolbarHelper::divider();
		// set help url for this view if found
		$help_url = ReservationHelper::getHelpUrl('order');
		if (ReservationHelper::checkString($help_url))
		{
			JToolbarHelper::help('COM_RESERVATION_HELP_MANAGER', false,
$help_url);
		}
	}

	/**
	 * Escapes a value for output in a view script.
	 *
	 * @param   mixed  $var  The output to escape.
	 *
	 * @return  mixed  The escaped value.
	 */
	public function escape($var)
	{
		if(strlen($var) > 30)
		{
    		// use the helper htmlEscape method instead and shorten the string
			return ReservationHelper::htmlEscape($var, $this->_charset, true,
30);
		}
		// use the helper htmlEscape method instead.
		return ReservationHelper::htmlEscape($var, $this->_charset);
	}

	/**
	 * Method to set up the document properties
	 *
	 * @return void
	 */
	protected function setDocument()
	{
		$isNew = ($this->item->id < 1);
		if (!isset($this->document))
		{
			$this->document = JFactory::getDocument();
		}
		$this->document->setTitle(JText::_($isNew ?
'COM_RESERVATION_ORDER_NEW' :
'COM_RESERVATION_ORDER_EDIT'));
		$this->document->addStyleSheet(JURI::root() .
"administrator/components/com_reservation/assets/css/order.css",
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') : 'text/css');
		$this->document->addScript(JURI::root() . $this->script,
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') :
'text/javascript');
		$this->document->addScript(JURI::root() .
"administrator/components/com_reservation/views/order/submitbutton.js",
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') :
'text/javascript'); 
		JText::script('view not acceptable. Error');
	}
}
PK5~�[�#o,,views/orders/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[��P�##views/orders/tmpl/default.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.31
	@build			8th May, 2021
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

JHtml::_('behavior.tooltip');
JHtml::_('behavior.multiselect');
JHtml::_('dropdown.init');
JHtml::_('formbehavior.chosen',
'.multipleAccessLevels', null,
array('placeholder_text_multiple' => '- ' .
JText::_('COM_RESERVATION_FILTER_SELECT_ACCESS') . '
-'));
JHtml::_('formbehavior.chosen', 'select');
if ($this->saveOrder)
{
	$saveOrderingUrl =
'index.php?option=com_reservation&task=orders.saveOrderAjax&tmpl=component';
	JHtml::_('sortablelist.sortable', 'orderList',
'adminForm', strtolower($this->listDirn), $saveOrderingUrl);
}
?>
<form action="<?php echo
JRoute::_('index.php?option=com_reservation&view=orders');
?>" method="post" name="adminForm"
id="adminForm">
<?php if(!empty( $this->sidebar)): ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif; ?>
<?php
	// Add the searchtools
	echo JLayoutHelper::render('joomla.searchtools.default',
array('view' => $this));
?>
<?php if (empty($this->items)): ?>
	<div class="alert alert-no-items">
		<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
	</div>
<?php else : ?>
	<table class="table table-striped"
id="orderList">
		<thead><?php echo
$this->loadTemplate('head');?></thead>
		<tfoot><?php echo
$this->loadTemplate('foot');?></tfoot>
		<tbody><?php echo
$this->loadTemplate('body');?></tbody>
	</table>
	<?php // Load the batch processing form. ?>
	<?php if ($this->canCreate && $this->canEdit) : ?>
		<?php echo JHtml::_(
			'bootstrap.renderModal',
			'collapseModal',
			array(
				'title' =>
JText::_('COM_RESERVATION_ORDERS_BATCH_OPTIONS'),
				'footer' =>
$this->loadTemplate('batch_footer')
			),
			$this->loadTemplate('batch_body')
		); ?>
	<?php endif; ?>
	<input type="hidden" name="boxchecked"
value="0" />
	</div>
<?php endif; ?>
	<input type="hidden" name="task" value=""
/>
	<?php echo JHtml::_('form.token'); ?>
</form>
PK5~�[�Ir{��(views/orders/tmpl/default_batch_body.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.31
	@build			8th May, 2021
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_batch_body.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>

<p><?php echo
JText::_('COM_RESERVATION_ORDERS_BATCH_TIP'); ?></p>
<?php echo $this->batchDisplay;
?>PK5~�[��!��*views/orders/tmpl/default_batch_footer.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.31
	@build			8th May, 2021
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_batch_footer.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<!-- clear the batch values if cancel -->
<button class="btn" type="button"
onclick="" data-dismiss="modal">
	<?php echo JText::_('JCANCEL'); ?>
</button>
<!-- post the batch values if process -->
<button class="btn btn-success" type="submit"
onclick="Joomla.submitbutton('order.batch');">
	<?php echo JText::_('JGLOBAL_BATCH_PROCESS'); ?>
</button>PK5~�[a

A��"views/orders/tmpl/default_body.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.31
	@build			8th May, 2021
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_body.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

$edit =
"index.php?option=com_reservation&view=orders&task=order.edit";

?>
<?php foreach ($this->items as $i => $item): ?>
	<?php
		$canCheckin = $this->user->authorise('core.manage',
'com_checkin') || $item->checked_out == $this->user->id
|| $item->checked_out == 0;
		$userChkOut = JFactory::getUser($item->checked_out);
		$canDo =
ReservationHelper::getActions('order',$item,'orders');
	?>
	<tr class="row<?php echo $i % 2; ?>">
		<td class="order nowrap center hidden-phone">
		<?php if ($canDo->get('core.edit.state')): ?>
			<?php
				$iconClass = '';
				if (!$this->saveOrder)
				{
					$iconClass = ' inactive tip-top" hasTooltip"
title="' . JHtml::tooltipText('JORDERINGDISABLED');
				}
			?>
			<span class="sortable-handler<?php echo $iconClass;
?>">
				<i class="icon-menu"></i>
			</span>
			<?php if ($this->saveOrder) : ?>
				<input type="text" style="display:none"
name="order[]" size="5"
				value="<?php echo $item->ordering; ?>"
class="width-20 text-area-order " />
			<?php endif; ?>
		<?php else: ?>
			&#8942;
		<?php endif; ?>
		</td>
		<td class="nowrap center">
		<?php if ($canDo->get('core.edit')): ?>
				<?php if ($item->checked_out) : ?>
					<?php if ($canCheckin) : ?>
						<?php echo JHtml::_('grid.id', $i, $item->id); ?>
					<?php else: ?>
						&#9633;
					<?php endif; ?>
				<?php else: ?>
					<?php echo JHtml::_('grid.id', $i, $item->id); ?>
				<?php endif; ?>
		<?php else: ?>
			&#9633;
		<?php endif; ?>
		</td>
		<td class="nowrap">
			<div class="name">
				<?php if ($canDo->get('core.edit')): ?>
					<a href="<?php echo $edit; ?>&id=<?php echo
$item->id; ?>"><?php echo
$this->escape($item->sickid_phonenumber); ?></a>
					<?php if ($item->checked_out): ?>
						<?php echo JHtml::_('jgrid.checkedout', $i,
$userChkOut->name, $item->checked_out_time, 'orders.',
$canCheckin); ?>
					<?php endif; ?>
				<?php else: ?>
					<?php echo $this->escape($item->sickid_phonenumber); ?>
				<?php endif; ?>
			</div>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->full_price); ?>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->doctor_quota); ?>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->system_quota); ?>
		</td>
		<td class="hidden-phone">
			<?php echo JText::_($item->status); ?>
		</td>
		<td class="center">
		<?php if ($canDo->get('core.edit.state')) : ?>
				<?php if ($item->checked_out) : ?>
					<?php if ($canCheckin) : ?>
						<?php echo JHtml::_('jgrid.published',
$item->published, $i, 'orders.', true, 'cb'); ?>
					<?php else: ?>
						<?php echo JHtml::_('jgrid.published',
$item->published, $i, 'orders.', false, 'cb'); ?>
					<?php endif; ?>
				<?php else: ?>
					<?php echo JHtml::_('jgrid.published',
$item->published, $i, 'orders.', true, 'cb'); ?>
				<?php endif; ?>
		<?php else: ?>
			<?php echo JHtml::_('jgrid.published', $item->published,
$i, 'orders.', false, 'cb'); ?>
		<?php endif; ?>
		</td>
		<td class="nowrap center hidden-phone">
			<?php echo $item->id; ?>
		</td>
	</tr>
<?php endforeach;
?>PK5~�[?y�?��"views/orders/tmpl/default_foot.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.31
	@build			8th May, 2021
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_foot.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<tr>
	<td colspan="9"><?php echo
$this->pagination->getListFooter(); ?></td>
</tr>PK5~�[5	��WW"views/orders/tmpl/default_head.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.31
	@build			8th May, 2021
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_head.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<tr>
	<?php if ($this->canEdit&& $this->canState): ?>
		<th width="1%" class="nowrap center
hidden-phone">
			<?php echo JHtml::_('searchtools.sort', '',
'a.ordering', $this->listDirn, $this->listOrder, null,
'asc', 'JGRID_HEADING_ORDERING',
'icon-menu-2'); ?>
		</th>
		<th width="20" class="nowrap center">
			<?php echo JHtml::_('grid.checkall'); ?>
		</th>
	<?php else: ?>
		<th width="20" class="nowrap center
hidden-phone">
			&#9662;
		</th>
		<th width="20" class="nowrap center">
			&#9632;
		</th>
	<?php endif; ?>
	<th class="nowrap" >
			<?php echo JText::_('COM_RESERVATION_ORDER_SICKID_LABEL');
?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo JHtml::_('searchtools.sort',
'COM_RESERVATION_ORDER_FULL_PRICE_LABEL',
'a.full_price', $this->listDirn, $this->listOrder); ?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo
JText::_('COM_RESERVATION_ORDER_DOCTOR_QUOTA_LABEL'); ?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo
JText::_('COM_RESERVATION_ORDER_SYSTEM_QUOTA_LABEL'); ?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo JHtml::_('searchtools.sort',
'COM_RESERVATION_ORDER_STATUS_LABEL', 'a.status',
$this->listDirn, $this->listOrder); ?>
	</th>
	<?php if ($this->canState): ?>
		<th width="10" class="nowrap center" >
			<?php echo JHtml::_('searchtools.sort',
'COM_RESERVATION_ORDER_STATUS', 'a.published',
$this->listDirn, $this->listOrder); ?>
		</th>
	<?php else: ?>
		<th width="10" class="nowrap center" >
			<?php echo JText::_('COM_RESERVATION_ORDER_STATUS'); ?>
		</th>
	<?php endif; ?>
	<th width="5" class="nowrap center hidden-phone"
>
			<?php echo JHtml::_('searchtools.sort',
'COM_RESERVATION_ORDER_ID', 'a.id', $this->listDirn,
$this->listOrder); ?>
	</th>
</tr>PK5~�[�X�;ee%views/orders/tmpl/default_toolbar.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.31
	@build			8th May, 2021
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_toolbar.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<div id="filter-bar" class="btn-toolbar">
        <div class="filter-search btn-group pull-left">
            <label for="filter_search"
class="element-invisible"><?php echo
JText::_('Search');?></label>
            <input type="text" name="filter_search"
id="filter_search" placeholder="<?php echo
JText::_('JSEARCH_FILTER'); ?>" value="<?php echo
$this->escape($this->state->get('filter.search'));
?>" class="hasTooltip" title="<?php echo
JHtml::tooltipText('Search Orders'); ?>" />
        </div>
        <div class="btn-group pull-left">
            <button type="submit" class="btn
hasTooltip" title="<?php echo
JHtml::tooltipText('JSEARCH_FILTER_SUBMIT'); ?>"><i
class="icon-search"></i></button>
            <button type="button" class="btn
hasTooltip" title="<?php echo
JHtml::tooltipText('JSEARCH_FILTER_CLEAR'); ?>"
onclick="document.id('filter_search').value='';this.form.submit();"><i
class="icon-remove"></i></button>
        </div>
        <div class="btn-group pull-right hidden-phone">
            <label for="limit"
class="element-invisible"><?php echo
JText::_('JFIELD_PLG_SEARCH_SEARCHLIMIT_DESC');?></label>
            <?php echo $this->pagination->getLimitBox(); ?>
        </div>
        <div class="btn-group pull-right hidden-phone">
            <label for="directionTable"
class="element-invisible"><?php echo
JText::_('JFIELD_ORDERING_DESC');?></label>
            <select name="directionTable"
id="directionTable" class="input-medium"
onchange="Joomla.orderTable()">
                <option value=""><?php echo
JText::_('JFIELD_ORDERING_DESC');?></option>
                <option value="asc" <?php if
($this->listDirn == 'asc') echo
'selected="selected"'; ?>><?php echo
JText::_('JGLOBAL_ORDER_ASCENDING');?></option>
                <option value="desc" <?php if
($this->listDirn == 'desc') echo
'selected="selected"'; ?>><?php echo
JText::_('JGLOBAL_ORDER_DESCENDING');?></option>
            </select>
        </div>
        <div class="btn-group pull-right">
            <label for="sortTable"
class="element-invisible"><?php echo
JText::_('JGLOBAL_SORT_BY');?></label>
            <select name="sortTable" id="sortTable"
class="input-medium"
onchange="Joomla.orderTable()">
                <option value=""><?php echo
JText::_('JGLOBAL_SORT_BY');?></option>
                <?php echo JHtml::_('select.options',
$this->getSortFields(), 'value', 'text',
$this->listOrder);?>
            </select>
        </div>
    </div>
<div class="clearfix">
</div>PK5~�[�#o,,views/orders/tmpl/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[:����views/orders/view.html.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.31
	@build			8th May, 2021
	@created		17th December, 2020
	@package		Reservation
	@subpackage		view.html.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

/**
 * Reservation View class for the Orders
 */
class ReservationViewOrders extends JViewLegacy
{
	/**
	 * Orders view display method
	 * @return void
	 */
	function display($tpl = null)
	{
		if ($this->getLayout() !== 'modal')
		{
			// Include helper submenu
			ReservationHelper::addSubmenu('orders');
		}

		// Assign data to the view
		$this->items = $this->get('Items');
		$this->pagination = $this->get('Pagination');
		$this->state = $this->get('State');
		$this->user = JFactory::getUser();
		// Load the filter form from xml.
		$this->filterForm = $this->get('FilterForm');
		// Load the active filters.
		$this->activeFilters = $this->get('ActiveFilters');
		// Add the list ordering clause.
		$this->listOrder =
$this->escape($this->state->get('list.ordering',
'a.id'));
		$this->listDirn =
$this->escape($this->state->get('list.direction',
'DESC'));
		$this->saveOrder = $this->listOrder == 'a.ordering';
		// set the return here value
		$this->return_here = urlencode(base64_encode((string)
JUri::getInstance()));
		// get global action permissions
		$this->canDo = ReservationHelper::getActions('order');
		$this->canEdit = $this->canDo->get('core.edit');
		$this->canState =
$this->canDo->get('core.edit.state');
		$this->canCreate = $this->canDo->get('core.create');
		$this->canDelete = $this->canDo->get('core.delete');
		$this->canBatch = $this->canDo->get('core.batch');

		// We don't need toolbar in the modal window.
		if ($this->getLayout() !== 'modal')
		{
			$this->addToolbar();
			$this->sidebar = JHtmlSidebar::render();
			// load the batch html
			if ($this->canCreate && $this->canEdit &&
$this->canState)
			{
				$this->batchDisplay = JHtmlBatch_::render();
			}
		}
		
		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		// Display the template
		parent::display($tpl);

		// Set the document
		$this->setDocument();
	}

	/**
	 * Setting the toolbar
	 */
	protected function addToolBar()
	{
		JToolBarHelper::title(JText::_('COM_RESERVATION_ORDERS'),
'joomla');
		JHtmlSidebar::setAction('index.php?option=com_reservation&view=orders');
		JFormHelper::addFieldPath(JPATH_COMPONENT . '/models/fields');

		if ($this->canCreate)
		{
			JToolBarHelper::addNew('order.add');
		}

		// Only load if there are items
		if (ReservationHelper::checkArray($this->items))
		{
			if ($this->canEdit)
			{
				JToolBarHelper::editList('order.edit');
			}

			if ($this->canState)
			{
				JToolBarHelper::publishList('orders.publish');
				JToolBarHelper::unpublishList('orders.unpublish');
				JToolBarHelper::archiveList('orders.archive');

				if ($this->canDo->get('core.admin'))
				{
					JToolBarHelper::checkin('orders.checkin');
				}
			}

			// Add a batch button
			if ($this->canBatch && $this->canCreate &&
$this->canEdit && $this->canState)
			{
				// Get the toolbar object instance
				$bar = JToolBar::getInstance('toolbar');
				// set the batch button name
				$title = JText::_('JTOOLBAR_BATCH');
				// Instantiate a new JLayoutFile instance and render the batch button
				$layout = new JLayoutFile('joomla.toolbar.batch');
				// add the button to the page
				$dhtml = $layout->render(array('title' => $title));
				$bar->appendButton('Custom', $dhtml, 'batch');
			}

			if ($this->state->get('filter.published') == -2
&& ($this->canState && $this->canDelete))
			{
				JToolbarHelper::deleteList('', 'orders.delete',
'JTOOLBAR_EMPTY_TRASH');
			}
			elseif ($this->canState && $this->canDelete)
			{
				JToolbarHelper::trash('orders.trash');
			}

			if ($this->canDo->get('core.export') &&
$this->canDo->get('order.export'))
			{
				JToolBarHelper::custom('orders.exportData',
'download', '',
'COM_RESERVATION_EXPORT_DATA', true);
			}
		}

		if ($this->canDo->get('core.import') &&
$this->canDo->get('order.import'))
		{
			JToolBarHelper::custom('orders.importData',
'upload', '', 'COM_RESERVATION_IMPORT_DATA',
false);
		}

		// set help url for this view if found
		$help_url = ReservationHelper::getHelpUrl('orders');
		if (ReservationHelper::checkString($help_url))
		{
				JToolbarHelper::help('COM_RESERVATION_HELP_MANAGER', false,
$help_url);
		}

		// add the options comp button
		if ($this->canDo->get('core.admin') ||
$this->canDo->get('core.options'))
		{
			JToolBarHelper::preferences('com_reservation');
		}

		// Only load published batch if state and batch is allowed
		if ($this->canState && $this->canBatch)
		{
			JHtmlBatch_::addListSelection(
				JText::_('COM_RESERVATION_KEEP_ORIGINAL_STATE'),
				'batch[published]',
				JHtml::_('select.options',
JHtml::_('jgrid.publishedOptions', array('all' =>
false)), 'value', 'text', '', true)
			);
		}

		// Only load access batch if create, edit and batch is allowed
		if ($this->canBatch && $this->canCreate &&
$this->canEdit)
		{
			JHtmlBatch_::addListSelection(
				JText::_('COM_RESERVATION_KEEP_ORIGINAL_ACCESS'),
				'batch[access]',
				JHtml::_('select.options',
JHtml::_('access.assetgroups'), 'value',
'text')
			);
		}
	}

	/**
	 * Method to set up the document properties
	 *
	 * @return void
	 */
	protected function setDocument()
	{
		if (!isset($this->document))
		{
			$this->document = JFactory::getDocument();
		}
		$this->document->setTitle(JText::_('COM_RESERVATION_ORDERS'));
		$this->document->addStyleSheet(JURI::root() .
"administrator/components/com_reservation/assets/css/orders.css",
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') : 'text/css');
	}

	/**
	 * Escapes a value for output in a view script.
	 *
	 * @param   mixed  $var  The output to escape.
	 *
	 * @return  mixed  The escaped value.
	 */
	public function escape($var)
	{
		if(strlen($var) > 50)
		{
			// use the helper htmlEscape method instead and shorten the string
			return ReservationHelper::htmlEscape($var, $this->_charset, true);
		}
		// use the helper htmlEscape method instead.
		return ReservationHelper::htmlEscape($var, $this->_charset);
	}

	/**
	 * Returns an array of fields the table can be sorted by
	 *
	 * @return  array  Array containing the field name to sort by as the key
and display text as value
	 */
	protected function getSortFields()
	{
		return array(
			'a.ordering' =>
JText::_('JGRID_HEADING_ORDERING'),
			'a.published' => JText::_('JSTATUS'),
			'a.full_price' =>
JText::_('COM_RESERVATION_ORDER_FULL_PRICE_LABEL'),
			'a.status' =>
JText::_('COM_RESERVATION_ORDER_STATUS_LABEL'),
			'a.id' => JText::_('JGRID_HEADING_ID')
		);
	}
}
PK5~�[�`����views/plan/submitbutton.jsnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		submitbutton.js
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

Joomla.submitbutton = function(task)
{
	if (task == ''){
		return false;
	} else { 
		var action = task.split('.');
		if (action[1] == 'cancel' || action[1] == 'close' ||
document.formvalidator.isValid(document.getElementById("adminForm"))){
			Joomla.submitform(task, document.getElementById("adminForm"));
			return true;
		} else {
			alert(Joomla.JText._('plan, some values are not
acceptable.','Some values are unacceptable'));
			return false;
		}
	}
}PK5~�[���w��views/plan/tmpl/edit.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		edit.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');
JHtml::_('behavior.tooltip');
JHtml::_('behavior.formvalidation');
JHtml::_('formbehavior.chosen', 'select');
JHtml::_('behavior.keepalive');
$componentParams = $this->params; // will be removed just use
$this->params instead
?>
<script type="text/javascript">
	// waiting spinner
	var outerDiv = jQuery('body');
	jQuery('<div id="loading"></div>')
		.css("background", "rgba(255, 255, 255, .8)
url('components/com_reservation/assets/images/import.gif') 50%
15% no-repeat")
		.css("top", outerDiv.position().top -
jQuery(window).scrollTop())
		.css("left", outerDiv.position().left -
jQuery(window).scrollLeft())
		.css("width", outerDiv.width())
		.css("height", outerDiv.height())
		.css("position", "fixed")
		.css("opacity", "0.80")
		.css("-ms-filter",
"progid:DXImageTransform.Microsoft.Alpha(Opacity = 80)")
		.css("filter", "alpha(opacity = 80)")
		.css("display", "none")
		.appendTo(outerDiv);
	jQuery('#loading').show();
	// when page is ready remove and show
	jQuery(window).load(function() {
		jQuery('#reservation_loader').fadeIn('fast');
		jQuery('#loading').hide();
	});
</script>
<div id="reservation_loader" style="display:
none;">
<form action="<?php echo
JRoute::_('index.php?option=com_reservation&layout=edit&id='.
(int) $this->item->id . $this->referral); ?>"
method="post" name="adminForm" id="adminForm"
class="form-validate" enctype="multipart/form-data">

<div class="form-horizontal">

	<?php echo JHtml::_('bootstrap.startTabSet',
'planTab', array('active' => 'details'));
?>

	<?php echo JHtml::_('bootstrap.addTab', 'planTab',
'details', JText::_('COM_RESERVATION_PLAN_DETAILS',
true)); ?>
		<div class="row-fluid form-horizontal-desktop">
			<div class="span6">
				<?php echo JLayoutHelper::render('plan.details_left',
$this); ?>
			</div>
			<div class="span6">
				<?php echo JLayoutHelper::render('plan.details_right',
$this); ?>
			</div>
		</div>
	<?php echo JHtml::_('bootstrap.endTab'); ?>

	<?php $this->ignore_fieldsets =
array('details','metadata','vdmmetadata','accesscontrol');
?>
	<?php $this->tab_name = 'planTab'; ?>
	<?php echo JLayoutHelper::render('joomla.edit.params',
$this); ?>

	<?php if ($this->canDo->get('core.edit.created_by') ||
$this->canDo->get('core.edit.created') ||
$this->canDo->get('core.edit.state') ||
($this->canDo->get('core.delete') &&
$this->canDo->get('core.edit.state'))) : ?>
	<?php echo JHtml::_('bootstrap.addTab', 'planTab',
'publishing',
JText::_('COM_RESERVATION_PLAN_PUBLISHING', true)); ?>
		<div class="row-fluid form-horizontal-desktop">
			<div class="span6">
				<?php echo JLayoutHelper::render('plan.publishing',
$this); ?>
			</div>
			<div class="span6">
				<?php echo JLayoutHelper::render('plan.publlshing',
$this); ?>
			</div>
		</div>
	<?php echo JHtml::_('bootstrap.endTab'); ?>
	<?php endif; ?>

	<?php if ($this->canDo->get('core.admin')) : ?>
	<?php echo JHtml::_('bootstrap.addTab', 'planTab',
'permissions',
JText::_('COM_RESERVATION_PLAN_PERMISSION', true)); ?>
		<div class="row-fluid form-horizontal-desktop">
			<div class="span12">
				<fieldset class="adminform">
					<div class="adminformlist">
					<?php foreach
($this->form->getFieldset('accesscontrol') as $field):
?>
						<div>
							<?php echo $field->label; echo $field->input;?>
						</div>
						<div class="clearfix"></div>
					<?php endforeach; ?>
					</div>
				</fieldset>
			</div>
		</div>
	<?php echo JHtml::_('bootstrap.endTab'); ?>
	<?php endif; ?>

	<?php echo JHtml::_('bootstrap.endTabSet'); ?>

	<div>
		<input type="hidden" name="task"
value="plan.edit" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</div>
</form>
</div>
PK5~�[�#o,,views/plan/tmpl/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[F��y��views/plan/view.html.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		view.html.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

/**
 * Plan View class
 */
class ReservationViewPlan extends JViewLegacy
{
	/**
	 * display method of View
	 * @return void
	 */
	public function display($tpl = null)
	{
		// set params
		$this->params =
JComponentHelper::getParams('com_reservation');
		// Assign the variables
		$this->form = $this->get('Form');
		$this->item = $this->get('Item');
		$this->script = $this->get('Script');
		$this->state = $this->get('State');
		// get action permissions
		$this->canDo = ReservationHelper::getActions('plan',
$this->item);
		// get input
		$jinput = JFactory::getApplication()->input;
		$this->ref = $jinput->get('ref', 0, 'word');
		$this->refid = $jinput->get('refid', 0, 'int');
		$return = $jinput->get('return', null, 'base64');
		// set the referral string
		$this->referral = '';
		if ($this->refid && $this->ref)
		{
			// return to the item that referred to this item
			$this->referral = '&ref=' . (string)$this->ref .
'&refid=' . (int)$this->refid;
		}
		elseif($this->ref)
		{
			// return to the list view that referred to this item
			$this->referral = '&ref=' . (string)$this->ref;
		}
		// check return value
		if (!is_null($return))
		{
			// add the return value
			$this->referral .= '&return=' . (string)$return;
		}

		// Set the toolbar
		$this->addToolBar();
		
		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		// Display the template
		parent::display($tpl);

		// Set the document
		$this->setDocument();
	}


	/**
	 * Setting the toolbar
	 */
	protected function addToolBar()
	{
		JFactory::getApplication()->input->set('hidemainmenu',
true);
		$user = JFactory::getUser();
		$userId	= $user->id;
		$isNew = $this->item->id == 0;

		JToolbarHelper::title( JText::_($isNew ?
'COM_RESERVATION_PLAN_NEW' :
'COM_RESERVATION_PLAN_EDIT'), 'pencil-2 article-add');
		// Built the actions for new and existing records.
		if (ReservationHelper::checkString($this->referral))
		{
			if ($this->canDo->get('core.create') && $isNew)
			{
				// We can create the record.
				JToolBarHelper::save('plan.save', 'JTOOLBAR_SAVE');
			}
			elseif ($this->canDo->get('core.edit'))
			{
				// We can save the record.
				JToolBarHelper::save('plan.save', 'JTOOLBAR_SAVE');
			}
			if ($isNew)
			{
				// Do not creat but cancel.
				JToolBarHelper::cancel('plan.cancel',
'JTOOLBAR_CANCEL');
			}
			else
			{
				// We can close it.
				JToolBarHelper::cancel('plan.cancel',
'JTOOLBAR_CLOSE');
			}
		}
		else
		{
			if ($isNew)
			{
				// For new records, check the create permission.
				if ($this->canDo->get('core.create'))
				{
					JToolBarHelper::apply('plan.apply',
'JTOOLBAR_APPLY');
					JToolBarHelper::save('plan.save',
'JTOOLBAR_SAVE');
					JToolBarHelper::custom('plan.save2new',
'save-new.png', 'save-new_f2.png',
'JTOOLBAR_SAVE_AND_NEW', false);
				};
				JToolBarHelper::cancel('plan.cancel',
'JTOOLBAR_CANCEL');
			}
			else
			{
				if ($this->canDo->get('core.edit'))
				{
					// We can save the new record
					JToolBarHelper::apply('plan.apply',
'JTOOLBAR_APPLY');
					JToolBarHelper::save('plan.save',
'JTOOLBAR_SAVE');
					// We can save this record, but check the create permission to see
					// if we can return to make a new one.
					if ($this->canDo->get('core.create'))
					{
						JToolBarHelper::custom('plan.save2new',
'save-new.png', 'save-new_f2.png',
'JTOOLBAR_SAVE_AND_NEW', false);
					}
				}
				$canVersion = ($this->canDo->get('core.version')
&& $this->canDo->get('plan.version'));
				if ($this->state->params->get('save_history', 1)
&& $this->canDo->get('core.edit') &&
$canVersion)
				{
					JToolbarHelper::versions('com_reservation.plan',
$this->item->id);
				}
				if ($this->canDo->get('core.create'))
				{
					JToolBarHelper::custom('plan.save2copy',
'save-copy.png', 'save-copy_f2.png',
'JTOOLBAR_SAVE_AS_COPY', false);
				}
				JToolBarHelper::cancel('plan.cancel',
'JTOOLBAR_CLOSE');
			}
		}
		JToolbarHelper::divider();
		// set help url for this view if found
		$help_url = ReservationHelper::getHelpUrl('plan');
		if (ReservationHelper::checkString($help_url))
		{
			JToolbarHelper::help('COM_RESERVATION_HELP_MANAGER', false,
$help_url);
		}
	}

	/**
	 * Escapes a value for output in a view script.
	 *
	 * @param   mixed  $var  The output to escape.
	 *
	 * @return  mixed  The escaped value.
	 */
	public function escape($var)
	{
		if(strlen($var) > 30)
		{
    		// use the helper htmlEscape method instead and shorten the string
			return ReservationHelper::htmlEscape($var, $this->_charset, true,
30);
		}
		// use the helper htmlEscape method instead.
		return ReservationHelper::htmlEscape($var, $this->_charset);
	}

	/**
	 * Method to set up the document properties
	 *
	 * @return void
	 */
	protected function setDocument()
	{
		$isNew = ($this->item->id < 1);
		if (!isset($this->document))
		{
			$this->document = JFactory::getDocument();
		}
		$this->document->setTitle(JText::_($isNew ?
'COM_RESERVATION_PLAN_NEW' :
'COM_RESERVATION_PLAN_EDIT'));
		$this->document->addStyleSheet(JURI::root() .
"administrator/components/com_reservation/assets/css/plan.css",
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') : 'text/css');
		$this->document->addScript(JURI::root() . $this->script,
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') :
'text/javascript');
		$this->document->addScript(JURI::root() .
"administrator/components/com_reservation/views/plan/submitbutton.js",
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') :
'text/javascript'); 
		JText::script('view not acceptable. Error');
	}
}
PK5~�[�#o,,views/plans/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[�ăviews/plans/tmpl/default.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

JHtml::_('behavior.tooltip');
JHtml::_('behavior.multiselect');
JHtml::_('dropdown.init');
JHtml::_('formbehavior.chosen',
'.multipleAccessLevels', null,
array('placeholder_text_multiple' => '- ' .
JText::_('COM_RESERVATION_FILTER_SELECT_ACCESS') . '
-'));
JHtml::_('formbehavior.chosen', 'select');
if ($this->saveOrder)
{
	$saveOrderingUrl =
'index.php?option=com_reservation&task=plans.saveOrderAjax&tmpl=component';
	JHtml::_('sortablelist.sortable', 'planList',
'adminForm', strtolower($this->listDirn), $saveOrderingUrl);
}
?>
<form action="<?php echo
JRoute::_('index.php?option=com_reservation&view=plans');
?>" method="post" name="adminForm"
id="adminForm">
<?php if(!empty( $this->sidebar)): ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif; ?>
<?php
	// Add the searchtools
	echo JLayoutHelper::render('joomla.searchtools.default',
array('view' => $this));
?>
<?php if (empty($this->items)): ?>
	<div class="alert alert-no-items">
		<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
	</div>
<?php else : ?>
	<table class="table table-striped"
id="planList">
		<thead><?php echo
$this->loadTemplate('head');?></thead>
		<tfoot><?php echo
$this->loadTemplate('foot');?></tfoot>
		<tbody><?php echo
$this->loadTemplate('body');?></tbody>
	</table>
	<?php // Load the batch processing form. ?>
	<?php if ($this->canCreate && $this->canEdit) : ?>
		<?php echo JHtml::_(
			'bootstrap.renderModal',
			'collapseModal',
			array(
				'title' =>
JText::_('COM_RESERVATION_PLANS_BATCH_OPTIONS'),
				'footer' =>
$this->loadTemplate('batch_footer')
			),
			$this->loadTemplate('batch_body')
		); ?>
	<?php endif; ?>
	<input type="hidden" name="boxchecked"
value="0" />
	</div>
<?php endif; ?>
	<input type="hidden" name="task" value=""
/>
	<?php echo JHtml::_('form.token'); ?>
</form>
PK5~�[�Rz���'views/plans/tmpl/default_batch_body.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_batch_body.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>

<p><?php echo
JText::_('COM_RESERVATION_PLANS_BATCH_TIP'); ?></p>
<?php echo $this->batchDisplay;
?>PK5~�[&)ZS��)views/plans/tmpl/default_batch_footer.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_batch_footer.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<!-- clear the batch values if cancel -->
<button class="btn" type="button"
onclick="" data-dismiss="modal">
	<?php echo JText::_('JCANCEL'); ?>
</button>
<!-- post the batch values if process -->
<button class="btn btn-success" type="submit"
onclick="Joomla.submitbutton('plan.batch');">
	<?php echo JText::_('JGLOBAL_BATCH_PROCESS'); ?>
</button>PK5~�[e��LL!views/plans/tmpl/default_body.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_body.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

$edit =
"index.php?option=com_reservation&view=plans&task=plan.edit";

?>
<?php foreach ($this->items as $i => $item): ?>
	<?php
		$canCheckin = $this->user->authorise('core.manage',
'com_checkin') || $item->checked_out == $this->user->id
|| $item->checked_out == 0;
		$userChkOut = JFactory::getUser($item->checked_out);
		$canDo =
ReservationHelper::getActions('plan',$item,'plans');
	?>
	<tr class="row<?php echo $i % 2; ?>">
		<td class="order nowrap center hidden-phone">
		<?php if ($canDo->get('core.edit.state')): ?>
			<?php
				$iconClass = '';
				if (!$this->saveOrder)
				{
					$iconClass = ' inactive tip-top" hasTooltip"
title="' . JHtml::tooltipText('JORDERINGDISABLED');
				}
			?>
			<span class="sortable-handler<?php echo $iconClass;
?>">
				<i class="icon-menu"></i>
			</span>
			<?php if ($this->saveOrder) : ?>
				<input type="text" style="display:none"
name="order[]" size="5"
				value="<?php echo $item->ordering; ?>"
class="width-20 text-area-order " />
			<?php endif; ?>
		<?php else: ?>
			&#8942;
		<?php endif; ?>
		</td>
		<td class="nowrap center">
		<?php if ($canDo->get('core.edit')): ?>
				<?php if ($item->checked_out) : ?>
					<?php if ($canCheckin) : ?>
						<?php echo JHtml::_('grid.id', $i, $item->id); ?>
					<?php else: ?>
						&#9633;
					<?php endif; ?>
				<?php else: ?>
					<?php echo JHtml::_('grid.id', $i, $item->id); ?>
				<?php endif; ?>
		<?php else: ?>
			&#9633;
		<?php endif; ?>
		</td>
		<td class="nowrap">
			<div class="name">
				<?php if ($canDo->get('core.edit')): ?>
					<a href="<?php echo $edit; ?>&id=<?php echo
$item->id; ?>"><?php echo JText::_($item->plantype);
?></a>
					<?php if ($item->checked_out): ?>
						<?php echo JHtml::_('jgrid.checkedout', $i,
$userChkOut->name, $item->checked_out_time, 'plans.',
$canCheckin); ?>
					<?php endif; ?>
				<?php else: ?>
					<?php echo JText::_($item->plantype); ?>
				<?php endif; ?>
			</div>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->time); ?>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->price); ?>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->waitingtime); ?>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->consultantid_id); ?>
		</td>
		<td class="center">
		<?php if ($canDo->get('core.edit.state')) : ?>
				<?php if ($item->checked_out) : ?>
					<?php if ($canCheckin) : ?>
						<?php echo JHtml::_('jgrid.published',
$item->published, $i, 'plans.', true, 'cb'); ?>
					<?php else: ?>
						<?php echo JHtml::_('jgrid.published',
$item->published, $i, 'plans.', false, 'cb'); ?>
					<?php endif; ?>
				<?php else: ?>
					<?php echo JHtml::_('jgrid.published',
$item->published, $i, 'plans.', true, 'cb'); ?>
				<?php endif; ?>
		<?php else: ?>
			<?php echo JHtml::_('jgrid.published', $item->published,
$i, 'plans.', false, 'cb'); ?>
		<?php endif; ?>
		</td>
		<td class="nowrap center hidden-phone">
			<?php echo $item->id; ?>
		</td>
	</tr>
<?php endforeach;
?>PK5~�[����!views/plans/tmpl/default_foot.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_foot.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<tr>
	<td colspan="9"><?php echo
$this->pagination->getListFooter(); ?></td>
</tr>PK5~�[��zuu!views/plans/tmpl/default_head.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_head.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<tr>
	<?php if ($this->canEdit&& $this->canState): ?>
		<th width="1%" class="nowrap center
hidden-phone">
			<?php echo JHtml::_('searchtools.sort', '',
'a.ordering', $this->listDirn, $this->listOrder, null,
'asc', 'JGRID_HEADING_ORDERING',
'icon-menu-2'); ?>
		</th>
		<th width="20" class="nowrap center">
			<?php echo JHtml::_('grid.checkall'); ?>
		</th>
	<?php else: ?>
		<th width="20" class="nowrap center
hidden-phone">
			&#9662;
		</th>
		<th width="20" class="nowrap center">
			&#9632;
		</th>
	<?php endif; ?>
	<th class="nowrap" >
			<?php echo JText::_('COM_RESERVATION_PLAN_PLANTYPE_LABEL');
?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo JHtml::_('searchtools.sort',
'COM_RESERVATION_PLAN_TIME_LABEL', 'a.time',
$this->listDirn, $this->listOrder); ?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo JHtml::_('searchtools.sort',
'COM_RESERVATION_PLAN_PRICE_LABEL', 'a.price',
$this->listDirn, $this->listOrder); ?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo JHtml::_('searchtools.sort',
'COM_RESERVATION_PLAN_WAITINGTIME_LABEL',
'a.waitingtime', $this->listDirn, $this->listOrder); ?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo
JText::_('COM_RESERVATION_PLAN_CONSULTANTID_LABEL'); ?>
	</th>
	<?php if ($this->canState): ?>
		<th width="10" class="nowrap center" >
			<?php echo JHtml::_('searchtools.sort',
'COM_RESERVATION_PLAN_STATUS', 'a.published',
$this->listDirn, $this->listOrder); ?>
		</th>
	<?php else: ?>
		<th width="10" class="nowrap center" >
			<?php echo JText::_('COM_RESERVATION_PLAN_STATUS'); ?>
		</th>
	<?php endif; ?>
	<th width="5" class="nowrap center hidden-phone"
>
			<?php echo JHtml::_('searchtools.sort',
'COM_RESERVATION_PLAN_ID', 'a.id', $this->listDirn,
$this->listOrder); ?>
	</th>
</tr>PK5~�[�pF�22$views/plans/tmpl/default_toolbar.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_toolbar.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<div id="filter-bar" class="btn-toolbar">
        <div class="filter-search btn-group pull-left">
            <label for="filter_search"
class="element-invisible"><?php echo
JText::_('Search');?></label>
            <input type="text" name="filter_search"
id="filter_search" placeholder="<?php echo
JText::_('JSEARCH_FILTER'); ?>" value="<?php echo
$this->escape($this->state->get('filter.search'));
?>" class="hasTooltip" title="<?php echo
JHtml::tooltipText('Search Plans'); ?>" />
        </div>
        <div class="btn-group pull-left">
            <button type="submit" class="btn
hasTooltip" title="<?php echo
JHtml::tooltipText('JSEARCH_FILTER_SUBMIT'); ?>"><i
class="icon-search"></i></button>
            <button type="button" class="btn
hasTooltip" title="<?php echo
JHtml::tooltipText('JSEARCH_FILTER_CLEAR'); ?>"
onclick="document.id('filter_search').value='';this.form.submit();"><i
class="icon-remove"></i></button>
        </div>
        <div class="btn-group pull-right hidden-phone">
            <label for="limit"
class="element-invisible"><?php echo
JText::_('JFIELD_PLG_SEARCH_SEARCHLIMIT_DESC');?></label>
            <?php echo $this->pagination->getLimitBox(); ?>
        </div>
        <div class="btn-group pull-right hidden-phone">
            <label for="directionTable"
class="element-invisible"><?php echo
JText::_('JFIELD_ORDERING_DESC');?></label>
            <select name="directionTable"
id="directionTable" class="input-medium"
onchange="Joomla.orderTable()">
                <option value=""><?php echo
JText::_('JFIELD_ORDERING_DESC');?></option>
                <option value="asc" <?php if
($this->listDirn == 'asc') echo
'selected="selected"'; ?>><?php echo
JText::_('JGLOBAL_ORDER_ASCENDING');?></option>
                <option value="desc" <?php if
($this->listDirn == 'desc') echo
'selected="selected"'; ?>><?php echo
JText::_('JGLOBAL_ORDER_DESCENDING');?></option>
            </select>
        </div>
        <div class="btn-group pull-right">
            <label for="sortTable"
class="element-invisible"><?php echo
JText::_('JGLOBAL_SORT_BY');?></label>
            <select name="sortTable" id="sortTable"
class="input-medium" onchange="Joomla.orderTable()">
                <option value=""><?php echo
JText::_('JGLOBAL_SORT_BY');?></option>
                <?php echo JHtml::_('select.options',
$this->getSortFields(), 'value', 'text',
$this->listOrder);?>
            </select>
        </div>
    </div>
<div class="clearfix">
</div>PK5~�[�#o,,views/plans/tmpl/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[6�ؔviews/plans/view.html.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		view.html.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

/**
 * Reservation View class for the Plans
 */
class ReservationViewPlans extends JViewLegacy
{
	/**
	 * Plans view display method
	 * @return void
	 */
	function display($tpl = null)
	{
		if ($this->getLayout() !== 'modal')
		{
			// Include helper submenu
			ReservationHelper::addSubmenu('plans');
		}

		// Assign data to the view
		$this->items = $this->get('Items');
		$this->pagination = $this->get('Pagination');
		$this->state = $this->get('State');
		$this->user = JFactory::getUser();
		// Load the filter form from xml.
		$this->filterForm = $this->get('FilterForm');
		// Load the active filters.
		$this->activeFilters = $this->get('ActiveFilters');
		// Add the list ordering clause.
		$this->listOrder =
$this->escape($this->state->get('list.ordering',
'a.id'));
		$this->listDirn =
$this->escape($this->state->get('list.direction',
'DESC'));
		$this->saveOrder = $this->listOrder == 'a.ordering';
		// set the return here value
		$this->return_here = urlencode(base64_encode((string)
JUri::getInstance()));
		// get global action permissions
		$this->canDo = ReservationHelper::getActions('plan');
		$this->canEdit = $this->canDo->get('core.edit');
		$this->canState =
$this->canDo->get('core.edit.state');
		$this->canCreate = $this->canDo->get('core.create');
		$this->canDelete = $this->canDo->get('core.delete');
		$this->canBatch = $this->canDo->get('core.batch');

		// We don't need toolbar in the modal window.
		if ($this->getLayout() !== 'modal')
		{
			$this->addToolbar();
			$this->sidebar = JHtmlSidebar::render();
			// load the batch html
			if ($this->canCreate && $this->canEdit &&
$this->canState)
			{
				$this->batchDisplay = JHtmlBatch_::render();
			}
		}
		
		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		// Display the template
		parent::display($tpl);

		// Set the document
		$this->setDocument();
	}

	/**
	 * Setting the toolbar
	 */
	protected function addToolBar()
	{
		JToolBarHelper::title(JText::_('COM_RESERVATION_PLANS'),
'joomla');
		JHtmlSidebar::setAction('index.php?option=com_reservation&view=plans');
		JFormHelper::addFieldPath(JPATH_COMPONENT . '/models/fields');

		if ($this->canCreate)
		{
			JToolBarHelper::addNew('plan.add');
		}

		// Only load if there are items
		if (ReservationHelper::checkArray($this->items))
		{
			if ($this->canEdit)
			{
				JToolBarHelper::editList('plan.edit');
			}

			if ($this->canState)
			{
				JToolBarHelper::publishList('plans.publish');
				JToolBarHelper::unpublishList('plans.unpublish');
				JToolBarHelper::archiveList('plans.archive');

				if ($this->canDo->get('core.admin'))
				{
					JToolBarHelper::checkin('plans.checkin');
				}
			}

			// Add a batch button
			if ($this->canBatch && $this->canCreate &&
$this->canEdit && $this->canState)
			{
				// Get the toolbar object instance
				$bar = JToolBar::getInstance('toolbar');
				// set the batch button name
				$title = JText::_('JTOOLBAR_BATCH');
				// Instantiate a new JLayoutFile instance and render the batch button
				$layout = new JLayoutFile('joomla.toolbar.batch');
				// add the button to the page
				$dhtml = $layout->render(array('title' => $title));
				$bar->appendButton('Custom', $dhtml, 'batch');
			}

			if ($this->state->get('filter.published') == -2
&& ($this->canState && $this->canDelete))
			{
				JToolbarHelper::deleteList('', 'plans.delete',
'JTOOLBAR_EMPTY_TRASH');
			}
			elseif ($this->canState && $this->canDelete)
			{
				JToolbarHelper::trash('plans.trash');
			}

			if ($this->canDo->get('core.export') &&
$this->canDo->get('plan.export'))
			{
				JToolBarHelper::custom('plans.exportData',
'download', '',
'COM_RESERVATION_EXPORT_DATA', true);
			}
		}

		if ($this->canDo->get('core.import') &&
$this->canDo->get('plan.import'))
		{
			JToolBarHelper::custom('plans.importData', 'upload',
'', 'COM_RESERVATION_IMPORT_DATA', false);
		}

		// set help url for this view if found
		$help_url = ReservationHelper::getHelpUrl('plans');
		if (ReservationHelper::checkString($help_url))
		{
				JToolbarHelper::help('COM_RESERVATION_HELP_MANAGER', false,
$help_url);
		}

		// add the options comp button
		if ($this->canDo->get('core.admin') ||
$this->canDo->get('core.options'))
		{
			JToolBarHelper::preferences('com_reservation');
		}

		// Only load published batch if state and batch is allowed
		if ($this->canState && $this->canBatch)
		{
			JHtmlBatch_::addListSelection(
				JText::_('COM_RESERVATION_KEEP_ORIGINAL_STATE'),
				'batch[published]',
				JHtml::_('select.options',
JHtml::_('jgrid.publishedOptions', array('all' =>
false)), 'value', 'text', '', true)
			);
		}

		// Only load access batch if create, edit and batch is allowed
		if ($this->canBatch && $this->canCreate &&
$this->canEdit)
		{
			JHtmlBatch_::addListSelection(
				JText::_('COM_RESERVATION_KEEP_ORIGINAL_ACCESS'),
				'batch[access]',
				JHtml::_('select.options',
JHtml::_('access.assetgroups'), 'value',
'text')
			);
		}
	}

	/**
	 * Method to set up the document properties
	 *
	 * @return void
	 */
	protected function setDocument()
	{
		if (!isset($this->document))
		{
			$this->document = JFactory::getDocument();
		}
		$this->document->setTitle(JText::_('COM_RESERVATION_PLANS'));
		$this->document->addStyleSheet(JURI::root() .
"administrator/components/com_reservation/assets/css/plans.css",
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') : 'text/css');
	}

	/**
	 * Escapes a value for output in a view script.
	 *
	 * @param   mixed  $var  The output to escape.
	 *
	 * @return  mixed  The escaped value.
	 */
	public function escape($var)
	{
		if(strlen($var) > 50)
		{
			// use the helper htmlEscape method instead and shorten the string
			return ReservationHelper::htmlEscape($var, $this->_charset, true);
		}
		// use the helper htmlEscape method instead.
		return ReservationHelper::htmlEscape($var, $this->_charset);
	}

	/**
	 * Returns an array of fields the table can be sorted by
	 *
	 * @return  array  Array containing the field name to sort by as the key
and display text as value
	 */
	protected function getSortFields()
	{
		return array(
			'a.ordering' =>
JText::_('JGRID_HEADING_ORDERING'),
			'a.published' => JText::_('JSTATUS'),
			'a.time' =>
JText::_('COM_RESERVATION_PLAN_TIME_LABEL'),
			'a.price' =>
JText::_('COM_RESERVATION_PLAN_PRICE_LABEL'),
			'a.waitingtime' =>
JText::_('COM_RESERVATION_PLAN_WAITINGTIME_LABEL'),
			'a.id' => JText::_('JGRID_HEADING_ID')
		);
	}
}
PK5~�[�#o,,views/reservation/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[Z!%��"views/reservation/tmpl/default.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

JHtml::_('behavior.tooltip');

?>
<div id="j-main-container">
	<div class="span9">
		<?php echo JHtml::_('bootstrap.startAccordion',
'dashboard_left', array('active' =>
'main')); ?>
			<?php echo JHtml::_('bootstrap.addSlide',
'dashboard_left', 'cPanel', 'main'); ?>
				<?php echo $this->loadTemplate('main');?>
			<?php echo JHtml::_('bootstrap.endSlide'); ?>
		<?php echo JHtml::_('bootstrap.endAccordion'); ?>
	</div>
	<div class="span3">
		<?php echo JHtml::_('bootstrap.startAccordion',
'dashboard_right', array('active' =>
'vdm')); ?>
			<?php echo JHtml::_('bootstrap.addSlide',
'dashboard_right', 'fdsh', 'vdm'); ?>
				<?php echo $this->loadTemplate('vdm');?>
			<?php echo JHtml::_('bootstrap.endSlide'); ?>
		<?php echo JHtml::_('bootstrap.endAccordion'); ?>
	</div>
</div>PK5~�[�yj��'views/reservation/tmpl/default_main.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_main.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<?php if(isset($this->icons['main']) &&
is_array($this->icons['main'])) :?>
	<?php foreach($this->icons['main'] as $icon): ?>
		<div class="dashboard-wraper">
			<div class="dashboard-content"> 
				<a class="icon" href="<?php echo $icon->url;
?>">
					<img alt="<?php echo $icon->alt; ?>"
src="components/com_reservation/assets/images/icons/<?php  echo
$icon->image; ?>">
					<span class="dashboard-title"><?php echo
JText::_($icon->name); ?></span>
				</a>
			 </div>
		</div>
	<?php endforeach; ?>
	<div class="clearfix"></div>
<?php else: ?>
	<div class="alert alert-error"><h4
class="alert-heading"><?php echo JText::_("Permission
denied, or not correctly set"); ?></h4><div
class="alert-message"><?php echo JText::_("Please
notify your System Administrator if result is unexpected.");
?></div></div>
<?php endif; ?>PK5~�[�lB�V
V
&views/reservation/tmpl/default_vdm.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_vdm.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<img alt="<?php echo JText::_('COM_RESERVATION');
?>"
src="components/com_reservation/assets/images/vdm-component.jpg">
<ul class="list-striped">
	<li><b><?php echo
JText::_('COM_RESERVATION_VERSION'); ?>:</b> <?php
echo $this->manifest->version; ?>&nbsp;&nbsp;<span
class="update-notice"></span></li>
	<li><b><?php echo
JText::_('COM_RESERVATION_DATE'); ?>:</b> <?php echo
$this->manifest->creationDate; ?></li>
	<li><b><?php echo
JText::_('COM_RESERVATION_AUTHOR'); ?>:</b> <a
href="mailto:<?php echo $this->manifest->authorEmail;
?>"><?php echo $this->manifest->author;
?></a></li>
	<li><b><?php echo
JText::_('COM_RESERVATION_WEBSITE'); ?>:</b> <a
href="<?php echo $this->manifest->authorUrl; ?>"
target="_blank"><?php echo
$this->manifest->authorUrl; ?></a></li>
	<li><b><?php echo
JText::_('COM_RESERVATION_LICENSE'); ?>:</b> <?php
echo $this->manifest->license; ?></li>
	<li><b><?php echo $this->manifest->copyright;
?></b></li>
</ul>
<div class="clearfix"></div>
<?php if(ReservationHelper::checkArray($this->contributors)): ?>
	<?php if(count($this->contributors) > 1): ?>
		<h3><?php echo
JText::_('COM_RESERVATION_CONTRIBUTORS'); ?></h3>
	<?php else: ?>
		<h3><?php echo
JText::_('COM_RESERVATION_CONTRIBUTOR'); ?></h3>
	<?php endif; ?>
	<ul class="list-striped">
		<?php foreach($this->contributors as $contributor): ?>
		<li><b><?php echo $contributor['title'];
?>:</b> <?php echo $contributor['name'];
?></li>
		<?php endforeach; ?>
	</ul>
	<div class="clearfix"></div>
<?php endif;
?>PK5~�[�#o,,!views/reservation/tmpl/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[�{]���views/reservation/view.html.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		view.html.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

/**
 * Reservation View class
 */
class ReservationViewReservation extends JViewLegacy
{
	/**
	 * View display method
	 * @return void
	 */
	function display($tpl = null)
	{
		// Assign data to the view
		$this->icons			= $this->get('Icons');
		$this->contributors		= ReservationHelper::getContributors();
		
		// get the manifest details of the component
		$this->manifest = ReservationHelper::manifest();
		
		// Set the toolbar
		$this->addToolBar();
		
		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		// Display the template
		parent::display($tpl);

		// Set the document
		$this->setDocument();
	}

	/**
	 * Setting the toolbar
	 */
	protected function addToolBar()
	{
		$canDo = ReservationHelper::getActions('reservation');
		JToolBarHelper::title(JText::_('COM_RESERVATION_DASHBOARD'),
'grid-2');

		// set help url for this view if found
		$help_url = ReservationHelper::getHelpUrl('reservation');
		if (ReservationHelper::checkString($help_url))
		{
			JToolbarHelper::help('COM_RESERVATION_HELP_MANAGER', false,
$help_url);
		}

		if ($canDo->get('core.admin') ||
$canDo->get('core.options'))
		{
			JToolBarHelper::preferences('com_reservation');
		}
	}

	/**
	 * Method to set up the document properties
	 *
	 * @return void
	 */
	protected function setDocument()
	{
		$document = JFactory::getDocument();
		
		// add dashboard style sheets
		$document->addStyleSheet(JURI::root() .
"administrator/components/com_reservation/assets/css/dashboard.css");
		
		// set page title
		$document->setTitle(JText::_('COM_RESERVATION_DASHBOARD'));
		
		// add manifest to page JavaScript
		$document->addScriptDeclaration("var manifest =
jQuery.parseJSON('" . json_encode($this->manifest) .
"');", "text/javascript");
	}
}
PK5~�[�y4���views/reserve/submitbutton.jsnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		submitbutton.js
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

Joomla.submitbutton = function(task)
{
	if (task == ''){
		return false;
	} else { 
		var action = task.split('.');
		if (action[1] == 'cancel' || action[1] == 'close' ||
document.formvalidator.isValid(document.getElementById("adminForm"))){
			Joomla.submitform(task, document.getElementById("adminForm"));
			return true;
		} else {
			alert(Joomla.JText._('reserve, some values are not
acceptable.','Some values are unacceptable'));
			return false;
		}
	}
}PK5~�[D"W��views/reserve/tmpl/edit.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		edit.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');
JHtml::_('behavior.tooltip');
JHtml::_('behavior.formvalidation');
JHtml::_('formbehavior.chosen', 'select');
JHtml::_('behavior.keepalive');
$componentParams = $this->params; // will be removed just use
$this->params instead
?>
<script type="text/javascript">
	// waiting spinner
	var outerDiv = jQuery('body');
	jQuery('<div id="loading"></div>')
		.css("background", "rgba(255, 255, 255, .8)
url('components/com_reservation/assets/images/import.gif') 50%
15% no-repeat")
		.css("top", outerDiv.position().top -
jQuery(window).scrollTop())
		.css("left", outerDiv.position().left -
jQuery(window).scrollLeft())
		.css("width", outerDiv.width())
		.css("height", outerDiv.height())
		.css("position", "fixed")
		.css("opacity", "0.80")
		.css("-ms-filter",
"progid:DXImageTransform.Microsoft.Alpha(Opacity = 80)")
		.css("filter", "alpha(opacity = 80)")
		.css("display", "none")
		.appendTo(outerDiv);
	jQuery('#loading').show();
	// when page is ready remove and show
	jQuery(window).load(function() {
		jQuery('#reservation_loader').fadeIn('fast');
		jQuery('#loading').hide();
	});
</script>
<div id="reservation_loader" style="display:
none;">
<form action="<?php echo
JRoute::_('index.php?option=com_reservation&layout=edit&id='.
(int) $this->item->id . $this->referral); ?>"
method="post" name="adminForm" id="adminForm"
class="form-validate" enctype="multipart/form-data">

<div class="form-horizontal">

	<?php echo JHtml::_('bootstrap.startTabSet',
'reserveTab', array('active' =>
'details')); ?>

	<?php echo JHtml::_('bootstrap.addTab',
'reserveTab', 'details',
JText::_('COM_RESERVATION_RESERVE_DETAILS', true)); ?>
		<div class="row-fluid form-horizontal-desktop">
			<div class="span6">
				<?php echo JLayoutHelper::render('reserve.details_left',
$this); ?>
			</div>
			<div class="span6">
				<?php echo JLayoutHelper::render('reserve.details_right',
$this); ?>
			</div>
		</div>
	<?php echo JHtml::_('bootstrap.endTab'); ?>

	<?php $this->ignore_fieldsets =
array('details','metadata','vdmmetadata','accesscontrol');
?>
	<?php $this->tab_name = 'reserveTab'; ?>
	<?php echo JLayoutHelper::render('joomla.edit.params',
$this); ?>

	<?php if ($this->canDo->get('core.edit.created_by') ||
$this->canDo->get('core.edit.created') ||
$this->canDo->get('core.edit.state') ||
($this->canDo->get('core.delete') &&
$this->canDo->get('core.edit.state'))) : ?>
	<?php echo JHtml::_('bootstrap.addTab',
'reserveTab', 'publishing',
JText::_('COM_RESERVATION_RESERVE_PUBLISHING', true)); ?>
		<div class="row-fluid form-horizontal-desktop">
			<div class="span6">
				<?php echo JLayoutHelper::render('reserve.publishing',
$this); ?>
			</div>
			<div class="span6">
				<?php echo JLayoutHelper::render('reserve.publlshing',
$this); ?>
			</div>
		</div>
	<?php echo JHtml::_('bootstrap.endTab'); ?>
	<?php endif; ?>

	<?php if ($this->canDo->get('core.admin')) : ?>
	<?php echo JHtml::_('bootstrap.addTab',
'reserveTab', 'permissions',
JText::_('COM_RESERVATION_RESERVE_PERMISSION', true)); ?>
		<div class="row-fluid form-horizontal-desktop">
			<div class="span12">
				<fieldset class="adminform">
					<div class="adminformlist">
					<?php foreach
($this->form->getFieldset('accesscontrol') as $field):
?>
						<div>
							<?php echo $field->label; echo $field->input;?>
						</div>
						<div class="clearfix"></div>
					<?php endforeach; ?>
					</div>
				</fieldset>
			</div>
		</div>
	<?php echo JHtml::_('bootstrap.endTab'); ?>
	<?php endif; ?>

	<?php echo JHtml::_('bootstrap.endTabSet'); ?>

	<div>
		<input type="hidden" name="task"
value="reserve.edit" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</div>
</form>
</div>
PK5~�[�#o,,views/reserve/tmpl/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�["S�Q��views/reserve/view.html.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		view.html.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

/**
 * Reserve View class
 */
class ReservationViewReserve extends JViewLegacy
{
	/**
	 * display method of View
	 * @return void
	 */
	public function display($tpl = null)
	{
		// set params
		$this->params =
JComponentHelper::getParams('com_reservation');
		// Assign the variables
		$this->form = $this->get('Form');
		$this->item = $this->get('Item');
		$this->script = $this->get('Script');
		$this->state = $this->get('State');
		// get action permissions
		$this->canDo = ReservationHelper::getActions('reserve',
$this->item);
		// get input
		$jinput = JFactory::getApplication()->input;
		$this->ref = $jinput->get('ref', 0, 'word');
		$this->refid = $jinput->get('refid', 0, 'int');
		$return = $jinput->get('return', null, 'base64');
		// set the referral string
		$this->referral = '';
		if ($this->refid && $this->ref)
		{
			// return to the item that referred to this item
			$this->referral = '&ref=' . (string)$this->ref .
'&refid=' . (int)$this->refid;
		}
		elseif($this->ref)
		{
			// return to the list view that referred to this item
			$this->referral = '&ref=' . (string)$this->ref;
		}
		// check return value
		if (!is_null($return))
		{
			// add the return value
			$this->referral .= '&return=' . (string)$return;
		}

		// Set the toolbar
		$this->addToolBar();
		
		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		// Display the template
		parent::display($tpl);

		// Set the document
		$this->setDocument();
	}


	/**
	 * Setting the toolbar
	 */
	protected function addToolBar()
	{
		JFactory::getApplication()->input->set('hidemainmenu',
true);
		$user = JFactory::getUser();
		$userId	= $user->id;
		$isNew = $this->item->id == 0;

		JToolbarHelper::title( JText::_($isNew ?
'COM_RESERVATION_RESERVE_NEW' :
'COM_RESERVATION_RESERVE_EDIT'), 'pencil-2
article-add');
		// Built the actions for new and existing records.
		if (ReservationHelper::checkString($this->referral))
		{
			if ($this->canDo->get('core.create') && $isNew)
			{
				// We can create the record.
				JToolBarHelper::save('reserve.save',
'JTOOLBAR_SAVE');
			}
			elseif ($this->canDo->get('core.edit'))
			{
				// We can save the record.
				JToolBarHelper::save('reserve.save',
'JTOOLBAR_SAVE');
			}
			if ($isNew)
			{
				// Do not creat but cancel.
				JToolBarHelper::cancel('reserve.cancel',
'JTOOLBAR_CANCEL');
			}
			else
			{
				// We can close it.
				JToolBarHelper::cancel('reserve.cancel',
'JTOOLBAR_CLOSE');
			}
		}
		else
		{
			if ($isNew)
			{
				// For new records, check the create permission.
				if ($this->canDo->get('core.create'))
				{
					JToolBarHelper::apply('reserve.apply',
'JTOOLBAR_APPLY');
					JToolBarHelper::save('reserve.save',
'JTOOLBAR_SAVE');
					JToolBarHelper::custom('reserve.save2new',
'save-new.png', 'save-new_f2.png',
'JTOOLBAR_SAVE_AND_NEW', false);
				};
				JToolBarHelper::cancel('reserve.cancel',
'JTOOLBAR_CANCEL');
			}
			else
			{
				if ($this->canDo->get('core.edit'))
				{
					// We can save the new record
					JToolBarHelper::apply('reserve.apply',
'JTOOLBAR_APPLY');
					JToolBarHelper::save('reserve.save',
'JTOOLBAR_SAVE');
					// We can save this record, but check the create permission to see
					// if we can return to make a new one.
					if ($this->canDo->get('core.create'))
					{
						JToolBarHelper::custom('reserve.save2new',
'save-new.png', 'save-new_f2.png',
'JTOOLBAR_SAVE_AND_NEW', false);
					}
				}
				$canVersion = ($this->canDo->get('core.version')
&& $this->canDo->get('reserve.version'));
				if ($this->state->params->get('save_history', 1)
&& $this->canDo->get('core.edit') &&
$canVersion)
				{
					JToolbarHelper::versions('com_reservation.reserve',
$this->item->id);
				}
				if ($this->canDo->get('core.create'))
				{
					JToolBarHelper::custom('reserve.save2copy',
'save-copy.png', 'save-copy_f2.png',
'JTOOLBAR_SAVE_AS_COPY', false);
				}
				JToolBarHelper::cancel('reserve.cancel',
'JTOOLBAR_CLOSE');
			}
		}
		JToolbarHelper::divider();
		// set help url for this view if found
		$help_url = ReservationHelper::getHelpUrl('reserve');
		if (ReservationHelper::checkString($help_url))
		{
			JToolbarHelper::help('COM_RESERVATION_HELP_MANAGER', false,
$help_url);
		}
	}

	/**
	 * Escapes a value for output in a view script.
	 *
	 * @param   mixed  $var  The output to escape.
	 *
	 * @return  mixed  The escaped value.
	 */
	public function escape($var)
	{
		if(strlen($var) > 30)
		{
    		// use the helper htmlEscape method instead and shorten the string
			return ReservationHelper::htmlEscape($var, $this->_charset, true,
30);
		}
		// use the helper htmlEscape method instead.
		return ReservationHelper::htmlEscape($var, $this->_charset);
	}

	/**
	 * Method to set up the document properties
	 *
	 * @return void
	 */
	protected function setDocument()
	{
		$isNew = ($this->item->id < 1);
		if (!isset($this->document))
		{
			$this->document = JFactory::getDocument();
		}
		$this->document->setTitle(JText::_($isNew ?
'COM_RESERVATION_RESERVE_NEW' :
'COM_RESERVATION_RESERVE_EDIT'));
		$this->document->addStyleSheet(JURI::root() .
"administrator/components/com_reservation/assets/css/reserve.css",
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') : 'text/css');
		$this->document->addScript(JURI::root() . $this->script,
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') :
'text/javascript');
		$this->document->addScript(JURI::root() .
"administrator/components/com_reservation/views/reserve/submitbutton.js",
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') :
'text/javascript'); 
		JText::script('view not acceptable. Error');
	}
}
PK5~�[�#o,,views/reserves/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[�X]�views/reserves/tmpl/default.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

JHtml::_('behavior.tooltip');
JHtml::_('behavior.multiselect');
JHtml::_('dropdown.init');
JHtml::_('formbehavior.chosen',
'.multipleAccessLevels', null,
array('placeholder_text_multiple' => '- ' .
JText::_('COM_RESERVATION_FILTER_SELECT_ACCESS') . '
-'));
JHtml::_('formbehavior.chosen', 'select');
if ($this->saveOrder)
{
	$saveOrderingUrl =
'index.php?option=com_reservation&task=reserves.saveOrderAjax&tmpl=component';
	JHtml::_('sortablelist.sortable', 'reserveList',
'adminForm', strtolower($this->listDirn), $saveOrderingUrl);
}
?>
<form action="<?php echo
JRoute::_('index.php?option=com_reservation&view=reserves');
?>" method="post" name="adminForm"
id="adminForm">
<?php if(!empty( $this->sidebar)): ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif; ?>
<?php
	// Add the searchtools
	echo JLayoutHelper::render('joomla.searchtools.default',
array('view' => $this));
?>
<?php if (empty($this->items)): ?>
	<div class="alert alert-no-items">
		<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
	</div>
<?php else : ?>
	<table class="table table-striped"
id="reserveList">
		<thead><?php echo
$this->loadTemplate('head');?></thead>
		<tfoot><?php echo
$this->loadTemplate('foot');?></tfoot>
		<tbody><?php echo
$this->loadTemplate('body');?></tbody>
	</table>
	<?php // Load the batch processing form. ?>
	<?php if ($this->canCreate && $this->canEdit) : ?>
		<?php echo JHtml::_(
			'bootstrap.renderModal',
			'collapseModal',
			array(
				'title' =>
JText::_('COM_RESERVATION_RESERVES_BATCH_OPTIONS'),
				'footer' =>
$this->loadTemplate('batch_footer')
			),
			$this->loadTemplate('batch_body')
		); ?>
	<?php endif; ?>
	<input type="hidden" name="boxchecked"
value="0" />
	</div>
<?php endif; ?>
	<input type="hidden" name="task" value=""
/>
	<?php echo JHtml::_('form.token'); ?>
</form>
PK5~�[�b���*views/reserves/tmpl/default_batch_body.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_batch_body.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>

<p><?php echo
JText::_('COM_RESERVATION_RESERVES_BATCH_TIP'); ?></p>
<?php echo $this->batchDisplay;
?>PK5~�[e��%��,views/reserves/tmpl/default_batch_footer.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_batch_footer.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<!-- clear the batch values if cancel -->
<button class="btn" type="button"
onclick="" data-dismiss="modal">
	<?php echo JText::_('JCANCEL'); ?>
</button>
<!-- post the batch values if process -->
<button class="btn btn-success" type="submit"
onclick="Joomla.submitbutton('reserve.batch');">
	<?php echo JText::_('JGLOBAL_BATCH_PROCESS'); ?>
</button>PK5~�[���n��$views/reserves/tmpl/default_body.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_body.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

$edit =
"index.php?option=com_reservation&view=reserves&task=reserve.edit";

?>
<?php foreach ($this->items as $i => $item): ?>
	<?php
		$canCheckin = $this->user->authorise('core.manage',
'com_checkin') || $item->checked_out == $this->user->id
|| $item->checked_out == 0;
		$userChkOut = JFactory::getUser($item->checked_out);
		$canDo =
ReservationHelper::getActions('reserve',$item,'reserves');
	?>
	<tr class="row<?php echo $i % 2; ?>">
		<td class="order nowrap center hidden-phone">
		<?php if ($canDo->get('core.edit.state')): ?>
			<?php
				$iconClass = '';
				if (!$this->saveOrder)
				{
					$iconClass = ' inactive tip-top" hasTooltip"
title="' . JHtml::tooltipText('JORDERINGDISABLED');
				}
			?>
			<span class="sortable-handler<?php echo $iconClass;
?>">
				<i class="icon-menu"></i>
			</span>
			<?php if ($this->saveOrder) : ?>
				<input type="text" style="display:none"
name="order[]" size="5"
				value="<?php echo $item->ordering; ?>"
class="width-20 text-area-order " />
			<?php endif; ?>
		<?php else: ?>
			&#8942;
		<?php endif; ?>
		</td>
		<td class="nowrap center">
		<?php if ($canDo->get('core.edit')): ?>
				<?php if ($item->checked_out) : ?>
					<?php if ($canCheckin) : ?>
						<?php echo JHtml::_('grid.id', $i, $item->id); ?>
					<?php else: ?>
						&#9633;
					<?php endif; ?>
				<?php else: ?>
					<?php echo JHtml::_('grid.id', $i, $item->id); ?>
				<?php endif; ?>
		<?php else: ?>
			&#9633;
		<?php endif; ?>
		</td>
		<td class="nowrap">
			<div class="name">
				<?php if ($canDo->get('core.edit')): ?>
<!--[REPLACED$$$$]--><!--22-->
					<a href="<?php echo $edit; ?>&id=<?php echo
$item->id; ?>"><?php echo
$this->escape($item->name); ?></a>
                <p style="margin: 0;"><?php echo
$this->escape($item->title); ?></p>
                <p style="margin: 0;"><?php echo
$this->escape($item->appointmentid_appointment); ?></p>
<!--[/REPLACED$$$$]-->
					<?php if ($item->checked_out): ?>
						<?php echo JHtml::_('jgrid.checkedout', $i,
$userChkOut->name, $item->checked_out_time, 'reserves.',
$canCheckin); ?>
					<?php endif; ?>
				<?php else: ?>
					<?php echo $this->escape($item->appointmentid_appointment);
?>
				<?php endif; ?>
			</div>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->sickid_phonenumber); ?>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->full_price); ?>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->doctor_quota); ?>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->system_quota); ?>
		</td>
		<td class="hidden-phone">
			<?php echo JText::_($item->status); ?>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->payment_method); ?>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->tracking_code); ?>
		</td>
		<td class="center">
		<?php if ($canDo->get('core.edit.state')) : ?>
				<?php if ($item->checked_out) : ?>
					<?php if ($canCheckin) : ?>
						<?php echo JHtml::_('jgrid.published',
$item->published, $i, 'reserves.', true, 'cb');
?>
					<?php else: ?>
						<?php echo JHtml::_('jgrid.published',
$item->published, $i, 'reserves.', false, 'cb');
?>
					<?php endif; ?>
				<?php else: ?>
					<?php echo JHtml::_('jgrid.published',
$item->published, $i, 'reserves.', true, 'cb');
?>
				<?php endif; ?>
		<?php else: ?>
			<?php echo JHtml::_('jgrid.published', $item->published,
$i, 'reserves.', false, 'cb'); ?>
		<?php endif; ?>
		</td>
		<td class="nowrap center hidden-phone">
			<?php echo $item->id; ?>
		</td>
	</tr>
<?php endforeach;
?>PK5~�[`9����$views/reserves/tmpl/default_foot.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_foot.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<tr>
	<td colspan="12"><?php echo
$this->pagination->getListFooter(); ?></td>
</tr>PK5~�[*F�6��$views/reserves/tmpl/default_head.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_head.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<tr>
	<?php if ($this->canEdit&& $this->canState): ?>
		<th width="1%" class="nowrap center
hidden-phone">
			<?php echo JHtml::_('searchtools.sort', '',
'a.ordering', $this->listDirn, $this->listOrder, null,
'asc', 'JGRID_HEADING_ORDERING',
'icon-menu-2'); ?>
		</th>
		<th width="20" class="nowrap center">
			<?php echo JHtml::_('grid.checkall'); ?>
		</th>
	<?php else: ?>
		<th width="20" class="nowrap center
hidden-phone">
			&#9662;
		</th>
		<th width="20" class="nowrap center">
			&#9632;
		</th>
	<?php endif; ?>
	<th class="nowrap" >
			<?php echo
JText::_('COM_RESERVATION_RESERVE_APPOINTMENTID_LABEL'); ?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo
JText::_('COM_RESERVATION_RESERVE_SICKID_LABEL'); ?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo JHtml::_('searchtools.sort',
'COM_RESERVATION_RESERVE_FULL_PRICE_LABEL',
'a.full_price', $this->listDirn, $this->listOrder); ?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo JHtml::_('searchtools.sort',
'COM_RESERVATION_RESERVE_DOCTOR_QUOTA_LABEL',
'a.doctor_quota', $this->listDirn, $this->listOrder); ?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo JHtml::_('searchtools.sort',
'COM_RESERVATION_RESERVE_SYSTEM_QUOTA_LABEL',
'a.system_quota', $this->listDirn, $this->listOrder); ?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo
JText::_('COM_RESERVATION_RESERVE_STATUS_LABEL'); ?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo
JText::_('COM_RESERVATION_RESERVE_PAYMENT_METHOD_LABEL'); ?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo
JText::_('COM_RESERVATION_RESERVE_TRACKING_CODE_LABEL'); ?>
	</th>
	<?php if ($this->canState): ?>
		<th width="10" class="nowrap center" >
			<?php echo JHtml::_('searchtools.sort',
'COM_RESERVATION_RESERVE_STATUS', 'a.published',
$this->listDirn, $this->listOrder); ?>
		</th>
	<?php else: ?>
		<th width="10" class="nowrap center" >
			<?php echo JText::_('COM_RESERVATION_RESERVE_STATUS');
?>
		</th>
	<?php endif; ?>
	<th width="5" class="nowrap center hidden-phone"
>
			<?php echo JHtml::_('searchtools.sort',
'COM_RESERVATION_RESERVE_ID', 'a.id',
$this->listDirn, $this->listOrder); ?>
	</th>
</tr>PK5~�[f��?55'views/reserves/tmpl/default_toolbar.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_toolbar.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<div id="filter-bar" class="btn-toolbar">
        <div class="filter-search btn-group pull-left">
            <label for="filter_search"
class="element-invisible"><?php echo
JText::_('Search');?></label>
            <input type="text" name="filter_search"
id="filter_search" placeholder="<?php echo
JText::_('JSEARCH_FILTER'); ?>" value="<?php echo
$this->escape($this->state->get('filter.search'));
?>" class="hasTooltip" title="<?php echo
JHtml::tooltipText('Search Reserves'); ?>" />
        </div>
        <div class="btn-group pull-left">
            <button type="submit" class="btn
hasTooltip" title="<?php echo
JHtml::tooltipText('JSEARCH_FILTER_SUBMIT'); ?>"><i
class="icon-search"></i></button>
            <button type="button" class="btn
hasTooltip" title="<?php echo
JHtml::tooltipText('JSEARCH_FILTER_CLEAR'); ?>"
onclick="document.id('filter_search').value='';this.form.submit();"><i
class="icon-remove"></i></button>
        </div>
        <div class="btn-group pull-right hidden-phone">
            <label for="limit"
class="element-invisible"><?php echo
JText::_('JFIELD_PLG_SEARCH_SEARCHLIMIT_DESC');?></label>
            <?php echo $this->pagination->getLimitBox(); ?>
        </div>
        <div class="btn-group pull-right hidden-phone">
            <label for="directionTable"
class="element-invisible"><?php echo
JText::_('JFIELD_ORDERING_DESC');?></label>
            <select name="directionTable"
id="directionTable" class="input-medium"
onchange="Joomla.orderTable()">
                <option value=""><?php echo
JText::_('JFIELD_ORDERING_DESC');?></option>
                <option value="asc" <?php if
($this->listDirn == 'asc') echo
'selected="selected"'; ?>><?php echo
JText::_('JGLOBAL_ORDER_ASCENDING');?></option>
                <option value="desc" <?php if
($this->listDirn == 'desc') echo
'selected="selected"'; ?>><?php echo
JText::_('JGLOBAL_ORDER_DESCENDING');?></option>
            </select>
        </div>
        <div class="btn-group pull-right">
            <label for="sortTable"
class="element-invisible"><?php echo
JText::_('JGLOBAL_SORT_BY');?></label>
            <select name="sortTable" id="sortTable"
class="input-medium" onchange="Joomla.orderTable()">
                <option value=""><?php echo
JText::_('JGLOBAL_SORT_BY');?></option>
                <?php echo JHtml::_('select.options',
$this->getSortFields(), 'value', 'text',
$this->listOrder);?>
            </select>
        </div>
    </div>
<div class="clearfix">
</div>PK5~�[�#o,,views/reserves/tmpl/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[.F�|kkviews/reserves/view.html.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		view.html.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

/**
 * Reservation View class for the Reserves
 */
class ReservationViewReserves extends JViewLegacy
{
	/**
	 * Reserves view display method
	 * @return void
	 */
	function display($tpl = null)
	{
		if ($this->getLayout() !== 'modal')
		{
			// Include helper submenu
			ReservationHelper::addSubmenu('reserves');
		}

		// Assign data to the view
		$this->items = $this->get('Items');
		$this->pagination = $this->get('Pagination');
		$this->state = $this->get('State');
		$this->user = JFactory::getUser();
		// Load the filter form from xml.
		$this->filterForm = $this->get('FilterForm');
		// Load the active filters.
		$this->activeFilters = $this->get('ActiveFilters');
		// Add the list ordering clause.
		$this->listOrder =
$this->escape($this->state->get('list.ordering',
'a.id'));
		$this->listDirn =
$this->escape($this->state->get('list.direction',
'DESC'));
		$this->saveOrder = $this->listOrder == 'a.ordering';
		// set the return here value
		$this->return_here = urlencode(base64_encode((string)
JUri::getInstance()));
		// get global action permissions
		$this->canDo = ReservationHelper::getActions('reserve');
		$this->canEdit = $this->canDo->get('core.edit');
		$this->canState =
$this->canDo->get('core.edit.state');
		$this->canCreate = $this->canDo->get('core.create');
		$this->canDelete = $this->canDo->get('core.delete');
		$this->canBatch = $this->canDo->get('core.batch');

		// We don't need toolbar in the modal window.
		if ($this->getLayout() !== 'modal')
		{
			$this->addToolbar();
			$this->sidebar = JHtmlSidebar::render();
			// load the batch html
			if ($this->canCreate && $this->canEdit &&
$this->canState)
			{
				$this->batchDisplay = JHtmlBatch_::render();
			}
		}
		
		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		// Display the template
		parent::display($tpl);

		// Set the document
		$this->setDocument();
	}

	/**
	 * Setting the toolbar
	 */
	protected function addToolBar()
	{
		JToolBarHelper::title(JText::_('COM_RESERVATION_RESERVES'),
'joomla');
		JHtmlSidebar::setAction('index.php?option=com_reservation&view=reserves');
		JFormHelper::addFieldPath(JPATH_COMPONENT . '/models/fields');

		if ($this->canCreate)
		{
			JToolBarHelper::addNew('reserve.add');
		}

		// Only load if there are items
		if (ReservationHelper::checkArray($this->items))
		{
			if ($this->canEdit)
			{
				JToolBarHelper::editList('reserve.edit');
			}

			if ($this->canState)
			{
				JToolBarHelper::publishList('reserves.publish');
				JToolBarHelper::unpublishList('reserves.unpublish');
				JToolBarHelper::archiveList('reserves.archive');

				if ($this->canDo->get('core.admin'))
				{
					JToolBarHelper::checkin('reserves.checkin');
				}
			}

			// Add a batch button
			if ($this->canBatch && $this->canCreate &&
$this->canEdit && $this->canState)
			{
				// Get the toolbar object instance
				$bar = JToolBar::getInstance('toolbar');
				// set the batch button name
				$title = JText::_('JTOOLBAR_BATCH');
				// Instantiate a new JLayoutFile instance and render the batch button
				$layout = new JLayoutFile('joomla.toolbar.batch');
				// add the button to the page
				$dhtml = $layout->render(array('title' => $title));
				$bar->appendButton('Custom', $dhtml, 'batch');
			}

			if ($this->state->get('filter.published') == -2
&& ($this->canState && $this->canDelete))
			{
				JToolbarHelper::deleteList('', 'reserves.delete',
'JTOOLBAR_EMPTY_TRASH');
			}
			elseif ($this->canState && $this->canDelete)
			{
				JToolbarHelper::trash('reserves.trash');
			}

			if ($this->canDo->get('core.export') &&
$this->canDo->get('reserve.export'))
			{
				JToolBarHelper::custom('reserves.exportData',
'download', '',
'COM_RESERVATION_EXPORT_DATA', true);
			}
		}

		if ($this->canDo->get('core.import') &&
$this->canDo->get('reserve.import'))
		{
			JToolBarHelper::custom('reserves.importData',
'upload', '', 'COM_RESERVATION_IMPORT_DATA',
false);
		}

		// set help url for this view if found
		$help_url = ReservationHelper::getHelpUrl('reserves');
		if (ReservationHelper::checkString($help_url))
		{
				JToolbarHelper::help('COM_RESERVATION_HELP_MANAGER', false,
$help_url);
		}

		// add the options comp button
		if ($this->canDo->get('core.admin') ||
$this->canDo->get('core.options'))
		{
			JToolBarHelper::preferences('com_reservation');
		}

		// Only load published batch if state and batch is allowed
		if ($this->canState && $this->canBatch)
		{
			JHtmlBatch_::addListSelection(
				JText::_('COM_RESERVATION_KEEP_ORIGINAL_STATE'),
				'batch[published]',
				JHtml::_('select.options',
JHtml::_('jgrid.publishedOptions', array('all' =>
false)), 'value', 'text', '', true)
			);
		}

		// Only load access batch if create, edit and batch is allowed
		if ($this->canBatch && $this->canCreate &&
$this->canEdit)
		{
			JHtmlBatch_::addListSelection(
				JText::_('COM_RESERVATION_KEEP_ORIGINAL_ACCESS'),
				'batch[access]',
				JHtml::_('select.options',
JHtml::_('access.assetgroups'), 'value',
'text')
			);
		}
	}

	/**
	 * Method to set up the document properties
	 *
	 * @return void
	 */
	protected function setDocument()
	{
		if (!isset($this->document))
		{
			$this->document = JFactory::getDocument();
		}
		$this->document->setTitle(JText::_('COM_RESERVATION_RESERVES'));
		$this->document->addStyleSheet(JURI::root() .
"administrator/components/com_reservation/assets/css/reserves.css",
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') : 'text/css');
	}

	/**
	 * Escapes a value for output in a view script.
	 *
	 * @param   mixed  $var  The output to escape.
	 *
	 * @return  mixed  The escaped value.
	 */
	public function escape($var)
	{
		if(strlen($var) > 50)
		{
			// use the helper htmlEscape method instead and shorten the string
			return ReservationHelper::htmlEscape($var, $this->_charset, true);
		}
		// use the helper htmlEscape method instead.
		return ReservationHelper::htmlEscape($var, $this->_charset);
	}

	/**
	 * Returns an array of fields the table can be sorted by
	 *
	 * @return  array  Array containing the field name to sort by as the key
and display text as value
	 */
	protected function getSortFields()
	{
		return array(
			'a.ordering' =>
JText::_('JGRID_HEADING_ORDERING'),
			'a.published' => JText::_('JSTATUS'),
			'a.full_price' =>
JText::_('COM_RESERVATION_RESERVE_FULL_PRICE_LABEL'),
			'a.doctor_quota' =>
JText::_('COM_RESERVATION_RESERVE_DOCTOR_QUOTA_LABEL'),
			'a.system_quota' =>
JText::_('COM_RESERVATION_RESERVE_SYSTEM_QUOTA_LABEL'),
			'a.id' => JText::_('JGRID_HEADING_ID')
		);
	}
}
PK5~�[v�!��views/session/submitbutton.jsnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		submitbutton.js
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

Joomla.submitbutton = function(task)
{
	if (task == ''){
		return false;
	} else { 
		var action = task.split('.');
		if (action[1] == 'cancel' || action[1] == 'close' ||
document.formvalidator.isValid(document.getElementById("adminForm"))){
			Joomla.submitform(task, document.getElementById("adminForm"));
			return true;
		} else {
			alert(Joomla.JText._('session, some values are not
acceptable.','Some values are unacceptable'));
			return false;
		}
	}
}PK5~�[�K�o��views/session/tmpl/edit.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		edit.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');
JHtml::_('behavior.tooltip');
JHtml::_('behavior.formvalidation');
JHtml::_('formbehavior.chosen', 'select');
JHtml::_('behavior.keepalive');
$componentParams = $this->params; // will be removed just use
$this->params instead
?>
<script type="text/javascript">
	// waiting spinner
	var outerDiv = jQuery('body');
	jQuery('<div id="loading"></div>')
		.css("background", "rgba(255, 255, 255, .8)
url('components/com_reservation/assets/images/import.gif') 50%
15% no-repeat")
		.css("top", outerDiv.position().top -
jQuery(window).scrollTop())
		.css("left", outerDiv.position().left -
jQuery(window).scrollLeft())
		.css("width", outerDiv.width())
		.css("height", outerDiv.height())
		.css("position", "fixed")
		.css("opacity", "0.80")
		.css("-ms-filter",
"progid:DXImageTransform.Microsoft.Alpha(Opacity = 80)")
		.css("filter", "alpha(opacity = 80)")
		.css("display", "none")
		.appendTo(outerDiv);
	jQuery('#loading').show();
	// when page is ready remove and show
	jQuery(window).load(function() {
		jQuery('#reservation_loader').fadeIn('fast');
		jQuery('#loading').hide();
	});
</script>
<div id="reservation_loader" style="display:
none;">
<form action="<?php echo
JRoute::_('index.php?option=com_reservation&layout=edit&id='.
(int) $this->item->id . $this->referral); ?>"
method="post" name="adminForm" id="adminForm"
class="form-validate" enctype="multipart/form-data">

<div class="form-horizontal">

	<?php echo JHtml::_('bootstrap.startTabSet',
'sessionTab', array('active' =>
'details')); ?>

	<?php echo JHtml::_('bootstrap.addTab',
'sessionTab', 'details',
JText::_('COM_RESERVATION_SESSION_DETAILS', true)); ?>
		<div class="row-fluid form-horizontal-desktop">
			<div class="span6">
				<?php echo JLayoutHelper::render('session.details_left',
$this); ?>
			</div>
			<div class="span6">
				<?php echo JLayoutHelper::render('session.details_right',
$this); ?>
			</div>
		</div>
	<?php echo JHtml::_('bootstrap.endTab'); ?>

	<?php $this->ignore_fieldsets =
array('details','metadata','vdmmetadata','accesscontrol');
?>
	<?php $this->tab_name = 'sessionTab'; ?>
	<?php echo JLayoutHelper::render('joomla.edit.params',
$this); ?>

	<?php if ($this->canDo->get('core.edit.created_by') ||
$this->canDo->get('core.edit.created') ||
$this->canDo->get('core.edit.state') ||
($this->canDo->get('core.delete') &&
$this->canDo->get('core.edit.state'))) : ?>
	<?php echo JHtml::_('bootstrap.addTab',
'sessionTab', 'publishing',
JText::_('COM_RESERVATION_SESSION_PUBLISHING', true)); ?>
		<div class="row-fluid form-horizontal-desktop">
			<div class="span6">
				<?php echo JLayoutHelper::render('session.publishing',
$this); ?>
			</div>
			<div class="span6">
				<?php echo JLayoutHelper::render('session.publlshing',
$this); ?>
			</div>
		</div>
	<?php echo JHtml::_('bootstrap.endTab'); ?>
	<?php endif; ?>

	<?php if ($this->canDo->get('core.admin')) : ?>
	<?php echo JHtml::_('bootstrap.addTab',
'sessionTab', 'permissions',
JText::_('COM_RESERVATION_SESSION_PERMISSION', true)); ?>
		<div class="row-fluid form-horizontal-desktop">
			<div class="span12">
				<fieldset class="adminform">
					<div class="adminformlist">
					<?php foreach
($this->form->getFieldset('accesscontrol') as $field):
?>
						<div>
							<?php echo $field->label; echo $field->input;?>
						</div>
						<div class="clearfix"></div>
					<?php endforeach; ?>
					</div>
				</fieldset>
			</div>
		</div>
	<?php echo JHtml::_('bootstrap.endTab'); ?>
	<?php endif; ?>

	<?php echo JHtml::_('bootstrap.endTabSet'); ?>

	<div>
		<input type="hidden" name="task"
value="session.edit" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</div>
</form>
</div>
PK5~�[�#o,,views/session/tmpl/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[6'3���views/session/view.html.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		view.html.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

/**
 * Session View class
 */
class ReservationViewSession extends JViewLegacy
{
	/**
	 * display method of View
	 * @return void
	 */
	public function display($tpl = null)
	{
		// set params
		$this->params =
JComponentHelper::getParams('com_reservation');
		// Assign the variables
		$this->form = $this->get('Form');
		$this->item = $this->get('Item');
		$this->script = $this->get('Script');
		$this->state = $this->get('State');
		// get action permissions
		$this->canDo = ReservationHelper::getActions('session',
$this->item);
		// get input
		$jinput = JFactory::getApplication()->input;
		$this->ref = $jinput->get('ref', 0, 'word');
		$this->refid = $jinput->get('refid', 0, 'int');
		$return = $jinput->get('return', null, 'base64');
		// set the referral string
		$this->referral = '';
		if ($this->refid && $this->ref)
		{
			// return to the item that referred to this item
			$this->referral = '&ref=' . (string)$this->ref .
'&refid=' . (int)$this->refid;
		}
		elseif($this->ref)
		{
			// return to the list view that referred to this item
			$this->referral = '&ref=' . (string)$this->ref;
		}
		// check return value
		if (!is_null($return))
		{
			// add the return value
			$this->referral .= '&return=' . (string)$return;
		}

		// Set the toolbar
		$this->addToolBar();
		
		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		// Display the template
		parent::display($tpl);

		// Set the document
		$this->setDocument();
	}


	/**
	 * Setting the toolbar
	 */
	protected function addToolBar()
	{
		JFactory::getApplication()->input->set('hidemainmenu',
true);
		$user = JFactory::getUser();
		$userId	= $user->id;
		$isNew = $this->item->id == 0;

		JToolbarHelper::title( JText::_($isNew ?
'COM_RESERVATION_SESSION_NEW' :
'COM_RESERVATION_SESSION_EDIT'), 'pencil-2
article-add');
		// Built the actions for new and existing records.
		if (ReservationHelper::checkString($this->referral))
		{
			if ($this->canDo->get('core.create') && $isNew)
			{
				// We can create the record.
				JToolBarHelper::save('session.save',
'JTOOLBAR_SAVE');
			}
			elseif ($this->canDo->get('core.edit'))
			{
				// We can save the record.
				JToolBarHelper::save('session.save',
'JTOOLBAR_SAVE');
			}
			if ($isNew)
			{
				// Do not creat but cancel.
				JToolBarHelper::cancel('session.cancel',
'JTOOLBAR_CANCEL');
			}
			else
			{
				// We can close it.
				JToolBarHelper::cancel('session.cancel',
'JTOOLBAR_CLOSE');
			}
		}
		else
		{
			if ($isNew)
			{
				// For new records, check the create permission.
				if ($this->canDo->get('core.create'))
				{
					JToolBarHelper::apply('session.apply',
'JTOOLBAR_APPLY');
					JToolBarHelper::save('session.save',
'JTOOLBAR_SAVE');
					JToolBarHelper::custom('session.save2new',
'save-new.png', 'save-new_f2.png',
'JTOOLBAR_SAVE_AND_NEW', false);
				};
				JToolBarHelper::cancel('session.cancel',
'JTOOLBAR_CANCEL');
			}
			else
			{
				if ($this->canDo->get('core.edit'))
				{
					// We can save the new record
					JToolBarHelper::apply('session.apply',
'JTOOLBAR_APPLY');
					JToolBarHelper::save('session.save',
'JTOOLBAR_SAVE');
					// We can save this record, but check the create permission to see
					// if we can return to make a new one.
					if ($this->canDo->get('core.create'))
					{
						JToolBarHelper::custom('session.save2new',
'save-new.png', 'save-new_f2.png',
'JTOOLBAR_SAVE_AND_NEW', false);
					}
				}
				$canVersion = ($this->canDo->get('core.version')
&& $this->canDo->get('session.version'));
				if ($this->state->params->get('save_history', 1)
&& $this->canDo->get('core.edit') &&
$canVersion)
				{
					JToolbarHelper::versions('com_reservation.session',
$this->item->id);
				}
				if ($this->canDo->get('core.create'))
				{
					JToolBarHelper::custom('session.save2copy',
'save-copy.png', 'save-copy_f2.png',
'JTOOLBAR_SAVE_AS_COPY', false);
				}
				JToolBarHelper::cancel('session.cancel',
'JTOOLBAR_CLOSE');
			}
		}
		JToolbarHelper::divider();
		// set help url for this view if found
		$help_url = ReservationHelper::getHelpUrl('session');
		if (ReservationHelper::checkString($help_url))
		{
			JToolbarHelper::help('COM_RESERVATION_HELP_MANAGER', false,
$help_url);
		}
	}

	/**
	 * Escapes a value for output in a view script.
	 *
	 * @param   mixed  $var  The output to escape.
	 *
	 * @return  mixed  The escaped value.
	 */
	public function escape($var)
	{
		if(strlen($var) > 30)
		{
    		// use the helper htmlEscape method instead and shorten the string
			return ReservationHelper::htmlEscape($var, $this->_charset, true,
30);
		}
		// use the helper htmlEscape method instead.
		return ReservationHelper::htmlEscape($var, $this->_charset);
	}

	/**
	 * Method to set up the document properties
	 *
	 * @return void
	 */
	protected function setDocument()
	{
		$isNew = ($this->item->id < 1);
		if (!isset($this->document))
		{
			$this->document = JFactory::getDocument();
		}
		$this->document->setTitle(JText::_($isNew ?
'COM_RESERVATION_SESSION_NEW' :
'COM_RESERVATION_SESSION_EDIT'));
		$this->document->addStyleSheet(JURI::root() .
"administrator/components/com_reservation/assets/css/session.css",
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') : 'text/css');
		$this->document->addScript(JURI::root() . $this->script,
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') :
'text/javascript');
		$this->document->addScript(JURI::root() .
"administrator/components/com_reservation/views/session/submitbutton.js",
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') :
'text/javascript'); 
		JText::script('view not acceptable. Error');
	}
}
PK5~�[�#o,,views/sessions/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[�views/sessions/tmpl/default.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

JHtml::_('behavior.tooltip');
JHtml::_('behavior.multiselect');
JHtml::_('dropdown.init');
JHtml::_('formbehavior.chosen',
'.multipleAccessLevels', null,
array('placeholder_text_multiple' => '- ' .
JText::_('COM_RESERVATION_FILTER_SELECT_ACCESS') . '
-'));
JHtml::_('formbehavior.chosen', 'select');
if ($this->saveOrder)
{
	$saveOrderingUrl =
'index.php?option=com_reservation&task=sessions.saveOrderAjax&tmpl=component';
	JHtml::_('sortablelist.sortable', 'sessionList',
'adminForm', strtolower($this->listDirn), $saveOrderingUrl);
}
?>
<form action="<?php echo
JRoute::_('index.php?option=com_reservation&view=sessions');
?>" method="post" name="adminForm"
id="adminForm">
<?php if(!empty( $this->sidebar)): ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif; ?>
<?php
	// Add the searchtools
	echo JLayoutHelper::render('joomla.searchtools.default',
array('view' => $this));
?>
<?php if (empty($this->items)): ?>
	<div class="alert alert-no-items">
		<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
	</div>
<?php else : ?>
	<table class="table table-striped"
id="sessionList">
		<thead><?php echo
$this->loadTemplate('head');?></thead>
		<tfoot><?php echo
$this->loadTemplate('foot');?></tfoot>
		<tbody><?php echo
$this->loadTemplate('body');?></tbody>
	</table>
	<?php // Load the batch processing form. ?>
	<?php if ($this->canCreate && $this->canEdit) : ?>
		<?php echo JHtml::_(
			'bootstrap.renderModal',
			'collapseModal',
			array(
				'title' =>
JText::_('COM_RESERVATION_SESSIONS_BATCH_OPTIONS'),
				'footer' =>
$this->loadTemplate('batch_footer')
			),
			$this->loadTemplate('batch_body')
		); ?>
	<?php endif; ?>
	<input type="hidden" name="boxchecked"
value="0" />
	</div>
<?php endif; ?>
	<input type="hidden" name="task" value=""
/>
	<?php echo JHtml::_('form.token'); ?>
</form>
PK5~�[|���*views/sessions/tmpl/default_batch_body.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_batch_body.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>

<p><?php echo
JText::_('COM_RESERVATION_SESSIONS_BATCH_TIP'); ?></p>
<?php echo $this->batchDisplay;
?>PK5~�[�W-r��,views/sessions/tmpl/default_batch_footer.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_batch_footer.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<!-- clear the batch values if cancel -->
<button class="btn" type="button"
onclick="" data-dismiss="modal">
	<?php echo JText::_('JCANCEL'); ?>
</button>
<!-- post the batch values if process -->
<button class="btn btn-success" type="submit"
onclick="Joomla.submitbutton('session.batch');">
	<?php echo JText::_('JGLOBAL_BATCH_PROCESS'); ?>
</button>PK5~�[��O''$views/sessions/tmpl/default_body.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_body.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

$edit =
"index.php?option=com_reservation&view=sessions&task=session.edit";

?>
<?php foreach ($this->items as $i => $item): ?>
	<?php
		$canCheckin = $this->user->authorise('core.manage',
'com_checkin') || $item->checked_out == $this->user->id
|| $item->checked_out == 0;
		$userChkOut = JFactory::getUser($item->checked_out);
		$canDo =
ReservationHelper::getActions('session',$item,'sessions');
	?>
	<tr class="row<?php echo $i % 2; ?>">
		<td class="order nowrap center hidden-phone">
		<?php if ($canDo->get('core.edit.state')): ?>
			<?php
				$iconClass = '';
				if (!$this->saveOrder)
				{
					$iconClass = ' inactive tip-top" hasTooltip"
title="' . JHtml::tooltipText('JORDERINGDISABLED');
				}
			?>
			<span class="sortable-handler<?php echo $iconClass;
?>">
				<i class="icon-menu"></i>
			</span>
			<?php if ($this->saveOrder) : ?>
				<input type="text" style="display:none"
name="order[]" size="5"
				value="<?php echo $item->ordering; ?>"
class="width-20 text-area-order " />
			<?php endif; ?>
		<?php else: ?>
			&#8942;
		<?php endif; ?>
		</td>
		<td class="nowrap center">
		<?php if ($canDo->get('core.edit')): ?>
				<?php if ($item->checked_out) : ?>
					<?php if ($canCheckin) : ?>
						<?php echo JHtml::_('grid.id', $i, $item->id); ?>
					<?php else: ?>
						&#9633;
					<?php endif; ?>
				<?php else: ?>
					<?php echo JHtml::_('grid.id', $i, $item->id); ?>
				<?php endif; ?>
		<?php else: ?>
			&#9633;
		<?php endif; ?>
		</td>
		<td class="nowrap">
			<div class="name">
				<?php if ($canDo->get('core.edit')): ?>
					<a href="<?php echo $edit; ?>&id=<?php echo
$item->id; ?>"><?php echo
$this->escape($item->sickid_phonenumber); ?></a>
					<?php if ($item->checked_out): ?>
						<?php echo JHtml::_('jgrid.checkedout', $i,
$userChkOut->name, $item->checked_out_time, 'sessions.',
$canCheckin); ?>
					<?php endif; ?>
				<?php else: ?>
					<?php echo $this->escape($item->sickid_phonenumber); ?>
				<?php endif; ?>
			</div>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->planid_id); ?>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->pay); ?>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->finish); ?>
		</td>
		<td class="center">
		<?php if ($canDo->get('core.edit.state')) : ?>
				<?php if ($item->checked_out) : ?>
					<?php if ($canCheckin) : ?>
						<?php echo JHtml::_('jgrid.published',
$item->published, $i, 'sessions.', true, 'cb');
?>
					<?php else: ?>
						<?php echo JHtml::_('jgrid.published',
$item->published, $i, 'sessions.', false, 'cb');
?>
					<?php endif; ?>
				<?php else: ?>
					<?php echo JHtml::_('jgrid.published',
$item->published, $i, 'sessions.', true, 'cb');
?>
				<?php endif; ?>
		<?php else: ?>
			<?php echo JHtml::_('jgrid.published', $item->published,
$i, 'sessions.', false, 'cb'); ?>
		<?php endif; ?>
		</td>
		<td class="nowrap center hidden-phone">
			<?php echo $item->id; ?>
		</td>
	</tr>
<?php endforeach; ?>PK5~�[�
���$views/sessions/tmpl/default_foot.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_foot.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<tr>
	<td colspan="8"><?php echo
$this->pagination->getListFooter(); ?></td>
</tr>PK5~�[v�	D�
�
$views/sessions/tmpl/default_head.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_head.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<tr>
	<?php if ($this->canEdit&& $this->canState): ?>
		<th width="1%" class="nowrap center
hidden-phone">
			<?php echo JHtml::_('searchtools.sort', '',
'a.ordering', $this->listDirn, $this->listOrder, null,
'asc', 'JGRID_HEADING_ORDERING',
'icon-menu-2'); ?>
		</th>
		<th width="20" class="nowrap center">
			<?php echo JHtml::_('grid.checkall'); ?>
		</th>
	<?php else: ?>
		<th width="20" class="nowrap center
hidden-phone">
			&#9662;
		</th>
		<th width="20" class="nowrap center">
			&#9632;
		</th>
	<?php endif; ?>
	<th class="nowrap" >
			<?php echo
JText::_('COM_RESERVATION_SESSION_SICKID_LABEL'); ?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo
JText::_('COM_RESERVATION_SESSION_PLANID_LABEL'); ?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo JHtml::_('searchtools.sort',
'COM_RESERVATION_SESSION_PAY_LABEL', 'a.pay',
$this->listDirn, $this->listOrder); ?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo
JText::_('COM_RESERVATION_SESSION_FINISH_LABEL'); ?>
	</th>
	<?php if ($this->canState): ?>
		<th width="10" class="nowrap center" >
			<?php echo JHtml::_('searchtools.sort',
'COM_RESERVATION_SESSION_STATUS', 'a.published',
$this->listDirn, $this->listOrder); ?>
		</th>
	<?php else: ?>
		<th width="10" class="nowrap center" >
			<?php echo JText::_('COM_RESERVATION_SESSION_STATUS');
?>
		</th>
	<?php endif; ?>
	<th width="5" class="nowrap center hidden-phone"
>
			<?php echo JHtml::_('searchtools.sort',
'COM_RESERVATION_SESSION_ID', 'a.id',
$this->listDirn, $this->listOrder); ?>
	</th>
</tr>PK5~�[N��F55'views/sessions/tmpl/default_toolbar.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_toolbar.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<div id="filter-bar" class="btn-toolbar">
        <div class="filter-search btn-group pull-left">
            <label for="filter_search"
class="element-invisible"><?php echo
JText::_('Search');?></label>
            <input type="text" name="filter_search"
id="filter_search" placeholder="<?php echo
JText::_('JSEARCH_FILTER'); ?>" value="<?php echo
$this->escape($this->state->get('filter.search'));
?>" class="hasTooltip" title="<?php echo
JHtml::tooltipText('Search Sessions'); ?>" />
        </div>
        <div class="btn-group pull-left">
            <button type="submit" class="btn
hasTooltip" title="<?php echo
JHtml::tooltipText('JSEARCH_FILTER_SUBMIT'); ?>"><i
class="icon-search"></i></button>
            <button type="button" class="btn
hasTooltip" title="<?php echo
JHtml::tooltipText('JSEARCH_FILTER_CLEAR'); ?>"
onclick="document.id('filter_search').value='';this.form.submit();"><i
class="icon-remove"></i></button>
        </div>
        <div class="btn-group pull-right hidden-phone">
            <label for="limit"
class="element-invisible"><?php echo
JText::_('JFIELD_PLG_SEARCH_SEARCHLIMIT_DESC');?></label>
            <?php echo $this->pagination->getLimitBox(); ?>
        </div>
        <div class="btn-group pull-right hidden-phone">
            <label for="directionTable"
class="element-invisible"><?php echo
JText::_('JFIELD_ORDERING_DESC');?></label>
            <select name="directionTable"
id="directionTable" class="input-medium"
onchange="Joomla.orderTable()">
                <option value=""><?php echo
JText::_('JFIELD_ORDERING_DESC');?></option>
                <option value="asc" <?php if
($this->listDirn == 'asc') echo
'selected="selected"'; ?>><?php echo
JText::_('JGLOBAL_ORDER_ASCENDING');?></option>
                <option value="desc" <?php if
($this->listDirn == 'desc') echo
'selected="selected"'; ?>><?php echo
JText::_('JGLOBAL_ORDER_DESCENDING');?></option>
            </select>
        </div>
        <div class="btn-group pull-right">
            <label for="sortTable"
class="element-invisible"><?php echo
JText::_('JGLOBAL_SORT_BY');?></label>
            <select name="sortTable" id="sortTable"
class="input-medium" onchange="Joomla.orderTable()">
                <option value=""><?php echo
JText::_('JGLOBAL_SORT_BY');?></option>
                <?php echo JHtml::_('select.options',
$this->getSortFields(), 'value', 'text',
$this->listOrder);?>
            </select>
        </div>
    </div>
<div class="clearfix">
</div>PK5~�[�#o,,views/sessions/tmpl/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[�d����views/sessions/view.html.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		view.html.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

/**
 * Reservation View class for the Sessions
 */
class ReservationViewSessions extends JViewLegacy
{
	/**
	 * Sessions view display method
	 * @return void
	 */
	function display($tpl = null)
	{
		if ($this->getLayout() !== 'modal')
		{
			// Include helper submenu
			ReservationHelper::addSubmenu('sessions');
		}

		// Assign data to the view
		$this->items = $this->get('Items');
		$this->pagination = $this->get('Pagination');
		$this->state = $this->get('State');
		$this->user = JFactory::getUser();
		// Load the filter form from xml.
		$this->filterForm = $this->get('FilterForm');
		// Load the active filters.
		$this->activeFilters = $this->get('ActiveFilters');
		// Add the list ordering clause.
		$this->listOrder =
$this->escape($this->state->get('list.ordering',
'a.id'));
		$this->listDirn =
$this->escape($this->state->get('list.direction',
'DESC'));
		$this->saveOrder = $this->listOrder == 'a.ordering';
		// set the return here value
		$this->return_here = urlencode(base64_encode((string)
JUri::getInstance()));
		// get global action permissions
		$this->canDo = ReservationHelper::getActions('session');
		$this->canEdit = $this->canDo->get('core.edit');
		$this->canState =
$this->canDo->get('core.edit.state');
		$this->canCreate = $this->canDo->get('core.create');
		$this->canDelete = $this->canDo->get('core.delete');
		$this->canBatch = $this->canDo->get('core.batch');

		// We don't need toolbar in the modal window.
		if ($this->getLayout() !== 'modal')
		{
			$this->addToolbar();
			$this->sidebar = JHtmlSidebar::render();
			// load the batch html
			if ($this->canCreate && $this->canEdit &&
$this->canState)
			{
				$this->batchDisplay = JHtmlBatch_::render();
			}
		}
		
		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		// Display the template
		parent::display($tpl);

		// Set the document
		$this->setDocument();
	}

	/**
	 * Setting the toolbar
	 */
	protected function addToolBar()
	{
		JToolBarHelper::title(JText::_('COM_RESERVATION_SESSIONS'),
'joomla');
		JHtmlSidebar::setAction('index.php?option=com_reservation&view=sessions');
		JFormHelper::addFieldPath(JPATH_COMPONENT . '/models/fields');

		if ($this->canCreate)
		{
			JToolBarHelper::addNew('session.add');
		}

		// Only load if there are items
		if (ReservationHelper::checkArray($this->items))
		{
			if ($this->canEdit)
			{
				JToolBarHelper::editList('session.edit');
			}

			if ($this->canState)
			{
				JToolBarHelper::publishList('sessions.publish');
				JToolBarHelper::unpublishList('sessions.unpublish');
				JToolBarHelper::archiveList('sessions.archive');

				if ($this->canDo->get('core.admin'))
				{
					JToolBarHelper::checkin('sessions.checkin');
				}
			}

			// Add a batch button
			if ($this->canBatch && $this->canCreate &&
$this->canEdit && $this->canState)
			{
				// Get the toolbar object instance
				$bar = JToolBar::getInstance('toolbar');
				// set the batch button name
				$title = JText::_('JTOOLBAR_BATCH');
				// Instantiate a new JLayoutFile instance and render the batch button
				$layout = new JLayoutFile('joomla.toolbar.batch');
				// add the button to the page
				$dhtml = $layout->render(array('title' => $title));
				$bar->appendButton('Custom', $dhtml, 'batch');
			}

			if ($this->state->get('filter.published') == -2
&& ($this->canState && $this->canDelete))
			{
				JToolbarHelper::deleteList('', 'sessions.delete',
'JTOOLBAR_EMPTY_TRASH');
			}
			elseif ($this->canState && $this->canDelete)
			{
				JToolbarHelper::trash('sessions.trash');
			}

			if ($this->canDo->get('core.export') &&
$this->canDo->get('session.export'))
			{
				JToolBarHelper::custom('sessions.exportData',
'download', '',
'COM_RESERVATION_EXPORT_DATA', true);
			}
		}

		if ($this->canDo->get('core.import') &&
$this->canDo->get('session.import'))
		{
			JToolBarHelper::custom('sessions.importData',
'upload', '', 'COM_RESERVATION_IMPORT_DATA',
false);
		}

		// set help url for this view if found
		$help_url = ReservationHelper::getHelpUrl('sessions');
		if (ReservationHelper::checkString($help_url))
		{
				JToolbarHelper::help('COM_RESERVATION_HELP_MANAGER', false,
$help_url);
		}

		// add the options comp button
		if ($this->canDo->get('core.admin') ||
$this->canDo->get('core.options'))
		{
			JToolBarHelper::preferences('com_reservation');
		}

		// Only load published batch if state and batch is allowed
		if ($this->canState && $this->canBatch)
		{
			JHtmlBatch_::addListSelection(
				JText::_('COM_RESERVATION_KEEP_ORIGINAL_STATE'),
				'batch[published]',
				JHtml::_('select.options',
JHtml::_('jgrid.publishedOptions', array('all' =>
false)), 'value', 'text', '', true)
			);
		}

		// Only load access batch if create, edit and batch is allowed
		if ($this->canBatch && $this->canCreate &&
$this->canEdit)
		{
			JHtmlBatch_::addListSelection(
				JText::_('COM_RESERVATION_KEEP_ORIGINAL_ACCESS'),
				'batch[access]',
				JHtml::_('select.options',
JHtml::_('access.assetgroups'), 'value',
'text')
			);
		}
	}

	/**
	 * Method to set up the document properties
	 *
	 * @return void
	 */
	protected function setDocument()
	{
		if (!isset($this->document))
		{
			$this->document = JFactory::getDocument();
		}
		$this->document->setTitle(JText::_('COM_RESERVATION_SESSIONS'));
		$this->document->addStyleSheet(JURI::root() .
"administrator/components/com_reservation/assets/css/sessions.css",
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') : 'text/css');
	}

	/**
	 * Escapes a value for output in a view script.
	 *
	 * @param   mixed  $var  The output to escape.
	 *
	 * @return  mixed  The escaped value.
	 */
	public function escape($var)
	{
		if(strlen($var) > 50)
		{
			// use the helper htmlEscape method instead and shorten the string
			return ReservationHelper::htmlEscape($var, $this->_charset, true);
		}
		// use the helper htmlEscape method instead.
		return ReservationHelper::htmlEscape($var, $this->_charset);
	}

	/**
	 * Returns an array of fields the table can be sorted by
	 *
	 * @return  array  Array containing the field name to sort by as the key
and display text as value
	 */
	protected function getSortFields()
	{
		return array(
			'a.ordering' =>
JText::_('JGRID_HEADING_ORDERING'),
			'a.published' => JText::_('JSTATUS'),
			'a.id' => JText::_('JGRID_HEADING_ID')
		);
	}
}
PK5~�[��&)��views/sick/submitbutton.jsnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		submitbutton.js
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

Joomla.submitbutton = function(task)
{
	if (task == ''){
		return false;
	} else { 
		var action = task.split('.');
		if (action[1] == 'cancel' || action[1] == 'close' ||
document.formvalidator.isValid(document.getElementById("adminForm"))){
			Joomla.submitform(task, document.getElementById("adminForm"));
			return true;
		} else {
			alert(Joomla.JText._('sick, some values are not
acceptable.','Some values are unacceptable'));
			return false;
		}
	}
}PK5~�[ǜ2��views/sick/tmpl/edit.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		edit.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');
JHtml::_('behavior.tooltip');
JHtml::_('behavior.formvalidation');
JHtml::_('formbehavior.chosen', 'select');
JHtml::_('behavior.keepalive');
$componentParams = $this->params; // will be removed just use
$this->params instead
?>
<script type="text/javascript">
	// waiting spinner
	var outerDiv = jQuery('body');
	jQuery('<div id="loading"></div>')
		.css("background", "rgba(255, 255, 255, .8)
url('components/com_reservation/assets/images/import.gif') 50%
15% no-repeat")
		.css("top", outerDiv.position().top -
jQuery(window).scrollTop())
		.css("left", outerDiv.position().left -
jQuery(window).scrollLeft())
		.css("width", outerDiv.width())
		.css("height", outerDiv.height())
		.css("position", "fixed")
		.css("opacity", "0.80")
		.css("-ms-filter",
"progid:DXImageTransform.Microsoft.Alpha(Opacity = 80)")
		.css("filter", "alpha(opacity = 80)")
		.css("display", "none")
		.appendTo(outerDiv);
	jQuery('#loading').show();
	// when page is ready remove and show
	jQuery(window).load(function() {
		jQuery('#reservation_loader').fadeIn('fast');
		jQuery('#loading').hide();
	});
</script>
<div id="reservation_loader" style="display:
none;">
<form action="<?php echo
JRoute::_('index.php?option=com_reservation&layout=edit&id='.
(int) $this->item->id . $this->referral); ?>"
method="post" name="adminForm" id="adminForm"
class="form-validate" enctype="multipart/form-data">

<div class="form-horizontal">

	<?php echo JHtml::_('bootstrap.startTabSet',
'sickTab', array('active' => 'details'));
?>

	<?php echo JHtml::_('bootstrap.addTab', 'sickTab',
'details', JText::_('COM_RESERVATION_SICK_DETAILS',
true)); ?>
		<div class="row-fluid form-horizontal-desktop">
			<div class="span6">
				<?php echo JLayoutHelper::render('sick.details_left',
$this); ?>
			</div>
			<div class="span6">
				<?php echo JLayoutHelper::render('sick.details_right',
$this); ?>
			</div>
		</div>
	<?php echo JHtml::_('bootstrap.endTab'); ?>

	<?php $this->ignore_fieldsets =
array('details','metadata','vdmmetadata','accesscontrol');
?>
	<?php $this->tab_name = 'sickTab'; ?>
	<?php echo JLayoutHelper::render('joomla.edit.params',
$this); ?>

	<?php if ($this->canDo->get('core.edit.created_by') ||
$this->canDo->get('core.edit.created') ||
$this->canDo->get('core.edit.state') ||
($this->canDo->get('core.delete') &&
$this->canDo->get('core.edit.state'))) : ?>
	<?php echo JHtml::_('bootstrap.addTab', 'sickTab',
'publishing',
JText::_('COM_RESERVATION_SICK_PUBLISHING', true)); ?>
		<div class="row-fluid form-horizontal-desktop">
			<div class="span6">
				<?php echo JLayoutHelper::render('sick.publishing',
$this); ?>
			</div>
			<div class="span6">
				<?php echo JLayoutHelper::render('sick.publlshing',
$this); ?>
			</div>
		</div>
	<?php echo JHtml::_('bootstrap.endTab'); ?>
	<?php endif; ?>

	<?php if ($this->canDo->get('core.admin')) : ?>
	<?php echo JHtml::_('bootstrap.addTab', 'sickTab',
'permissions',
JText::_('COM_RESERVATION_SICK_PERMISSION', true)); ?>
		<div class="row-fluid form-horizontal-desktop">
			<div class="span12">
				<fieldset class="adminform">
					<div class="adminformlist">
					<?php foreach
($this->form->getFieldset('accesscontrol') as $field):
?>
						<div>
							<?php echo $field->label; echo $field->input;?>
						</div>
						<div class="clearfix"></div>
					<?php endforeach; ?>
					</div>
				</fieldset>
			</div>
		</div>
	<?php echo JHtml::_('bootstrap.endTab'); ?>
	<?php endif; ?>

	<?php echo JHtml::_('bootstrap.endTabSet'); ?>

	<div>
		<input type="hidden" name="task"
value="sick.edit" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</div>
</form>
</div>

<script type="text/javascript">



/***[JCBGUI.field.javascript_view_footer.1038.$$$$]***/
jQuery(document).ready(function($){

   var gettoken= Joomla.getOptions('token');


   $('select#jform_capitalid').change(function () {

      var capitalid= $(this).val();
      var token= gettoken;

      $.ajax({
         url: 'index.php?option=com_reservation',
         method: 'post',
         dataType: 'json',
         data: {[token] : '1',task:'ajax.getCity',
format: 'json' , raw: 'true' , capitalid: capitalid},
         success: function (msg) {

            var temp='<option value="">Select an
option</option>';
            msg.each(function(value, index){

               temp += '<option
value="'+value.id+'">'+value.name+'</option>';

            });

            $('select#jform_cityid').html(temp);
            $( "select#jform_cityid" ).trigger(
"liszt:updated" );
         },
         error: function (err) {
            console.log(err);
         }
      });


   });


});/***[/JCBGUI$$$$]***/

</script>
PK5~�[�#o,,views/sick/tmpl/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[���UUviews/sick/view.html.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		view.html.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

/**
 * Sick View class
 */
class ReservationViewSick extends JViewLegacy
{
	/**
	 * display method of View
	 * @return void
	 */
	public function display($tpl = null)
	{
		// set params
		$this->params =
JComponentHelper::getParams('com_reservation');
		// Assign the variables
		$this->form = $this->get('Form');
		$this->item = $this->get('Item');
		$this->script = $this->get('Script');
		$this->state = $this->get('State');
		// get action permissions
		$this->canDo = ReservationHelper::getActions('sick',
$this->item);
		// get input
		$jinput = JFactory::getApplication()->input;
		$this->ref = $jinput->get('ref', 0, 'word');
		$this->refid = $jinput->get('refid', 0, 'int');
		$return = $jinput->get('return', null, 'base64');
		// set the referral string
		$this->referral = '';
		if ($this->refid && $this->ref)
		{
			// return to the item that referred to this item
			$this->referral = '&ref=' . (string)$this->ref .
'&refid=' . (int)$this->refid;
		}
		elseif($this->ref)
		{
			// return to the list view that referred to this item
			$this->referral = '&ref=' . (string)$this->ref;
		}
		// check return value
		if (!is_null($return))
		{
			// add the return value
			$this->referral .= '&return=' . (string)$return;
		}

		// Set the toolbar
		$this->addToolBar();
		
		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		// Display the template
		parent::display($tpl);

		// Set the document
		$this->setDocument();
	}


	/**
	 * Setting the toolbar
	 */
	protected function addToolBar()
	{
		JFactory::getApplication()->input->set('hidemainmenu',
true);
		$user = JFactory::getUser();
		$userId	= $user->id;
		$isNew = $this->item->id == 0;

		JToolbarHelper::title( JText::_($isNew ?
'COM_RESERVATION_SICK_NEW' :
'COM_RESERVATION_SICK_EDIT'), 'pencil-2 article-add');
		// Built the actions for new and existing records.
		if (ReservationHelper::checkString($this->referral))
		{
			if ($this->canDo->get('core.create') && $isNew)
			{
				// We can create the record.
				JToolBarHelper::save('sick.save', 'JTOOLBAR_SAVE');
			}
			elseif ($this->canDo->get('core.edit'))
			{
				// We can save the record.
				JToolBarHelper::save('sick.save', 'JTOOLBAR_SAVE');
			}
			if ($isNew)
			{
				// Do not creat but cancel.
				JToolBarHelper::cancel('sick.cancel',
'JTOOLBAR_CANCEL');
			}
			else
			{
				// We can close it.
				JToolBarHelper::cancel('sick.cancel',
'JTOOLBAR_CLOSE');
			}
		}
		else
		{
			if ($isNew)
			{
				// For new records, check the create permission.
				if ($this->canDo->get('core.create'))
				{
					JToolBarHelper::apply('sick.apply',
'JTOOLBAR_APPLY');
					JToolBarHelper::save('sick.save',
'JTOOLBAR_SAVE');
					JToolBarHelper::custom('sick.save2new',
'save-new.png', 'save-new_f2.png',
'JTOOLBAR_SAVE_AND_NEW', false);
				};
				JToolBarHelper::cancel('sick.cancel',
'JTOOLBAR_CANCEL');
			}
			else
			{
				if ($this->canDo->get('core.edit'))
				{
					// We can save the new record
					JToolBarHelper::apply('sick.apply',
'JTOOLBAR_APPLY');
					JToolBarHelper::save('sick.save',
'JTOOLBAR_SAVE');
					// We can save this record, but check the create permission to see
					// if we can return to make a new one.
					if ($this->canDo->get('core.create'))
					{
						JToolBarHelper::custom('sick.save2new',
'save-new.png', 'save-new_f2.png',
'JTOOLBAR_SAVE_AND_NEW', false);
					}
				}
				$canVersion = ($this->canDo->get('core.version')
&& $this->canDo->get('sick.version'));
				if ($this->state->params->get('save_history', 1)
&& $this->canDo->get('core.edit') &&
$canVersion)
				{
					JToolbarHelper::versions('com_reservation.sick',
$this->item->id);
				}
				if ($this->canDo->get('core.create'))
				{
					JToolBarHelper::custom('sick.save2copy',
'save-copy.png', 'save-copy_f2.png',
'JTOOLBAR_SAVE_AS_COPY', false);
				}
				JToolBarHelper::cancel('sick.cancel',
'JTOOLBAR_CLOSE');
			}
		}
		JToolbarHelper::divider();
		// set help url for this view if found
		$help_url = ReservationHelper::getHelpUrl('sick');
		if (ReservationHelper::checkString($help_url))
		{
			JToolbarHelper::help('COM_RESERVATION_HELP_MANAGER', false,
$help_url);
		}
	}

	/**
	 * Escapes a value for output in a view script.
	 *
	 * @param   mixed  $var  The output to escape.
	 *
	 * @return  mixed  The escaped value.
	 */
	public function escape($var)
	{
		if(strlen($var) > 30)
		{
    		// use the helper htmlEscape method instead and shorten the string
			return ReservationHelper::htmlEscape($var, $this->_charset, true,
30);
		}
		// use the helper htmlEscape method instead.
		return ReservationHelper::htmlEscape($var, $this->_charset);
	}

	/**
	 * Method to set up the document properties
	 *
	 * @return void
	 */
	protected function setDocument()
	{
		$isNew = ($this->item->id < 1);
		if (!isset($this->document))
		{
			$this->document = JFactory::getDocument();
		}
		$this->document->setTitle(JText::_($isNew ?
'COM_RESERVATION_SICK_NEW' :
'COM_RESERVATION_SICK_EDIT'));
		$this->document->addStyleSheet(JURI::root() .
"administrator/components/com_reservation/assets/css/sick.css",
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') : 'text/css');
		// Add Ajax Token
		$this->document->addScriptDeclaration("var token =
'".JSession::getFormToken()."';");
		$this->document->addScript(JURI::root() . $this->script,
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') :
'text/javascript');
		$this->document->addScript(JURI::root() .
"administrator/components/com_reservation/views/sick/submitbutton.js",
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') :
'text/javascript'); 

/***[JCBGUI.admin_view.php_document.113.$$$$]***/
        $getCityAjaxRoute=
JRoute::_('index.php?option=com_reservation&view=sick');
       
$this->document->addScriptOptions('route',$getCityAjaxRoute);
       
$this->document->addScriptOptions('token',JFactory::getSession()->getFormToken());/***[/JCBGUI$$$$]***/

		JText::script('view not acceptable. Error');
	}
}
PK5~�[�#o,,views/sicks/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[Sʼ�views/sicks/tmpl/default.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

JHtml::_('behavior.tooltip');
JHtml::_('behavior.multiselect');
JHtml::_('dropdown.init');
JHtml::_('formbehavior.chosen',
'.multipleAccessLevels', null,
array('placeholder_text_multiple' => '- ' .
JText::_('COM_RESERVATION_FILTER_SELECT_ACCESS') . '
-'));
JHtml::_('formbehavior.chosen', 'select');
if ($this->saveOrder)
{
	$saveOrderingUrl =
'index.php?option=com_reservation&task=sicks.saveOrderAjax&tmpl=component';
	JHtml::_('sortablelist.sortable', 'sickList',
'adminForm', strtolower($this->listDirn), $saveOrderingUrl);
}
?>
<form action="<?php echo
JRoute::_('index.php?option=com_reservation&view=sicks');
?>" method="post" name="adminForm"
id="adminForm">
<?php if(!empty( $this->sidebar)): ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif; ?>
<?php
	// Add the searchtools
	echo JLayoutHelper::render('joomla.searchtools.default',
array('view' => $this));
?>
<?php if (empty($this->items)): ?>
	<div class="alert alert-no-items">
		<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
	</div>
<?php else : ?>
	<table class="table table-striped"
id="sickList">
		<thead><?php echo
$this->loadTemplate('head');?></thead>
		<tfoot><?php echo
$this->loadTemplate('foot');?></tfoot>
		<tbody><?php echo
$this->loadTemplate('body');?></tbody>
	</table>
	<?php // Load the batch processing form. ?>
	<?php if ($this->canCreate && $this->canEdit) : ?>
		<?php echo JHtml::_(
			'bootstrap.renderModal',
			'collapseModal',
			array(
				'title' =>
JText::_('COM_RESERVATION_SICKS_BATCH_OPTIONS'),
				'footer' =>
$this->loadTemplate('batch_footer')
			),
			$this->loadTemplate('batch_body')
		); ?>
	<?php endif; ?>
	<input type="hidden" name="boxchecked"
value="0" />
	</div>
<?php endif; ?>
	<input type="hidden" name="task" value=""
/>
	<?php echo JHtml::_('form.token'); ?>
</form>
PK5~�[�W����'views/sicks/tmpl/default_batch_body.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_batch_body.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>

<p><?php echo
JText::_('COM_RESERVATION_SICKS_BATCH_TIP'); ?></p>
<?php echo $this->batchDisplay;
?>PK5~�[/���)views/sicks/tmpl/default_batch_footer.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_batch_footer.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<!-- clear the batch values if cancel -->
<button class="btn" type="button"
onclick="" data-dismiss="modal">
	<?php echo JText::_('JCANCEL'); ?>
</button>
<!-- post the batch values if process -->
<button class="btn btn-success" type="submit"
onclick="Joomla.submitbutton('sick.batch');">
	<?php echo JText::_('JGLOBAL_BATCH_PROCESS'); ?>
</button>PK5~�[�nGE��!views/sicks/tmpl/default_body.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_body.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

$edit =
"index.php?option=com_reservation&view=sicks&task=sick.edit";

?>
<?php foreach ($this->items as $i => $item): ?>
	<?php
		$canCheckin = $this->user->authorise('core.manage',
'com_checkin') || $item->checked_out == $this->user->id
|| $item->checked_out == 0;
		$userChkOut = JFactory::getUser($item->checked_out);
		$canDo =
ReservationHelper::getActions('sick',$item,'sicks');
	?>
	<tr class="row<?php echo $i % 2; ?>">
		<td class="order nowrap center hidden-phone">
		<?php if ($canDo->get('core.edit.state')): ?>
			<?php
				$iconClass = '';
				if (!$this->saveOrder)
				{
					$iconClass = ' inactive tip-top" hasTooltip"
title="' . JHtml::tooltipText('JORDERINGDISABLED');
				}
			?>
			<span class="sortable-handler<?php echo $iconClass;
?>">
				<i class="icon-menu"></i>
			</span>
			<?php if ($this->saveOrder) : ?>
				<input type="text" style="display:none"
name="order[]" size="5"
				value="<?php echo $item->ordering; ?>"
class="width-20 text-area-order " />
			<?php endif; ?>
		<?php else: ?>
			&#8942;
		<?php endif; ?>
		</td>
		<td class="nowrap center">
		<?php if ($canDo->get('core.edit')): ?>
				<?php if ($item->checked_out) : ?>
					<?php if ($canCheckin) : ?>
						<?php echo JHtml::_('grid.id', $i, $item->id); ?>
					<?php else: ?>
						&#9633;
					<?php endif; ?>
				<?php else: ?>
					<?php echo JHtml::_('grid.id', $i, $item->id); ?>
				<?php endif; ?>
		<?php else: ?>
			&#9633;
		<?php endif; ?>
		</td>
		<td class="nowrap">
			<div class="name">
				<?php if ($canDo->get('core.edit')): ?>
					<a href="<?php echo $edit; ?>&id=<?php echo
$item->id; ?>"><?php echo
JFactory::getUser((int)$item->userid)->name; ?></a>
					<?php if ($item->checked_out): ?>
						<?php echo JHtml::_('jgrid.checkedout', $i,
$userChkOut->name, $item->checked_out_time, 'sicks.',
$canCheckin); ?>
					<?php endif; ?>
				<?php else: ?>
					<?php echo JFactory::getUser((int)$item->userid)->name; ?>
				<?php endif; ?>
			</div>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->phonenumber); ?>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->capitalid_name); ?>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->cityid_name); ?>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->image); ?>
		</td>
		<td class="hidden-phone">
			<?php echo $this->escape($item->cardnumber); ?>
		</td>
		<td class="center">
		<?php if ($canDo->get('core.edit.state')) : ?>
				<?php if ($item->checked_out) : ?>
					<?php if ($canCheckin) : ?>
						<?php echo JHtml::_('jgrid.published',
$item->published, $i, 'sicks.', true, 'cb'); ?>
					<?php else: ?>
						<?php echo JHtml::_('jgrid.published',
$item->published, $i, 'sicks.', false, 'cb'); ?>
					<?php endif; ?>
				<?php else: ?>
					<?php echo JHtml::_('jgrid.published',
$item->published, $i, 'sicks.', true, 'cb'); ?>
				<?php endif; ?>
		<?php else: ?>
			<?php echo JHtml::_('jgrid.published', $item->published,
$i, 'sicks.', false, 'cb'); ?>
		<?php endif; ?>
		</td>
		<td class="nowrap center hidden-phone">
			<?php echo $item->id; ?>
		</td>
	</tr>
<?php endforeach;
?>PK5~�[���7��!views/sicks/tmpl/default_foot.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_foot.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<tr>
	<td colspan="10"><?php echo
$this->pagination->getListFooter(); ?></td>
</tr>PK5~�[�*z"!views/sicks/tmpl/default_head.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_head.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<tr>
	<?php if ($this->canEdit&& $this->canState): ?>
		<th width="1%" class="nowrap center
hidden-phone">
			<?php echo JHtml::_('searchtools.sort', '',
'a.ordering', $this->listDirn, $this->listOrder, null,
'asc', 'JGRID_HEADING_ORDERING',
'icon-menu-2'); ?>
		</th>
		<th width="20" class="nowrap center">
			<?php echo JHtml::_('grid.checkall'); ?>
		</th>
	<?php else: ?>
		<th width="20" class="nowrap center
hidden-phone">
			&#9662;
		</th>
		<th width="20" class="nowrap center">
			&#9632;
		</th>
	<?php endif; ?>
	<th class="nowrap" >
			<?php echo JText::_('COM_RESERVATION_SICK_USERID_LABEL');
?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo
JText::_('COM_RESERVATION_SICK_PHONENUMBER_LABEL'); ?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo
JText::_('COM_RESERVATION_SICK_CAPITALID_LABEL'); ?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo JText::_('COM_RESERVATION_SICK_CITYID_LABEL');
?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo JText::_('COM_RESERVATION_SICK_IMAGE_LABEL');
?>
	</th>
	<th class="nowrap hidden-phone" >
			<?php echo
JText::_('COM_RESERVATION_SICK_CARDNUMBER_LABEL'); ?>
	</th>
	<?php if ($this->canState): ?>
		<th width="10" class="nowrap center" >
			<?php echo JHtml::_('searchtools.sort',
'COM_RESERVATION_SICK_STATUS', 'a.published',
$this->listDirn, $this->listOrder); ?>
		</th>
	<?php else: ?>
		<th width="10" class="nowrap center" >
			<?php echo JText::_('COM_RESERVATION_SICK_STATUS'); ?>
		</th>
	<?php endif; ?>
	<th width="5" class="nowrap center hidden-phone"
>
			<?php echo JHtml::_('searchtools.sort',
'COM_RESERVATION_SICK_ID', 'a.id', $this->listDirn,
$this->listOrder); ?>
	</th>
</tr>PK5~�[_c�P22$views/sicks/tmpl/default_toolbar.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		default_toolbar.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

?>
<div id="filter-bar" class="btn-toolbar">
        <div class="filter-search btn-group pull-left">
            <label for="filter_search"
class="element-invisible"><?php echo
JText::_('Search');?></label>
            <input type="text" name="filter_search"
id="filter_search" placeholder="<?php echo
JText::_('JSEARCH_FILTER'); ?>" value="<?php echo
$this->escape($this->state->get('filter.search'));
?>" class="hasTooltip" title="<?php echo
JHtml::tooltipText('Search Sicks'); ?>" />
        </div>
        <div class="btn-group pull-left">
            <button type="submit" class="btn
hasTooltip" title="<?php echo
JHtml::tooltipText('JSEARCH_FILTER_SUBMIT'); ?>"><i
class="icon-search"></i></button>
            <button type="button" class="btn
hasTooltip" title="<?php echo
JHtml::tooltipText('JSEARCH_FILTER_CLEAR'); ?>"
onclick="document.id('filter_search').value='';this.form.submit();"><i
class="icon-remove"></i></button>
        </div>
        <div class="btn-group pull-right hidden-phone">
            <label for="limit"
class="element-invisible"><?php echo
JText::_('JFIELD_PLG_SEARCH_SEARCHLIMIT_DESC');?></label>
            <?php echo $this->pagination->getLimitBox(); ?>
        </div>
        <div class="btn-group pull-right hidden-phone">
            <label for="directionTable"
class="element-invisible"><?php echo
JText::_('JFIELD_ORDERING_DESC');?></label>
            <select name="directionTable"
id="directionTable" class="input-medium"
onchange="Joomla.orderTable()">
                <option value=""><?php echo
JText::_('JFIELD_ORDERING_DESC');?></option>
                <option value="asc" <?php if
($this->listDirn == 'asc') echo
'selected="selected"'; ?>><?php echo
JText::_('JGLOBAL_ORDER_ASCENDING');?></option>
                <option value="desc" <?php if
($this->listDirn == 'desc') echo
'selected="selected"'; ?>><?php echo
JText::_('JGLOBAL_ORDER_DESCENDING');?></option>
            </select>
        </div>
        <div class="btn-group pull-right">
            <label for="sortTable"
class="element-invisible"><?php echo
JText::_('JGLOBAL_SORT_BY');?></label>
            <select name="sortTable" id="sortTable"
class="input-medium" onchange="Joomla.orderTable()">
                <option value=""><?php echo
JText::_('JGLOBAL_SORT_BY');?></option>
                <?php echo JHtml::_('select.options',
$this->getSortFields(), 'value', 'text',
$this->listOrder);?>
            </select>
        </div>
    </div>
<div class="clearfix">
</div>PK5~�[�#o,,views/sicks/tmpl/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[�[��@@views/sicks/view.html.phpnu�[���<?php
/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		view.html.php
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

/**
 * Reservation View class for the Sicks
 */
class ReservationViewSicks extends JViewLegacy
{
	/**
	 * Sicks view display method
	 * @return void
	 */
	function display($tpl = null)
	{
		if ($this->getLayout() !== 'modal')
		{
			// Include helper submenu
			ReservationHelper::addSubmenu('sicks');
		}

		// Assign data to the view
		$this->items = $this->get('Items');
		$this->pagination = $this->get('Pagination');
		$this->state = $this->get('State');
		$this->user = JFactory::getUser();
		// Load the filter form from xml.
		$this->filterForm = $this->get('FilterForm');
		// Load the active filters.
		$this->activeFilters = $this->get('ActiveFilters');
		// Add the list ordering clause.
		$this->listOrder =
$this->escape($this->state->get('list.ordering',
'a.id'));
		$this->listDirn =
$this->escape($this->state->get('list.direction',
'DESC'));
		$this->saveOrder = $this->listOrder == 'a.ordering';
		// set the return here value
		$this->return_here = urlencode(base64_encode((string)
JUri::getInstance()));
		// get global action permissions
		$this->canDo = ReservationHelper::getActions('sick');
		$this->canEdit = $this->canDo->get('core.edit');
		$this->canState =
$this->canDo->get('core.edit.state');
		$this->canCreate = $this->canDo->get('core.create');
		$this->canDelete = $this->canDo->get('core.delete');
		$this->canBatch = $this->canDo->get('core.batch');

		// We don't need toolbar in the modal window.
		if ($this->getLayout() !== 'modal')
		{
			$this->addToolbar();
			$this->sidebar = JHtmlSidebar::render();
			// load the batch html
			if ($this->canCreate && $this->canEdit &&
$this->canState)
			{
				$this->batchDisplay = JHtmlBatch_::render();
			}
		}
		
		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		// Display the template
		parent::display($tpl);

		// Set the document
		$this->setDocument();
	}

	/**
	 * Setting the toolbar
	 */
	protected function addToolBar()
	{
		JToolBarHelper::title(JText::_('COM_RESERVATION_SICKS'),
'joomla');
		JHtmlSidebar::setAction('index.php?option=com_reservation&view=sicks');
		JFormHelper::addFieldPath(JPATH_COMPONENT . '/models/fields');

		if ($this->canCreate)
		{
			JToolBarHelper::addNew('sick.add');
		}

		// Only load if there are items
		if (ReservationHelper::checkArray($this->items))
		{
			if ($this->canEdit)
			{
				JToolBarHelper::editList('sick.edit');
			}

			if ($this->canState)
			{
				JToolBarHelper::publishList('sicks.publish');
				JToolBarHelper::unpublishList('sicks.unpublish');
				JToolBarHelper::archiveList('sicks.archive');

				if ($this->canDo->get('core.admin'))
				{
					JToolBarHelper::checkin('sicks.checkin');
				}
			}

			// Add a batch button
			if ($this->canBatch && $this->canCreate &&
$this->canEdit && $this->canState)
			{
				// Get the toolbar object instance
				$bar = JToolBar::getInstance('toolbar');
				// set the batch button name
				$title = JText::_('JTOOLBAR_BATCH');
				// Instantiate a new JLayoutFile instance and render the batch button
				$layout = new JLayoutFile('joomla.toolbar.batch');
				// add the button to the page
				$dhtml = $layout->render(array('title' => $title));
				$bar->appendButton('Custom', $dhtml, 'batch');
			}

			if ($this->state->get('filter.published') == -2
&& ($this->canState && $this->canDelete))
			{
				JToolbarHelper::deleteList('', 'sicks.delete',
'JTOOLBAR_EMPTY_TRASH');
			}
			elseif ($this->canState && $this->canDelete)
			{
				JToolbarHelper::trash('sicks.trash');
			}

			if ($this->canDo->get('core.export') &&
$this->canDo->get('sick.export'))
			{
				JToolBarHelper::custom('sicks.exportData',
'download', '',
'COM_RESERVATION_EXPORT_DATA', true);
			}
		}

		if ($this->canDo->get('core.import') &&
$this->canDo->get('sick.import'))
		{
			JToolBarHelper::custom('sicks.importData', 'upload',
'', 'COM_RESERVATION_IMPORT_DATA', false);
		}

		// set help url for this view if found
		$help_url = ReservationHelper::getHelpUrl('sicks');
		if (ReservationHelper::checkString($help_url))
		{
				JToolbarHelper::help('COM_RESERVATION_HELP_MANAGER', false,
$help_url);
		}

		// add the options comp button
		if ($this->canDo->get('core.admin') ||
$this->canDo->get('core.options'))
		{
			JToolBarHelper::preferences('com_reservation');
		}

		// Only load published batch if state and batch is allowed
		if ($this->canState && $this->canBatch)
		{
			JHtmlBatch_::addListSelection(
				JText::_('COM_RESERVATION_KEEP_ORIGINAL_STATE'),
				'batch[published]',
				JHtml::_('select.options',
JHtml::_('jgrid.publishedOptions', array('all' =>
false)), 'value', 'text', '', true)
			);
		}

		// Only load access batch if create, edit and batch is allowed
		if ($this->canBatch && $this->canCreate &&
$this->canEdit)
		{
			JHtmlBatch_::addListSelection(
				JText::_('COM_RESERVATION_KEEP_ORIGINAL_ACCESS'),
				'batch[access]',
				JHtml::_('select.options',
JHtml::_('access.assetgroups'), 'value',
'text')
			);
		}
	}

	/**
	 * Method to set up the document properties
	 *
	 * @return void
	 */
	protected function setDocument()
	{
		if (!isset($this->document))
		{
			$this->document = JFactory::getDocument();
		}
		$this->document->setTitle(JText::_('COM_RESERVATION_SICKS'));
		$this->document->addStyleSheet(JURI::root() .
"administrator/components/com_reservation/assets/css/sicks.css",
(ReservationHelper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') : 'text/css');
	}

	/**
	 * Escapes a value for output in a view script.
	 *
	 * @param   mixed  $var  The output to escape.
	 *
	 * @return  mixed  The escaped value.
	 */
	public function escape($var)
	{
		if(strlen($var) > 50)
		{
			// use the helper htmlEscape method instead and shorten the string
			return ReservationHelper::htmlEscape($var, $this->_charset, true);
		}
		// use the helper htmlEscape method instead.
		return ReservationHelper::htmlEscape($var, $this->_charset);
	}

	/**
	 * Returns an array of fields the table can be sorted by
	 *
	 * @return  array  Array containing the field name to sort by as the key
and display text as value
	 */
	protected function getSortFields()
	{
		return array(
			'a.ordering' =>
JText::_('JGRID_HEADING_ORDERING'),
			'a.published' => JText::_('JSTATUS'),
			'a.id' => JText::_('JGRID_HEADING_ID')
		);
	}
}
PK5~�[�W���views/submitbutton.jsnu�[���###BOM###

Joomla.submitbutton = function(task)
{
	if (task == ''){
		return false;
	} else { 
		var action = task.split('.');
		if (action[1] == 'cancel' || action[1] == 'close' ||
document.formvalidator.isValid(document.getElementById("adminForm"))){
			Joomla.submitform(task,
document.getElementById("adminForm"));
			return true;
		} else {
			alert(Joomla.JText._('###view###, some values are not
acceptable.','Some values are unacceptable'));
			return false;
		}
	}
}PK5~�[X��6��views/tmpl/default.phpnu�[���<?php
/**
 * @package    Joomla.Component.Builder
 *
 * @created    30th April, 2015
 * @author     Llewellyn van der Merwe
<http://www.joomlacomponentbuilder.com>
 * @github     Joomla Component Builder
<https://github.com/vdm-io/Joomla-Component-Builder>
 * @copyright  Copyright (C) 2015 Vast Development Method. All rights
reserved.
 * @license    GNU General Public License version 2 or later; see
LICENSE.txt
 */

// No direct access to this file
defined('_JEXEC') or die('Restricted access');
?>
###BOM###

// No direct access to this file
defined('_JEXEC') or die('Restricted
access');###LICENSE_LOCKED_DEFINED###

###ADMIN_VIEWS_HEADER###
if ($this->saveOrder)
{
	$saveOrderingUrl =
'index.php?option=com_###component###&task=###views###.saveOrderAjax&tmpl=component';
	JHtml::_('sortablelist.sortable', '###view###List',
'adminForm', strtolower($this->listDirn), $saveOrderingUrl);
}
?>
###VIEWS_DEFAULT_BODY######VIEWS_FOOTER_SCRIPT###
PK5~�[J��!views/tmpl/default_batch_body.phpnu�[���<?php
/**
 * @package    Joomla.Component.Builder
 *
 * @created    30th April, 2015
 * @author     Llewellyn van der Merwe
<http://www.joomlacomponentbuilder.com>
 * @github     Joomla Component Builder
<https://github.com/vdm-io/Joomla-Component-Builder>
 * @copyright  Copyright (C) 2015 Vast Development Method. All rights
reserved.
 * @license    GNU General Public License version 2 or later; see
LICENSE.txt
 */

// No direct access to this file
defined('_JEXEC') or die('Restricted access');
?>
###BOM###

// No direct access to this file
defined('_JEXEC') or die('Restricted
access');###LICENSE_LOCKED_DEFINED###

?>

<p><?php echo
JText::_('COM_###COMPONENT###_###VIEWS###_BATCH_TIP');
?></p>
<?php echo $this->batchDisplay;
?>PK5~�[�	�B#views/tmpl/default_batch_footer.phpnu�[���<?php
/**
 * @package    Joomla.Component.Builder
 *
 * @created    30th April, 2015
 * @author     Llewellyn van der Merwe
<http://www.joomlacomponentbuilder.com>
 * @github     Joomla Component Builder
<https://github.com/vdm-io/Joomla-Component-Builder>
 * @copyright  Copyright (C) 2015 Vast Development Method. All rights
reserved.
 * @license    GNU General Public License version 2 or later; see
LICENSE.txt
 */

// No direct access to this file
defined('_JEXEC') or die('Restricted access');
?>
###BOM###

// No direct access to this file
defined('_JEXEC') or die('Restricted
access');###LICENSE_LOCKED_DEFINED###

?>
<!-- clear the batch values if cancel -->
<button class="btn" type="button"
onclick="###BATCH_ONCLICK_CANCEL_SCRIPT###"
data-dismiss="modal">
	<?php echo JText::_('JCANCEL'); ?>
</button>
<!-- post the batch values if process -->
<button class="btn btn-success" type="submit"
onclick="Joomla.submitbutton('###view###.batch');">
	<?php echo JText::_('JGLOBAL_BATCH_PROCESS'); ?>
</button>PK5~�[ԧ����views/tmpl/default_body.phpnu�[���<?php
/**
 * @package    Joomla.Component.Builder
 *
 * @created    30th April, 2015
 * @author     Llewellyn van der Merwe
<http://www.joomlacomponentbuilder.com>
 * @github     Joomla Component Builder
<https://github.com/vdm-io/Joomla-Component-Builder>
 * @copyright  Copyright (C) 2015 Vast Development Method. All rights
reserved.
 * @license    GNU General Public License version 2 or later; see
LICENSE.txt
 */

// No direct access to this file
defined('_JEXEC') or die('Restricted access');
?>
###BOM###

// No direct access to this file
defined('_JEXEC') or die('Restricted
access');###LICENSE_LOCKED_DEFINED###

$edit =
"index.php?option=com_###component###&view=###views###&task=###view###.edit";

?>
###LISTBODY###PK5~�["���views/tmpl/default_foot.phpnu�[���<?php
/**
 * @package    Joomla.Component.Builder
 *
 * @created    30th April, 2015
 * @author     Llewellyn van der Merwe
<http://www.joomlacomponentbuilder.com>
 * @github     Joomla Component Builder
<https://github.com/vdm-io/Joomla-Component-Builder>
 * @copyright  Copyright (C) 2015 Vast Development Method. All rights
reserved.
 * @license    GNU General Public License version 2 or later; see
LICENSE.txt
 */

// No direct access to this file
defined('_JEXEC') or die('Restricted access');
?>
###BOM###

// No direct access to this file
defined('_JEXEC') or die('Restricted
access');###LICENSE_LOCKED_DEFINED###

?>
<tr>
	<td colspan="###LISTCOLNR###"><?php echo
$this->pagination->getListFooter(); ?></td>
</tr>PK5~�[�����views/tmpl/default_head.phpnu�[���<?php
/**
 * @package    Joomla.Component.Builder
 *
 * @created    30th April, 2015
 * @author     Llewellyn van der Merwe
<http://www.joomlacomponentbuilder.com>
 * @github     Joomla Component Builder
<https://github.com/vdm-io/Joomla-Component-Builder>
 * @copyright  Copyright (C) 2015 Vast Development Method. All rights
reserved.
 * @license    GNU General Public License version 2 or later; see
LICENSE.txt
 */

// No direct access to this file
defined('_JEXEC') or die('Restricted access');
?>
###BOM###

// No direct access to this file
defined('_JEXEC') or die('Restricted
access');###LICENSE_LOCKED_DEFINED###

?>
###LISTHEAD###PK5~�[���\\views/tmpl/default_toolbar.phpnu�[���<?php
/**
 * @package    Joomla.Component.Builder
 *
 * @created    30th April, 2015
 * @author     Llewellyn van der Merwe
<http://www.joomlacomponentbuilder.com>
 * @github     Joomla Component Builder
<https://github.com/vdm-io/Joomla-Component-Builder>
 * @copyright  Copyright (C) 2015 Vast Development Method. All rights
reserved.
 * @license    GNU General Public License version 2 or later; see
LICENSE.txt
 */

// No direct access to this file
defined('_JEXEC') or die('Restricted access');
?>
###BOM###

// No direct access to this file
defined('_JEXEC') or die('Restricted
access');###LICENSE_LOCKED_DEFINED###

?>
<div id="filter-bar" class="btn-toolbar">
        <div class="filter-search btn-group pull-left">
            <label for="filter_search"
class="element-invisible"><?php echo
JText::_('Search');?></label>
            <input type="text" name="filter_search"
id="filter_search" placeholder="<?php echo
JText::_('JSEARCH_FILTER'); ?>" value="<?php echo
$this->escape($this->state->get('filter.search'));
?>" class="hasTooltip" title="<?php echo
JHtml::tooltipText('Search ###Views###'); ?>" />
        </div>
        <div class="btn-group pull-left">
            <button type="submit" class="btn
hasTooltip" title="<?php echo
JHtml::tooltipText('JSEARCH_FILTER_SUBMIT'); ?>"><i
class="icon-search"></i></button>
            <button type="button" class="btn
hasTooltip" title="<?php echo
JHtml::tooltipText('JSEARCH_FILTER_CLEAR'); ?>"
onclick="document.id('filter_search').value='';this.form.submit();"><i
class="icon-remove"></i></button>
        </div>
        <div class="btn-group pull-right hidden-phone">
            <label for="limit"
class="element-invisible"><?php echo
JText::_('JFIELD_PLG_SEARCH_SEARCHLIMIT_DESC');?></label>
            <?php echo $this->pagination->getLimitBox(); ?>
        </div>
        <div class="btn-group pull-right hidden-phone">
            <label for="directionTable"
class="element-invisible"><?php echo
JText::_('JFIELD_ORDERING_DESC');?></label>
            <select name="directionTable"
id="directionTable" class="input-medium"
onchange="Joomla.orderTable()">
                <option value=""><?php echo
JText::_('JFIELD_ORDERING_DESC');?></option>
                <option value="asc" <?php if
($this->listDirn == 'asc') echo
'selected="selected"'; ?>><?php echo
JText::_('JGLOBAL_ORDER_ASCENDING');?></option>
                <option value="desc" <?php if
($this->listDirn == 'desc') echo
'selected="selected"'; ?>><?php echo
JText::_('JGLOBAL_ORDER_DESCENDING');?></option>
            </select>
        </div>
        <div class="btn-group pull-right">
            <label for="sortTable"
class="element-invisible"><?php echo
JText::_('JGLOBAL_SORT_BY');?></label>
            <select name="sortTable" id="sortTable"
class="input-medium"
onchange="Joomla.orderTable()">
                <option value=""><?php echo
JText::_('JGLOBAL_SORT_BY');?></option>
                <?php echo JHtml::_('select.options',
$this->getSortFields(), 'value', 'text',
$this->listOrder);?>
            </select>
        </div>
    </div>
<div class="clearfix">
</div>PK5~�[4��aviews/tmpl/edit.phpnu�[���<?php
/**
 * @package    Joomla.Component.Builder
 *
 * @created    30th April, 2015
 * @author     Llewellyn van der Merwe
<http://www.joomlacomponentbuilder.com>
 * @github     Joomla Component Builder
<https://github.com/vdm-io/Joomla-Component-Builder>
 * @copyright  Copyright (C) 2015 Vast Development Method. All rights
reserved.
 * @license    GNU General Public License version 2 or later; see
LICENSE.txt
 */

// No direct access to this file
defined('_JEXEC') or die('Restricted access');
?>
###BOM###

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

###ADMIN_VIEW_HEADER###
$componentParams = $this->params; // will be removed just use
$this->params instead
?>
###EDITBODYFADEIN###
<form action="<?php echo
JRoute::_('index.php?option=com_###component###&layout=edit&id='.
(int) $this->item->id . $this->referral); ?>"
method="post" name="adminForm" id="adminForm"
class="form-validate"
enctype="multipart/form-data">
###EDITBODY###
</form>
</div>###EDITBODYSCRIPT###
PK5~�[�#o,,views/tmpl/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[a�ܰ��views/view.html.phpnu�[���<?php
/**
 * @package    Joomla.Component.Builder
 *
 * @created    30th April, 2015
 * @author     Llewellyn van der Merwe
<http://www.joomlacomponentbuilder.com>
 * @github     Joomla Component Builder
<https://github.com/vdm-io/Joomla-Component-Builder>
 * @copyright  Copyright (C) 2015 Vast Development Method. All rights
reserved.
 * @license    GNU General Public License version 2 or later; see
LICENSE.txt
 */

// No direct access to this file
defined('_JEXEC') or die('Restricted access');
?>
###BOM###

// No direct access to this file
defined('_JEXEC') or die('Restricted
access');###LICENSE_LOCKED_DEFINED###

/**
 * ###Component### View class for the ###Views###
 */
class ###Component###View###Views### extends JViewLegacy
{
	/**
	 * ###Views### view display method
	 * @return void
	 */
	function display($tpl = null)
	{
		if ($this->getLayout() !== 'modal')
		{
			// Include helper submenu
			###Component###Helper::addSubmenu('###views###');
		}

		// Assign data to the view
		$this->items = $this->get('Items');
		$this->pagination = $this->get('Pagination');
		$this->state = $this->get('State');
		$this->user = JFactory::getUser();###ADMIN_DIPLAY_METHOD###
		$this->saveOrder = $this->listOrder == 'a.ordering';
		// set the return here value
		$this->return_here = urlencode(base64_encode((string)
JUri::getInstance()));
		// get global action permissions
		$this->canDo =
###Component###Helper::getActions('###view###');###JVIEWLISTCANDO###

		// We don't need toolbar in the modal window.
		if ($this->getLayout() !== 'modal')
		{
			$this->addToolbar();
			$this->sidebar = JHtmlSidebar::render();
			// load the batch html
			if ($this->canCreate && $this->canEdit &&
$this->canState)
			{
				$this->batchDisplay = JHtmlBatch_::render();
			}
		}
		
		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		// Display the template
		parent::display($tpl);

		// Set the document
		$this->setDocument();
	}

	/**
	 * Setting the toolbar
	 */
	protected function addToolBar()
	{
		JToolBarHelper::title(JText::_('COM_###COMPONENT###_###VIEWS###'),
'###ICOMOON###');
		JHtmlSidebar::setAction('index.php?option=com_###component###&view=###views###');
		JFormHelper::addFieldPath(JPATH_COMPONENT . '/models/fields');

		if ($this->canCreate)
		{
			JToolBarHelper::addNew('###view###.add');
		}

		// Only load if there are items
		if (###Component###Helper::checkArray($this->items))
		{
			if ($this->canEdit)
			{
				JToolBarHelper::editList('###view###.edit');
			}

			if ($this->canState)
			{
				JToolBarHelper::publishList('###views###.publish');
				JToolBarHelper::unpublishList('###views###.unpublish');
				JToolBarHelper::archiveList('###views###.archive');

				if ($this->canDo->get('core.admin'))
				{
					JToolBarHelper::checkin('###views###.checkin');
				}
			}

			// Add a batch button
			if ($this->canBatch && $this->canCreate &&
$this->canEdit && $this->canState)
			{
				// Get the toolbar object instance
				$bar = JToolBar::getInstance('toolbar');
				// set the batch button name
				$title = JText::_('JTOOLBAR_BATCH');
				// Instantiate a new JLayoutFile instance and render the batch button
				$layout = new JLayoutFile('joomla.toolbar.batch');
				// add the button to the page
				$dhtml = $layout->render(array('title' => $title));
				$bar->appendButton('Custom', $dhtml, 'batch');
			}###CUSTOM_ADMIN_DYNAMIC_BUTTONS######ADMIN_CUSTOM_BUTTONS_LIST###

			if ($this->state->get('filter.published') == -2
&& ($this->canState && $this->canDelete))
			{
				JToolbarHelper::deleteList('',
'###views###.delete', 'JTOOLBAR_EMPTY_TRASH');
			}
			elseif ($this->canState && $this->canDelete)
			{
				JToolbarHelper::trash('###views###.trash');
			}###EXPORTBUTTON###
		}###ADMIN_CUSTOM_FUNCTION_ONLY_BUTTONS_LIST######IMPORTBUTTON###

		// set help url for this view if found
		$help_url = ###Component###Helper::getHelpUrl('###views###');
		if (###Component###Helper::checkString($help_url))
		{
				JToolbarHelper::help('COM_###COMPONENT###_HELP_MANAGER',
false, $help_url);
		}

		// add the options comp button
		if ($this->canDo->get('core.admin') ||
$this->canDo->get('core.options'))
		{
			JToolBarHelper::preferences('com_###component###');
		}###FILTERFIELDDISPLAYHELPER######BATCHDISPLAYHELPER###
	}

	/**
	 * Method to set up the document properties
	 *
	 * @return void
	 */
	protected function setDocument()
	{
		if (!isset($this->document))
		{
			$this->document = JFactory::getDocument();
		}
		$this->document->setTitle(JText::_('COM_###COMPONENT###_###VIEWS###'));
		$this->document->addStyleSheet(JURI::root() .
"administrator/components/com_###component###/assets/css/###views###.css",
(###Component###Helper::jVersion()->isCompatible('3.8.0')) ?
array('version' => 'auto') :
'text/css');###ADMIN_ADD_JAVASCRIPT_FILE###
	}

	/**
	 * Escapes a value for output in a view script.
	 *
	 * @param   mixed  $var  The output to escape.
	 *
	 * @return  mixed  The escaped value.
	 */
	public function escape($var)
	{
		if(strlen($var) > 50)
		{
			// use the helper htmlEscape method instead and shorten the string
			return ###Component###Helper::htmlEscape($var, $this->_charset,
true);
		}
		// use the helper htmlEscape method instead.
		return ###Component###Helper::htmlEscape($var, $this->_charset);
	}

	/**
	 * Returns an array of fields the table can be sorted by
	 *
	 * @return  array  Array containing the field name to sort by as the key
and display text as value
	 */
	protected function getSortFields()
	{
		###SORTFIELDS###
	}###FILTERFUNCTIONS###
}
PK5~�[p���bbb/LICENSEnu�[���                  
GNU LESSER GENERAL PUBLIC LICENSE
                       Version 3, 29 June 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.


  This version of the GNU Lesser General Public License incorporates
the terms and conditions of version 3 of the GNU General Public
License, supplemented by the additional permissions listed below.

  0. Additional Definitions.

  As used herein, "this License" refers to version 3 of the GNU
Lesser
General Public License, and the "GNU GPL" refers to version 3 of
the GNU
General Public License.

  "The Library" refers to a covered work governed by this
License,
other than an Application or a Combined Work as defined below.

  An "Application" is any work that makes use of an interface
provided
by the Library, but which is not otherwise based on the Library.
Defining a subclass of a class defined by the Library is deemed a mode
of using an interface provided by the Library.

  A "Combined Work" is a work produced by combining or linking an
Application with the Library.  The particular version of the Library
with which the Combined Work was made is also called the "Linked
Version".

  The "Minimal Corresponding Source" for a Combined Work means
the
Corresponding Source for the Combined Work, excluding any source code
for portions of the Combined Work that, considered in isolation, are
based on the Application, and not on the Linked Version.

  The "Corresponding Application Code" for a Combined Work means
the
object code and/or source code for the Application, including any data
and utility programs needed for reproducing the Combined Work from the
Application, but excluding the System Libraries of the Combined Work.

  1. Exception to Section 3 of the GNU GPL.

  You may convey a covered work under sections 3 and 4 of this License
without being bound by section 3 of the GNU GPL.

  2. Conveying Modified Versions.

  If you modify a copy of the Library, and, in your modifications, a
facility refers to a function or data to be supplied by an Application
that uses the facility (other than as an argument passed when the
facility is invoked), then you may convey a copy of the modified
version:

   a) under this License, provided that you make a good faith effort to
   ensure that, in the event an Application does not supply the
   function or data, the facility still operates, and performs
   whatever part of its purpose remains meaningful, or

   b) under the GNU GPL, with none of the additional permissions of
   this License applicable to that copy.

  3. Object Code Incorporating Material from Library Header Files.

  The object code form of an Application may incorporate material from
a header file that is part of the Library.  You may convey such object
code under terms of your choice, provided that, if the incorporated
material is not limited to numerical parameters, data structure
layouts and accessors, or small macros, inline functions and templates
(ten or fewer lines in length), you do both of the following:

   a) Give prominent notice with each copy of the object code that the
   Library is used in it and that the Library and its use are
   covered by this License.

   b) Accompany the object code with a copy of the GNU GPL and this license
   document.

  4. Combined Works.

  You may convey a Combined Work under terms of your choice that,
taken together, effectively do not restrict modification of the
portions of the Library contained in the Combined Work and reverse
engineering for debugging such modifications, if you also do each of
the following:

   a) Give prominent notice with each copy of the Combined Work that
   the Library is used in it and that the Library and its use are
   covered by this License.

   b) Accompany the Combined Work with a copy of the GNU GPL and this
license
   document.

   c) For a Combined Work that displays copyright notices during
   execution, include the copyright notice for the Library among
   these notices, as well as a reference directing the user to the
   copies of the GNU GPL and this license document.

   d) Do one of the following:

       0) Convey the Minimal Corresponding Source under the terms of this
       License, and the Corresponding Application Code in a form
       suitable for, and under terms that permit, the user to
       recombine or relink the Application with a modified version of
       the Linked Version to produce a modified Combined Work, in the
       manner specified by section 6 of the GNU GPL for conveying
       Corresponding Source.

       1) Use a suitable shared library mechanism for linking with the
       Library.  A suitable mechanism is one that (a) uses at run time
       a copy of the Library already present on the user's computer
       system, and (b) will operate properly with a modified version
       of the Library that is interface-compatible with the Linked
       Version.

   e) Provide Installation Information, but only if you would otherwise
   be required to provide such information under section 6 of the
   GNU GPL, and only to the extent that such information is
   necessary to install and execute a modified version of the
   Combined Work produced by recombining or relinking the
   Application with a modified version of the Linked Version. (If
   you use option 4d0, the Installation Information must accompany
   the Minimal Corresponding Source and Corresponding Application
   Code. If you use option 4d1, you must provide the Installation
   Information in the manner specified by section 6 of the GNU GPL
   for conveying Corresponding Source.)

  5. Combined Libraries.

  You may place library facilities that are a work based on the
Library side by side in a single library together with other library
facilities that are not Applications and are not covered by this
License, and convey such a combined library under terms of your
choice, if you do both of the following:

   a) Accompany the combined library with a copy of the same work based
   on the Library, uncombined with any other library facilities,
   conveyed under the terms of this License.

   b) Give prominent notice with the combined library that part of it
   is a work based on the Library, and explaining where to find the
   accompanying uncombined form of the same work.

  6. Revised Versions of the GNU Lesser General Public License.

  The Free Software Foundation may publish revised and/or new versions
of the GNU Lesser 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
Library as you received it specifies that a certain numbered version
of the GNU Lesser General Public License "or any later version"
applies to it, you have the option of following the terms and
conditions either of that published version or of any later version
published by the Free Software Foundation. If the Library as you
received it does not specify a version number of the GNU Lesser
General Public License, you may choose any version of the GNU Lesser
General Public License ever published by the Free Software Foundation.

  If the Library as you received it specifies that a proxy can decide
whether future versions of the GNU Lesser General Public License shall
apply, that proxy's public statement of acceptance of any version is
permanent authorization for you to choose that version for the
Library.
PK5~�[�.X���
bbb/README.mdnu�[���# BigBlueButton
API for PHP

![Home
Image](https://raw.githubusercontent.com/wiki/bigbluebutton/bigbluebutton-api-php/images/header.png)
[![FOSSA
Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fbigbluebutton%2Fbigbluebutton-api-php.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2Fbigbluebutton%2Fbigbluebutton-api-php?ref=badge_shield)

The official and easy to use **BigBlueButton API for PHP**, makes easy for
developers to use [BigBlueButton][bbb] API for **PHP 7.1+**.

![Packagist](https://img.shields.io/packagist/v/bigbluebutton/bigbluebutton-api-php.svg?label=release)
![PHP from Travis
config](https://img.shields.io/travis/php-v/bigbluebutton/bigbluebutton-api-php.svg)
[![Downloads](https://img.shields.io/packagist/dt/bigbluebutton/bigbluebutton-api-php.svg?style=flat-square)](https://packagist.org/packages/bigbluebutton/bigbluebutton-api-php)

[![Build
Status](https://travis-ci.org/bigbluebutton/bigbluebutton-api-php.svg?branch=master)](https://travis-ci.org/bigbluebutton/bigbluebutton-api-php)
[![Coverage
Status](https://coveralls.io/repos/github/bigbluebutton/bigbluebutton-api-php/badge.svg?branch=master)](https://coveralls.io/github/bigbluebutton/bigbluebutton-api-php?branch=master)
[![Scrutinizer Code
Quality](https://scrutinizer-ci.com/g/bigbluebutton/bigbluebutton-api-php/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/bigbluebutton/bigbluebutton-api-php/?branch=master)

[![@bigbluebutton on
Twitter](https://img.shields.io/badge/twitter-%40bigbluebutton-blue.svg?style=flat)](https://twitter.com/bigbluebutton)
![Website](https://img.shields.io/website-up-down-green-red/http/bigbluebutton.org.svg?label=BigBlueButton.org)

[![PHP
7.1](https://img.shields.io/badge/php-7.2-f33.svg?style=flat-square)](https://php.net/)
[![PHP
7.2](https://img.shields.io/badge/php-7.3-f33.svg?style=flat-square)](https://php.net/)
[![PHP
7.3](https://img.shields.io/badge/php-7.4-f93.svg?style=flat-square)](https://php.net/)
[![PHP
7.4](https://img.shields.io/badge/php-8.0-9c9.svg?style=flat-square)](https://php.net/)
[![PHP
7.4](https://img.shields.io/badge/php-8.1-9c9.svg?style=flat-square)](https://php.net/)

## Installation and usage

The [wiki] contains all the documentation related to the PHP library. We
have also written a samples to show a full
install and usage example.

## Submitting bugs and feature requests

Bugs and feature request are tracked on
[GitHub](https://github.com/bigbluebutton/bigbluebutton-api-php/issues)

## Contributing guidelines
### Code style

Make sure the code style configuration is applied by running PHPCS-Fixer.

```
./vendor/bin/php-cs-fixer fix
```

### Running tests

For every implemented feature add unit tests and check all is green by
running the command below.

```bash
./vendor/bin/phpunit
```

To run a single test

```bash
./vendor/bin/phpunit --filter "BigBlueButtonTest::testApiVersion"
```

[bbb]: http://bigbluebutton.org
[composer]: https://getcomposer.org
[INSTALL]: samples/README.md
[wiki]: https://github.com/bigbluebutton/bigbluebutton-api-php/wiki

## License
[![FOSSA
Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fbigbluebutton%2Fbigbluebutton-api-php.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Fbigbluebutton%2Fbigbluebutton-api-php?ref=badge_large)PK5~�[���66bbb/autoload.phpnu�[���<?php
namespace BigBlueButton;
spl_autoload_register(function ($class) {
    // Namespace of your library
    $namespace = 'BigBlueButton\\';
    
    // The base directory where your library's src/ directory resides
    $baseDir = __DIR__ . '/src/';
    
    // If the namespace does not match, move to the next registered
autoloader
    if (strpos($class, $namespace) !== 0) {
        return;
    }
    
    // Get the relative class name
    $relativeClass = substr($class, strlen($namespace));
    
    // Replace the namespace prefix with the base directory, replace
namespace separators with directory separators
    $file = $baseDir . str_replace('\\', '/',
$relativeClass) . '.php';
    
    // If the file exists, require it
    if (file_exists($file)) {
        require $file;
    }
});
PK5~�[S�oxbbb/codeception.ymlnu�[���actor: Tester
paths:
    tests: tests
    log: tests/_output
    data: tests/_data
    support: tests/_support
    envs: tests/_envs
settings:
    bootstrap: _bootstrap.php
    colors: false
    memory_limit: 1024M
extensions:
    enabled:
        - Codeception\Extension\RunFailed
PK5~�[T����bbb/composer.jsonnu�[���{
  "name": "bigbluebutton/bigbluebutton-api-php",
  "type": "library",
  "description": "BigBlueButton PHP API Library for
PHP",
  "keywords": [
    "bigbluebutton",
    "bbb",
    "api"
  ],
  "homepage": "http://bigbluebutton.org/",
  "license": "LGPL-3.0-or-later",
  "authors": [
    {
      "name": "Ghazi Triki",
      "email": "ghazi.triki@riadvice.tn",
      "role": "Developer"
    }
  ],
  "repositories": {
    "packagist": {
      "url": "https://packagist.org",
      "type": "composer"
    }
  },
  "require": {
    "php": ">=7.1",
    "ext-curl": "*",
    "ext-simplexml": "*",
    "ext-mbstring": "*"
  },
  "require-dev": {
    "ext-mbstring": "*",
    "phpunit/phpunit": "^8.5",
    "fakerphp/faker": "^1.17",
    "friendsofphp/php-cs-fixer": "^3.8.0",
    "squizlabs/php_codesniffer": "^3.7",
    "php-coveralls/php-coveralls": "^2.5.2"
  },
  "options": {
    "symlink": false
  },
  "autoload": {
    "psr-4": {
      "BigBlueButton\\": "src"
    }
  }
}
PK5~�[�#o,,bbb/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[�/hhbbb/phpunit.xml.distnu�[���<?xml
version="1.0" encoding="UTF-8"?>


<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         bootstrap="./tests/bootstrap.php"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false">

    <php>
        <!-- Specify the value of your BigBlueButton secret -->
        <env name="BBB_SECRET"
value="8cd8ef52e8e101574e400365b55e11a6"/>
        <!-- Specify the Server Base URL of your BigBlueButton -->
        <env name="BBB_SERVER_BASE_URL"
value="https://test-install.blindsidenetworks.com/bigbluebutton/"/>
    </php>

    <log type="coverage-html" target="./coverage"
         charset='UTF-8' yui='true'/>

    <filter>
        <whitelist
processUncoveredFilesFromWhitelist="true">
            <directory
suffix=".php">./src/</directory>
        </whitelist>
    </filter>

    <testsuites>
        <testsuite name="BigBlueButton test suit">
            <directory>./tests/</directory>
        </testsuite>
    </testsuites>

</phpunit>
PK5~�[O��=�=bbb/src/BigBlueButton.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton;

use BigBlueButton\Core\ApiMethod;
use BigBlueButton\Exceptions\BadResponseException;
use BigBlueButton\Parameters\CreateMeetingParameters;
use BigBlueButton\Parameters\DeleteRecordingsParameters;
use BigBlueButton\Parameters\EndMeetingParameters;
use BigBlueButton\Parameters\GetMeetingInfoParameters;
use BigBlueButton\Parameters\GetRecordingsParameters;
use BigBlueButton\Parameters\HooksCreateParameters;
use BigBlueButton\Parameters\HooksDestroyParameters;
use BigBlueButton\Parameters\IsMeetingRunningParameters;
use BigBlueButton\Parameters\JoinMeetingParameters;
use BigBlueButton\Parameters\PublishRecordingsParameters;
use BigBlueButton\Parameters\UpdateRecordingsParameters;
use BigBlueButton\Responses\ApiVersionResponse;
use BigBlueButton\Responses\CreateMeetingResponse;
use BigBlueButton\Responses\DeleteRecordingsResponse;
use BigBlueButton\Responses\EndMeetingResponse;
use BigBlueButton\Responses\GetMeetingInfoResponse;
use BigBlueButton\Responses\GetMeetingsResponse;
use BigBlueButton\Responses\GetRecordingsResponse;
use BigBlueButton\Responses\HooksCreateResponse;
use BigBlueButton\Responses\HooksDestroyResponse;
use BigBlueButton\Responses\HooksListResponse;
use BigBlueButton\Responses\IsMeetingRunningResponse;
use BigBlueButton\Responses\JoinMeetingResponse;
use BigBlueButton\Responses\PublishRecordingsResponse;
use BigBlueButton\Responses\UpdateRecordingsResponse;
use BigBlueButton\Util\UrlBuilder;
use SimpleXMLElement;

/**
 * Class BigBlueButton.
 */
class BigBlueButton
{
    protected $securitySecret;
    protected $bbbServerBaseUrl;
    protected $urlBuilder;
    protected $jSessionId;
    protected $timeOut = 10;

    /**
     * BigBlueButton constructor.
     *
     * @param null       $baseUrl
     * @param null       $secret
     * @param null|mixed $opts
     */
    public function __construct($baseUrl = null, $secret = null, $opts =
null)
    {
        // Keeping backward compatibility with older deployed versions
        // BBB_SECRET is the new variable name and have higher priority
against the old named BBB_SECURITY_SALT
        $this->securitySecret   = $secret ?:
getenv('BBB_SECRET') ?: getenv('BBB_SECURITY_SALT');
        $this->bbbServerBaseUrl = $baseUrl ?:
getenv('BBB_SERVER_BASE_URL');
        $this->urlBuilder       = new
UrlBuilder($this->securitySecret, $this->bbbServerBaseUrl);
        $this->curlopts         = $opts['curl'] ?? [];
    }

    /**
     * @throws \RuntimeException
     *
     * @return ApiVersionResponse
     */
    public function getApiVersion()
    {
        $xml =
$this->processXmlResponse($this->urlBuilder->buildUrl());

        return new ApiVersionResponse($xml);
    }

    // __________________ BBB ADMINISTRATION METHODS _________________
    /* The methods in the following section support the following
categories of the BBB API:
    -- create
    -- join
    -- end
    */

    /**
     * @param CreateMeetingParameters $createMeetingParams
     *
     * @return string
     */
    public function getCreateMeetingUrl($createMeetingParams)
    {
        return $this->urlBuilder->buildUrl(ApiMethod::CREATE,
$createMeetingParams->getHTTPQuery());
    }

    /**
     * @param CreateMeetingParameters $createMeetingParams
     *
     * @throws \RuntimeException
     *
     * @return CreateMeetingResponse
     */
    public function createMeeting($createMeetingParams)
    {
        $xml =
$this->processXmlResponse($this->getCreateMeetingUrl($createMeetingParams),
$createMeetingParams->getPresentationsAsXML());

        return new CreateMeetingResponse($xml);
    }

    /**
     * @param $joinMeetingParams JoinMeetingParameters
     *
     * @return string
     */
    public function getJoinMeetingURL($joinMeetingParams)
    {
        return $this->urlBuilder->buildUrl(ApiMethod::JOIN,
$joinMeetingParams->getHTTPQuery());
    }

    /**
     * @param $joinMeetingParams JoinMeetingParameters
     *
     * @throws \RuntimeException
     *
     * @return JoinMeetingResponse
     */
    public function joinMeeting($joinMeetingParams)
    {
        $xml =
$this->processXmlResponse($this->getJoinMeetingURL($joinMeetingParams));

        return new JoinMeetingResponse($xml);
    }

    /**
     * @param $endParams EndMeetingParameters
     *
     * @return string
     */
    public function getEndMeetingURL($endParams)
    {
        return $this->urlBuilder->buildUrl(ApiMethod::END,
$endParams->getHTTPQuery());
    }

    /**
     * @param $endParams EndMeetingParameters
     *
     * @throws \RuntimeException
     *
     * @return EndMeetingResponse
     * */
    public function endMeeting($endParams)
    {
        $xml =
$this->processXmlResponse($this->getEndMeetingURL($endParams));

        return new EndMeetingResponse($xml);
    }

    // __________________ BBB MONITORING METHODS _________________
    /* The methods in the following section support the following
categories of the BBB API:
    -- isMeetingRunning
    -- getMeetings
    -- getMeetingInfo
    */

    /**
     * @param $meetingParams IsMeetingRunningParameters
     *
     * @return string
     */
    public function getIsMeetingRunningUrl($meetingParams)
    {
        return
$this->urlBuilder->buildUrl(ApiMethod::IS_MEETING_RUNNING,
$meetingParams->getHTTPQuery());
    }

    /**
     * @param $meetingParams
     *
     * @throws \RuntimeException
     *
     * @return IsMeetingRunningResponse
     */
    public function isMeetingRunning($meetingParams)
    {
        $xml =
$this->processXmlResponse($this->getIsMeetingRunningUrl($meetingParams));

        return new IsMeetingRunningResponse($xml);
    }

    /**
     * @return string
     */
    public function getMeetingsUrl()
    {
        return $this->urlBuilder->buildUrl(ApiMethod::GET_MEETINGS);
    }

    /**
     * @throws \RuntimeException
     *
     * @return GetMeetingsResponse
     */
    public function getMeetings()
    {
        $xml = $this->processXmlResponse($this->getMeetingsUrl());

        return new GetMeetingsResponse($xml);
    }

    /**
     * @param $meetingParams GetMeetingInfoParameters
     *
     * @return string
     */
    public function getMeetingInfoUrl($meetingParams)
    {
        return
$this->urlBuilder->buildUrl(ApiMethod::GET_MEETING_INFO,
$meetingParams->getHTTPQuery());
    }

    /**
     * @param $meetingParams GetMeetingInfoParameters
     *
     * @throws \RuntimeException
     *
     * @return GetMeetingInfoResponse
     */
    public function getMeetingInfo($meetingParams)
    {
        $xml =
$this->processXmlResponse($this->getMeetingInfoUrl($meetingParams));

        return new GetMeetingInfoResponse($xml);
    }

    // __________________ BBB RECORDING METHODS _________________
    /* The methods in the following section support the following
categories of the BBB API:
    -- getRecordings
    -- publishRecordings
    -- deleteRecordings
    */

    /**
     * @param $recordingsParams GetRecordingsParameters
     *
     * @return string
     */
    public function getRecordingsUrl($recordingsParams)
    {
        return $this->urlBuilder->buildUrl(ApiMethod::GET_RECORDINGS,
$recordingsParams->getHTTPQuery());
    }

    /**
     * @param $recordingParams
     *
     * @throws \RuntimeException
     *
     * @return GetRecordingsResponse
     */
    public function getRecordings($recordingParams)
    {
        $xml =
$this->processXmlResponse($this->getRecordingsUrl($recordingParams));

        return new GetRecordingsResponse($xml);
    }

    /**
     * @param $recordingParams PublishRecordingsParameters
     *
     * @return string
     */
    public function getPublishRecordingsUrl($recordingParams)
    {
        return
$this->urlBuilder->buildUrl(ApiMethod::PUBLISH_RECORDINGS,
$recordingParams->getHTTPQuery());
    }

    /**
     * @param $recordingParams PublishRecordingsParameters
     *
     * @throws \RuntimeException
     *
     * @return PublishRecordingsResponse
     */
    public function publishRecordings($recordingParams)
    {
        $xml =
$this->processXmlResponse($this->getPublishRecordingsUrl($recordingParams));

        return new PublishRecordingsResponse($xml);
    }

    /**
     * @param $recordingParams DeleteRecordingsParameters
     *
     * @return string
     */
    public function getDeleteRecordingsUrl($recordingParams)
    {
        return
$this->urlBuilder->buildUrl(ApiMethod::DELETE_RECORDINGS,
$recordingParams->getHTTPQuery());
    }

    /**
     * @param $recordingParams DeleteRecordingsParameters
     *
     * @throws \RuntimeException
     *
     * @return DeleteRecordingsResponse
     */
    public function deleteRecordings($recordingParams)
    {
        $xml =
$this->processXmlResponse($this->getDeleteRecordingsUrl($recordingParams));

        return new DeleteRecordingsResponse($xml);
    }

    /**
     * @param $recordingParams UpdateRecordingsParameters
     *
     * @return string
     */
    public function getUpdateRecordingsUrl($recordingParams)
    {
        return
$this->urlBuilder->buildUrl(ApiMethod::UPDATE_RECORDINGS,
$recordingParams->getHTTPQuery());
    }

    /**
     * @param $recordingParams UpdateRecordingsParameters
     *
     * @throws \RuntimeException
     *
     * @return UpdateRecordingsResponse
     */
    public function updateRecordings($recordingParams)
    {
        $xml =
$this->processXmlResponse($this->getUpdateRecordingsUrl($recordingParams));

        return new UpdateRecordingsResponse($xml);
    }

    // ____________________ WEB HOOKS METHODS ___________________

    /**
     * @param $hookCreateParams HooksCreateParameters
     *
     * @return string
     */
    public function getHooksCreateUrl($hookCreateParams)
    {
        return $this->urlBuilder->buildUrl(ApiMethod::HOOKS_CREATE,
$hookCreateParams->getHTTPQuery());
    }

    /**
     * @param $hookCreateParams
     *
     * @return HooksCreateResponse
     */
    public function hooksCreate($hookCreateParams)
    {
        $xml =
$this->processXmlResponse($this->getHooksCreateUrl($hookCreateParams));

        return new HooksCreateResponse($xml);
    }

    /**
     * @return string
     */
    public function getHooksListUrl()
    {
        return $this->urlBuilder->buildUrl(ApiMethod::HOOKS_LIST);
    }

    /**
     * @return HooksListResponse
     */
    public function hooksList()
    {
        $xml = $this->processXmlResponse($this->getHooksListUrl());

        return new HooksListResponse($xml);
    }

    /**
     * @param $hooksDestroyParams HooksDestroyParameters
     *
     * @return string
     */
    public function getHooksDestroyUrl($hooksDestroyParams)
    {
        return $this->urlBuilder->buildUrl(ApiMethod::HOOKS_DESTROY,
$hooksDestroyParams->getHTTPQuery());
    }

    /**
     * @param $hooksDestroyParams
     *
     * @return HooksDestroyResponse
     */
    public function hooksDestroy($hooksDestroyParams)
    {
        $xml =
$this->processXmlResponse($this->getHooksDestroyUrl($hooksDestroyParams));

        return new HooksDestroyResponse($xml);
    }

    // ____________________ SPECIAL METHODS ___________________
    /**
     * @return string
     */
    public function getJSessionId()
    {
        return $this->jSessionId;
    }

    /**
     * @param string $jSessionId
     */
    public function setJSessionId($jSessionId)
    {
        $this->jSessionId = $jSessionId;
    }

    /**
     * @param array $curlopts
     */
    public function setCurlOpts($curlopts)
    {
        $this->curlopts = $curlopts;
    }

    /**
     * Set Curl Timeout (Optional), Default 10 Seconds.
     *
     * @param int $TimeOutInSeconds
     *
     * @return static
     */
    public function setTimeOut($TimeOutInSeconds)
    {
        $this->timeOut = $TimeOutInSeconds;

        return $this;
    }

    /**
     * Public accessor for buildUrl.
     *
     * @param string $method
     * @param string $params
     * @param bool   $append
     *
     * @return string
     */
    public function buildUrl($method = '', $params =
'', $append = true)
    {
        return $this->urlBuilder->buildUrl($method, $params,
$append);
    }

    // ____________________ INTERNAL CLASS METHODS ___________________

    /**
     * A private utility method used by other public methods to process XML
responses.
     *
     * @param string $url
     * @param string $payload
     * @param string $contentType
     *
     * @throws \RuntimeException
     *
     * @return SimpleXMLElement
     */
    private function processXmlResponse($url, $payload = '',
$contentType = 'application/xml')
    {
        if (extension_loaded('curl')) {
            $ch = curl_init();
            if (!$ch) {
                throw new \RuntimeException('Unhandled curl error:
' . curl_error($ch));
            }
            $timeout = 10;

            // Needed to store the JSESSIONID
            $cookiefile     = tmpfile();
            $cookiefilepath =
stream_get_meta_data($cookiefile)['uri'];

            foreach ($this->curlopts as $opt => $value) {
                curl_setopt($ch, $opt, $value);
            }
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
            curl_setopt($ch, CURLOPT_ENCODING, 'UTF-8');
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
            curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefilepath);
            curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefilepath);
            if (!empty($payload)) {
                curl_setopt($ch, CURLOPT_HEADER, 0);
                curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
                curl_setopt($ch, CURLOPT_POST, 1);
                curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
                curl_setopt($ch, CURLOPT_HTTPHEADER, [
                    'Content-type: ' . $contentType,
                    'Content-length: ' . mb_strlen($payload),
                ]);
            }
            $data = curl_exec($ch);
            if (false === $data) {
                throw new \RuntimeException('Unhandled curl error:
' . curl_error($ch));
            }
            $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            if ($httpcode < 200 || $httpcode >= 300) {
                throw new BadResponseException('Bad response, HTTP
code: ' . $httpcode);
            }
            curl_close($ch);
            unset($ch);

            $cookies = file_get_contents($cookiefilepath);
            if (false !== mb_strpos($cookies, 'JSESSIONID')) {
               
preg_match('/(?:JSESSIONID\s*)(?<JSESSIONID>.*)/',
$cookies, $output_array);
               
$this->setJSessionId($output_array['JSESSIONID']);
            }

            return new SimpleXMLElement($data);
        }

        throw new \RuntimeException('Post XML data set but curl PHP
module is not installed or not enabled.');
    }
}
PK5~�[����bbb/src/Core/ApiMethod.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Core;

abstract class ApiMethod
{
    public const CREATE             = 'create';
    public const JOIN               = 'join';
    public const ENTER              = 'enter';
    public const END                = 'end';
    public const IS_MEETING_RUNNING = 'isMeetingRunning';
    public const GET_MEETING_INFO   = 'getMeetingInfo';
    public const GET_MEETINGS       = 'getMeetings';
    public const SIGN_OUT           = 'signOut';
    public const GET_RECORDINGS     = 'getRecordings';
    public const PUBLISH_RECORDINGS = 'publishRecordings';
    public const DELETE_RECORDINGS  = 'deleteRecordings';
    public const UPDATE_RECORDINGS  = 'updateRecordings';
    public const HOOKS_CREATE       = 'hooks/create';
    public const HOOKS_LIST         = 'hooks/list';
    public const HOOKS_DESTROY      = 'hooks/destroy';
}
PK5~�[q�[
[
bbb/src/Core/Attendee.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Core;

class Attendee
{
    /**
     * @var string
     */
    private $userId;

    /**
     * @var string
     */
    private $fullName;

    /**
     * @var string
     */
    private $role;

    /**
     * @var bool
     */
    private $isPresenter;

    /**
     * @var bool
     */
    private $isListeningOnly;

    /**
     * @var bool
     */
    private $hasJoinedVoice;

    /**
     * @var bool
     */
    private $hasVideo;

    /**
     * @var array
     */
    private $customData = [];

    /**
     * @var string
     */
    private $clientType;

    /**
     * Attendee constructor.
     *
     * @param $xml \SimpleXMLElement
     */
    public function __construct($xml)
    {
        $this->userId          = $xml->userID->__toString();
        $this->fullName        = $xml->fullName->__toString();
        $this->role            = $xml->role->__toString();
        $this->isPresenter     = 'true' ===
$xml->isPresenter->__toString();
        $this->isListeningOnly = 'true' ===
$xml->isListeningOnly->__toString();
        $this->hasJoinedVoice  = 'true' ===
$xml->hasJoinedVoice->__toString();
        $this->hasVideo        = 'true' ===
$xml->hasVideo->__toString();
        $this->clientType      = $xml->clientType->__toString();

        if ($xml->customdata) {
            foreach ($xml->customdata->children() as $data) {
                $this->customData[$data->getName()] =
$data->__toString();
            }
        }
    }

    /**
     * @return string
     */
    public function getUserId()
    {
        return $this->userId;
    }

    /**
     * @return string
     */
    public function getFullName()
    {
        return $this->fullName;
    }

    /**
     * @return string
     */
    public function getRole()
    {
        return $this->role;
    }

    /**
     * @return null|bool
     */
    public function isPresenter()
    {
        return $this->isPresenter;
    }

    /**
     * @return null|bool
     */
    public function isListeningOnly()
    {
        return $this->isListeningOnly;
    }

    /**
     * @return null|bool
     */
    public function hasJoinedVoice()
    {
        return $this->hasJoinedVoice;
    }

    /**
     * @return null|bool
     */
    public function hasVideo()
    {
        return $this->hasVideo;
    }

    /**
     * @return string
     */
    public function getClientType()
    {
        return $this->clientType;
    }

    /**
     * @return array
     */
    public function getCustomData()
    {
        return $this->customData;
    }
}
PK5~�[��	�'	'	bbb/src/Core/Format.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Core;

class Format
{
    /**
     * @var \SimpleXMLElement
     */
    protected $rawXml;

    private $type;
    private $url;
    private $processingTime;
    private $length;
    private $size;
    private $images;

    /**
     * Record constructor.
     *
     * @param $xml \SimpleXMLElement
     */
    public function __construct($xml)
    {
        $this->rawXml         = $xml;
        $this->type           = $xml->type->__toString();
        $this->url            = $xml->url->__toString();
        $this->processingTime = (int)
$xml->processingTime->__toString();
        $this->length         = (int) $xml->length->__toString();
        $this->size           = (int) $xml->size->__toString();
    }

    /**
     * @return Image[]
     */
    public function getImages()
    {
        if (null === $this->images) {
            $this->images = [];
            foreach ($this->rawXml->preview->images->image as
$imageXml) {
                $this->images[] = new Image($imageXml);
            }
        }

        return $this->images;
    }

    public function getType(): string
    {
        return $this->type;
    }

    public function getUrl(): string
    {
        return $this->url;
    }

    public function getProcessingTime(): int
    {
        return $this->processingTime;
    }

    public function getLength(): int
    {
        return $this->length;
    }

    public function getSize(): int
    {
        return $this->size;
    }
}
PK5~�[m	� 
bbb/src/Core/GuestPolicy.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Core;

class GuestPolicy
{
    public const ALWAYS_ACCEPT = 'ALWAYS_ACCEPT';
    public const ALWAYS_DENY   = 'ALWAYS_DENY';
    public const ASK_MODERATOR = 'ASK_MODERATOR';
}
PK5~�[3iSj	j	bbb/src/Core/Hook.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Core;

/**
 * Class Meeting.
 */
class Hook
{
    /**
     * @var \SimpleXMLElement
     */
    protected $rawXml;

    /**
     * @var string
     */
    private $hookId;

    /**
     * @var string
     */
    private $meetingId;

    /**
     * @var string
     */
    private $callbackUrl;

    /**
     * @var bool
     */
    private $permanentHook;

    /**
     * @var bool
     */
    private $rawData;

    /**
     * Meeting constructor.
     *
     * @param $xml \SimpleXMLElement
     */
    public function __construct($xml)
    {
        $this->rawXml        = $xml;
        $this->hookId        = (int) $xml->hookID->__toString();
        $this->callbackUrl   = $xml->callbackURL->__toString();
        $this->meetingId     = $xml->meetingID->__toString();
        $this->permanentHook = 'true' ===
$xml->permanentHook->__toString();
        $this->rawData       = 'true' ===
$xml->rawData->__toString();
    }

    /**
     * @return string
     */
    public function getHookId()
    {
        return $this->hookId;
    }

    /**
     * @return string
     */
    public function getMeetingId()
    {
        return $this->meetingId;
    }

    /**
     * @return string
     */
    public function getCallbackUrl()
    {
        return $this->callbackUrl;
    }

    /**
     * @return null|bool
     */
    public function isPermanentHook()
    {
        return $this->permanentHook;
    }

    /**
     * @return null|bool
     */
    public function hasRawData()
    {
        return $this->rawData;
    }
}
PK5~�[���hhbbb/src/Core/Image.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Core;

/**
 * Class Record.
 */
class Image
{
    private $alt;
    private $height;
    private $width;
    private $url;

    /**
     * Record constructor.
     *
     * @param $xml \SimpleXMLElement
     */
    public function __construct($xml)
    {
        $this->alt    = $xml['alt']->__toString();
        $this->height = (int) $xml['height'];
        $this->width  = (int) $xml['width'];
        $this->url    = $xml->__toString();
    }

    public function getAlt(): string
    {
        return $this->alt;
    }

    public function getHeight(): int
    {
        return $this->height;
    }

    public function getWidth(): int
    {
        return $this->width;
    }

    public function getUrl(): string
    {
        return $this->url;
    }
}
PK5~�[D�=�!�!bbb/src/Core/Meeting.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Core;

/**
 * Class Meeting.
 */
class Meeting
{
    /**
     * @var \SimpleXMLElement
     */
    protected $rawXml;

    /**
     * @var string
     */
    private $meetingId;

    /**
     * @var string
     */
    private $meetingName;

    /**
     * @var float
     */
    private $creationTime;

    /**
     * @var string
     */
    private $creationDate;

    /**
     * @var int
     */
    private $voiceBridge;

    /**
     * @var string
     */
    private $dialNumber;

    /**
     * @var string
     */
    private $attendeePassword;

    /**
     * @var string
     */
    private $moderatorPassword;

    /**
     * @var bool
     */
    private $hasBeenForciblyEnded;

    /**
     * @var bool
     */
    private $isRunning;

    /**
     * @var int
     */
    private $participantCount;

    /**
     * @var int
     */
    private $listenerCount;

    /**
     * @var int
     */
    private $voiceParticipantCount;

    /**
     * @var int
     */
    private $videoCount;

    /**
     * @var int
     */
    private $duration;

    /**
     * @var bool
     */
    private $hasUserJoined;

    /**
     * @var string
     */
    private $internalMeetingId;

    /**
     * @var bool
     */
    private $isRecording;

    /**
     * @var float
     */
    private $startTime;

    /**
     * @var float
     */
    private $endTime;

    /**
     * @var int
     */
    private $maxUsers;

    /**
     * @var int
     */
    private $moderatorCount;

    /**
     * @var Attendee[]
     */
    private $attendees;

    /**
     * @var array
     */
    private $metas;

    /**
     * @var bool
     */
    private $isBreakout;

    /**
     * Meeting constructor.
     *
     * @param $xml \SimpleXMLElement
     */
    public function __construct($xml)
    {
        $this->rawXml                = $xml;
        $this->meetingId             =
$xml->meetingID->__toString();
        $this->meetingName           =
$xml->meetingName->__toString();
        $this->creationTime          = (float) $xml->createTime;
        $this->creationDate          =
$xml->createDate->__toString();
        $this->voiceBridge           = (int) $xml->voiceBridge;
        $this->dialNumber            =
$xml->dialNumber->__toString();
        $this->attendeePassword      =
$xml->attendeePW->__toString();
        $this->moderatorPassword     =
$xml->moderatorPW->__toString();
        $this->hasBeenForciblyEnded  = 'true' ===
$xml->hasBeenForciblyEnded->__toString();
        $this->isRunning             = 'true' ===
$xml->running->__toString();
        $this->participantCount      = (int) $xml->participantCount;
        $this->listenerCount         = (int) $xml->listenerCount;
        $this->voiceParticipantCount = (int)
$xml->voiceParticipantCount;
        $this->videoCount            = (int) $xml->videoCount;
        $this->duration              = (int) $xml->duration;
        $this->hasUserJoined         = 'true' ===
$xml->hasUserJoined->__toString();
        $this->internalMeetingId     =
$xml->internalMeetingID->__toString();
        $this->isRecording           = 'true' ===
$xml->recording->__toString();
        $this->startTime             = (float) $xml->startTime;
        $this->endTime               = (float) $xml->endTime;
        $this->maxUsers              = (int)
$xml->maxUsers->__toString();
        $this->moderatorCount        = (int)
$xml->moderatorCount->__toString();
        $this->isBreakout            = 'true' ===
$xml->isBreakout->__toString();
    }

    /**
     * @return string
     */
    public function getMeetingId()
    {
        return $this->meetingId;
    }

    /**
     * @return string
     */
    public function getMeetingName()
    {
        return $this->meetingName;
    }

    /**
     * @return float
     */
    public function getCreationTime()
    {
        return $this->creationTime;
    }

    /**
     * @return string
     */
    public function getCreationDate()
    {
        return $this->creationDate;
    }

    /**
     * @return int
     */
    public function getVoiceBridge()
    {
        return $this->voiceBridge;
    }

    /**
     * @return string
     */
    public function getDialNumber()
    {
        return $this->dialNumber;
    }

    /**
     * @return string
     */
    public function getAttendeePassword()
    {
        return $this->attendeePassword;
    }

    /**
     * @return string
     */
    public function getModeratorPassword()
    {
        return $this->moderatorPassword;
    }

    /**
     * @return null|bool
     */
    public function hasBeenForciblyEnded()
    {
        return $this->hasBeenForciblyEnded;
    }

    /**
     * @return null|bool
     */
    public function isRunning()
    {
        return $this->isRunning;
    }

    /**
     * @return int
     */
    public function getParticipantCount()
    {
        return $this->participantCount;
    }

    /**
     * @return int
     */
    public function getListenerCount()
    {
        return $this->listenerCount;
    }

    /**
     * @return int
     */
    public function getVoiceParticipantCount()
    {
        return $this->voiceParticipantCount;
    }

    /**
     * @return int
     */
    public function getVideoCount()
    {
        return $this->videoCount;
    }

    /**
     * @return int
     */
    public function getDuration()
    {
        return $this->duration;
    }

    /**
     * @return null|bool
     */
    public function hasUserJoined()
    {
        return $this->hasUserJoined;
    }

    /**
     * @return string
     */
    public function getInternalMeetingId()
    {
        return $this->internalMeetingId;
    }

    /**
     * @return null|bool
     */
    public function isRecording()
    {
        return $this->isRecording;
    }

    /**
     * @return float
     */
    public function getStartTime()
    {
        return $this->startTime;
    }

    /**
     * @return float
     */
    public function getEndTime()
    {
        return $this->endTime;
    }

    /**
     * @return int
     */
    public function getMaxUsers()
    {
        return $this->maxUsers;
    }

    /**
     * @return int
     */
    public function getModeratorCount()
    {
        return $this->moderatorCount;
    }

    /**
     * @return Attendee[]
     */
    public function getAttendees()
    {
        if (null === $this->attendees) {
            $this->attendees = [];
            foreach ($this->rawXml->attendees->attendee as
$attendeeXml) {
                $this->attendees[] = new Attendee($attendeeXml);
            }
        }

        return $this->attendees;
    }

    /**
     * Moderators of Meeting - Subset of Attendees.
     *
     * @return Attendee[]
     */
    public function getModerators()
    {
        $attendees = $this->getAttendees();

        $moderators = array_filter($attendees, function($attendee) {
            return 'MODERATOR' === $attendee->getRole();
        });

        return array_values($moderators);
    }

    /**
     * Viewers of Meeting - Subset of Attendees.
     *
     * @return Attendee[]
     */
    public function getViewers()
    {
        $attendees = $this->getAttendees();

        $viewers = array_filter($attendees, function($attendee) {
            return 'VIEWER' === $attendee->getRole();
        });

        return array_values($viewers);
    }

    /**
     * @return array
     */
    public function getMetas()
    {
        if (null === $this->metas) {
            $this->metas = [];
            foreach ($this->rawXml->metadata->children() as
$metadataXml) {
                $this->metas[$metadataXml->getName()] =
$metadataXml->__toString();
            }
        }

        return $this->metas;
    }

    public function isBreakout(): bool
    {
        return $this->isBreakout;
    }
}
PK5~�[���llbbb/src/Core/MeetingLayout.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Core;

class MeetingLayout
{
    public const CUSTOM_LAYOUT      = 'CUSTOM_LAYOUT';
    public const SMART_LAYOUT       = 'SMART_LAYOUT';
    public const PRESENTATION_FOCUS = 'PRESENTATION_FOCUS';
    public const VIDEO_FOCUS        = 'VIDEO_FOCUS';
}
PK5~�[���'RRbbb/src/Core/Record.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Core;

/**
 * Class Record.
 */
class Record
{
    /**
     * @var \SimpleXMLElement
     */
    protected $rawXml;

    private $recordId;
    private $meetingId;
    private $name;
    private $isPublished;
    private $state;
    private $startTime;
    private $endTime;

    /**
     * @deprecated deprecated since 2.1.2
     */
    private $playbackType;

    /**
     * @deprecated deprecated since 2.1.2
     */
    private $playbackUrl;

    /**
     * @deprecated deprecated since 2.1.2
     */
    private $playbackLength;
    private $metas;
    private $formats;

    /**
     * Record constructor.
     *
     * @param $xml \SimpleXMLElement
     */
    public function __construct($xml)
    {
        $this->rawXml         = $xml;
        $this->recordId       = $xml->recordID->__toString();
        $this->meetingId      = $xml->meetingID->__toString();
        $this->name           = $xml->name->__toString();
        $this->isPublished    = 'true' ===
$xml->published->__toString();
        $this->state          = $xml->state->__toString();
        $this->startTime      = (float)
$xml->startTime->__toString();
        $this->endTime        = (float)
$xml->endTime->__toString();
        $this->playbackType   =
$xml->playback->format->type->__toString();
        $this->playbackUrl    =
$xml->playback->format->url->__toString();
        $this->playbackLength = (int)
$xml->playback->format->length->__toString();

        foreach ($xml->metadata->children() as $meta) {
            $this->metas[$meta->getName()] = $meta->__toString();
        }
    }

    /**
     * @return string
     */
    public function getRecordId()
    {
        return $this->recordId;
    }

    /**
     * @return string
     */
    public function getMeetingId()
    {
        return $this->meetingId;
    }

    /**
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * @return null|bool
     */
    public function isPublished()
    {
        return $this->isPublished;
    }

    /**
     * @return string
     */
    public function getState()
    {
        return $this->state;
    }

    /**
     * @return string
     */
    public function getStartTime()
    {
        return $this->startTime;
    }

    /**
     * @return string
     */
    public function getEndTime()
    {
        return $this->endTime;
    }

    /**
     * @return string
     *
     * @deprecated
     */
    public function getPlaybackType()
    {
        return $this->playbackType;
    }

    /**
     * @return string
     *
     * @deprecated
     */
    public function getPlaybackUrl()
    {
        return $this->playbackUrl;
    }

    /**
     * @return string
     *
     * @deprecated
     */
    public function getPlaybackLength()
    {
        return $this->playbackLength;
    }

    /**
     * @return array
     */
    public function getMetas()
    {
        return $this->metas;
    }

    /**
     * @return Format[]
     */
    public function getFormats()
    {
        if (null === $this->formats) {
            $this->formats = [];
            foreach ($this->rawXml->playback->format as
$formatXml) {
                $this->formats[] = new Format($formatXml);
            }
        }

        return $this->formats;
    }
}
PK5~�[�#o,,bbb/src/Core/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[N�ܽ�+bbb/src/Exceptions/BadResponseException.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Exceptions;

use Exception;

class BadResponseException extends Exception
{
}
PK5~�[�#o,,bbb/src/Exceptions/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[՘|���%bbb/src/Parameters/BaseParameters.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Parameters;

/**
 * Class BaseParameters.
 */
abstract class BaseParameters
{
    /**
     * @return string
     */
    abstract public function getHTTPQuery();

    /**
     * @param $array
     *
     * @return string
     */
    protected function buildHTTPQuery($array)
    {
        return http_build_query(array_filter($array));
    }
}
PK5~�[����vVvV.bbb/src/Parameters/CreateMeetingParameters.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Parameters;

/**
 * Class CreateMeetingParameters.
 */
class CreateMeetingParameters extends MetaParameters
{
    public const ALWAYS_ACCEPT = 'ALWAYS_ACCEPT';
    public const ALWAYS_DENY   = 'ALWAYS_DENY';
    public const ASK_MODERATOR = 'ASK_MODERATOR';

    /**
     * @var string
     */
    private $meetingId;

    /**
     * @var string
     */
    private $meetingName;

    /**
     * @var string
     */
    private $attendeePassword;

    /**
     * @var string
     */
    private $moderatorPassword;

    /**
     * @var string
     */
    private $dialNumber;

    /**
     * @var int
     */
    private $voiceBridge;

    /**
     * @var string
     */
    private $webVoice;

    /**
     * @var string
     */
    private $logoutUrl;

    /**
     * @var int
     */
    private $maxParticipants;

    /**
     * @var bool
     */
    private $record;

    /**
     * @var bool
     */
    private $autoStartRecording;

    /**
     * @var bool
     */
    private $allowStartStopRecording;

    /**
     * @var int
     */
    private $duration;

    /**
     * @var string
     */
    private $welcomeMessage;

    /**
     * @var string
     */
    private $moderatorOnlyMessage;

    /**
     * @var bool
     */
    private $webcamsOnlyForModerator;

    /**
     * @var string
     */
    private $logo;

    /**
     * @var string
     */
    private $copyright;

    /**
     * @var bool
     */
    private $muteOnStart;

    /**
     * @var bool
     */
    private $lockSettingsDisableCam;

    /**
     * @var bool
     */
    private $lockSettingsDisableMic;

    /**
     * @var bool
     */
    private $lockSettingsDisablePrivateChat;

    /**
     * @var bool
     */
    private $lockSettingsDisablePublicChat;

    /**
     * @var bool
     */
    private $lockSettingsDisableNote;

    /**
     * @var bool
     */
    private $lockSettingsHideUserList;

    /**
     * @var bool
     */
    private $lockSettingsLockedLayout;

    /**
     * @var bool
     */
    private $lockSettingsLockOnJoin = true;

    /**
     * @var bool
     */
    private $lockSettingsLockOnJoinConfigurable;

    /**
     * @var bool
     */
    private $allowModsToUnmuteUsers;

    /**
     * @var array
     */
    private $presentations = [];

    /**
     * @var bool
     */
    private $isBreakout;

    /**
     * @var string
     */
    private $parentMeetingId;

    /**
     * @var int
     */
    private $sequence;

    /**
     * @var bool
     */
    private $freeJoin;

    /**
     * @var string
     */
    private $guestPolicy = self::ALWAYS_ACCEPT;

    /**
     * CreateMeetingParameters constructor.
     *
     * @param $meetingId
     * @param $meetingName
     */
    public function __construct($meetingId, $meetingName)
    {
        $this->meetingId   = $meetingId;
        $this->meetingName = $meetingName;
    }

    /**
     * @return string
     */
    public function getMeetingId()
    {
        return $this->meetingId;
    }

    /**
     * @param string $meetingId
     *
     * @return CreateMeetingParameters
     */
    public function setMeetingId($meetingId)
    {
        $this->meetingId = $meetingId;

        return $this;
    }

    /**
     * @return string
     */
    public function getMeetingName()
    {
        return $this->meetingName;
    }

    /**
     * @param string $meetingName
     *
     * @return CreateMeetingParameters
     */
    public function setMeetingName($meetingName)
    {
        $this->meetingName = $meetingName;

        return $this;
    }

    /**
     * @return string
     */
    public function getAttendeePassword()
    {
        return $this->attendeePassword;
    }

    /**
     * @param string $attendeePassword
     *
     * @return CreateMeetingParameters
     */
    public function setAttendeePassword($attendeePassword)
    {
        $this->attendeePassword = $attendeePassword;

        return $this;
    }

    /**
     * @return string
     */
    public function getModeratorPassword()
    {
        return $this->moderatorPassword;
    }

    /**
     * @param string $moderatorPassword
     *
     * @return CreateMeetingParameters
     */
    public function setModeratorPassword($moderatorPassword)
    {
        $this->moderatorPassword = $moderatorPassword;

        return $this;
    }

    /**
     * @return string
     */
    public function getDialNumber()
    {
        return $this->dialNumber;
    }

    /**
     * @param string $dialNumber
     *
     * @return CreateMeetingParameters
     */
    public function setDialNumber($dialNumber)
    {
        $this->dialNumber = $dialNumber;

        return $this;
    }

    /**
     * @return int
     */
    public function getVoiceBridge()
    {
        return $this->voiceBridge;
    }

    /**
     * @param int $voiceBridge
     *
     * @return CreateMeetingParameters
     */
    public function setVoiceBridge($voiceBridge)
    {
        $this->voiceBridge = $voiceBridge;

        return $this;
    }

    /**
     * @return string
     */
    public function getWebVoice()
    {
        return $this->webVoice;
    }

    /**
     * @param string $webVoice
     *
     * @return CreateMeetingParameters
     */
    public function setWebVoice($webVoice)
    {
        $this->webVoice = $webVoice;

        return $this;
    }

    /**
     * @return string
     */
    public function getLogoutUrl()
    {
        return $this->logoutUrl;
    }

    /**
     * @param string $logoutUrl
     *
     * @return CreateMeetingParameters
     */
    public function setLogoutUrl($logoutUrl)
    {
        $this->logoutUrl = $logoutUrl;

        return $this;
    }

    /**
     * @return int
     */
    public function getMaxParticipants()
    {
        return $this->maxParticipants;
    }

    /**
     * @param int $maxParticipants
     *
     * @return CreateMeetingParameters
     */
    public function setMaxParticipants($maxParticipants)
    {
        $this->maxParticipants = $maxParticipants;

        return $this;
    }

    /**
     * @return null|bool
     */
    public function isRecorded()
    {
        return $this->record;
    }

    /**
     * @param bool $record
     *
     * @return CreateMeetingParameters
     */
    public function setRecord($record)
    {
        $this->record = $record;

        return $this;
    }

    /**
     * @return null|bool
     */
    public function isAutoStartRecording()
    {
        return $this->autoStartRecording;
    }

    /**
     * @param bool $autoStartRecording
     *
     * @return CreateMeetingParameters
     */
    public function setAutoStartRecording($autoStartRecording)
    {
        $this->autoStartRecording = $autoStartRecording;

        return $this;
    }

    /**
     * @return null|bool
     */
    public function isAllowStartStopRecording()
    {
        return $this->allowStartStopRecording;
    }

    /**
     * @param bool $allowStartStopRecording
     *
     * @return CreateMeetingParameters
     */
    public function setAllowStartStopRecording($allowStartStopRecording)
    {
        $this->allowStartStopRecording = $allowStartStopRecording;

        return $this;
    }

    /**
     * @return int
     */
    public function getDuration()
    {
        return $this->duration;
    }

    /**
     * @param int $duration
     *
     * @return CreateMeetingParameters
     */
    public function setDuration($duration)
    {
        $this->duration = $duration;

        return $this;
    }

    /**
     * @return string
     */
    public function getWelcomeMessage()
    {
        return $this->welcomeMessage;
    }

    /**
     * @param string $welcomeMessage
     *
     * @return CreateMeetingParameters
     */
    public function setWelcomeMessage($welcomeMessage)
    {
        $this->welcomeMessage = $welcomeMessage;

        return $this;
    }

    /**
     * @return string
     */
    public function getModeratorOnlyMessage()
    {
        return $this->moderatorOnlyMessage;
    }

    /**
     * @param string $message
     *
     * @return CreateMeetingParameters
     */
    public function setModeratorOnlyMessage($message)
    {
        $this->moderatorOnlyMessage = $message;

        return $this;
    }

    /**
     * @return null|bool
     */
    public function isWebcamsOnlyForModerator()
    {
        return $this->webcamsOnlyForModerator;
    }

    /**
     * @param bool $webcamsOnlyForModerator
     *
     * @return CreateMeetingParameters
     */
    public function setWebcamsOnlyForModerator($webcamsOnlyForModerator)
    {
        $this->webcamsOnlyForModerator = $webcamsOnlyForModerator;

        return $this;
    }

    /**
     * @return string
     */
    public function getLogo()
    {
        return $this->logo;
    }

    /**
     * @param string $logo
     *
     * @return CreateMeetingParameters
     */
    public function setLogo($logo)
    {
        $this->logo = $logo;

        return $this;
    }

    /**
     * @return string
     */
    public function getCopyright()
    {
        return $this->copyright;
    }

    /**
     * @param string $copyright
     *
     * @return CreateMeetingParameters
     */
    public function setCopyright($copyright)
    {
        $this->copyright = $copyright;

        return $this;
    }

    /**
     * @return null|bool
     */
    public function isMuteOnStart()
    {
        return $this->muteOnStart;
    }

    /**
     * @param bool $muteOnStart
     *
     * @return CreateMeetingParameters
     */
    public function setMuteOnStart($muteOnStart)
    {
        $this->muteOnStart = $muteOnStart;

        return $this;
    }

    /**
     * @return null|bool
     */
    public function isLockSettingsDisableCam()
    {
        return $this->lockSettingsDisableCam;
    }

    /**
     * @param bool $lockSettingsDisableCam
     *
     * @return CreateMeetingParameters
     */
    public function setLockSettingsDisableCam($lockSettingsDisableCam)
    {
        $this->lockSettingsDisableCam = $lockSettingsDisableCam;

        return $this;
    }

    /**
     * @return null|bool
     */
    public function isLockSettingsDisableMic()
    {
        return $this->lockSettingsDisableMic;
    }

    /**
     * @param bool $lockSettingsDisableMic
     *
     * @return CreateMeetingParameters
     */
    public function setLockSettingsDisableMic($lockSettingsDisableMic)
    {
        $this->lockSettingsDisableMic = $lockSettingsDisableMic;

        return $this;
    }

    /**
     * @return null|bool
     */
    public function isLockSettingsDisablePrivateChat()
    {
        return $this->lockSettingsDisablePrivateChat;
    }

    /**
     * @param bool $lockSettingsDisablePrivateChat
     *
     * @return CreateMeetingParameters
     */
    public function
setLockSettingsDisablePrivateChat($lockSettingsDisablePrivateChat)
    {
        $this->lockSettingsDisablePrivateChat =
$lockSettingsDisablePrivateChat;

        return $this;
    }

    /**
     * @return null|bool
     */
    public function isLockSettingsDisablePublicChat()
    {
        return $this->lockSettingsDisablePublicChat;
    }

    /**
     * @param bool $lockSettingsDisablePublicChat
     *
     * @return CreateMeetingParameters
     */
    public function
setLockSettingsDisablePublicChat($lockSettingsDisablePublicChat)
    {
        $this->lockSettingsDisablePublicChat =
$lockSettingsDisablePublicChat;

        return $this;
    }

    /**
     * @return null|bool
     */
    public function isLockSettingsDisableNote()
    {
        return $this->lockSettingsDisableNote;
    }

    /**
     * @param bool $lockSettingsDisableNote
     *
     * @return CreateMeetingParameters
     */
    public function setLockSettingsDisableNote($lockSettingsDisableNote)
    {
        $this->lockSettingsDisableNote = $lockSettingsDisableNote;

        return $this;
    }

    /**
     * @return null|bool
     */
    public function isLockSettingsHideUserList()
    {
        return $this->lockSettingsHideUserList;
    }

    /**
     * @param bool $lockSettingsHideUserList
     *
     * @return CreateMeetingParameters
     */
    public function setLockSettingsHideUserList($lockSettingsHideUserList)
    {
        $this->lockSettingsHideUserList = $lockSettingsHideUserList;

        return $this;
    }

    /**
     * @return null|bool
     */
    public function isLockSettingsLockedLayout()
    {
        return $this->lockSettingsLockedLayout;
    }

    /**
     * @param bool $lockSettingsLockedLayout
     *
     * @return CreateMeetingParameters
     */
    public function setLockSettingsLockedLayout($lockSettingsLockedLayout)
    {
        $this->lockSettingsLockedLayout = $lockSettingsLockedLayout;

        return $this;
    }

    /**
     * @return null|bool
     */
    public function isLockSettingsLockOnJoin()
    {
        return $this->lockSettingsLockOnJoin;
    }

    /**
     * @param bool $lockOnJoin
     *
     * @return CreateMeetingParameters
     */
    public function setLockSettingsLockOnJoin($lockOnJoin)
    {
        $this->lockSettingsLockOnJoin = $lockOnJoin;

        return $this;
    }

    /**
     * @return null|bool
     */
    public function isLockSettingsLockOnJoinConfigurable()
    {
        return $this->lockSettingsLockOnJoinConfigurable;
    }

    /**
     * @param bool $lockOnJoinConfigurable
     *
     * @return CreateMeetingParameters
     */
    public function
setLockSettingsLockOnJoinConfigurable($lockOnJoinConfigurable)
    {
        $this->lockSettingsLockOnJoinConfigurable =
$lockOnJoinConfigurable;

        return $this;
    }

    /**
     * @return null|bool
     */
    public function isAllowModsToUnmuteUsers()
    {
        return $this->allowModsToUnmuteUsers;
    }

    /**
     * @param bool $allowModsToUnmuteUsers
     *
     * @return CreateMeetingParameters
     */
    public function setAllowModsToUnmuteUsers($allowModsToUnmuteUsers)
    {
        $this->allowModsToUnmuteUsers = $allowModsToUnmuteUsers;

        return $this;
    }

    /**
     * @param $endCallbackUrl
     *
     * @return CreateMeetingParameters
     */
    public function setEndCallbackUrl($endCallbackUrl)
    {
        $this->addMeta('endCallbackUrl', $endCallbackUrl);

        return $this;
    }

    /**
     * @param $recordingReadyCallbackUrl
     *
     * @return CreateMeetingParameters
     */
    public function
setRecordingReadyCallbackUrl($recordingReadyCallbackUrl)
    {
        $this->addMeta('bbb-recording-ready-url',
$recordingReadyCallbackUrl);

        return $this;
    }

    /**
     * @return null|bool
     */
    public function isBreakout()
    {
        return $this->isBreakout;
    }

    /**
     * @param bool $isBreakout
     *
     * @return CreateMeetingParameters
     */
    public function setBreakout($isBreakout)
    {
        $this->isBreakout = $isBreakout;

        return $this;
    }

    /**
     * @return string
     */
    public function getParentMeetingId()
    {
        return $this->parentMeetingId;
    }

    /**
     * @param string $parentMeetingId
     *
     * @return CreateMeetingParameters
     */
    public function setParentMeetingId($parentMeetingId)
    {
        $this->parentMeetingId = $parentMeetingId;

        return $this;
    }

    /**
     * @return int
     */
    public function getSequence()
    {
        return $this->sequence;
    }

    /**
     * @param int $sequence
     *
     * @return CreateMeetingParameters
     */
    public function setSequence($sequence)
    {
        $this->sequence = $sequence;

        return $this;
    }

    /**
     * @return null|bool
     */
    public function isFreeJoin()
    {
        return $this->freeJoin;
    }

    /**
     * @param bool $freeJoin
     *
     * @return CreateMeetingParameters
     */
    public function setFreeJoin($freeJoin)
    {
        $this->freeJoin = $freeJoin;

        return $this;
    }

    /**
     * @return string
     */
    public function getGuestPolicy()
    {
        return $this->guestPolicy;
    }

    /**
     * @param bool $guestPolicy
     *
     * @return CreateMeetingParameters
     */
    public function setGuestPolicy($guestPolicy)
    {
        $this->guestPolicy = $guestPolicy;

        return $this;
    }

    /**
     * @return array
     */
    public function getPresentations()
    {
        return $this->presentations;
    }

    /**
     * @param $nameOrUrl
     * @param null $content
     * @param null $filename
     *
     * @return CreateMeetingParameters
     */
    public function addPresentation($nameOrUrl, $content = null, $filename
= null)
    {
        if (!$filename) {
            $this->presentations[$nameOrUrl] = !$content ?:
base64_encode($content);
        } else {
            $this->presentations[$nameOrUrl] = $filename;
        }

        return $this;
    }

    /**
     * @return mixed
     */
    public function getPresentationsAsXML()
    {
        $result = '';

        if (!empty($this->presentations)) {
            $xml    = new \SimpleXMLElement('<?xml
version="1.0"
encoding="UTF-8"?><modules/>');
            $module = $xml->addChild('module');
            $module->addAttribute('name',
'presentation');

            foreach ($this->presentations as $nameOrUrl => $content)
{
                if (0 === mb_strpos($nameOrUrl, 'http')) {
                    $presentation =
$module->addChild('document');
                    $presentation->addAttribute('url',
$nameOrUrl);
                    if (is_string($content)) {
                       
$presentation->addAttribute('filename', $content);
                    }
                } else {
                    $document = $module->addChild('document');
                    $document->addAttribute('name',
$nameOrUrl);
                    $document[0] = $content;
                }
            }
            $result = $xml->asXML();
        }

        return $result;
    }

    /**
     * @return string
     */
    public function getHTTPQuery()
    {
        $queries = [
            'name'                               =>
$this->meetingName,
            'meetingID'                          =>
$this->meetingId,
            'attendeePW'                         =>
$this->attendeePassword,
            'moderatorPW'                        =>
$this->moderatorPassword,
            'dialNumber'                         =>
$this->dialNumber,
            'voiceBridge'                        =>
$this->voiceBridge,
            'webVoice'                           =>
$this->webVoice,
            'logoutURL'                          =>
$this->logoutUrl,
            'record'                             =>
$this->record ? 'true' : 'false',
            'duration'                           =>
$this->duration,
            'maxParticipants'                    =>
$this->maxParticipants,
            'autoStartRecording'                 =>
$this->autoStartRecording ? 'true' : 'false',
            'allowStartStopRecording'            =>
$this->allowStartStopRecording ? 'true' : 'false',
            'welcome'                            =>
trim($this->welcomeMessage),
            'moderatorOnlyMessage'               =>
trim($this->moderatorOnlyMessage),
            'webcamsOnlyForModerator'            =>
$this->webcamsOnlyForModerator ? 'true' : 'false',
            'logo'                               =>
$this->logo,
            'copyright'                          =>
$this->copyright,
            'muteOnStart'                        =>
$this->muteOnStart ? 'true' : 'false',
            'guestPolicy'                        =>
$this->guestPolicy,
            'lockSettingsDisableCam'             =>
$this->isLockSettingsDisableCam() ? 'true' :
'false',
            'lockSettingsDisableMic'             =>
$this->isLockSettingsDisableMic() ? 'true' :
'false',
            'lockSettingsDisablePrivateChat'     =>
$this->isLockSettingsDisablePrivateChat() ? 'true' :
'false',
            'lockSettingsDisablePublicChat'      =>
$this->isLockSettingsDisablePublicChat() ? 'true' :
'false',
            'lockSettingsDisableNote'            =>
$this->isLockSettingsDisableNote() ? 'true' :
'false',
            'lockSettingsHideUserList'           =>
$this->isLockSettingsHideUserList() ? 'true' :
'false',
            'lockSettingsLockedLayout'           =>
$this->isLockSettingsLockedLayout() ? 'true' :
'false',
            'lockSettingsLockOnJoin'             =>
$this->isLockSettingsLockOnJoin() ? 'true' :
'false',
            'lockSettingsLockOnJoinConfigurable' =>
$this->isLockSettingsLockOnJoinConfigurable() ? 'true' :
'false',
            'allowModsToUnmuteUsers'             =>
$this->isAllowModsToUnmuteUsers() ? 'true' :
'false',
        ];

        // Add breakout rooms parameters only if the meeting is a breakout
room
        if ($this->isBreakout()) {
            $queries = array_merge($queries, [
                'isBreakout'      => $this->isBreakout ?
'true' : 'false',
                'parentMeetingID' =>
$this->parentMeetingId,
                'sequence'        => $this->sequence,
                'freeJoin'        => $this->freeJoin ?
'true' : 'false',
            ]);
        }

        $this->buildMeta($queries);

        return $this->buildHTTPQuery($queries);
    }
}
PK5~�[�DϿ��1bbb/src/Parameters/DeleteRecordingsParameters.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Parameters;

/**
 * Class DeleteRecordingsParameters.
 */
class DeleteRecordingsParameters extends BaseParameters
{
    /**
     * @var string
     */
    private $recordingId;

    /**
     * DeleteRecordingsParameters constructor.
     *
     * @param $recordingId
     */
    public function __construct($recordingId)
    {
        $this->recordingId = $recordingId;
    }

    /**
     * @return string
     */
    public function getRecordingId()
    {
        return $this->recordingId;
    }

    /**
     * @param string $recordingId
     *
     * @return DeleteRecordingsParameters
     */
    public function setRecordingId($recordingId)
    {
        $this->recordingId = $recordingId;

        return $this;
    }

    /**
     * @return string
     */
    public function getHTTPQuery()
    {
        return $this->buildHTTPQuery(['recordID' =>
$this->recordingId]);
    }
}
PK5~�['���+bbb/src/Parameters/EndMeetingParameters.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Parameters;

/**
 * Class EndMeetingParameters.
 */
class EndMeetingParameters extends BaseParameters
{
    /**
     * @var string
     */
    private $meetingId;

    /**
     * @var string
     */
    private $password;

    /**
     * EndMeetingParameters constructor.
     *
     * @param $meetingId
     * @param $password
     */
    public function __construct($meetingId, $password)
    {
        $this->password  = $password;
        $this->meetingId = $meetingId;
    }

    /**
     * @return string
     */
    public function getMeetingId()
    {
        return $this->meetingId;
    }

    /**
     * @param string $meetingId
     *
     * @return EndMeetingParameters
     */
    public function setMeetingId($meetingId)
    {
        $this->meetingId = $meetingId;

        return $this;
    }

    /**
     * @return string
     */
    public function getPassword()
    {
        return $this->password;
    }

    /**
     * @param string $password
     *
     * @return EndMeetingParameters
     */
    public function setPassword($password)
    {
        $this->password = $password;

        return $this;
    }

    /**
     * @return string
     */
    public function getHTTPQuery()
    {
        return $this->buildHTTPQuery(
            [
                'meetingID' => $this->meetingId,
                'password'  => $this->password,
            ]
        );
    }
}
PK5~�[3�z��/bbb/src/Parameters/GetMeetingInfoParameters.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Parameters;

/**
 * Class GetMeetingInfoParameters.
 */
class GetMeetingInfoParameters extends BaseParameters
{
    /**
     * @var string
     */
    private $meetingId;

    /**
     * GetMeetingInfoParameters constructor.
     *
     * @param $meetingId
     */
    public function __construct($meetingId)
    {
        $this->meetingId = $meetingId;
    }

    /**
     * @return string
     */
    public function getMeetingId()
    {
        return $this->meetingId;
    }

    /**
     * @param string $meetingId
     *
     * @return GetMeetingInfoParameters
     */
    public function setMeetingId($meetingId)
    {
        $this->meetingId = $meetingId;

        return $this;
    }

    /**
     * @return string
     */
    public function getHTTPQuery()
    {
        return $this->buildHTTPQuery(
            [
                'meetingID' => $this->meetingId,
            ]
        );
    }
}
PK5~�[x߈G�	�	.bbb/src/Parameters/GetRecordingsParameters.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Parameters;

/**
 * Class GetRecordingsParameters.
 */
class GetRecordingsParameters extends MetaParameters
{
    /**
     * @var string
     */
    private $meetingId;

    /**
     * @var string
     */
    private $recordId;

    /**
     * @var string
     */
    private $state;

    /**
     * @return string
     */
    public function getMeetingId()
    {
        return $this->meetingId;
    }

    /**
     * @param string $meetingId
     *
     * @return GetRecordingsParameters
     */
    public function setMeetingId($meetingId)
    {
        $this->meetingId = $meetingId;

        return $this;
    }

    /**
     * @return string
     */
    public function getRecordId()
    {
        return $this->recordId;
    }

    /**
     * @param string $recordId
     *
     * @return GetRecordingsParameters
     */
    public function setRecordId($recordId)
    {
        $this->recordId = $recordId;

        return $this;
    }

    /**
     * @return string
     */
    public function getState()
    {
        return $this->state;
    }

    /**
     * @param string $state
     *
     * @return GetRecordingsParameters
     */
    public function setState($state)
    {
        $this->state = $state;

        return $this;
    }

    /**
     * @return string
     */
    public function getHTTPQuery()
    {
        $queries = [
            'meetingID' => $this->meetingId,
            'recordID'  => $this->recordId,
            'state'     => $this->state,
        ];

        $this->buildMeta($queries);

        return $this->buildHTTPQuery($queries);
    }
}
PK5~�[D}_�C
C
,bbb/src/Parameters/HooksCreateParameters.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Parameters;

class HooksCreateParameters extends BaseParameters
{
    /**
     * @var string
     */
    private $callbackUrl;

    /**
     * @var string
     */
    private $meetingId;

    /**
     * @var bool
     */
    private $getRaw;

    /**
     * HooksCreateParameters constructor.
     *
     * @param $callbackUrl
     */
    public function __construct($callbackUrl)
    {
        $this->callbackUrl = $callbackUrl;
    }

    /**
     * @return string
     */
    public function getCallbackUrl()
    {
        return $this->callbackUrl;
    }

    /**
     * @param string $callbackUrl
     *
     * @return HooksCreateParameters
     */
    public function setCallbackUrl($callbackUrl)
    {
        $this->callbackUrl = $callbackUrl;

        return $this;
    }

    /**
     * @return string
     */
    public function getMeetingId()
    {
        return $this->meetingId;
    }

    /**
     * @param string $meetingId
     *
     * @return HooksCreateParameters
     */
    public function setMeetingId($meetingId)
    {
        $this->meetingId = $meetingId;

        return $this;
    }

    /**
     * @return null|bool
     */
    public function getRaw()
    {
        return $this->getRaw;
    }

    /**
     * @param bool $getRaw
     *
     * @return HooksCreateParameters
     */
    public function setGetRaw($getRaw)
    {
        $this->getRaw = $getRaw;

        return $this;
    }

    /**
     * @return string
     */
    public function getHTTPQuery()
    {
        $queries = [
            'callbackURL' => $this->callbackUrl,
            'meetingID'   => $this->meetingId,
            'getRaw'      => $this->getRaw ?
'true' : 'false',
        ];

        return $this->buildHTTPQuery($queries);
    }
}
PK5~�[h�c��-bbb/src/Parameters/HooksDestroyParameters.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Parameters;

class HooksDestroyParameters extends BaseParameters
{
    /**
     * @var string
     */
    private $hookId;

    /**
     * HooksDestroyParameters constructor.
     *
     * @param $hookId
     */
    public function __construct($hookId)
    {
        $this->hookId = $hookId;
    }

    /**
     * @return string
     */
    public function getHookId()
    {
        return $this->hookId;
    }

    /**
     * @param string $hookId
     *
     * @return HooksDestroyParameters
     */
    public function setHookId($hookId)
    {
        $this->hookId = $hookId;

        return $this;
    }

    /**
     * @return string
     */
    public function getHTTPQuery()
    {
        $queries = [
            'hookID' => $this->hookId,
        ];

        return $this->buildHTTPQuery($queries);
    }
}
PK5~�[�2�c��1bbb/src/Parameters/IsMeetingRunningParameters.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Parameters;

/**
 * Class IsMeetingRunningParameters.
 */
class IsMeetingRunningParameters extends BaseParameters
{
    /**
     * @var string
     */
    private $meetingId;

    /**
     * IsMeetingRunningParameters constructor.
     *
     * @param $meetingId
     */
    public function __construct($meetingId)
    {
        $this->meetingId = $meetingId;
    }

    /**
     * @return string
     */
    public function getMeetingId()
    {
        return $this->meetingId;
    }

    /**
     * @param string $meetingId
     *
     * @return IsMeetingRunningParameters
     */
    public function setMeetingId($meetingId)
    {
        $this->meetingId = $meetingId;

        return $this;
    }

    /**
     * @return string
     */
    public function getHTTPQuery()
    {
        return $this->buildHTTPQuery(['meetingID' =>
$this->meetingId]);
    }
}
PK5~�[0nx�FF,bbb/src/Parameters/JoinMeetingParameters.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Parameters;

/**
 * Class JoinMeetingParametersTest.
 */
class JoinMeetingParameters extends UserDataParameters
{
    /**
     * @var string
     */
    private $meetingId;

    /**
     * @var string
     */
    private $username;

    /**
     * @var string
     */
    private $password;

    /**
     * @var string
     */
    private $userId;

    /**
     * @var string
     */
    private $webVoiceConf;

    /**
     * @var string
     */
    private $creationTime;

    /**
     * @var string
     */
    private $configToken;

    /**
     * @var string
     */
    private $avatarURL;

    /**
     * @var bool
     */
    private $redirect;

    /**
     * @var
     */
    private $clientURL;

    /**
     * @var array
     */
    private $customParameters;

    /**
     * JoinMeetingParametersTest constructor.
     *
     * @param $meetingId
     * @param $username
     * @param $password
     */
    public function __construct($meetingId, $username, $password)
    {
        $this->meetingId        = $meetingId;
        $this->username         = $username;
        $this->password         = $password;
        $this->customParameters = [];
    }

    /**
     * @return string
     */
    public function getMeetingId()
    {
        return $this->meetingId;
    }

    /**
     * @param string $meetingId
     *
     * @return JoinMeetingParameters
     */
    public function setMeetingId($meetingId)
    {
        $this->meetingId = $meetingId;

        return $this;
    }

    /**
     * @return string
     */
    public function getUsername()
    {
        return $this->username;
    }

    /**
     * @param string $username
     *
     * @return JoinMeetingParameters
     */
    public function setUsername($username)
    {
        $this->username = $username;

        return $this;
    }

    /**
     * @return string
     */
    public function getPassword()
    {
        return $this->password;
    }

    /**
     * @param string $password
     *
     * @return JoinMeetingParameters
     */
    public function setPassword($password)
    {
        $this->password = $password;

        return $this;
    }

    /**
     * @return string
     */
    public function getUserId()
    {
        return $this->userId;
    }

    /**
     * @param string $userId
     *
     * @return JoinMeetingParameters
     */
    public function setUserId($userId)
    {
        $this->userId = $userId;

        return $this;
    }

    /**
     * @return string
     */
    public function getWebVoiceConf()
    {
        return $this->webVoiceConf;
    }

    /**
     * @param string $webVoiceConf
     *
     * @return JoinMeetingParameters
     */
    public function setWebVoiceConf($webVoiceConf)
    {
        $this->webVoiceConf = $webVoiceConf;

        return $this;
    }

    /**
     * @return string
     */
    public function getCreationTime()
    {
        return $this->creationTime;
    }

    /**
     * @param int $creationTime
     *
     * @return JoinMeetingParameters
     */
    public function setCreationTime($creationTime)
    {
        $this->creationTime = $creationTime;

        return $this;
    }

    /**
     * @return string
     */
    public function getConfigToken()
    {
        return $this->configToken;
    }

    /**
     * @param string $configToken
     *
     * @return JoinMeetingParameters
     */
    public function setConfigToken($configToken)
    {
        $this->configToken = $configToken;

        return $this;
    }

    /**
     * @return string
     */
    public function getAvatarURL()
    {
        return $this->avatarURL;
    }

    /**
     * @param string $avatarURL
     *
     * @return JoinMeetingParameters
     */
    public function setAvatarURL($avatarURL)
    {
        $this->avatarURL = $avatarURL;

        return $this;
    }

    /**
     * @return null|bool
     */
    public function isRedirect()
    {
        return $this->redirect;
    }

    /**
     * @param bool $redirect
     *
     * @return JoinMeetingParameters
     */
    public function setRedirect($redirect)
    {
        $this->redirect = $redirect;

        return $this;
    }

    /**
     * @return mixed
     */
    public function getClientURL()
    {
        return $this->clientURL;
    }

    /**
     * @param mixed $clientURL
     *
     * @return JoinMeetingParameters
     */
    public function setClientURL($clientURL)
    {
        $this->clientURL = $clientURL;

        return $this;
    }

    /**
     * @param string $paramName
     * @param string $paramValue
     *
     * @return JoinMeetingParameters
     */
    public function setCustomParameter($paramName, $paramValue)
    {
        $this->customParameters[$paramName] = $paramValue;

        return $this;
    }

    /**
     * @return string
     */
    public function getHTTPQuery()
    {
        $queries = [
            'meetingID'    => $this->meetingId,
            'fullName'     => $this->username,
            'password'     => $this->password,
            'userID'       => $this->userId,
            'webVoiceConf' => $this->webVoiceConf,
            'createTime'   => $this->creationTime,
            'configToken'  => $this->configToken,
            'avatarURL'    => $this->avatarURL,
            'redirect'     => $this->redirect ?
'true' : 'false',
            'clientURL'    => $this->clientURL,
        ];

        foreach ($this->customParameters as $key => $value) {
            $queries[$key] = $value;
        }

        $this->buildUserData($queries);

        return $this->buildHTTPQuery($queries);
    }
}
PK5~�[/��?%bbb/src/Parameters/MetaParameters.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Parameters;

/**
 * Class MetaParameters.
 */
abstract class MetaParameters extends BaseParameters
{
    /**
     * @var array
     */
    private $meta = [];

    /**
     * @param $key
     *
     * @return mixed
     */
    public function getMeta($key)
    {
        return $this->meta[$key];
    }

    /**
     * @param string $key
     * @param string $value
     *
     * @return $this
     */
    public function addMeta($key, $value)
    {
        $this->meta[$key] = $value;

        return $this;
    }

    /**
     * @param $queries
     */
    protected function buildMeta(&$queries)
    {
        if (0 !== count($this->meta)) {
            foreach ($this->meta as $k => $v) {
                if (!is_bool($v)) {
                    $queries['meta_' . $k] = $v;
                } else {
                    $queries['meta_' . $k] = $v ?
'true' : 'false';
                }
            }
        }
    }
}
PK5~�[�+]��2bbb/src/Parameters/PublishRecordingsParameters.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Parameters;

/**
 * Class PublishRecordingsParameters.
 */
class PublishRecordingsParameters extends BaseParameters
{
    /**
     * @var string
     */
    private $recordingId;

    /**
     * @var bool
     */
    private $publish;

    /**
     * PublishRecordingsParameters constructor.
     *
     * @param $recordingId
     * @param $publish
     */
    public function __construct($recordingId, $publish)
    {
        $this->recordingId = $recordingId;
        $this->publish     = $publish;
    }

    /**
     * @return string
     */
    public function getRecordingId()
    {
        return $this->recordingId;
    }

    /**
     * @param string $recordingId
     *
     * @return PublishRecordingsParameters
     */
    public function setRecordingId($recordingId)
    {
        $this->recordingId = $recordingId;

        return $this;
    }

    /**
     * @return null|bool
     */
    public function isPublish()
    {
        return $this->publish;
    }

    /**
     * @param bool $publish
     */
    public function setPublish($publish)
    {
        $this->publish = $publish;
    }

    /**
     * @return string
     */
    public function getHTTPQuery()
    {
        return $this->buildHTTPQuery(
            [
                'recordID' => $this->recordingId,
                'publish'  => $this->publish ?
'true' : 'false',
            ]
        );
    }
}
PK5~�[��ˠAA1bbb/src/Parameters/UpdateRecordingsParameters.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Parameters;

/**
 * Class UpdateRecordingsParameters.
 */
class UpdateRecordingsParameters extends MetaParameters
{
    /**
     * @var string
     */
    private $recordingId;

    /**
     * UpdateRecordingsParameters constructor.
     *
     * @param $recordingId
     */
    public function __construct($recordingId)
    {
        $this->recordingId = $recordingId;
    }

    /**
     * @return string
     */
    public function getRecordingId()
    {
        return $this->recordingId;
    }

    /**
     * @param string $recordingId
     *
     * @return UpdateRecordingsParameters
     */
    public function setRecordingId($recordingId)
    {
        $this->recordingId = $recordingId;

        return $this;
    }

    /**
     * @return string
     */
    public function getHTTPQuery()
    {
        $queries = [
            'recordID' => $this->recordingId,
        ];

        $this->buildMeta($queries);

        return $this->buildHTTPQuery($queries);
    }
}
PK5~�[㻺)bbb/src/Parameters/UserDataParameters.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Parameters;

/**
 * Class UserDataParameters.
 */
abstract class UserDataParameters extends BaseParameters
{
    /**
     * @var array
     */
    private $userData = [];

    /**
     * @param $key
     *
     * @return mixed
     */
    public function getUserData($key)
    {
        return $this->userData[$key];
    }

    /**
     * @param string $key
     * @param string $value
     *
     * @return $this
     */
    public function addUserData($key, $value)
    {
        $this->userData[$key] = $value;

        return $this;
    }

    protected function buildUserData(&$queries)
    {
        if (0 !== count($this->userData)) {
            foreach ($this->userData as $k => $v) {
                if (!is_bool($v)) {
                    $queries['userdata-' . $k] = $v;
                } else {
                    $queries['userdata-' . $k] = $v ?
'true' : 'false';
                }
            }
        }
    }
}
PK5~�[�#o,,bbb/src/Parameters/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[�@��xx(bbb/src/Responses/ApiVersionResponse.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Responses;

/**
 * Class ApiVersionResponse.
 */
class ApiVersionResponse extends BaseResponse
{
    /**
     * @return string
     */
    public function getVersion()
    {
        return $this->rawXml->version->__toString();
    }

    /**
     * @return string
     */
    public function getApiVersion()
    {
        return $this->rawXml->apiVersion->__toString();
    }

    /**
     * @return string
     */
    public function getBbbVersion()
    {
        return $this->rawXml->bbbVersion->__toString();
    }
}
PK5~�[�K8i��"bbb/src/Responses/BaseResponse.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Responses;

/**
 * Class BaseResponse.
 */
abstract class BaseResponse
{
    public const SUCCESS = 'SUCCESS';
    public const FAILED  = 'FAILED';

    /**
     * @var \SimpleXMLElement
     */
    protected $rawXml;

    /**
     * BaseResponse constructor.
     */
    public function __construct(\SimpleXMLElement $xml)
    {
        $this->rawXml = $xml;
    }

    /**
     * @return \SimpleXMLElement
     */
    public function getRawXml()
    {
        return $this->rawXml;
    }

    /**
     * @return string
     */
    public function getReturnCode()
    {
        return $this->rawXml->returncode->__toString();
    }

    /**
     * @return string
     */
    public function getMessageKey()
    {
        return $this->rawXml->messageKey->__toString();
    }

    /**
     * @return string
     */
    public function getMessage()
    {
        return $this->rawXml->message->__toString();
    }

    public function success()
    {
        return self::SUCCESS === $this->getReturnCode();
    }

    public function failed()
    {
        return self::FAILED === $this->getReturnCode();
    }
}
PK5~�[^��+++bbb/src/Responses/CreateMeetingResponse.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Responses;

/**
 * Class CreateMeetingResponse.
 */
class CreateMeetingResponse extends BaseResponse
{
    /**
     * @return string
     */
    public function getMeetingId()
    {
        return $this->rawXml->meetingID->__toString();
    }

    /**
     * @return string
     */
    public function getInternalMeetingId()
    {
        return $this->rawXml->internalMeetingID->__toString();
    }

    /**
     * @return string
     */
    public function getParentMeetingId()
    {
        return $this->rawXml->parentMeetingID->__toString();
    }

    /**
     * @return string
     */
    public function getAttendeePassword()
    {
        return $this->rawXml->attendeePW->__toString();
    }

    /**
     * @return string
     */
    public function getModeratorPassword()
    {
        return $this->rawXml->moderatorPW->__toString();
    }

    /**
     * Creation timestamp.
     *
     * @return float
     */
    public function getCreationTime()
    {
        return (float) $this->rawXml->createTime;
    }

    /**
     * @return int
     */
    public function getVoiceBridge()
    {
        return (int) $this->rawXml->voiceBridge;
    }

    /**
     * @return string
     */
    public function getDialNumber()
    {
        return $this->rawXml->dialNumber->__toString();
    }

    /**
     * Creation date at the format "Sun Jan 17 18:20:07 EST
2016".
     *
     * @return string
     */
    public function getCreationDate()
    {
        return $this->rawXml->createDate->__toString();
    }

    /**
     * @return true
     */
    public function hasUserJoined()
    {
        return 'true' ===
$this->rawXml->hasUserJoined->__toString();
    }

    /**
     * @return int
     */
    public function getDuration()
    {
        return (int) $this->rawXml->duration;
    }

    /**
     * @return null|bool
     */
    public function hasBeenForciblyEnded()
    {
        return 'true' ===
$this->rawXml->hasBeenForciblyEnded->__toString();
    }
}
PK5~�[h�
�rr.bbb/src/Responses/DeleteRecordingsResponse.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Responses;

/**
 * Class DeleteRecordingsResponse.
 */
class DeleteRecordingsResponse extends BaseResponse
{
    /**
     * @return null|bool
     */
    public function isDeleted()
    {
        return 'true' ==
$this->rawXml->deleted->__toString();
    }
}
PK5~�[4��U��(bbb/src/Responses/EndMeetingResponse.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Responses;

/**
 * Class EndMeetingResponse.
 */
class EndMeetingResponse extends BaseResponse
{
    /**
     * @return string
     */
    public function getMessageKey()
    {
        return $this->rawXml->messageKey->__toString();
    }

    /**
     * @return string
     */
    public function getMessage()
    {
        return $this->rawXml->message->__toString();
    }
}
PK5~�[�D��,bbb/src/Responses/GetMeetingInfoResponse.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Responses;

use BigBlueButton\Core\Meeting;

/**
 * Class GetMeetingInfoResponse.
 */
class GetMeetingInfoResponse extends BaseResponse
{
    /**
     * @var Meeting
     */
    private $meeting;

    /**
     * @return Meeting
     */
    public function getMeeting()
    {
        if (null === $this->meeting) {
            $this->meeting = new Meeting($this->rawXml);
        }

        return $this->meeting;
    }
}
PK5~�[t�����)bbb/src/Responses/GetMeetingsResponse.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Responses;

use BigBlueButton\Core\Meeting;

/**
 * Class GetMeetingsResponse.
 */
class GetMeetingsResponse extends BaseResponse
{
    /**
     * @var Meeting[]
     */
    private $meetings;

    /**
     * @return Meeting[]
     */
    public function getMeetings()
    {
        if (null === $this->meetings) {
            $this->meetings = [];
            foreach ($this->rawXml->meetings->children() as
$meetingXml) {
                $this->meetings[] = new Meeting($meetingXml);
            }
        }

        return $this->meetings;
    }
}
PK5~�[9d0��+bbb/src/Responses/GetRecordingsResponse.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Responses;

use BigBlueButton\Core\Record;

/**
 * Class GetRecordingsResponse.
 */
class GetRecordingsResponse extends BaseResponse
{
    /**
     * @var Record[]
     */
    private $records;

    /**
     * @return Record[]
     */
    public function getRecords()
    {
        if (null === $this->records) {
            $this->records = [];
            foreach ($this->rawXml->recordings->children() as
$recordXml) {
                $this->records[] = new Record($recordXml);
            }
        }

        return $this->records;
    }
}
PK5~�[�*ؘ�)bbb/src/Responses/HooksCreateResponse.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Responses;

/**
 * Class GetRecordingsResponse.
 */
class HooksCreateResponse extends BaseResponse
{
    /**
     * @return int
     */
    public function getHookId()
    {
        return (int) $this->rawXml->hookID->__toString();
    }

    /**
     * @return null|bool
     */
    public function isPermanentHook()
    {
        return 'true' ===
$this->rawXml->permanentHook->__toString();
    }

    /**
     * @return null|bool
     */
    public function hasRawData()
    {
        return 'true' ===
$this->rawXml->rawData->__toString();
    }
}
PK5~�[�o�jj*bbb/src/Responses/HooksDestroyResponse.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Responses;

/**
 * Class GetRecordingsResponse.
 */
class HooksDestroyResponse extends BaseResponse
{
    /**
     * @return null|bool
     */
    public function removed()
    {
        return 'true' ===
$this->rawXml->removed->__toString();
    }
}
PK5~�[���oo'bbb/src/Responses/HooksListResponse.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Responses;

use BigBlueButton\Core\Hook;

/**
 * Class GetRecordingsResponse.
 */
class HooksListResponse extends BaseResponse
{
    /**
     * @var Hook[]
     */
    private $hooks;

    /**
     * @return Hook[]
     */
    public function getHooks()
    {
        if (null === $this->hooks) {
            $this->hooks = [];
            foreach ($this->rawXml->hooks->children() as $hookXml)
{
                $this->hooks[] = new Hook($hookXml);
            }
        }

        return $this->hooks;
    }
}
PK5~�[���ss.bbb/src/Responses/IsMeetingRunningResponse.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Responses;

/**
 * Class IsMeetingRunningResponse.
 */
class IsMeetingRunningResponse extends BaseResponse
{
    /**
     * @return null|bool
     */
    public function isRunning()
    {
        return 'true' ===
$this->rawXml->running->__toString();
    }
}
PK5~�[���)bbb/src/Responses/JoinMeetingResponse.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Responses;

/**
 * Class JoinMeetingResponse.
 */
class JoinMeetingResponse extends BaseResponse
{
    /**
     * @return string
     */
    public function getMeetingId()
    {
        return $this->rawXml->meeting_id->__toString();
    }

    /**
     * @return string
     */
    public function getUserId()
    {
        return $this->rawXml->user_id->__toString();
    }

    /**
     * @return string
     */
    public function getAuthToken()
    {
        return $this->rawXml->auth_token->__toString();
    }

    /**
     * @return string
     */
    public function getSessionToken()
    {
        return $this->rawXml->session_token->__toString();
    }

    /**
     * @return string
     */
    public function getGuestStatus()
    {
        return $this->rawXml->guestStatus->__toString();
    }

    /**
     * @return string
     */
    public function getUrl()
    {
        return $this->rawXml->url->__toString();
    }
}
PK5~�[
9��yy/bbb/src/Responses/PublishRecordingsResponse.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Responses;

/**
 * Class PublishRecordingsResponse.
 */
class PublishRecordingsResponse extends BaseResponse
{
    /**
     * @return null|bool
     */
    public function isPublished()
    {
        return 'true' ===
$this->rawXml->published->__toString();
    }
}
PK5~�[��ss.bbb/src/Responses/UpdateRecordingsResponse.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Responses;

/**
 * Class UpdateRecordingsResponse.
 */
class UpdateRecordingsResponse extends BaseResponse
{
    /**
     * @return null|bool
     */
    public function isUpdated()
    {
        return 'true' ===
$this->rawXml->updated->__toString();
    }
}
PK5~�[�#o,,bbb/src/Responses/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[��5
TTbbb/src/Util/UrlBuilder.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Util;

/**
 * Class UrlBuilder.
 */
class UrlBuilder
{
    /**
     * @var string
     */
    private $securitySalt;

    /**
     * @var string
     */
    private $bbbServerBaseUrl;

    /**
     * UrlBuilder constructor.
     *
     * @param $secret
     * @param $serverBaseUrl
     */
    public function __construct($secret, $serverBaseUrl)
    {
        $this->securitySalt     = $secret;
        $this->bbbServerBaseUrl = $serverBaseUrl;
    }

    /**
     * Builds an API method URL that includes the url + params + its
generated checksum.
     *
     * @param string $method
     * @param string $params
     * @param bool   $append
     *
     * @return string
     */
    public function buildUrl($method = '', $params =
'', $append = true)
    {
        return $this->bbbServerBaseUrl . 'api/' . $method .
($append ? '?' . $this->buildQs($method, $params) :
'');
    }

    /**
     * Builds a query string for an API method URL that includes the params
+ its generated checksum.
     *
     * @param string $method
     * @param string $params
     *
     * @return string
     */
    public function buildQs($method = '', $params = '')
    {
        return $params . '&checksum=' . sha1($method .
$params . $this->securitySalt);
    }
}
PK5~�[�#o,,bbb/src/Util/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[�#o,,bbb/src/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[�f�v..bbb/tests/BigBlueButtonTest.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton;

use BigBlueButton\Core\ApiMethod;
use BigBlueButton\Parameters\DeleteRecordingsParameters;
use BigBlueButton\Parameters\EndMeetingParameters;
use BigBlueButton\Parameters\GetMeetingInfoParameters;
use BigBlueButton\Parameters\GetRecordingsParameters;
use BigBlueButton\Parameters\IsMeetingRunningParameters;
use BigBlueButton\Parameters\PublishRecordingsParameters;

/**
 * Class BigBlueButtonTest.
 *
 * @internal
 * @coversNothing
 */
class BigBlueButtonTest extends TestCase
{
    /**
     * @var BigBlueButton
     */
    private $bbb;

    /**
     * Setup test class.
     */
    public function setUp(): void
    {
        parent::setUp();

        foreach (['BBB_SECRET', 'BBB_SERVER_BASE_URL']
as $k) {
            if (!getenv($k)) {
                $this->fail('$_SERVER[\'' . $k .
'\'] not set in '
                    . 'phpunit.xml');
            }
        }

        $this->bbb = new BigBlueButton();
    }

    // API Version

    /**
     * Test API version call.
     */
    public function testApiVersion()
    {
        $apiVersion = $this->bbb->getApiVersion();
        $this->assertEquals('SUCCESS',
$apiVersion->getReturnCode());
        $this->assertEquals('2.0',
$apiVersion->getVersion());
        $this->assertTrue($apiVersion->success());
    }

    // Create Meeting

    /**
     * Test create meeting URL.
     */
    public function testCreateMeetingUrl()
    {
        $params = $this->generateCreateParams();
        $url    =
$this->bbb->getCreateMeetingUrl($this->getCreateMock($params));
        foreach ($params as $key => $value) {
            if (is_bool($value)) {
                $value = $value ? 'true' : 'false';
            }
            $this->assertStringContainsString('=' .
urlencode($value), $url);
        }
    }

    /**
     * Test create meeting.
     */
    public function testCreateMeeting()
    {
        $params = $this->generateCreateParams();
        $result =
$this->bbb->createMeeting($this->getCreateMock($params));
        $this->assertEquals('SUCCESS',
$result->getReturnCode());
        $this->assertTrue($result->success());
    }

    /**
     * Test create meeting with a document URL.
     */
    public function testCreateMeetingWithDocumentUrl()
    {
        $params =
$this->getCreateMock($this->generateCreateParams());
       
$params->addPresentation('https://picsum.photos/3840/2160/?random');

        $result = $this->bbb->createMeeting($params);

        $this->assertCount(1, $params->getPresentations());
        $this->assertEquals('SUCCESS',
$result->getReturnCode());
        $this->assertTrue($result->success());
    }

    /**
     * Test create meeting with a document URL and filename.
     */
    public function testCreateMeetingWithDocumentUrlAndFileName()
    {
        $params =
$this->getCreateMock($this->generateCreateParams());
       
$params->addPresentation('https://picsum.photos/3840/2160/?random',
null, 'placeholder.png');

        $result = $this->bbb->createMeeting($params);

        $this->assertCount(1, $params->getPresentations());
        $this->assertEquals('SUCCESS',
$result->getReturnCode());
        $this->assertTrue($result->success());
    }

    /**
     * Test create meeting with a document URL.
     */
    public function testCreateMeetingWithDocumentEmbedded()
    {
        $params =
$this->getCreateMock($this->generateCreateParams());
        $params->addPresentation('bbb_logo.png',
file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . 'fixtures' .
DIRECTORY_SEPARATOR . 'bbb_logo.png'));

        $result = $this->bbb->createMeeting($params);

        $this->assertCount(1, $params->getPresentations());
        $this->assertEquals('SUCCESS',
$result->getReturnCode());
        $this->assertTrue($result->success());
    }

    /**
     * Test create meeting with a multiple documents.
     */
    public function testCreateMeetingWithMultiDocument()
    {
        $params =
$this->getCreateMock($this->generateCreateParams());
       
$params->addPresentation('https://picsum.photos/3840/2160/?random',
null, 'presentation.png');
        $params->addPresentation('logo.png',
file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . 'fixtures' .
DIRECTORY_SEPARATOR . 'bbb_logo.png'));

        $result = $this->bbb->createMeeting($params);

        $this->assertCount(2, $params->getPresentations());
        $this->assertEquals('SUCCESS',
$result->getReturnCode());
        $this->assertTrue($result->success());
    }

    // Join Meeting

    /**
     * Test create join meeting URL.
     */
    public function testCreateJoinMeetingUrl()
    {
        $joinMeetingParams = $this->generateJoinMeetingParams();
        $joinMeetingMock   =
$this->getJoinMeetingMock($joinMeetingParams);

        $url = $this->bbb->getJoinMeetingURL($joinMeetingMock);

        foreach ($joinMeetingParams as $key => $value) {
            if (is_bool($value)) {
                $value = $value ? 'true' : 'false';
            }
            $this->assertStringContainsString('=' .
urlencode($value), $url);
        }
    }

    /**
     * @expectedException \Exception
     * @expectedExceptionMessage String could not be parsed as XML
     */
    public function testJoinMeeting()
    {
        $joinMeetingParams = $this->generateJoinMeetingParams();
        $joinMeetingMock   =
$this->getJoinMeetingMock($joinMeetingParams);
        $joinMeetingMock->setRedirect(false);

        $joinMeeting = $this->bbb->joinMeeting($joinMeetingMock);
        $this->assertEquals('SUCCESS',
$joinMeeting->getReturnCode());
        $this->assertTrue($joinMeeting->success());
        $this->assertNotEmpty($joinMeeting->getAuthToken());
        $this->assertNotEmpty($joinMeeting->getUserId());
        $this->assertNotEmpty($joinMeeting->getSessionToken());
        $this->assertNotEmpty($joinMeeting->getGuestStatus());
        $this->assertNotEmpty($joinMeeting->getUrl());
    }

    // End Meeting

    /**
     * Test generate end meeting URL.
     */
    public function testCreateEndMeetingUrl()
    {
        $params = $this->generateEndMeetingParams();
        $url    =
$this->bbb->getEndMeetingURL($this->getEndMeetingMock($params));
        foreach ($params as $key => $value) {
            if (is_bool($value)) {
                $value = $value ? 'true' : 'false';
            }
            $this->assertStringContainsString('=' .
urlencode($value), $url);
        }
    }

    public function testEndMeeting()
    {
        $meeting = $this->createRealMeeting($this->bbb);

        $endMeeting = new EndMeetingParameters($meeting->getMeetingId(),
$meeting->getModeratorPassword());
        $result     = $this->bbb->endMeeting($endMeeting);
        $this->assertEquals('SUCCESS',
$result->getReturnCode());
        $this->assertTrue($result->success());
    }

    public function testEndNonExistingMeeting()
    {
        $params = $this->generateEndMeetingParams();
        $result =
$this->bbb->endMeeting($this->getEndMeetingMock($params));
        $this->assertEquals('FAILED',
$result->getReturnCode());
        $this->assertTrue($result->failed());
    }

    // Is Meeting Running

    public function testIsMeetingRunning()
    {
        $result = $this->bbb->isMeetingRunning(new
IsMeetingRunningParameters($this->faker->uuid));
        $this->assertEquals('SUCCESS',
$result->getReturnCode());
        $this->assertTrue($result->success());
        $this->assertEquals(false, $result->isRunning());
    }

    // Get Meetings

    public function testGetMeetingsUrl()
    {
        $url = $this->bbb->getMeetingsUrl();
        $this->assertStringContainsString(ApiMethod::GET_MEETINGS,
$url);
    }

    public function testGetMeetings()
    {
        $result = $this->bbb->getMeetings();
        $this->assertNotEmpty($result->getMeetings());
    }

    // Get meeting info

    public function testGetMeetingInfoUrl()
    {
        $meeting = $this->createRealMeeting($this->bbb);

        $url = $this->bbb->getMeetingInfoUrl(new
GetMeetingInfoParameters($meeting->getMeetingId(),
$meeting->getModeratorPassword()));
        $this->assertStringContainsString('=' .
urlencode($meeting->getMeetingId()), $url);
        $this->assertStringContainsString('=' .
urlencode($meeting->getModeratorPassword()), $url);
    }

    public function testGetMeetingInfo()
    {
        $meeting = $this->createRealMeeting($this->bbb);

        $result = $this->bbb->getMeetingInfo(new
GetMeetingInfoParameters($meeting->getMeetingId(),
$meeting->getModeratorPassword()));
        $this->assertEquals('SUCCESS',
$result->getReturnCode());
        $this->assertTrue($result->success());
    }

    public function testGetRecordingsUrl()
    {
        $url = $this->bbb->getRecordingsUrl(new
GetRecordingsParameters());
        $this->assertStringContainsString(ApiMethod::GET_RECORDINGS,
$url);
    }

    public function testGetRecordings()
    {
        $result = $this->bbb->getRecordings(new
GetRecordingsParameters());
        $this->assertEquals('SUCCESS',
$result->getReturnCode());
        $this->assertTrue($result->success());
    }

    public function testPublishRecordingsUrl()
    {
        $url = $this->bbb->getPublishRecordingsUrl(new
PublishRecordingsParameters($this->faker->sha1, true));
        $this->assertStringContainsString(ApiMethod::PUBLISH_RECORDINGS,
$url);
    }

    public function testPublishRecordings()
    {
        $result = $this->bbb->publishRecordings(new
PublishRecordingsParameters('non-existing-id-' .
$this->faker->sha1, true));
        $this->assertEquals('FAILED',
$result->getReturnCode());
        $this->assertTrue($result->failed());
    }

    public function testDeleteRecordingsUrl()
    {
        $url = $this->bbb->getDeleteRecordingsUrl(new
DeleteRecordingsParameters($this->faker->sha1));
        $this->assertStringContainsString(ApiMethod::DELETE_RECORDINGS,
$url);
    }

    public function testDeleteRecordings()
    {
        $result = $this->bbb->deleteRecordings(new
DeleteRecordingsParameters('non-existing-id-' .
$this->faker->sha1));
        $this->assertEquals('FAILED',
$result->getReturnCode());
        $this->assertTrue($result->failed());
    }

    public function testUpdateRecordingsUrl()
    {
        $params = $this->generateUpdateRecordingsParams();
        $url    =
$this->bbb->getUpdateRecordingsUrl($this->getUpdateRecordingsParamsMock($params));
        foreach ($params as $key => $value) {
            if (is_bool($value)) {
                $value = $value ? 'true' : 'false';
            }
            $this->assertStringContainsString('=' .
urlencode($value), $url);
        }
    }

    public function testUpdateRecordings()
    {
        $params = $this->generateUpdateRecordingsParams();
        $result =
$this->bbb->updateRecordings($this->getUpdateRecordingsParamsMock($params));
        $this->assertEquals('FAILED',
$result->getReturnCode());
        $this->assertTrue($result->failed());
    }
}
PK5~�[�n�%%4bbb/tests/Parameters/CreateMeetingParametersTest.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Parameters;

use BigBlueButton\TestCase;

/**
 * Class CreateMeetingParametersTest.
 *
 * @internal
 * @coversNothing
 */
class CreateMeetingParametersTest extends TestCase
{
    public function testCreateMeetingParameters()
    {
        $params              = $this->generateCreateParams();
        $createMeetingParams = $this->getCreateMock($params);

        $this->assertEquals($params['meetingName'],
$createMeetingParams->getMeetingName());
        $this->assertEquals($params['meetingId'],
$createMeetingParams->getMeetingId());
        $this->assertEquals($params['attendeePassword'],
$createMeetingParams->getAttendeePassword());
        $this->assertEquals($params['moderatorPassword'],
$createMeetingParams->getModeratorPassword());
        $this->assertEquals($params['autoStartRecording'],
$createMeetingParams->isAutoStartRecording());
        $this->assertEquals($params['dialNumber'],
$createMeetingParams->getDialNumber());
        $this->assertEquals($params['voiceBridge'],
$createMeetingParams->getVoiceBridge());
        $this->assertEquals($params['webVoice'],
$createMeetingParams->getWebVoice());
        $this->assertEquals($params['logoutUrl'],
$createMeetingParams->getLogoutUrl());
        $this->assertEquals($params['maxParticipants'],
$createMeetingParams->getMaxParticipants());
        $this->assertEquals($params['record'],
$createMeetingParams->isRecorded());
        $this->assertEquals($params['duration'],
$createMeetingParams->getDuration());
        $this->assertEquals($params['welcomeMessage'],
$createMeetingParams->getWelcomeMessage());
       
$this->assertEquals($params['allowStartStopRecording'],
$createMeetingParams->isAllowStartStopRecording());
        $this->assertEquals($params['moderatorOnlyMessage'],
$createMeetingParams->getModeratorOnlyMessage());
       
$this->assertEquals($params['webcamsOnlyForModerator'],
$createMeetingParams->isWebcamsOnlyForModerator());
        $this->assertEquals($params['logo'],
$createMeetingParams->getLogo());
        $this->assertEquals($params['copyright'],
$createMeetingParams->getCopyright());
        $this->assertEquals($params['muteOnStart'],
$createMeetingParams->isMuteOnStart());
        $this->assertEquals($params['lockSettingsDisableCam'],
$createMeetingParams->isLockSettingsDisableCam());
        $this->assertEquals($params['lockSettingsDisableMic'],
$createMeetingParams->isLockSettingsDisableMic());
       
$this->assertEquals($params['lockSettingsDisablePrivateChat'],
$createMeetingParams->isLockSettingsDisablePrivateChat());
       
$this->assertEquals($params['lockSettingsDisablePublicChat'],
$createMeetingParams->isLockSettingsDisablePublicChat());
       
$this->assertEquals($params['lockSettingsDisableNote'],
$createMeetingParams->isLockSettingsDisableNote());
       
$this->assertEquals($params['lockSettingsHideUserList'],
$createMeetingParams->isLockSettingsHideUserList());
       
$this->assertEquals($params['lockSettingsLockedLayout'],
$createMeetingParams->isLockSettingsLockedLayout());
        $this->assertEquals($params['lockSettingsLockOnJoin'],
$createMeetingParams->isLockSettingsLockOnJoin());
       
$this->assertEquals($params['lockSettingsLockOnJoinConfigurable'],
$createMeetingParams->isLockSettingsLockOnJoinConfigurable());
        $this->assertEquals($params['allowModsToUnmuteUsers'],
$createMeetingParams->isAllowModsToUnmuteUsers());
       
$this->assertEquals($params['allowModsToEjectCameras'],
$createMeetingParams->isAllowModsToEjectCameras());
        $this->assertEquals($params['guestPolicy'],
$createMeetingParams->getGuestPolicy());
        $this->assertEquals($params['endWhenNoModerator'],
$createMeetingParams->isEndWhenNoModerator());
       
$this->assertEquals($params['endWhenNoModeratorDelayInMinutes'],
$createMeetingParams->getEndWhenNoModeratorDelayInMinutes());
       
$this->assertEquals($params['learningDashboardEnabled'],
$createMeetingParams->isLearningDashboardEnabled());
       
$this->assertEquals($params['learningDashboardCleanupDelayInMinutes'],
$createMeetingParams->getLearningDashboardCleanupDelayInMinutes());
        $this->assertEquals($params['breakoutRoomsEnabled'],
$createMeetingParams->isBreakoutRoomsEnabled());
        $this->assertEquals($params['breakoutRoomsRecord'],
$createMeetingParams->isBreakoutRoomsRecord());
       
$this->assertEquals($params['breakoutRoomsPrivateChatEnabled'],
$createMeetingParams->isBreakoutRoomsPrivateChatEnabled());
        $this->assertEquals($params['meetingEndedURL'],
$createMeetingParams->getMeetingEndedURL());
        $this->assertEquals($params['meetingLayout'],
$createMeetingParams->getMeetingLayout());
        $this->assertEquals($params['meta_presenter'],
$createMeetingParams->getMeta('presenter'));
        $this->assertEquals($params['meta_endCallbackUrl'],
$createMeetingParams->getMeta('endCallbackUrl'));
       
$this->assertEquals($params['meta_bbb-recording-ready-url'],
$createMeetingParams->getMeta('bbb-recording-ready-url'));

        // Check values are empty of this is not a breakout room
        $this->assertNull($createMeetingParams->isBreakout());
       
$this->assertNull($createMeetingParams->getParentMeetingId());
        $this->assertNull($createMeetingParams->getSequence());
        $this->assertNull($createMeetingParams->isFreeJoin());

        // Test setters that are ignored by the constructor
        $createMeetingParams->setMeetingId($newId     =
$this->faker->uuid);
        $createMeetingParams->setMeetingName($newName =
$this->faker->name);
        $this->assertEquals($newName,
$createMeetingParams->getMeetingName());
        $this->assertEquals($newId,
$createMeetingParams->getMeetingId());
    }

    public function testCreateBreakoutMeeting()
    {
        $params                      =
$this->generateBreakoutCreateParams($this->generateCreateParams());
        $createBreakoutMeetingParams =
$this->getBreakoutCreateMock($params);
        $this->assertEquals($params['isBreakout'],
$createBreakoutMeetingParams->isBreakout());
        $this->assertEquals($params['parentMeetingId'],
$createBreakoutMeetingParams->getParentMeetingId());
        $this->assertEquals($params['sequence'],
$createBreakoutMeetingParams->getSequence());
        $this->assertEquals($params['freeJoin'],
$createBreakoutMeetingParams->isFreeJoin());

        $params = $createBreakoutMeetingParams->getHTTPQuery();

        $this->assertStringContainsString('isBreakout=' .
urlencode($createBreakoutMeetingParams->isBreakout() ? 'true'
: 'false'), $params);
        $this->assertStringContainsString('parentMeetingID=' .
urlencode($createBreakoutMeetingParams->getParentMeetingId()), $params);
        $this->assertStringContainsString('sequence=' .
urlencode($createBreakoutMeetingParams->getSequence()), $params);
        $this->assertStringContainsString('freeJoin=' .
urlencode($createBreakoutMeetingParams->isFreeJoin() ? 'true'
: 'false'), $params);
    }

    public function testGetPresentationsAsXMLWithUrl()
    {
        $params              = $this->generateCreateParams();
        $createMeetingParams = $this->getCreateMock($params);
       
$createMeetingParams->addPresentation('http://test-install.blindsidenetworks.com/default.pdf');
        $this->assertXmlStringEqualsXmlFile(__DIR__ .
DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR .
'fixtures' . DIRECTORY_SEPARATOR .
'presentation_with_url.xml',
$createMeetingParams->getPresentationsAsXML());
    }

    public function testGetPresentationsAsXMLWithUrlAndFilename()
    {
        $params              = $this->generateCreateParams();
        $createMeetingParams = $this->getCreateMock($params);
       
$createMeetingParams->addPresentation('http://test-install.blindsidenetworks.com/default.pdf',
null, 'presentation.pdf');
        $this->assertXmlStringEqualsXmlFile(__DIR__ .
DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR .
'fixtures' . DIRECTORY_SEPARATOR .
'presentation_with_filename.xml',
$createMeetingParams->getPresentationsAsXML());
    }

    public function testGetPresentationsAsXMLWithFile()
    {
        $params              = $this->generateCreateParams();
        $createMeetingParams = $this->getCreateMock($params);
        $createMeetingParams->addPresentation('bbb_logo.png',
file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . '..' .
DIRECTORY_SEPARATOR . 'fixtures' . DIRECTORY_SEPARATOR .
'bbb_logo.png'));
        $this->assertXmlStringEqualsXmlFile(__DIR__ .
DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR .
'fixtures' . DIRECTORY_SEPARATOR .
'presentation_with_embedded_file.xml',
$createMeetingParams->getPresentationsAsXML());
    }
}
PK5~�[�Y�<��7bbb/tests/Parameters/DeleteRecordingsParametersTest.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Parameters;

use BigBlueButton\TestCase;

/**
 * @internal
 * @coversNothing
 */
class DeleteRecordingsParametersTest extends TestCase
{
    public function testDeleteRecordingParameter()
    {
        $recordingId     = $this->faker->uuid;
        $deleteRecording = new DeleteRecordingsParameters($recordingId);

        $this->assertEquals($recordingId,
$deleteRecording->getRecordingId());

        // Test setters that are ignored by the constructor
        $deleteRecording->setRecordingId($recordingId =
$this->faker->uuid);
        $this->assertEquals($recordingId,
$deleteRecording->getRecordingId());
    }
}
PK5~�[�r���1bbb/tests/Parameters/EndMeetingParametersTest.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Parameters;

use BigBlueButton\TestCase;

/**
 * @internal
 * @coversNothing
 */
class EndMeetingParametersTest extends TestCase
{
    public function testEndMeetingParameters()
    {
        $endMeetingParams = new EndMeetingParameters($meetingId =
$this->faker->uuid, $password = $this->faker->password());

        $this->assertEquals($meetingId,
$endMeetingParams->getMeetingId());
        $this->assertEquals($password,
$endMeetingParams->getPassword());

        // Test setters that are ignored by the constructor
        $endMeetingParams->setMeetingId($newId      =
$this->faker->uuid);
        $endMeetingParams->setPassword($newPassword =
$this->faker->password);
        $this->assertEquals($newId,
$endMeetingParams->getMeetingId());
        $this->assertEquals($newPassword,
$endMeetingParams->getPassword());
    }
}
PK5~�[�Z���5bbb/tests/Parameters/GetMeetingInfoParametersTest.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Parameters;

use BigBlueButton\TestCase;

/**
 * @internal
 * @coversNothing
 */
class GetMeetingInfoParametersTest extends TestCase
{
    public function testGetMeetingInfoParameters()
    {
        $getMeetingInfoParams = new GetMeetingInfoParameters($meetingId =
$this->faker->uuid, $password = $this->faker->password());

        $this->assertEquals($meetingId,
$getMeetingInfoParams->getMeetingId());
        $this->assertEquals($password,
$getMeetingInfoParams->getPassword());

        // Test setters that are ignored by the constructor
        $getMeetingInfoParams->setMeetingId($newId      =
$this->faker->uuid);
        $getMeetingInfoParams->setPassword($newPassword =
$this->faker->password);
        $this->assertEquals($newId,
$getMeetingInfoParams->getMeetingId());
        $this->assertEquals($newPassword,
$getMeetingInfoParams->getPassword());
    }
}
PK5~�[�@+�4bbb/tests/Parameters/GetRecordingsParametersTest.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Parameters;

use BigBlueButton\TestCase;

/**
 * @internal
 * @coversNothing
 */
class GetRecordingsParametersTest extends TestCase
{
    public function testGetRecordingsParameters()
    {
        $getRecordings                          = new
GetRecordingsParameters();
        $getRecordings->setMeetingId($meetingId =
$this->faker->uuid);
        $getRecordings->setRecordId($recordId   =
$this->faker->uuid);
        $getRecordings->setState($state         =
'published');
        $getRecordings->addMeta($meta           = 'name',
$name           = $this->faker->firstName);

        $params = $getRecordings->getHTTPQuery();

        $this->assertEquals($meetingId,
$getRecordings->getMeetingId());
        $this->assertEquals($recordId,
$getRecordings->getRecordId());
        $this->assertEquals($state, $getRecordings->getState());
        $this->assertStringContainsString('meta_' . $meta .
'=' . $name, $params);
    }
}
PK5~�[��\\2bbb/tests/Parameters/HooksCreateParametersTest.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Parameters;

use BigBlueButton\TestCase;

/**
 * @internal
 * @coversNothing
 */
class HooksCreateParametersTest extends TestCase
{
    public function testHooksCreateParameters()
    {
        $hooksCreateParameters = new HooksCreateParameters($callBackUrl =
$this->faker->url);

        $this->assertEquals($callBackUrl,
$hooksCreateParameters->getCallbackUrl());

        // Test setters that are ignored by the constructor
        $hooksCreateParameters->setMeetingId($meetingId =
$this->faker->uuid);
        $hooksCreateParameters->setGetRaw($getRaw       =
$this->faker->boolean);
        $this->assertEquals($meetingId,
$hooksCreateParameters->getMeetingId());
        $this->assertEquals($getRaw,
$hooksCreateParameters->getRaw());
    }
}
PK5~�[^C���3bbb/tests/Parameters/HooksDestroyParametersTest.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Parameters;

use BigBlueButton\TestCase;

/**
 * @internal
 * @coversNothing
 */
class HooksDestroyParametersTest extends TestCase
{
    public function testHooksDestroyParameters()
    {
        $hooksCreateParameters = new HooksDestroyParameters($hookId =
$this->faker->numberBetween(1, 50));

        $this->assertEquals($hookId,
$hooksCreateParameters->getHookId());
    }
}
PK5~�[R�q���7bbb/tests/Parameters/IsMeetingRunningParametersTest.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Parameters;

use BigBlueButton\TestCase;

/**
 * Class IsMeetingRunningParametersTest.
 *
 * @internal
 * @coversNothing
 */
class IsMeetingRunningParametersTest extends TestCase
{
    public function testIsMeetingRunningParameters()
    {
        $meetingId       = $this->faker->uuid;
        $isRunningParams = new IsMeetingRunningParameters($meetingId);

        $this->assertEquals($meetingId,
$isRunningParams->getMeetingId());

        // Test setters that are ignored by the constructor
        $isRunningParams->setMeetingId($newId =
$this->faker->uuid);
        $this->assertEquals($newId,
$isRunningParams->getMeetingId());
    }
}
PK5~�[�"�р�2bbb/tests/Parameters/JoinMeetingParametersTest.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Parameters;

use BigBlueButton\TestCase;

/**
 * @internal
 * @coversNothing
 */
class JoinMeetingParametersTest extends TestCase
{
    public function testJoinMeetingParameters()
    {
        $params            = $this->generateJoinMeetingParams();
        $joinMeetingParams = $this->getJoinMeetingMock($params);

        $this->assertEquals($params['meetingId'],
$joinMeetingParams->getMeetingId());
        $this->assertEquals($params['userName'],
$joinMeetingParams->getUsername());
        $this->assertEquals($params['password'],
$joinMeetingParams->getPassword());
        $this->assertEquals($params['userId'],
$joinMeetingParams->getUserId());
        $this->assertEquals($params['webVoiceConf'],
$joinMeetingParams->getWebVoiceConf());
        $this->assertEquals($params['creationTime'],
$joinMeetingParams->getCreationTime());
        $this->assertEquals($params['userdata_countrycode'],
$joinMeetingParams->getUserData('countrycode'));
        $this->assertEquals($params['userdata_email'],
$joinMeetingParams->getUserData('email'));
        $this->assertEquals($params['userdata_commercial'],
$joinMeetingParams->getUserData('commercial'));

        // Test setters that are ignored by the constructor
        $joinMeetingParams->setMeetingId($newId         =
$this->faker->uuid);
        $joinMeetingParams->setUsername($newName        =
$this->faker->name);
        $joinMeetingParams->setPassword($newPassword    =
$this->faker->password);
        $joinMeetingParams->setConfigToken($configToken =
$this->faker->md5);
        $joinMeetingParams->setAvatarURL($avatarUrl     =
$this->faker->url);
        $joinMeetingParams->setRedirect($redirect       =
$this->faker->boolean(50));
        $joinMeetingParams->setClientURL($clientUrl     =
$this->faker->url);
        $this->assertEquals($newId,
$joinMeetingParams->getMeetingId());
        $this->assertEquals($newName,
$joinMeetingParams->getUsername());
        $this->assertEquals($newPassword,
$joinMeetingParams->getPassword());
        $this->assertEquals($configToken,
$joinMeetingParams->getConfigToken());
        $this->assertEquals($avatarUrl,
$joinMeetingParams->getAvatarURL());
        $this->assertEquals($redirect,
$joinMeetingParams->isRedirect());
        $this->assertEquals($clientUrl,
$joinMeetingParams->getClientURL());
    }
}
PK5~�[�<\c8bbb/tests/Parameters/PublishRecordingsParametersTest.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Parameters;

use BigBlueButton\TestCase;

/**
 * @internal
 * @coversNothing
 */
class PublishRecordingsParametersTest extends TestCase
{
    public function testPublishRecordingsParameters()
    {
        $recordingId      = $this->faker->uuid;
        $publish          = $this->faker->boolean(50);
        $publishRecording = new PublishRecordingsParameters($recordingId,
$publish);

        $this->assertEquals($recordingId,
$publishRecording->getRecordingId());
        $this->assertEquals($publish,
$publishRecording->isPublish());

        // Test setters that are ignored by the constructor
        $publishRecording->setRecordingId($newRecordingId =
!$this->faker->uuid);
        $publishRecording->setPublish($publish            = !$publish);
        $this->assertEquals($newRecordingId,
$publishRecording->getRecordingId());
        $this->assertEquals($publish,
$publishRecording->isPublish());
    }
}
PK5~�[n��zz7bbb/tests/Parameters/UpdateRecordingsParametersTest.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Parameters;

use BigBlueButton\TestCase;

/**
 * @internal
 * @coversNothing
 */
class UpdateRecordingsParametersTest extends TestCase
{
    public function testUpdateRecordingsParameters()
    {
        $params                 =
$this->generateUpdateRecordingsParams();
        $updateRecordingsParams =
$this->getUpdateRecordingsParamsMock($params);

        $this->assertEquals($params['recordingId'],
$updateRecordingsParams->getRecordingId());
        $this->assertEquals($params['meta_presenter'],
$updateRecordingsParams->getMeta('presenter'));

        // Test setters that are ignored by the constructor
        $updateRecordingsParams->setRecordingId($newId =
$this->faker->uuid);
        $this->assertEquals($newId,
$updateRecordingsParams->getRecordingId());
    }
}
PK5~�[�#o,,bbb/tests/Parameters/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[�����.bbb/tests/Responses/ApiVersionResponseTest.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Parameters;

use BigBlueButton\Responses\ApiVersionResponse;
use BigBlueButton\TestCase;

/**
 * @internal
 * @coversNothing
 */
class ApiVersionResponseTest extends TestCase
{
    /**
     * @var \BigBlueButton\Responses\ApiVersionResponse
     */
    private $version;

    public function setUp(): void
    {
        parent::setUp();

        $xml = $this->loadXmlFile(__DIR__ . DIRECTORY_SEPARATOR .
'..' . DIRECTORY_SEPARATOR . 'fixtures' .
DIRECTORY_SEPARATOR . 'api_version.xml');

        $this->version = new ApiVersionResponse($xml);
    }

    public function testApiVersionResponseContent()
    {
        $this->assertEquals('SUCCESS',
$this->version->getReturnCode());
        $this->assertEquals('2.0',
$this->version->getVersion());
        $this->assertEquals('2.0',
$this->version->getApiVersion());
        $this->assertEquals('2.4-rc-7',
$this->version->getBbbVersion());
    }

    public function testApiVersionResponseTypes()
    {
        $this->assertEachGetterValueIsString($this->version,
['getReturnCode', 'getVersion',
'getApiVersion', 'getBbbVersion']);
    }
}
PK5~�[B�=.9
9
1bbb/tests/Responses/CreateMeetingResponseTest.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Parameters;

use BigBlueButton\Responses\CreateMeetingResponse;
use BigBlueButton\TestCase;

/**
 * @internal
 * @coversNothing
 */
class CreateMeetingResponseTest extends TestCase
{
    /**
     * @var \BigBlueButton\Responses\CreateMeetingResponse
     */
    private $meeting;

    public function setUp(): void
    {
        parent::setUp();

        $xml = $this->loadXmlFile(__DIR__ . DIRECTORY_SEPARATOR .
'..' . DIRECTORY_SEPARATOR . 'fixtures' .
DIRECTORY_SEPARATOR . 'create_meeting.xml');

        $this->meeting = new CreateMeetingResponse($xml);
    }

    public function testCreateMeetingResponseContent()
    {
        $this->assertEquals('SUCCESS',
$this->meeting->getReturnCode());
        $this->assertEquals('random-1665177',
$this->meeting->getMeetingId());
       
$this->assertEquals('1a6938c707cdf5d052958672d66c219c30690c47-1524212045514',
$this->meeting->getInternalMeetingId());
        $this->assertEquals('bbb-none',
$this->meeting->getParentMeetingId());
        $this->assertEquals('tK6J5cJv3hMLNx5IBePa',
$this->meeting->getAttendeePassword());
        $this->assertEquals('34Heu0uiZYqCZXX9C4m2',
$this->meeting->getModeratorPassword());
        $this->assertEquals(1453283819419,
$this->meeting->getCreationTime());
        $this->assertEquals(76286,
$this->meeting->getVoiceBridge());
        $this->assertEquals('Wed Jan 20 04:56:59 EST 2016',
$this->meeting->getCreationDate());
        $this->assertEquals('613-555-1234',
$this->meeting->getDialNumber());
        $this->assertEquals(false,
$this->meeting->hasUserJoined());
        $this->assertEquals(20, $this->meeting->getDuration());
        $this->assertEquals(false,
$this->meeting->hasBeenForciblyEnded());
        $this->assertEquals('duplicateWarning',
$this->meeting->getMessageKey());
        $this->assertEquals('This conference was already in
existence and may currently be in progress.',
$this->meeting->getMessage());
    }

    public function testCreateMeetingResponseTypes()
    {
        $this->assertEachGetterValueIsString($this->meeting,
['getReturnCode', 'getInternalMeetingId',
'getParentMeetingId',
            'getAttendeePassword',
'getModeratorPassword', 'getDialNumber',
'getCreationDate', ]);
        $this->assertEachGetterValueIsDouble($this->meeting,
['getCreationTime']);
        $this->assertEachGetterValueIsInteger($this->meeting,
['getDuration', 'getVoiceBridge']);
        $this->assertEachGetterValueIsBoolean($this->meeting,
['hasUserJoined', 'hasBeenForciblyEnded']);
    }
}
PK5~�[G��,cc4bbb/tests/Responses/DeleteRecordingsResponseTest.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Parameters;

use BigBlueButton\Responses\DeleteRecordingsResponse;
use BigBlueButton\TestCase;

/**
 * @internal
 * @coversNothing
 */
class DeleteRecordingsResponseTest extends TestCase
{
    /**
     * @var \BigBlueButton\Responses\DeleteRecordingsResponse
     */
    private $delete;

    public function setUp(): void
    {
        parent::setUp();

        $xml = $this->loadXmlFile(__DIR__ . DIRECTORY_SEPARATOR .
'..' . DIRECTORY_SEPARATOR . 'fixtures' .
DIRECTORY_SEPARATOR . 'delete_recordings.xml');

        $this->delete = new DeleteRecordingsResponse($xml);
    }

    public function testDeleteRecordingsResponseContent()
    {
        $this->assertEquals('SUCCESS',
$this->delete->getReturnCode());
        $this->assertEquals(true, $this->delete->isDeleted());
    }

    public function testDeleteRecordingsResponseTypes()
    {
        $this->assertEachGetterValueIsString($this->delete,
['getReturnCode']);
        $this->assertEachGetterValueIsBoolean($this->delete,
['isDeleted']);
    }
}
PK5~�[PM̦��.bbb/tests/Responses/EndMeetingResponseTest.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Parameters;

use BigBlueButton\Responses\EndMeetingResponse;
use BigBlueButton\TestCase;

/**
 * @internal
 * @coversNothing
 */
class EndMeetingResponseTest extends TestCase
{
    /**
     * @var \BigBlueButton\Responses\EndMeetingResponse
     */
    private $end;

    public function setUp(): void
    {
        parent::setUp();

        $xml = $this->loadXmlFile(__DIR__ . DIRECTORY_SEPARATOR .
'..' . DIRECTORY_SEPARATOR . 'fixtures' .
DIRECTORY_SEPARATOR . 'end_meeting.xml');

        $this->end = new EndMeetingResponse($xml);
    }

    public function testEndMeetingResponseContent()
    {
        $this->assertEquals('SUCCESS',
$this->end->getReturnCode());
        $this->assertEquals('sentEndMeetingRequest',
$this->end->getMessageKey());
        $this->assertEquals('A request to end the meeting was sent.
Please wait a few seconds, and then use the getMeetingInfo or
isMeetingRunning API calls to verify that it was ended.',
$this->end->getMessage());
    }

    public function testEndMeetingResponseTypes()
    {
        $this->assertEachGetterValueIsString($this->end,
['getReturnCode', 'getMessageKey',
'getMessage']);
    }
}
PK5~�[\�BCC2bbb/tests/Responses/GetMeetingInfoResponseTest.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

/**
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2018 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 *
 * @internal
 * @coversNothing
 */
class GetMeetingInfoResponseTest extends \BigBlueButton\TestCase
{
    /**
     * @var \BigBlueButton\Responses\GetMeetingInfoResponse
     */
    private $meetingInfo;

    public function setUp(): void
    {
        parent::setUp();

        $xml = $this->loadXmlFile(__DIR__ . DIRECTORY_SEPARATOR .
'..' . DIRECTORY_SEPARATOR . 'fixtures' .
DIRECTORY_SEPARATOR . 'get_meeting_info.xml');

        $this->meetingInfo = new
\BigBlueButton\Responses\GetMeetingInfoResponse($xml);
    }

    public function testGetMeetingInfoResponseContent()
    {
        $this->assertInstanceOf('BigBlueButton\Core\Meeting',
$this->meetingInfo->getMeeting());
        $this->assertCount(4,
$this->meetingInfo->getMeeting()->getAttendees());
        $this->assertEquals('SUCCESS',
$this->meetingInfo->getReturnCode());

        $info = $this->meetingInfo->getMeeting();
        $this->assertEquals('Mock meeting for testing
getMeetingInfo API method', $info->getMeetingName());
       
$this->assertEquals('117b12ae2656972d330b6bad58878541-28-15',
$info->getMeetingId());
       
$this->assertEquals('178757fcedd9449054536162cdfe861ddebc70ba-1453206317376',
$info->getInternalMeetingId());
        $this->assertEquals(1453206317376, $info->getCreationTime());
        $this->assertEquals('Tue Jan 19 07:25:17 EST 2016',
$info->getCreationDate());
        $this->assertEquals(70100, $info->getVoiceBridge());
        $this->assertEquals('613-555-1234',
$info->getDialNumber());
        $this->assertEquals('dbfc7207321527bbb870c82028',
$info->getAttendeePassword());
        $this->assertEquals('4bfbbeeb4a65cacaefe3676633',
$info->getModeratorPassword());
        $this->assertEquals(true, $info->isRunning());
        $this->assertEquals(20, $info->getDuration());
        $this->assertEquals(true, $info->hasUserJoined());
        $this->assertEquals(true, $info->isRecording());
        $this->assertEquals(false, $info->hasBeenForciblyEnded());
        $this->assertEquals(1453206317380, $info->getStartTime());
        $this->assertEquals(1453206325002, $info->getEndTime());
        $this->assertEquals(2, $info->getParticipantCount());
        $this->assertEquals(1, $info->getListenerCount());
        $this->assertEquals(2, $info->getVoiceParticipantCount());
        $this->assertEquals(1, $info->getVideoCount());
        $this->assertEquals(20, $info->getMaxUsers());
        $this->assertEquals(2, $info->getModeratorCount());
        $this->assertEquals(10, sizeof($info->getMetas()));
    }

    public function testMeetingAttendeeContent()
    {
        $this->assertCount(4,
$this->meetingInfo->getMeeting()->getAttendees());

        $anAttendee =
$this->meetingInfo->getMeeting()->getAttendees()[1];

        $this->assertEquals('xi7y7gpmyq1g',
$anAttendee->getUserId());
        $this->assertEquals('Barrett Kutch',
$anAttendee->getFullName());
        $this->assertEquals('MODERATOR',
$anAttendee->getRole());
        $this->assertEquals(false, $anAttendee->isPresenter());
        $this->assertEquals(false, $anAttendee->isListeningOnly());
        $this->assertEquals(true, $anAttendee->hasJoinedVoice());
        $this->assertEquals(false, $anAttendee->hasVideo());
        $this->assertEquals('FLASH',
$anAttendee->getClientType());

        $customData = $anAttendee->getCustomData();
        $this->assertEquals(3, sizeof($customData));
        $this->assertEquals('true',
$customData['skipCheck']);
        $this->assertEquals('#FF0033',
$customData['backgroundColor']);
        $this->assertEquals('a:focus{color:#0181eb}',
$customData['customStyle']);
    }

    public function testMeetingModerators()
    {
        $moderators =
$this->meetingInfo->getMeeting()->getModerators();

        $this->assertCount(2, $moderators);

        $firstModerator = $moderators[0];
        $this->assertEquals('Ernie Abernathy',
$firstModerator->getFullName());
        $this->assertEquals('MODERATOR',
$firstModerator->getRole());

        $secondModerator = $moderators[1];
        $this->assertEquals('Barrett Kutch',
$secondModerator->getFullName());
        $this->assertEquals('MODERATOR',
$secondModerator->getRole());
    }

    public function testMeetingViewers()
    {
        $viewers = $this->meetingInfo->getMeeting()->getViewers();

        $this->assertCount(2, $viewers);

        $firstViewer = $viewers[0];
        $this->assertEquals('Peter Parker',
$firstViewer->getFullName());
        $this->assertEquals('VIEWER',
$firstViewer->getRole());

        $secondViewer = $viewers[1];
        $this->assertEquals('Bruce Wayne',
$secondViewer->getFullName());
        $this->assertEquals('VIEWER',
$secondViewer->getRole());
    }

    public function testGetMeetingInfoResponseTypes()
    {
        $info = $this->meetingInfo->getMeeting();

        $this->assertEachGetterValueIsString($info,
['getMeetingName', 'getMeetingId',
'getInternalMeetingId',
            'getModeratorPassword',
'getAttendeePassword', 'getCreationDate',
'getDialNumber', ]);

        $this->assertEachGetterValueIsInteger($info,
['getVoiceBridge', 'getDuration',
'getParticipantCount',
            'getListenerCount',
'getVoiceParticipantCount', 'getVideoCount',
'getMaxUsers', 'getModeratorCount', ]);

        $this->assertEachGetterValueIsDouble($info,
['getStartTime', 'getEndTime',
'getCreationTime']);

        $this->assertEachGetterValueIsBoolean($info,
['isRunning', 'isRecording', 'hasUserJoined',
'hasBeenForciblyEnded']);

        $anAttendee =
$this->meetingInfo->getMeeting()->getAttendees()[1];

        $this->assertEachGetterValueIsString($anAttendee,
['getUserId', 'getFullName', 'getRole',
'getClientType']);
        $this->assertEachGetterValueIsBoolean($anAttendee,
['isPresenter', 'isListeningOnly',
'hasJoinedVoice', 'hasVideo']);
    }

    public function testGetMeetingInfoMetadataContent()
    {
        $metas = $this->meetingInfo->getMeeting()->getMetas();

        $this->assertEquals('Bigbluebutton "Mock meeting for
testing getMeetingInfo"',
$metas['bbb-recording-name']);
    }
}
PK5~�[��{E��/bbb/tests/Responses/GetMeetingsResponseTest.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Parameters;

use BigBlueButton\Responses\GetMeetingsResponse;
use BigBlueButton\TestCase;

/**
 * @internal
 * @coversNothing
 */
class GetMeetingsResponseTest extends TestCase
{
    /**
     * @var \BigBlueButton\Responses\GetMeetingsResponse
     */
    private $meetings;

    public function setUp(): void
    {
        parent::setUp();

        $xml = $this->loadXmlFile(__DIR__ . DIRECTORY_SEPARATOR .
'..' . DIRECTORY_SEPARATOR . 'fixtures' .
DIRECTORY_SEPARATOR . 'get_meetings.xml');

        $this->meetings = new GetMeetingsResponse($xml);
    }

    public function testGetMeetingsResponseContent()
    {
        $this->assertEquals('SUCCESS',
$this->meetings->getReturnCode());

        $this->assertCount(3, $this->meetings->getMeetings());

        $aMeeting = $this->meetings->getMeetings()[2];

       
$this->assertEquals('56e1ae16-3dfc-390d-b0d8-5aa844a25874',
$aMeeting->getMeetingId());
        $this->assertEquals('Marty Lueilwitz',
$aMeeting->getMeetingName());
        $this->assertEquals(1453210075799,
$aMeeting->getCreationTime());
        $this->assertEquals('Tue Jan 19 08:27:55 EST 2016',
$aMeeting->getCreationDate());
        $this->assertEquals(49518, $aMeeting->getVoiceBridge());
        $this->assertEquals('580.124.3937x93615',
$aMeeting->getDialNumber());
        $this->assertEquals('f~kxYJeAV~G?Jb+E:ggn',
$aMeeting->getAttendeePassword());
        $this->assertEquals('n:"zWc##Bi.y,d^s,mMF',
$aMeeting->getModeratorPassword());
        $this->assertEquals(false,
$aMeeting->hasBeenForciblyEnded());
        $this->assertEquals(true, $aMeeting->isRunning());
        $this->assertEquals(5, $aMeeting->getParticipantCount());
        $this->assertEquals(2, $aMeeting->getListenerCount());
        $this->assertEquals(1,
$aMeeting->getVoiceParticipantCount());
        $this->assertEquals(3, $aMeeting->getVideoCount());
        $this->assertEquals(2206, $aMeeting->getDuration());
        $this->assertEquals(true, $aMeeting->hasUserJoined());
        $this->assertEquals(14, $aMeeting->getMaxUsers());
        $this->assertEquals(1, $aMeeting->getModeratorCount());
        $this->assertEquals('Consuelo Gleichner IV',
$aMeeting->getMetas()['presenter']);
       
$this->assertEquals('http://www.muller.biz/autem-dolor-aut-nam-doloribus-molestiae',
$aMeeting->getMetas()['endcallbackurl']);
    }

    public function testGetMeetingsResponseTypes()
    {
        $this->assertEachGetterValueIsString($this->meetings,
['getReturnCode']);

        $aMeeting = $this->meetings->getMeetings()[2];

        $this->assertEachGetterValueIsString($aMeeting,
['getMeetingId', 'getMeetingName',
'getCreationDate', 'getDialNumber',
            'getAttendeePassword',
'getModeratorPassword', ]);
        $this->assertEachGetterValueIsDouble($aMeeting,
['getCreationTime']);
        $this->assertEachGetterValueIsInteger($aMeeting,
['getVoiceBridge', 'getParticipantCount',
'getListenerCount',
            'getVoiceParticipantCount',
'getVideoCount', 'getDuration', ]);
        $this->assertEachGetterValueIsBoolean($aMeeting,
['hasBeenForciblyEnded', 'isRunning',
'hasUserJoined']);
    }
}
PK5~�[n�=�""1bbb/tests/Responses/GetRecordingsResponseTest.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Parameters;

use BigBlueButton\Responses\GetRecordingsResponse;
use BigBlueButton\TestCase;

/**
 * @internal
 * @coversNothing
 */
class GetRecordingsResponseTest extends TestCase
{
    /**
     * @var \BigBlueButton\Responses\GetRecordingsResponse
     */
    private $records;

    public function setUp(): void
    {
        parent::setUp();

        $xml = $this->loadXmlFile(__DIR__ . DIRECTORY_SEPARATOR .
'..' . DIRECTORY_SEPARATOR . 'fixtures' .
DIRECTORY_SEPARATOR . 'get_recordings.xml');

        $this->records = new GetRecordingsResponse($xml);
    }

    public function testGetRecordingResponseContent()
    {
        $this->assertEquals('SUCCESS',
$this->records->getReturnCode());

        $this->assertCount(6, $this->records->getRecords());

        $aRecord = $this->records->getRecords()[4];

       
$this->assertEquals('9d287cf50490ca856ca5273bd303a7e321df6051-4-119[0]',
$aRecord->getMeetingId());
       
$this->assertEquals('f71d810b6e90a4a34ae02b8c7143e8733178578e-1462980100026',
$aRecord->getRecordId());
        $this->assertEquals('SAT- Writing Section- Social Science
and History (All participants)', $aRecord->getName());
        $this->assertEquals(true, $aRecord->isPublished());
        $this->assertEquals('published',
$aRecord->getState());
        $this->assertEquals(1462980100026, $aRecord->getStartTime());
        $this->assertEquals(1462986640649, $aRecord->getEndTime());
        $this->assertEquals('presentation',
$aRecord->getPlaybackType());
       
$this->assertEquals('http://test-install.blindsidenetworks.com/playback/presentation/0.9.0/playback.html?meetingId=f71d810b6e90a4a34ae02b8c7143e8733178578e-1462980100026',
$aRecord->getPlaybackUrl());
        $this->assertEquals(86, $aRecord->getPlaybackLength());
        $this->assertEquals(9, sizeof($aRecord->getMetas()));
    }

    public function testRecordMetadataContent()
    {
        $metas = $this->records->getRecords()[4]->getMetas();

        $this->assertEquals('moodle-mod_bigbluebuttonbn
(2015080611)', $metas['bbb-origin-tag']);
    }

    public function testRecordingsPlaybackFormats()
    {
        $this->assertEquals('SUCCESS',
$this->records->getReturnCode());

        $this->assertCount(6, $this->records->getRecords());
        $aRecord = $this->records->getRecords()[0];

        // Test podcast format
        $podcastFormat = $aRecord->getFormats()[0]; // without images
preview
        $this->assertEquals('podcast',
$podcastFormat->getType());
       
$this->assertEquals('https://test-install.blindsidenetworks.com/podcast/f71d810b6e90a4a34ae02b8c7143e8733178578e-1462807897120/audio.ogg',
$podcastFormat->getUrl());
        $this->assertEquals('111',
$podcastFormat->getProcessingTime());
        $this->assertEquals('632',
$podcastFormat->getLength());
        $this->assertEquals('10500',
$podcastFormat->getSize());

        $presentationFormat = $aRecord->getFormats()[1]; // having
images preview
        $this->assertEquals('presentation',
$presentationFormat->getType());
       
$this->assertEquals('http://test-install.blindsidenetworks.com/playback/presentation/0.9.0/playback.html?meetingId=f71d810b6e90a4a34ae02b8c7143e8733178578e-1462807897120',
$presentationFormat->getUrl());
        $this->assertEquals(2973,
$presentationFormat->getProcessingTime());
        $this->assertEquals(532, $presentationFormat->getLength());
        $this->assertEquals(168019, $presentationFormat->getSize());

        $image = $presentationFormat->getImages()[0];
        $this->assertEquals('Welcome', $image->getAlt());
        $this->assertEquals(136, $image->getHeight());
        $this->assertEquals(176, $image->getWidth());
       
$this->assertEquals('https://test-install.blindsidenetworks.com/presentation/f71d810b6e90a4a34ae02b8c7143e8733178578e-1462807897120/presentation/d2d9a672040fbde2a47a10bf6c37b6a4b5ae187f-1632646357291/thumbnails/thumb-1.png',
$image->getUrl());
    }

    public function testGetRecordingResponseTypes()
    {
        $this->assertEachGetterValueIsString($this->records,
['getReturnCode']);

        $aRecord = $this->records->getRecords()[4];

        $this->assertEachGetterValueIsString($aRecord,
['getMeetingId', 'getRecordId', 'getName',
'getState',
            'getPlaybackType', 'getPlaybackUrl', ]);

        $this->assertEachGetterValueIsInteger($aRecord,
['getPlaybackLength']);

        $this->assertEachGetterValueIsBoolean($aRecord,
['isPublished']);

        $this->assertEachGetterValueIsDouble($aRecord,
['getStartTime', 'getEndTime']);
    }
}
PK5~�[8\�Amm/bbb/tests/Responses/HooksCreateResponseTest.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Parameters;

use BigBlueButton\Responses\HooksCreateResponse;
use BigBlueButton\TestCase;

/**
 * @internal
 * @coversNothing
 */
class HooksCreateResponseTest extends TestCase
{
    /**
     * @var \BigBlueButton\Responses\HooksCreateResponse
     */
    private $createResponse;

    public function setUp(): void
    {
        parent::setUp();

        $xml = $this->loadXmlFile(__DIR__ . DIRECTORY_SEPARATOR .
'..' . DIRECTORY_SEPARATOR . 'fixtures' .
DIRECTORY_SEPARATOR . 'hooks_create.xml');

        $this->createResponse = new HooksCreateResponse($xml);
    }

    public function testHooksCreateResponseContent()
    {
        $this->assertEquals('SUCCESS',
$this->createResponse->getReturnCode());
        $this->assertEquals(1,
$this->createResponse->getHookId());
        $this->assertEquals(false,
$this->createResponse->isPermanentHook());
        $this->assertEquals(false,
$this->createResponse->hasRawData());
    }

    public function testHooksCreateResponseTypes()
    {
        $this->assertEachGetterValueIsString($this->createResponse,
['getReturnCode']);
        $this->assertEachGetterValueIsInteger($this->createResponse,
['getHookId']);
        $this->assertEachGetterValueIsBoolean($this->createResponse,
['isPermanentHook', 'hasRawData']);
    }
}
PK5~�[���
yy0bbb/tests/Responses/HooksDestroyResponseTest.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Parameters;

use BigBlueButton\Responses\HooksDestroyResponse;
use BigBlueButton\TestCase;

/**
 * @internal
 * @coversNothing
 */
class HooksDestroyResponseTest extends TestCase
{
    /**
     * @var \BigBlueButton\Responses\HooksDestroyResponse
     */
    private $destroyResponse;

    public function setUp(): void
    {
        parent::setUp();

        $xml = $this->loadXmlFile(__DIR__ . DIRECTORY_SEPARATOR .
'..' . DIRECTORY_SEPARATOR . 'fixtures' .
DIRECTORY_SEPARATOR . 'hooks_destroy.xml');

        $this->destroyResponse = new HooksDestroyResponse($xml);
    }

    public function testHooksDestroyResponseContent()
    {
        $this->assertEquals('SUCCESS',
$this->destroyResponse->getReturnCode());
        $this->assertEquals(true,
$this->destroyResponse->removed());
    }

    public function testHooksDestroyResponseTypes()
    {
        $this->assertEachGetterValueIsString($this->destroyResponse,
['getReturnCode']);
        $this->assertEachGetterValueIsBoolean($this->destroyResponse,
['removed']);
    }
}
PK5~�[�3�	�	-bbb/tests/Responses/HooksListResponseTest.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Parameters;

use BigBlueButton\Responses\HooksListResponse;
use BigBlueButton\TestCase;

/**
 * @internal
 * @coversNothing
 */
class HooksListResponseTest extends TestCase
{
    /**
     * @var \BigBlueButton\Responses\HooksListResponse
     */
    private $listResponse;

    public function setUp(): void
    {
        parent::setUp();

        $xml = $this->loadXmlFile(__DIR__ . DIRECTORY_SEPARATOR .
'..' . DIRECTORY_SEPARATOR . 'fixtures' .
DIRECTORY_SEPARATOR . 'hooks_list.xml');

        $this->listResponse = new HooksListResponse($xml);
    }

    public function testHooksListResponseContent()
    {
        $this->assertEquals('SUCCESS',
$this->listResponse->getReturnCode());
        $this->assertCount(2, $this->listResponse->getHooks());

        $aHook = $this->listResponse->getHooks()[0];

        $this->assertEquals('my-meeting',
$aHook->getMeetingId());
       
$this->assertEquals('http://postcatcher.in/catchers/abcdefghijk',
$aHook->getCallbackUrl());
        $this->assertEquals(1, $aHook->getHookId());
        $this->assertEquals(false, $aHook->isPermanentHook());
        $this->assertEquals(false, $aHook->hasRawData());
    }

    public function testHooksListResponseTypes()
    {
        $this->assertEachGetterValueIsString($this->listResponse,
['getReturnCode']);

        $aHook = $this->listResponse->getHooks()[0];

        $this->assertEachGetterValueIsString($aHook,
['getCallbackUrl', 'getMeetingId']);
        $this->assertEachGetterValueIsInteger($aHook,
['getHookId']);
        $this->assertEachGetterValueIsBoolean($aHook,
['hasRawData', 'isPermanentHook']);
    }
}
PK5~�[�[�''4bbb/tests/Responses/IsMeetingRunningResponseTest.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Parameters;

use BigBlueButton\Responses\IsMeetingRunningResponse;
use BigBlueButton\TestCase;

/**
 * @internal
 * @coversNothing
 */
class IsMeetingRunningResponseTest extends TestCase
{
    /**
     * @var \BigBlueButton\Responses\IsMeetingRunningResponse
     */
    private $running;

    public function setUp(): void
    {
        parent::setUp();

        $xml = $this->loadXmlFile(__DIR__ . DIRECTORY_SEPARATOR .
'..' . DIRECTORY_SEPARATOR . 'fixtures' .
DIRECTORY_SEPARATOR . 'is_meeting_running.xml');

        $this->running = new IsMeetingRunningResponse($xml);
    }

    public function testIsMeetingRunningResponseContent()
    {
        $this->assertEquals('SUCCESS',
$this->running->getReturnCode());
        $this->assertEquals(true, $this->running->isRunning());

       
$this->assertEquals('<?xmlversion="1.0"?><response><returncode>SUCCESS</returncode><running>true</running></response>',
$this->minifyString($this->running->getRawXml()->asXML()));
    }

    public function testIsMeetingRunningResponseTypes()
    {
        $this->assertEachGetterValueIsString($this->running,
['getReturnCode']);
        $this->assertEachGetterValueIsBoolean($this->running,
['isRunning']);
    }
}
PK5~�[	Mq�R
R
/bbb/tests/Responses/JoinMeetingResponseTest.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Parameters;

use BigBlueButton\Responses\JoinMeetingResponse;
use BigBlueButton\TestCase;

/**
 * @internal
 * @coversNothing
 */
class JoinMeetingResponseTest extends TestCase
{
    /**
     * @var \BigBlueButton\Responses\JoinMeetingResponse
     */
    private $joinMeeting;

    public function setUp(): void
    {
        parent::setUp();

        $xml = $this->loadXmlFile(__DIR__ . DIRECTORY_SEPARATOR .
'..' . DIRECTORY_SEPARATOR . 'fixtures' .
DIRECTORY_SEPARATOR . 'join_meeting.xml');

        $this->joinMeeting = new JoinMeetingResponse($xml);
    }

    public function testJoinMeetingResponseContent()
    {
        $this->assertEquals('SUCCESS',
$this->joinMeeting->getReturnCode());
        $this->assertEquals('successfullyJoined',
$this->joinMeeting->getMessageKey());
        $this->assertEquals('You have joined successfully.',
$this->joinMeeting->getMessage());
       
$this->assertEquals('fa51ae0c65adef7fe3cf115421da8a6a25855a20-1464618262714',
$this->joinMeeting->getMeetingId());
        $this->assertEquals('ao6ehbtvbmhz',
$this->joinMeeting->getUserId());
        $this->assertEquals('huzbpgthac7s',
$this->joinMeeting->getAuthToken());
        $this->assertEquals('rbe7bbkjzx5mnoda',
$this->joinMeeting->getSessionToken());
        $this->assertEquals('ALLOW',
$this->joinMeeting->getGuestStatus());
       
$this->assertEquals('https://bigblubutton-server.sample/client/BigBlueButton.html?sessionToken=0wzsph6uaelwc68z',
$this->joinMeeting->getUrl());
    }

    public function testJoinMeetingResponseTypes()
    {
        $this->assertEachGetterValueIsString($this->joinMeeting,
['getReturnCode', 'getMessageKey',
'getMessage', 'getMeetingId', 'getUserId',
'getAuthToken', 'getSessionToken',
'getGuestStatus', 'getUrl']);
    }
}
PK5~�[�>�tt5bbb/tests/Responses/PublishRecordingsResponseTest.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Parameters;

use BigBlueButton\Responses\PublishRecordingsResponse;
use BigBlueButton\TestCase;

/**
 * @internal
 * @coversNothing
 */
class PublishRecordingsResponseTest extends TestCase
{
    /**
     * @var \BigBlueButton\Responses\PublishRecordingsResponse
     */
    private $publish;

    public function setUp(): void
    {
        parent::setUp();

        $xml = $this->loadXmlFile(__DIR__ . DIRECTORY_SEPARATOR .
'..' . DIRECTORY_SEPARATOR . 'fixtures' .
DIRECTORY_SEPARATOR . 'publish_recordings.xml');

        $this->publish = new PublishRecordingsResponse($xml);
    }

    public function testPublishRecordingsResponseContent()
    {
        $this->assertEquals('SUCCESS',
$this->publish->getReturnCode());
        $this->assertEquals(true, $this->publish->isPublished());
    }

    public function testPublishRecordingsResponseTypes()
    {
        $this->assertEachGetterValueIsString($this->publish,
['getReturnCode']);
        $this->assertEachGetterValueIsBoolean($this->publish,
['isPublished']);
    }
}
PK5~�[���cc4bbb/tests/Responses/UpdateRecordingsResponseTest.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton\Parameters;

use BigBlueButton\Responses\UpdateRecordingsResponse;
use BigBlueButton\TestCase;

/**
 * @internal
 * @coversNothing
 */
class UpdateRecordingsResponseTest extends TestCase
{
    /**
     * @var \BigBlueButton\Responses\UpdateRecordingsResponse
     */
    private $update;

    public function setUp(): void
    {
        parent::setUp();

        $xml = $this->loadXmlFile(__DIR__ . DIRECTORY_SEPARATOR .
'..' . DIRECTORY_SEPARATOR . 'fixtures' .
DIRECTORY_SEPARATOR . 'update_recordings.xml');

        $this->update = new UpdateRecordingsResponse($xml);
    }

    public function testUpdateRecordingsResponseContent()
    {
        $this->assertEquals('SUCCESS',
$this->update->getReturnCode());
        $this->assertEquals(true, $this->update->isUpdated());
    }

    public function testUpdateRecordingsResponseTypes()
    {
        $this->assertEachGetterValueIsString($this->update,
['getReturnCode']);
        $this->assertEachGetterValueIsBoolean($this->update,
['isUpdated']);
    }
}
PK5~�[�#o,,bbb/tests/Responses/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[��:�?;?;bbb/tests/TestCase.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

namespace BigBlueButton;

use BigBlueButton\Core\GuestPolicy;
use BigBlueButton\Core\MeetingLayout;
use BigBlueButton\Parameters\CreateMeetingParameters;
use BigBlueButton\Parameters\EndMeetingParameters;
use BigBlueButton\Parameters\JoinMeetingParameters;
use BigBlueButton\Parameters\UpdateRecordingsParameters;
use BigBlueButton\Responses\CreateMeetingResponse;
use BigBlueButton\Responses\UpdateRecordingsResponse;
use Faker\Factory as Faker;
use Faker\Generator;

/**
 * Class TestCase.
 *
 * @internal
 * @coversNothing
 */
class TestCase extends \PHPUnit\Framework\TestCase
{
    /**
     * @var Generator
     */
    protected $faker;

    /**
     * {@inheritdoc}
     */
    public function setUp(): void
    {
        parent::setUp();

        $this->faker = Faker::create();
    }

    // Additional assertions

    public function assertIsInteger($actual, $message = '')
    {
        if (empty($message)) {
            $message = 'Got a ' . gettype($actual) . '
instead of an integer.';
        }
        $this->assertTrue(is_integer($actual), $message);
    }

    public function assertIsDouble($actual, $message = '')
    {
        if (empty($message)) {
            $message = 'Got a ' . gettype($actual) . '
instead of a double.';
        }
        $this->assertTrue(is_double($actual), $message);
    }

    public function assertIsBoolean($actual, $message = '')
    {
        if (empty($message)) {
            $message = 'Got a ' . gettype($actual) . '
instead of a boolean.';
        }
        $this->assertTrue(is_bool($actual), $message);
    }

    public function assertEachGetterValueIsString($obj, $getters)
    {
        foreach ($getters as $getterName) {
            $this->assertIsString($obj->{$getterName}(), 'Got a
' . gettype($obj->{$getterName}()) . ' instead of a string for
property -> ' . $getterName);
        }
    }

    public function assertEachGetterValueIsInteger($obj, $getters)
    {
        foreach ($getters as $getterName) {
            $this->assertIsInteger($obj->{$getterName}(), 'Got a
' . gettype($obj->{$getterName}()) . ' instead of an integer
for property -> ' . $getterName);
        }
    }

    public function assertEachGetterValueIsDouble($obj, $getters)
    {
        foreach ($getters as $getterName) {
            $this->assertIsDouble($obj->{$getterName}(), 'Got a
' . gettype($obj->{$getterName}()) . ' instead of a double for
property -> ' . $getterName);
        }
    }

    public function assertEachGetterValueIsBoolean($obj, $getters)
    {
        foreach ($getters as $getterName) {
            $this->assertIsBoolean($obj->{$getterName}(), 'Got a
' . gettype($obj->{$getterName}()) . ' instead of a boolean
for property -> ' . $getterName);
        }
    }

    /**
     * @param $bbb BigBlueButton
     *
     * @return CreateMeetingResponse
     */
    protected function createRealMeeting($bbb)
    {
        $createMeetingParams = $this->generateCreateParams();
        $createMeetingMock   =
$this->getCreateMock($createMeetingParams);

        return $bbb->createMeeting($createMeetingMock);
    }

    /**
     * @return array
     */
    protected function generateCreateParams()
    {
        return [
            'meetingName'                            =>
$this->faker->name,
            'meetingId'                              =>
$this->faker->uuid,
            'attendeePassword'                       =>
$this->faker->password,
            'moderatorPassword'                      =>
$this->faker->password,
            'autoStartRecording'                     =>
$this->faker->boolean(50),
            'dialNumber'                             =>
$this->faker->phoneNumber,
            'voiceBridge'                            =>
$this->faker->randomNumber(5),
            'webVoice'                               =>
$this->faker->word,
            'logoutUrl'                              =>
$this->faker->url,
            'maxParticipants'                        =>
$this->faker->numberBetween(2, 100),
            'record'                                 =>
$this->faker->boolean(50),
            'duration'                               =>
$this->faker->numberBetween(0, 6000),
            'welcomeMessage'                         =>
$this->faker->sentence,
            'allowStartStopRecording'                =>
$this->faker->boolean(50),
            'moderatorOnlyMessage'                   =>
$this->faker->sentence,
            'webcamsOnlyForModerator'                =>
$this->faker->boolean(50),
            'logo'                                   =>
$this->faker->imageUrl(330, 70),
            'copyright'                              =>
$this->faker->text,
            'muteOnStart'                            =>
$this->faker->boolean(50),
            'lockSettingsDisableCam'                 =>
$this->faker->boolean(50),
            'lockSettingsDisableMic'                 =>
$this->faker->boolean(50),
            'lockSettingsDisablePrivateChat'         =>
$this->faker->boolean(50),
            'lockSettingsDisablePublicChat'          =>
$this->faker->boolean(50),
            'lockSettingsDisableNote'                =>
$this->faker->boolean(50),
            'lockSettingsHideUserList'               =>
$this->faker->boolean(50),
            'lockSettingsLockedLayout'               =>
$this->faker->boolean(50),
            'lockSettingsLockOnJoin'                 =>
$this->faker->boolean(50),
            'lockSettingsLockOnJoinConfigurable'     =>
$this->faker->boolean(50),
            'allowModsToUnmuteUsers'                 =>
$this->faker->boolean(50),
            'allowModsToEjectCameras'                =>
$this->faker->boolean(50),
            'guestPolicy'                            =>
$this->faker->randomElement([GuestPolicy::ALWAYS_ACCEPT,
GuestPolicy::ALWAYS_DENY, GuestPolicy::ASK_MODERATOR]),
            'endWhenNoModerator'                     =>
$this->faker->boolean(50),
            'endWhenNoModeratorDelayInMinutes'       =>
$this->faker->numberBetween(1, 30),
            'meetingKeepEvents'                      =>
$this->faker->boolean(50),
            'learningDashboardEnabled'               =>
$this->faker->boolean(50),
            'learningDashboardCleanupDelayInMinutes' =>
$this->faker->numberBetween(1, 30),
            'bannerText'                             =>
$this->faker->sentence,
            'bannerColor'                            =>
$this->faker->hexColor,
            'breakoutRoomsEnabled'                   =>
$this->faker->boolean(50),
            'breakoutRoomsRecord'                    =>
$this->faker->boolean(50),
            'breakoutRoomsPrivateChatEnabled'        =>
$this->faker->boolean(50),
            'meetingEndedURL'                        =>
$this->faker->url,
            'meetingLayout'                          =>
$this->faker->randomElement([MeetingLayout::CUSTOM_LAYOUT,
MeetingLayout::SMART_LAYOUT, MeetingLayout::PRESENTATION_FOCUS,
MeetingLayout::VIDEO_FOCUS]),
            'meta_presenter'                         =>
$this->faker->name,
            'meta_endCallbackUrl'                    =>
$this->faker->url,
            'meta_bbb-recording-ready-url'           =>
$this->faker->url,
        ];
    }

    /**
     * @param $createParams
     *
     * @return array
     */
    protected function generateBreakoutCreateParams($createParams)
    {
        return array_merge($createParams, [
            'isBreakout'      => true,
            'parentMeetingId' => $this->faker->uuid,
            'sequence'        =>
$this->faker->numberBetween(1, 8),
            'freeJoin'        =>
$this->faker->boolean(50),
        ]);
    }

    /**
     * @param $params array
     *
     * @return CreateMeetingParameters
     */
    protected function getCreateMock($params)
    {
        $createMeetingParams = new
CreateMeetingParameters($params['meetingId'],
$params['meetingName']);

        return $createMeetingParams
            ->setAttendeePassword($params['attendeePassword'])
           
->setModeratorPassword($params['moderatorPassword'])
            ->setDialNumber($params['dialNumber'])
            ->setVoiceBridge($params['voiceBridge'])
            ->setWebVoice($params['webVoice'])
            ->setLogoutUrl($params['logoutUrl'])
            ->setMaxParticipants($params['maxParticipants'])
            ->setRecord($params['record'])
            ->setDuration($params['duration'])
            ->setWelcomeMessage($params['welcomeMessage'])
           
->setAutoStartRecording($params['autoStartRecording'])
           
->setAllowStartStopRecording($params['allowStartStopRecording'])
           
->setModeratorOnlyMessage($params['moderatorOnlyMessage'])
           
->setWebcamsOnlyForModerator($params['webcamsOnlyForModerator'])
            ->setLogo($params['logo'])
            ->setCopyright($params['copyright'])
           
->setEndCallbackUrl($params['meta_endCallbackUrl'])
            ->setMuteOnStart($params['muteOnStart'])
           
->setLockSettingsDisableCam($params['lockSettingsDisableCam'])
           
->setLockSettingsDisableMic($params['lockSettingsDisableMic'])
           
->setLockSettingsDisablePrivateChat($params['lockSettingsDisablePrivateChat'])
           
->setLockSettingsDisablePublicChat($params['lockSettingsDisablePublicChat'])
           
->setLockSettingsDisableNote($params['lockSettingsDisableNote'])
           
->setLockSettingsHideUserList($params['lockSettingsHideUserList'])
           
->setLockSettingsLockedLayout($params['lockSettingsLockedLayout'])
           
->setLockSettingsLockOnJoin($params['lockSettingsLockOnJoin'])
           
->setLockSettingsLockOnJoinConfigurable($params['lockSettingsLockOnJoinConfigurable'])
           
->setEndWhenNoModerator($params['endWhenNoModerator'])
           
->setEndWhenNoModeratorDelayInMinutes($params['endWhenNoModeratorDelayInMinutes'])
           
->setAllowModsToUnmuteUsers($params['allowModsToUnmuteUsers'])
           
->setAllowModsToEjectCameras($params['allowModsToEjectCameras'])
            ->setGuestPolicy($params['guestPolicy'])
           
->setMeetingKeepEvents($params['meetingKeepEvents'])
           
->setLearningDashboardEnabled($params['learningDashboardEnabled'])
           
->setLearningDashboardCleanupDelayInMinutes($params['learningDashboardCleanupDelayInMinutes'])
            ->setBannerColor($params['bannerColor'])
            ->setBannerText($params['bannerText'])
           
->setBreakoutRoomsEnabled($params['breakoutRoomsEnabled'])
           
->setBreakoutRoomsRecord($params['breakoutRoomsRecord'])
           
->setBreakoutRoomsPrivateChatEnabled($params['breakoutRoomsPrivateChatEnabled'])
            ->setMeetingEndedURL($params['meetingEndedURL'])
            ->setMeetingLayout($params['meetingLayout'])
            ->addMeta('presenter',
$params['meta_presenter'])
            ->addMeta('bbb-recording-ready-url',
$params['meta_bbb-recording-ready-url'])
        ;
    }

    /**
     * @param $params
     *
     * @return CreateMeetingParameters
     */
    protected function getBreakoutCreateMock($params)
    {
        $createMeetingParams = $this->getCreateMock($params);

        return
$createMeetingParams->setBreakout($params['isBreakout'])->setParentMeetingId($params['parentMeetingId'])->
       
setSequence($params['sequence'])->setFreeJoin($params['freeJoin']);
    }

    /**
     * @return array
     */
    protected function generateJoinMeetingParams()
    {
        return ['meetingId'        =>
$this->faker->uuid,
            'userName'             =>
$this->faker->name,
            'password'             =>
$this->faker->password,
            'userId'               =>
$this->faker->numberBetween(1, 1000),
            'webVoiceConf'         =>
$this->faker->word,
            'creationTime'         =>
$this->faker->unixTime,
            'userdata_countrycode' =>
$this->faker->countryCode,
            'userdata_email'       =>
$this->faker->email,
            'userdata_commercial'  => false,
        ];
    }

    /**
     * @param $params array
     *
     * @return JoinMeetingParameters
     */
    protected function getJoinMeetingMock($params)
    {
        $joinMeetingParams = new
JoinMeetingParameters($params['meetingId'],
$params['userName'], $params['password']);

        return
$joinMeetingParams->setUserId($params['userId'])->setWebVoiceConf($params['webVoiceConf'])
           
->setCreationTime($params['creationTime'])->addUserData('countrycode',
$params['userdata_countrycode'])
            ->addUserData('email',
$params['userdata_email'])->addUserData('commercial',
$params['userdata_commercial']);
    }

    /**
     * @return array
     */
    protected function generateEndMeetingParams()
    {
        return ['meetingId' => $this->faker->uuid,
            'password'      => $this->faker->password,
];
    }

    /**
     * @param $params array
     *
     * @return EndMeetingParameters
     */
    protected function getEndMeetingMock($params)
    {
        return new EndMeetingParameters($params['meetingId'],
$params['password']);
    }

    /**
     * @param $bbb BigBlueButton
     *
     * @return UpdateRecordingsResponse
     */
    protected function updateRecordings($bbb)
    {
        $updateRecordingsParams =
$this->generateUpdateRecordingsParams();
        $updateRecordingsMock   =
$this->getUpdateRecordingsParamsMock($updateRecordingsParams);

        return $bbb->updateRecordings($updateRecordingsMock);
    }

    /**
     * @return array
     */
    protected function generateUpdateRecordingsParams()
    {
        return [
            'recordingId'    => $this->faker->uuid,
            'meta_presenter' => $this->faker->name,
        ];
    }

    /**
     * @param $params array
     *
     * @return UpdateRecordingsParameters
     */
    protected function getUpdateRecordingsParamsMock($params)
    {
        $updateRecordingsParams = new
UpdateRecordingsParameters($params['recordingId']);

        return $updateRecordingsParams->addMeta('presenter',
$params['meta_presenter']);
    }

    // Load fixtures

    protected function loadXmlFile($path)
    {
        return simplexml_load_string(file_get_contents(($path)));
    }

    protected function minifyString($string)
    {
        return str_replace(["\r\n", "\r",
"\n", "\t", ' '], '', $string);
    }
}
PK5~�[��mj22bbb/tests/bootstrap.phpnu�[���<?php

/*
 * BigBlueButton open source conferencing system -
https://www.bigbluebutton.org/.
 *
 * Copyright (c) 2016-2022 BigBlueButton Inc. and by respective authors
(see below).
 *
 * This program is free software; you can redistribute it and/or modify it
under the
 * terms of the GNU Lesser General Public License as published by the Free
Software
 * Foundation; either version 3.0 of the License, or (at your option) any
later
 * version.
 *
 * BigBlueButton 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 Lesser General Public License for more
details.
 *
 * You should have received a copy of the GNU Lesser General Public License
along
 * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 */

error_reporting(-1);
date_default_timezone_set('UTC');
// Include the composer autoloader
$loader = require_once __DIR__ . '/../vendor/autoload.php';
// Include custom test class
require_once __DIR__ . '/TestCase.php';
PK5~�[�g�i��"bbb/tests/fixtures/api_version.xmlnu�[���<response>
    <returncode>SUCCESS</returncode>
    <version>2.0</version>
    <apiVersion>2.0</apiVersion>
    <bbbVersion>2.4-rc-7</bbbVersion>
</response>
PK5~�[g��U�U�bbb/tests/fixtures/bbb_logo.pngnu�[����PNG


IHDR����ߊ�IDATx��tTg��yg͚Y3sg��Λ{_�����v�1��6���9
�s�9'$!!�@
!	!"�6`lp��l�n�v�={眪SU��NUI���_�{r�w��~����	��>|�����=�	������p8����I&;���p8��7c�s8��@�p8��@�p8��@�p8��@�p8����p8����p8����p8����p8���p8���p8���p8���p8:���p8:���p8:���p8:���p8t���p8t���p8t���p8t���p����p����p����p����0�9���0�9���0�9���0�9��a�s8��a�s8��a�s8��a�s8��@�p8��@�p8��@�p8��@�p8����p8����p8����p8����p8����p8���p8���p8���p8���p8:���p8:���p8:���p8:���p8t���p8t���p8t���p8t���p����p����p����p����0�9���0�9���0�9���0�9��a�s8��a�s8��a�s8��a�s8��@�p8��@�p8��@�p8��@�p8����p8����p8����p8����p8���p8���p8���p8���p8:���p8:���p8:���p8:���p8t���p8t���p8t���p8t���p�t���p����p����p����p����0�9���0�9���0�9���0�9��a�s8��a�s8��a�s8��a�s8��@�p8��@�p8��@�p8��@�p8����pz#��|��gI�!H�����uA����a�s89�S8~���=||#[�+���,i��Kgu�	��O:����
�p��Ó�Y��_|��69��=uR��9Z;��9�p8:��@���⬪;!	��i��n�(��tv�{[��_z�&3p8t�ɷ�uͧ��+��@��ѳz�q��m�[����0�9��O����݁�Ż
6c�'�3�u���S���_?:������?��0�7ly��܍�l�A��JH�p8t���ŗ�g�����G
�h'÷�O:��e�%���O��7!��@�p����Y<x�%6w?Y�;���嫷����a�s8��7?���סx�~���d��١ߗ���O����X���5�'�7��ma6?����F��u�7�DO�n���y9:�a�/��*��5G�VC�Ü�z��YӽkM�3ϰ��'t�����g6�B�ׅ��ߚ�N>����]��C���;���:�O��0�ׁ���g_��]o�'f4^�^C�#�IT�t�3}�`�j��p-L���š!)w;>��'&}D�kyڶ\���oBӦ7�q#�
硡�Է��u-t^�uͯC��P�tj�NCM�iX�p
��T՟��u'`M�	X]{\�ʚcP��(��>
+��_/�8a�!�)�&n�H��"�O󮃙��9
�?��=:�^�c�5����<�!ɭq��|R�����E�=ç�b>/��6�t�H)�+kOAi�(\zֵ��C'?��?���}ع�}l/�[w_�Ν��o��6tl���.C���`ӶK���8�\���tބV���`��s��:4����g����8��OC]�)�m<	5
'`m�q�Ywj��k��cPUw���/Z���@j�V�,肈�M0����N�����y=����D�s�;�
�a�s8Zn}�5��M��
�^A����IU��h�����7BU�Yؼ�
�t\���o���3�����a��a�v��w�W:��.#�߂�[/��N<[.B[�h�ӂ;�f���������݀�nh9�U�X����4���85
'�'����aM�1XS#U�k�`�~VV��kA�ꃰ|���:U5G`����,���%;�p��5$�Mt=�b[ů�Lj�7���V}b�V8������p���J�u������r�L-ty@�([}�J�BS�E8r��=��;v���{�U�[���u��A�wlG��@��%�|¼�`�qZ�-X��b���s����0�G�ׯ'�ȱ��
�|���O��w:��W#�W̫�Շa¼�`^yVT�e+�쇥t�K���{a��}�t����P�t7,^�K�uV�VO�q����	�t��{զO-؎ݎ+��a�s8�[h�Y����޹������{"V�q��6�l������
h�*����s��u~��B�w�}��y��
���
�w`;]T��.#�7n}˴*�A�b�T�7���\�*�W���*���r�ye5U�rE.W�r������'
�d�^([�J	���))�	�e;�x�v�طCI�v(+�eKv@v~'$g�Cj�f�jAO`���ll�ӯ��{Ԋ?q�W�:����oߋ�L����6:݇OA�O�����ݐ�g��aV�G�܄�go�l�o�!����	���{�%���\���b�2��7"���/
��l6m�7��q�y��Ů�9ݏSenl��1�؏IU9�ة��T��R�}�*�"���2W`^J
_Ba^���,"��tAaqm��E�PX��l���q"�
8�E�|v���`�=!{+:���p��;f]��H��c��T�Oçd��:�����,�x�}N_�#�a���G������qq��/U�{�U��+��V��EU���fUU޴An��jW�27�ᮼV�js���T��@.���A�A^P�M�<!�W�	�xr
��g�m'+�r��!�`3$�a[>�+�f���J����=g�n8p�]��G�r�N��Ю���Xf��>v�*�n�����`�kp��p��g�"߅���\9RU��iUn�b��ʷYi�;*���/�����f�ʱ�N�\��-�"l��W��xr��w
�7CfN;ddo��M���2񯳲7BJz$��Bx\3�EH���$��ӛ�hf<��@�pz!4�
a�r�Tϵ�I�,�:�.���J���~�8p�S��Q��:,���)�-@�j�����n��ަ�^���*W��m��jU^.U�*/���"-��U�5��Iˤ�R36�
WN+$��@j:�
Hl����^@]9=���
����:������\|�����o��8�<4��Z�9ف��p��p��Mo��N��J�]uWޥY�_�/��-vS��
��[�}�m�V�-v�⛺�^���EU.�<W�b7¼]T��X��fn�a���DybJ�'�@\R3~]I�M���1����aԊ_/�'=���v���a�s8=��,(�ۭ�t7N�8In��[���
��?�c�G�~\��w5���n���ߓ*s9V���25�7o'��
��rUU���t_��^olA���0�s4��n��'�U��9�|�aCU�r��my��^_%�|i��*/�A.*�]P��z��^/R@N�@^�)����юқ�*�C
��:U����"O'��B�<!!N
O\�	x�kt|#�Љk���z�������
���3d�S�������@�p�3w��N�'�N�m��:�4�J|Y��$t`K}�я��[_�^�Տҹ�w��%�k�؝ߴvs�ʹ�nM|;mU|��%�tI|3�ح�osߔ;U���T�'	��"�����̛
��<:��b
A�'<jDF�AXd����F��!�?k�'��|���3���0�9���Gw!0���D7��kćuy�q�o܆�oށC�V'�K@7�\T�2�w��-��5�o��-�����v��Z�M�7j�7�*�6���oU(	�Yk*�U��H0��ޕ��o�J�}���^��
�ce�_(�o9�m�ᾜ��Jen
s9�<E���0Ǫ<��$*�h��9���z�^aQu�0�����	_��u��N���ن��w�:��l�**_}X��;*r��NC`h�I����B�޼�#�{�q�����w�4ػ�6i�fU���]�t�.�od��߄�n&�%���U�륪�@.W�QJUN
�ƪ\y���Z������'���׀_0v\�k����v}C����a�s8��<�lO�X�
dܜ��VX�
'x��j�V�{��0?*C����7�{���7�ѭ��okm�o�ѭ��oy����Ū��fG|Uy���mh��[�sj�SU��+�P#���U�_�j��������C��4����)�����K{�H���_��N�ŗ�=���DT�N݄�'>��ʏ��v�7��mϻ�U�=��r���%����^�m�KU�!���zWnf���xW�H%�
�N�-�7��z��f�uE|3�|W���Ny��B�A�|�
н�^~���w,�A�ulÇu�����+����h壏���s��^'k����&o�ڶ7��{�‰���"�w�X��k�þ�֠c�-�m�=�:T�[���&�˝��訫r�b��aNUy�s<F�W"�+����JX��
��]��a-ܻ	�GO}
q8tGΛ�>����TB>?[��h�S{�*r��h�w��|��ѭ��@n�^oV��ZUnr�����t�*��u��YݺM�<Ϫ��n�`O���IU�V{��*�
�-�KU��EUN
_%�o��wxxU�|�0o�R��`���@{xk����:����y�s��'�rWN;�iqJr�!�]��
8yC���U�
��V��0�M�ŮK|��_|��b��+�U�����!�Y����c_|�h���o
��:S�-�(���~�*G���\��}�Pe���B:�a��2�=�f�����n�zR�6x�߫s蜇4_}�wq_���J���Ӽj
�p7l�~ο�78z�3K��U9}U�|����
�R{�@޵O6ر2ߊ
�T�|����M��;/�;��oBk�$�ě7!�	���hZ���	��&
������戸/;�U
_!�ח&��r��h��	��s4��r{=� N⛘�F
�r��\L|S@.���<�*s�	�I*�SeN�є�<f�x�N
���hs���}y
�VC�\�K��<%G����u���JX(W�t�s,�9}��f�_
3�.��Ja�|��}k�
�,Nw��Fs8t�C�o��s���b��h4���V�_��w�E�]z��oZ-��ŷ
=/�������=!�%Y�t�o�6�7�žR�ʱͮ��%�/�*s��y�r�1��g���0yZ��Z-�������a�s��b�S{��L�_�����_��3�La�f�3�%��tQ|�A1vŷ�=.���-N�bwF|�+��-v�
3�/g�|����L����.����`��0qZ1L���ׁW��;Ft��R�0�9xn}����\�K�-v��㳻�ع�����fQ�����
�K�ŷ⛘�������
wT|�#�o�VŷM�^��f
r-�Ͳ*�3[��g�A>��)3K�'�������0e�
X܈w�-�+P�-�
�N}�?�:��Z���p��遇���bu�	��O_�B}�VU�&�ovķ.W'���+���o.�oe�t�o�'��ߒM`�-�E�*�:.�љ%��g�Z�0/U���%0aZ	¼^��F�˅��K��t���7|��5���0�9�O�tWN��t�9���%*�.)Z���ѭ��u}
Wķ���v@n�^����A~Ҫ�^imt�*��Nm���7��[۵A���`W�n��r�*�rCU`�^��Т�^a9��-��M���
�8m����O-B�Kg�E0r\��\�<V�WD�8�B��i��9t�ZC�ʇ!�|�G5,�9G�^�����7et���vX���U��֭��o6ߖk�nuJ|[b_|�+�%�m�!����,F����j&�y�Z���7E~�ߦ!�%�/�`>C]�ø)t�X��GO,��
a��\:2&�Y���Z���:�~=�q�Cp�w
LYP
+ם�7�Jݪ�~T��~@�v��b��1y�NcUn�Y�)�,�"=Gk���|���ķ���M�Z��urU^kl�W��j�e2�	�^,��H~�f�^�b��}�b����
OQ�<Q�ʓ��<�@�
�<Z�^��h�By���V:���7y��M�^��[%M|3�<�&�|��j��U�LK���\T�E��_
Έq�0��<xed�83���'j�˕���?��s����$�v��Ͽ�7�b�q�m�}�͢*�A��]�m���[�.�M��nE|�K�/���(�٪�g{h�6�7�O���c�LĻs��(r	�������1�
π����M�y���:���p�&Ս�U�筁�p��m8u�t_��1��w5nF�C
'��u�o;�;�;d��w�t_���Z|kmW�|��27�,��:��&K�*sj��ŷJl��Z{ظ���r��URe�T�b_��,_j)�ѐ�E��9ޙuA>V梽nr_NG��w��gJ���i�}�A|K����T;�c�e�-aN�u��J0�0�؃T�?�-��u?Q��0�[-��	��[�����sh�osU����r�}�T���6~�s���`eN0'�SeN
��|U�c�a(��ѹ�ʨ\�_
ˀ�#�`܌�0�L���\�s�!�.T�
�r�#��q�ػct�}���*���7s��Қ��Vl_|�j��ߢ��o���)��C��f�`����w�JU>r<B\����U�	�CF��#��<"��	�L��y��	�T�9�w�g����㞩j8�b����\IX�������.V�j�p�F��A�M�̝�j���{˝ߊ�o-vGŷ8�[���o��7�2�+��:$��ߗ�a>��>*����rς��2��߷�Q�
��I�7n}�:ǽB�̝3e!Vp1�n�8t��x_�i�uft�{�U�.#�M�ʵ@�!��
o��\ߪ���辜���B|�m2���|ͩJ|�m�;8�5Q�`�5y��ѭ��f�S���]�<-����3���T��y�5�
���
H�/���{�V�w�^���,xp��T��r��m��p�o��&
?�ct���T-v���9�ķJ�[��$�������oB~sA|��ʵķ���o�f*��_��Y�K0O����Ë���x��O�a��/��9�3@�����3:�
�G������y躴X嘪�~��^W@���-�*�}��R{���ѭoY�`��^wxt�y{�J��
?`a�K��r�[���
�7�y�3�[��UU��p#�m�&�uo���/�0�'��|�
��O�6؍
��
�/���S�Ϡxv@<�|4y�P��	��V�'x������8;4���T������K_`��M��^�]�o��o�'��Z�Y���[�j�o��ok��,G�:&��,vӻrK�M�[n.�5���ܮ�f>�U���Ln�/�+�M�aN���X�gK0�0��x^xY�y���s	���L�D�˳Q���v�R�gx�;����8;4F���
��<����|�5�1�,W��d|�l����2ȥ����h;4@�U~W��Yެ�Y����v��C�_�o�\cg�R��AN;��s�J:�J�YN0�g��\-���|�zgy�V��7�Y�/�,W��Y��n����ˍ;�
O�7��;�c	���8	�����h��r	�*��}���r?y3�Xu*�n�w��4��v��T�4$f���.�+�	�MAN����r{�hYx0���	��mȘ�/G��R�|�\��}y�W%��{%]��_A��ȓ�فr<X�?�@�D���0xt�F�V��6�sO���4�8-X�B�h��kpߘ�m�o���o[]ߌҬ�o�-vG�7��Z|[���f_|O�zX|�vs�P��6¼Şal��Uy_�*�#W��
���O��O��O���<G�s��a�srg>+��u;���\�k	r�E�]߶�G�*��;�ŷ
s���I�[���͛���r���x_^�(��F�����Vc�VQ���T|[Ng�$���,W�o��a��X�����m��"��.`�/�س4ķ�Lc�=YK|Kj�yl�zg��\�n5��[
��C��7o���[i����B���V3��1ߦ����R�m���F[҄�6�Q�Mi�gXޗ�,ݗS{���Ee�
NT�I�<�/�z1A/��x��<���_�kP�J��@��h�~�ӕ9���n�v9
��#Koz�7�[�v�*��7�k�v�ķ}vŷ"ŷ�L���.�o�v�ߕk�oSf�����^�)�e�����SU�
���E	��GT������w?��::����w?Bz��*sj�/�`~���6{w�o�-v͉oxO�q��/_��sa��(��G���P?'��Z߄��FǞ�FmvWķ���[���[�u���e�L��'ϰ/�	�My[.�oúY|S�؟�[�Z
ܬR�*u����{��a�s��;嫿Cl��+s��N�7v��7���Z{�6����Q|��j�
���x�rJ��!7o1�,C�l)��˱�>(���X������ڎff��Z�*�|�M�}�YUn*���\뮜����R���\��{�)�#�
�3�U��-�{���w���*����Iza�@nV��QW����m�ܢR�*�|�*u���0�9ݒ��|��۝���iZ���[�N�o{ߵ+���R+�ݑ�>p���S`��Q0�LÉ�����t������%��z�����m�SF��5�ͼŮ%�Q������[�k⛯�Mܗ�
�M�!���jC|{�E|K�/����
w�]{�F�C9:��4��s�i�R�ߖ�[�z�����u(�ѵ�ʕ�a��p��qqN�8iA����Â!��e���P�p�ԝ@�1�}�[K�f����
v��
��u��*����#�An�^�y���f{]�5ص���&w�T�g�Uy�)ȇ���nj���^w�Zw�uZ�$Ǖ:���q)�/~A���P��@_�|��뮋o�u�o�Vv����ٝ��Y�g����֭[����ATd��ܣ�C!!!�WCm�l��E�tZ|+1o�������o뭊o��[�n���`�	��`���ƺ&�=����c!0bJƷ;�z'����%��x.�sөMRx��\	k�›W�mv����,��m'�Ӑ����Ѷ�2V囷_�v�o��>G�(��Iw��;=;�s�[��.\���J�ֽ!$$[�ᐕS
��;��~�~��^��r��
�*/_!
�Q*sQ����R�Z���!��Uy1���������A|˦U�J{}�h�K��$3�=^�:�@�ތK���<�N�,�TU��b�7�ȱ2�
�4ؽ�d��A�!�\��ȱ2
���l��^&@>��r�䪜V��f���!1T���X
=G�$�#�}�4$����u�pyH��PE�|���>X�ޞC�@޿�A��??%*��&�~_�x����M�,��P���sn���*H��.Ƹ�?�iUn.��c�KU�4�Վ��������΋!1kN٬Э��	������zlLV�m�j?��r�7
�ݼ�N
wN|kVU�v�7F�:-�����t�oj��;ķ4�7i|����CH��ӑ�����_'�����"���a�st�e�y�>l&�0?z�>s���fm�������չs�dee��
22��)Yx_NF�1r��[�-�m���n)�m�-�Z�ķE|�qP|[%Z��os]�FMpV|K�-�=c���h/����ۿ{<����MNߧ_z�&Hq����s٩6�L�:H�E�����!�`�F�@�ɩѭ��!1U(�ݾ�ӿ.�}�>|���
,,bc#
)9�`e�t���.]�U��;ŷ8��&�
U�N�}��ƪ|���[�vU�%��0��U��+iv�7������G��_�+��أ���]����������?�
q����I�����Mps�Mst���f}g���l�o�07���BܚZ׀����!44L��2�*�v��C��V��E�]S|��k_|��V��La�-�M3�o�N�o��oõķ�^��<
�N(A�ot���0��?�8t��8:	��92����'���^{��f��N��h���-���[��Vy�J��P���T���S�\��@'.+��t9V�K"ȷ��n���
7o��I�0y���V��zL�)ȣL��&�ќݺ���m�
7m�/�Ʒ*�ۄ���<��\j�21�U�y���.�77��Й!�'��lm[��*��@�X�w?s�e^`¼�V��n�^|g�S����T�7j�,��WVE��m�^o��@(��c��xO�
��l�o��7��r�ķz�o�m�n�	�m�-�X�����ܴ��ߍ�7G���S�	s*
0���y�g߸�^:ǘ�����V�[~S=�B�s2�wjU��|��m�ag�Uig�.��ޡy�6���*���K�њ̍�Fy�T�+�N�kNWV��oӭ�nT�����J=&&22���Qy�x�&6���`ϱi�o;�MA�Uy��*����E�1�[���hQ��:ݗ�7�U��h~2�}����s�U�B|�ANǤ�>_��lt�ȧ��d�:ݗ���h��I���}���r��>T���}�Zz{�w�r˧l���	�����ԳKv&q��<?��3xG4;<�}�w��
�7�O~����f{�r_n���OŚ��t��˗Q�����(1�&'�	+�}�Cbd�ʹ�����:�*�e��7�u�os�o�U���o���7�}���~��7G�����z��v�VBg��R|m�a�3�9X)����l�u0?�6l{��;�o4$f�\�o�meg�V��ֆG�,�l�YN�9��I�y�J|[F�����|����u�a��C=tJ[[̞=�ӣ�D#���;S�ʥ�r��Z|KC��S4ߒ��ݕ��U;����yl�yT���<J�b��:�oa*�-�(�������L|O���f4	���r��y����>��i�4ķiF�M�߰2�T��m�T�W�7yH���F
)�od�Mܕ˛�^�ѭT����ARe�����Z����r7���������������Z�kw�Ì��@���hW��F�t���"�<����.�M��&�o�6�-��dgy���򚣰l��ݻw!??|||
>>�����|ޗouJ|KHvM|�!�Ѵ7kU��m�l���k��o��o��.�=��{�ح��>+��1ͳJ<g��1G�Nr�W_�9:��w��+8l�ӽytz�h��{s��ۮ��j�27�Y.oG[��|���=���W_	��}z<V�i˰2�f�b'��ߤ����[�n���v�73��Q�=�m����@���aU|�3�}�7GZ�4��}ba�B�
�lu�R��~�?�蜇1o^��a	n�g
D�!�?��?����7��
�j�`�4G�*�	��T
W�7��r���w�Ӛ��P�b��r��)�9s
rQX��BFV��C��n�]���n�j��\�h;��O'��/���Q�}����	
7i���o�ϙ���7Ƕ����C��k���野��nt�Ô�~	�i���ѝ��yk�|�q8q�3pc���or�ݚ�&���	̕��+�C��}=��Yܧ���X[��qOn�Z�[�"�5Z���FO�\�&��&�&���n�-�-�7���<#&��U��,GJ-�_��1�9K�Tr��b�w�T��gojܕ[��*W�7�\�E�[M��
��^'�W�w��>�K�­Ͼ��_��QX�11�X��#��#з��63�7k��
v��Vk�u�kU��
�
�1G�ʧk��KDUn��V�j���B;���6A����ΞG������h瞲�|�#��c�s�|�չ#oΩJ��Qq����������=�y�ݞ�&�-�'�Y��f�b��d��r�#���a��=�z���_�m۶�����-�cU�a��S[�oQ��o�w��[W��*ķ���7K�w������>n�[�ң�߰lsgZ�4���@�<Y�ի#s`.����;�'?�v��g�Y�窨����2ȷ7�mR@���y��*�ŷ��ȥ���|]�d��
?- ^K-�u�b?�����t�Re�0'�WK
�XsP�,�}��Kv��S>��sHLL���`����Mx6��<���$K;���;��鮜*siHL����`���еF��r����妛�<�V�m�B3�ϓ���5�Y>+�I35��EB|3�DU{]�Y�����e���A��,��$�?/v���&����j�=���S�1ӗ:�����Î��y�C��
F�y5T֟��o��95�v��6�(�ѱ%����Zn��Y��V����e+�CQٽ:�������]z$$$�
ȷ�����`o�?��!�m�~����ѭS4vk�yU�F��&�9����0ݳ�������C���y�o
>��!�����$l§i��k����;v[��]o�&E|�4�/o�"�5"�H|�iobt��}y=��-ŷJ��v[�r��W�w����/��E�;�֭{����c
::��HH�G��A�\ߤ!1��tWe��4�U%���o�X����oޫ�ê��f�[f��g*0������M�7Zs����'҆4���2�Gkܗ7�/O�~C4ķA��}�Y��b�g*�=���\y������ܝN�̯���:�
�P�w]p�jm�jXYw
���!A��
�K⛆�n"��
_a��{a��=PX�n�C��]����a������
/F�m��]�B#\��R�
;�"�-qN|s�`��-�=h��\���G�R�ֻwz/��C���w����y���O�8<'z�O��\�=�m�}�M��&�ܪ�&`~��x�,�e�@A�:�Ν;����.=&�[�-vŷ��压otW.�|�U�m���V�f���HS�m��s4��[����n�J�a3|:
�ՁOt��@/Z��?�)������~|�S�.s��m���	r��h⛕ѭk
WvI|#��A��^W@N�9��t�.�[�
�~���x���{,V�UX�7��ܚ�.��0m��V�f��Mv
��sft�9�-�7=�3��E3���j���<I��[٢�居���@�m��Wo�
��
��o�|�C��&�]������mkw�o�'���!�-�S�Bj��%����
�pk�}߾}bll,��㲰*o�+��v��7'G���
���5�⛭ѭ}Y|s�m:���sj�j����Ï?�!�s�gc�����[����`B�d8=�[7l�$���f{]���
����	�Uj����W���
/Y���v@v~'ܸ�;��iii�@ǯQ�&kNM���A�mf��M��|�9�o���h&�u�f��rU>q�z3Z��ѭVAn|WN�U�}
�����4��`��Ĭw�Kg�s��|�ݏ��:��V;���(��?�l��7{�[��ѭ��+���m�oF��V�|�|'�;���:�q
�	��A�ަ���6{�}�m����0�7�\[|3m�?�⛣��)K�J�t��ˆ�7j�O�����+�bo���$�ȷ!�
s�%��vH��Z�	��ț��Uy��:�f4z�&F��3�|����j��m���vV
ȗ�A^A�u	�
�� /�ʼh�vXT�Y9p�Ɨ��p��5���H��.Š�BT
���!X�K
�9�<�R�o�4$�׬�.�7
�}~��hH��e��Ċ�7��ƪ\�aWU�i3��_�
���	�CFI
'�m�LD
��q��r�/��d�M��?ߕ;�z�$yFD���U߾�(2�9�chA�_T�C"�ll�7lx��s���o��fK|�2�߬�Z-��y1V�E����
#g3V��>�ߣGC\l8V��u��nM|���[��7[��ѭ��7�;�o=�o��(Q��mr�.�t�A�_�p��:��CCd&/X	Y�`�Q5��oF��wi����.Ce.`�T�x
��� =�>�
��u�VQ�'`�=4|B|���r�ķ�s�o�t�o�V���pD|K�z_Πv�x

	��m�����>��?�)}�D�n�C>/���CM�9��s�t����V
�m�N��"�-S��jUn�By~�V|��	���z譭��ZRR,ޝ/G�י�<@K|[�!�-�+�M��7[�M���
5�G�����?
#���_�F��^Rq�?
�)~t��!2I�]��{xW.W��^�+�5�ߔ��Ίo�oZ��b�aR�!�!�;!%cc��̙3	�1xo^���*�y�v�;#���ܚ�6ɵ�otX|�	rO���ҽ���~�}���@��7Y��t����<�:���`7m��ķf���
���1ث�n�@�פ*W�7uU�H�[
'�X_�ɧ��n,//��
?���A�WYm��{9?���ZU��_��+��f�^��~�R�5��ϚW���[O_l��]��)e����t���a�s�\��K��vqw��
v�OT���f��[C���5�;"���	��̳�:
1���^RR!!��
Z��ь��ѭ��n��~�͹ѭ/
�!��g�����T��wbgz�ҽ�ͷ?�%���!���]�k��¶=W
߀���T�-��I{�r���I�4�M����hU6@n>��ķ%��z���s9V�J�z�YU�HyN~d�m���vHHn�u�������&K
��4�\lF������r��hr�h3��zg�R�OU��U;˕�hx_n�X���H�3�M@����>Pe�sU~����x/sj���?�K:ǝs��
��?tb�o$�t����J
�A�M�-����DenC|0_$���d#̩2��E��C<���zuu5��A]��m�o��&8d�kU�9��7�/�g�����;��DD2��K�U�:Ǎs��'��I��i:[w]
o�U���[��2�dzNu_^�Hw��[V�k��#���(�Z+U�+U;�E�}��r
�m1¼D�\�J��Bsy�V(X$U�R�=[�̳�2W`���b�{��9�q���
���<�KMŷ9T��K��q�*�OU*�"c�}�\����-v����7yH̐QX����^5�^���U��`��U�/I���{u�]z$��\�������M:�]�V�����
v–o�{s�ķ�B|37ث4ķU�F���d�ݪ�V��v|�	�27BL�z���ޝg}��
	豉X�/��JF���&�߆����RY|s�C@�3(
����Kv�&��9�wb�T�=���|���$��"�Y��-��W�qq��b��%�7`��A@o�u���b7zRb��g�l�JM�m���[��Ů!�
1�o��[��q�$���q�힜�7n}��t��������|�_m��<l�w��
?g�Z�y��'EU^m�V@�����^Uy�v�
�29��
���Q�����n�l�*�����M@>����+�c���l��A
��m�c�߉A3���@�Wn��w84H&�d7l���t�e�ʦ�v�[�7�m�ot�*O�"�o�a�ߠ�BdL��=)
B�3��߄��6��Mj�k�o/���nW���ux[]�i���_�C���q�8���%,x�F-���o��\y��V�g-Aޠ�`���
��1����;5A���%��r&���
�)�U��	�YX�Wh�ק�Rv��h�O�4�G�
.��U�J{�U�]�V�r��`w߻�(4��›�Ϸ#P�;��&��_��>���w�pK��殷DuN��[��־���B��f}�[�eU���ߠ7CX�:�z2=�>u�
��6ߕO�^��^��.Gh/��{	B��]��z)Vޥ���F/A`c�]��.��{V݅�B���j<C�Թ��}9A�����{�,u<�?A��wB:�x!
��=��O�R��K�??�z6��L"��#O%��L��=���@�ƛ���1��K�/�Iw����<ߝ��q��ů����T�X��
t�,�,o���`eހ ��،&v���|��c��h��b_�
��A�\��B�3���;ˋ	�F�u��hJ{=�[��|	�Yf
OE��
O�@����5.y=�D���w��!�h�/0����0ae���8>����	��d���t<}��;v<���-M/�x��=�ga*Jwҙ�
E�9t�řMg~2��'a��*q�c
�9	��'�i����߫�g�G<v
�O���G�����c}���tZ�:~NxG�:,�q�7�;�~���e���v�3�{sl�+�[C�k��J]��
�m�n�ͼŮ%�%�KU9��2�Oj���^�V@B�OŖ;�����˂)S�
<l,�>�!�p<-Np���%�`��>!t��	�:����o�������D����x�D��3Ᵽ
A�?û����8���(�@Pb�CO�|�Za��w�Ô����8"�M��؂�v�+W�7���Ӏs�m���VuV�ķ�Ji��2�y�Z|ۃ0�-��@��o�F���ݗ����|S�-3�(��i��Sۄ���U��f�O$�7AlB���Gn�@���������n�Ahn�	]�:����>[�tBWW'df
��
"<���!&:��CB|4Lî�kS��I�o���;��F�=��Mp��O�6w]�S:�7�~���.}2\�pM���(�`�n"��wQ|��/���N�o������/W��X<�<:�BֺГ��*̀�g��ö�����͛p��ex�������9��`�7��&��D<�ƣ�����;��?a{��0=m)�Eop�1�[X�c�sz3[w�%
��v^`��JUyӆ�M�7�fwE|[e���R|-v;�l�o�ɮ���}�9̱*���Qq
�\�6@O���w@�t�7���~�	~��8{�,,^�<=���i)Q����	(J�G����
7�K����������2�9������q^�d�i^5���Z��h?Gsbt�j|�&��n]dt����9-^
O29U摱
S~AU��G���AX�#�3s7"��VΟ?'N���������6=V���"؟����b!�s�W������ȵ�_�E_u.�۫�^����)Z7�o�-v��oE�{^|-v����
�#����7`
\s#������R0$z���m��o���۷CFF̛7�S�!=-B������u�7�$�:�v�]:�B�]�e8�ZQ�o��\��V����ݺ��w��n5y�N�g9r�*79U��Q��to����t��K��`��7�ZgK~����
����B=��`�4����6�8x*���?G�F�l�o2:�7r��5��v|{.��m��5ŷ�:�ķ2=�[�k��6�7�bo�a�m�h�2���P|����~@1n1<�����<mGB]aa!���CbB4���[�xxn�Ԃ؁N���l4L���!9���m�&�1�9�:a����Q�Y�oRK��G!���z��^E�Z�/'�K��VQU����
̕ѭ���b�)�|/V�{�K�"�	�Kv �e�/�ErU^@
�ʜ��<q_�9y�}�zt+�-�b�j�a�$��%�ǫA��9��@N�@#�<,�B�G�B�U��57zJ4��ihn���f�y���S;��{�b�No�CQ����t�-�b�?�o��v7s9Ƶ;T�׬?��XtνNB�V]?�s�'�Y��I�F��ߖ�ߜ�jb���-vQ����H��k�@���X�M@�]�Gz*=

^S,f���?��S;��ׯCUU,\艿����=M�z:FNY"���}	Cg%~.������@�ܫ�t��}�cs�	Y��Wk�[���[�N��[nAϊo��:�2G��
̃��B`�Z��Z�F@�_�4:�m�|4,���{tg�믿BEE��z|\4de$��0����܀:��̼��
��b�s�U�U��9ǿV�9�ͧ��o+]ߊ��6�rE|��P�kDeN0�7���p+��
�_�H�-��s��Z���.��q�C��9�I0j����}8�Ng�w��@��]��b�s�Uy>ݻ���SVŷ�Շ\�Y�o[�]|�U��5�7��.`�0�*�j�����>t'�����b�i�A)0c^9|z���v1|�D��@hH
de&����R��k/
���t츈]��7��ӹ�ɗ�-t=?���:�Hj���h�W*�yUngtk�M����V�뮌n�Q�<��R{���0#ȩ2��2��k`��r�zZjx���U���|�k��?�`�d�wC�ܹ#���DG`�=�Lz8+�?�=:=
v�C�Z���tN��7?�CI�yz�vhj9-@nM|[��E�Ⱦ��ot���֤�ʭ�o�{����
��>�a��en��
�=^��}Ј,�w���tG�^�
@jj����q_�N�Z��
���G/h8t�=��+���w$�
���
��s4Ez3�o
/U��%�r��Z�R�2إ�|�x�f^��s4s�'�KU9=G��r5�E{��ŨA�_	��2��T�`�x�%�}�$�{�U�̹K蟹
н�R���<xet�-���'�൩�M�
��ĝ���'$%�	�ӓ�G�~������06���M�שF�����N�������/����	���Vq�3�I�ͦ��]��`��D��J�9��d��W"<+aƜrx�7�o
�4$^F�Se>hx��tx?�K�u��������T��dI�����3���'�a��e��P�=�t7�0�9=Zuབw����l�z�iw�Bz���
,��@��/Cb�m��H-�!�	�t_^(ݗ�(�[��R{����z�Z|KV�,'��ŷX�y�,�E�CU摊����a��\��Se$�o�2���4�a��
��r/�{���������̩�N煗S��?�s��uG�~_�b���I��+��-1yx��t��
�ѡ��J�g9tNG�8z������b|�M�}Yϋo�F�ƨG���oJUn[|S���SU�
�	q�W´�en���X��J�����������!���Ă��J���_����N�]���!/7f̍��|,�!G��OE�����lI�0�@��dh���'(x�5�b��W�=lW|�[]ߔ�ܖ����V+��#l�o�0����B���WL�Y�v@~P6�q�b�k����/���'��w0e��;O��>|�����qq󗤽�C��>10�g->_ks�t?~��0�9=�����d�1�}�-��\��[�ͼ*�rӪ\C|��p��n������d��\��/��޿�@O�ſ�$xn`�	�_x9
�b�y4�_�-A���w�zw������zO��(�������8�c�?�o:���l�a}?����Ee�P�;h_|�6�U���nS|k�Z�ɮ�oA��5�MT�>�f'�W�0��y�äi%n�dx��)��S�Ϡ�}�����g�r��r��m���Pq�N����FC�!��ݑ��'_���i蜞�*��.d�H�$ߙ�3k��h��r5ȷ���;��	�R{��<.Q�Y�Q����y����y�)�=}�@�A��.Xs<���)�nW�?�/CT����
��L�$xv@<��_����/@b��Z��O٢!<������Js��rg�sz(_�,٫�q�o=dt���C�ķE.�ot�n�7�M[|�f������&0�ʜ`>{�R?��u#�{x%�=n��bW���x����%�'A�{������E���bh;[hh���6z�$�=�w��>/�;�M����o:��s��gᓵ��-��%�%�K��^/3�����䴳|�qg9�<[�T�o2�\�^W*s1�M
�$���@
o2�,�Pv��Wig9�o��C�!P6��hHL��A^)@�6�B�ʽ�
�/�|�e0�ΜW�MZ��@�
�{&�m��A��T�?=@y��&]m+?����'m>!k��C�B�����J�аx��~�+u��d��V��N�/��o:��C�/}Y�`��:�O����M��5�͚�n"����6�s�h�+mv��g�[�ϔ�a�D�M�zz,��#�*���2ȟ��R��V�H���o���
�M[N�'��?Bcc#����a3�����|�7��GM]~���y�7���a���<��i�Zn�vX��v#�w�"q_�
NJ\�/��<߬Ş�k��4��(�р��4�2OL���Cb�T�[�Z|�1T����r�/�P�<�(��+�偦��܆�6w��b����Ka��%0���P�>:}V�}>�X��O0���	6?���'#���
w���@̖-[`����J�<Cz�
ߣ���pxyl�C#`	��}�/,�^�,�K�(�����ķ\WŷdE|[oU|�6�}�JC|[m�`7�o&
�G
/����K`�25���*�8��N�6���]�\�;�!M��;ޭ�A�.g�f���8�
�qqq
���+�ۃ
�?<C���F����ͯ�^��@�to.�}S����(�Q��ؤ��C�[�}�-�i�m��D�݆�fs�3�1G�̧!�i�̈����n�	�g���ܑC�����_/��7n~�?0:���!��e���N<���{����e�t/Z�>���`�s�-w�~�%��=�
�P�U9�ov@N�L��-ߕ�����:v�*��r1�5H�`��k�K
_��2Q��'�X���
�3�s�x:�i����T�Ic�e>V�)������G~�n#_|�񞛝��x��_T۝��8��I�پ�B�sdI�O��tN����wu�Ѓb[�l�)U�%]v�7j�;'�)0�!�Et���BS|�Z�ƪ\��d�����\���X5=��������s�x��߸���]�#ǯ�����܁��<H��_�x�k����gx=��S�0q�J������t:��B?Pt���Kʶ�SU�n�^o��z3��

����*��h�����%��Y�-�K����%0aj	�W���
f&@��/��S��'"ා�ÿ����o�!&�	��Z����JΉ'`�BO�Ɏ����䏿h<~.�x�vhI����%�{K_3�:Eu�/�ŷMvķ��[�}�-��ķ�vF�j�f⛺�>����	�a´?���D�_u�
�����*]���7���0xT6��	�g�¥�p��{p���Q@���Ν�Y�0`X<�����t�}tz�Nya��&
�,�,WU��S3$�'�S%�'�Uy\�,Ƿ��TyAam�Y&�<�
��y`��^��<�@.W��X�+����7㣪�e��0��Cr�/U��,�M��X���L�.�|ܔxmJ�2<��pT����k�h�Ͽ��o
����}䗯�m8d�?u�����
55bc���ɣ}�]�ր#]������]~�@��г��^@S�T-v[����-\��&Z�ZUy7�oS�[����k��`�E0hX��@�:"�����߽
�y���g.\�ҡ;���-p�~�{�]��G�
)1�(A�A��/&���Iƽ��M�f�s�+���1�#��Q�0�7V���7a����u�o�F����`�V�-����|��qS$�������@w�9A��~��oxwO�zZ7?�Z����Wyy9�Ctt<<�~�ȍ0W�>ëڡiqts��0��]y���=#�CT�6A��6�[]�,@n)��j�o��os�o�$���ɋ�G#�GM(��C��+��=J_�X8���FL,��'��_~u�����j		�O�n����q�D��$I���@��B����gz�fqon��ŷp�⛏�����j��#W�&����o�]�?����pw�{�V45.11ob�#�'8s:�����a~P�C@O���a:������Ӳ�Ŗ4�g�y�3�[k
��:�ܦ���m�����g��\ܕO!�/29U�#������ŗ���+�2����������믿���莃���!�?3(ML�c�3�9���r詙�
K�j2�Պ�F�R|k�-����n]�9�U�o��o��6zb!���r:���ð�y���T����;M�������_BRR��	��t���F��%��e
�d��*�bg�Xu�6�㌛�hgy�9�Í�u�Y���^�V������^�V�.3����h�*/U�d��&�
� ��龜��r:rQ���|8�|��\x~`
\~���.������bS�3л�`�r:�s=[�$��d�1��v'ķ���&��F�-v��%����1y0dt���@w�C��
���(�Y����t:�~zV�ҝ9U�R�=�`��"v��ķF��k��x���p�̣�r�Y��oq�/����;˽����R|#鍀n"��W���T�OS&�aU>e�"�����T�O��&�}�x��x���e,��Ʌ��rᕑ9��'t�}�n�̍@O`�3�9������M����C|�@�&@>��`W�7�����sEe�ʨ<2��w�t���n�ʥ�,��`:�s_=!�R�d���ߤ�<2�5���߾�f|���n�[��ձrU>���Fd���w�m:���3��
�!R�=+rZw�l��
r�w���J�{h�+��fk�o�b�xW.M|��7���k��]9B��G
̇g��a�b�[t�[�g@�x?�<���ι���OT���oaQ��o:V�η5�վ�6Ǝ�6��Y�28,��O��@g��/л�Ů���Dz��ι_�N_c�ce�r���y�y�
��F�������@
r���y:G�N��^W&���\n���f�L��?¼��tx�8x�2���n@�>����"��ι+�x��e�Ǜ��-ŷU��(�U��DenE|��M�E��L|0)�؇���!���>�p���t����ŷ$+0g�3�9�5У�r���(;˕�\�,���z������7H�Y.�׽��\��Ǭ���Y�n����M�YN��$y;�,�
�,'�n����>b\!�of���r�h�Yȱ20\���_|%
^x9
��l���&@���t:�>zd,�o��=�M�-�+��rI|�c)����^�6�
��|��*ϐ`��`�wp*��:���C��K�anz&��ι_�N_���J�=��D|V�o�4�U2�EU.���
V�
�[	�T0�F���73϶�6En�O��XC|3�-=^C|�����0�����Hmv����E�??8��L4����@����dx�e:�s_U���^���6�5ŷ
-�R��6߼*�a�;+���'��
��<UT�}��s��OE�ŷ�����߬����<�b��ι_����(�d�Z�VkU|��l���/�ͳ/�M���ĝy*V�xd�?;
y2���@��w'̓�y�T:��N	K���C"	�@nvW��o�F�Z���.
7�of��J{�X^u��+W�o�[����mx�IUn�d�M
r:�
̟��{<.0����`�U����Ā4��@g�sz++k������!=ISZ��7�bwA|��C|3��"���F��T-v:T�?;
	��O!�i�����3���'��W�������BsG�����?��n�����Ѭ�0(�VȽ�V[}W>Ϣ���`7o��V�&{���֡�Sm�=K���r�z���J6�؟A�Se�~X>����h\��@g��$л�I�r���&�����PǏ��@�tc>��K�
��వ�R�����\�ķ��7����6f���l����˓L`N3���7��2��=�^�4Z�j�+@��?��t�d��K���a:�7�N��oHV�U�"�-v?�>���J�o���=�hթT�S�]]���6}��f�2�4S2�'�A>!>��`ǯ#'�
�����
���G��
�A���*�O�W4��	��}9��	�O�0�o��ރ@w��̝z��p��!�@����~,�Q���6�m�o�U���o��*�8]���e��w�Ct�o/
�-��T�/̍����
���@�m����8(��ǁ^P�W|�p�^�gH=��Ʒ��7K�;&�)��ߔ{�
�-M�oZ-v��&U�	���tz��=�7k0g�3�9�+Ѓ��2�{^|�G|s`t����W���ޖ۪����{�oZ
|@:<10y.&�[��@g�s�9^���P���>��䪼��7�'-�ߔ���4��Ʒ�ߔ�r:����%�%�?�x��,��W�/fZ�tNo�������~C�н�
vokCb$��g���
������6vc{]�+�t�`�g�tz�����{�]e���Y�����S��
�$!�Bzz�@BR(�
R
	��D���AQD�,�X�q���XFA���=9�IH༧$��\�Z�BY���=�g�{?�q�[˯}���Z�����zѼ��Ggy	#tp%���gG��S6��U7��e��M|�a�m�
F�^|+w(�ff��#t�	ݻ�o�En-���s�JI6�ܮ�Yݻ�%��W��F��J���)�OJ٬ow�D%���-��(�>v���V��7}��P-�5E>�vt�\C��[�׵�q�(C�s*�[��u�]^�R2��G����E��~�#t��нQ�u��"���Y]��=/_��.�)��;�`wm�-�o����ߺX����@�ݜн1�V��u
�y�B���2I��g�{Dq��J@��b�?m��g씉I%v�*Kg>�.?���r=$f�.-qKg�E>B�+Zyg�����Y�oÔ̇��g�U��i]b�o�_ާ�3�
����_nt�Ѻ3�Us����yDeg��qq
t�n��,B��3��9���k��D�J����I���@BG��&��,X���R��]n�[+��o|��W�H�m�̓o]����ѕ;|C��%B彩�ӂo��<,�R����W�2%k�z7�05��ً�|:���۞3��~{�:Օ��i�mx�ߖ�4��������[{�:Bw�н+�VC�6B�(����J��L�ڸh՟�6��
���	�?
��2�X%p�F�֞�����V{D��*�V�\y���m�Ͷ+��\$r����w�j��V�C7+t.eA��F�.”��ǯW"_Q|[Yo�m�(G�o�%��?����[�ޘ�73�y-����.�22~�$f�6��܉�y�"tp��T;��C��qi�UG�\F9�`R��Ϋ�`�0�ׯy�:F�vs|t+BG�
'�šBw���+��|�QZ�c���>Y�Ȍ�v=6�^#�v���[�K�v���:�m]9BG�N݋�o��<,�L�:Ɉ�M�.eY���\�|�.Bw�?`�
��/�{UG��"��8�ye�M��B�J��ug��FW޻���"�ѿ��+�Z���ʛѪ�,/�y�L�/�#t���;6���H׈�ZA%1`�:��C��[��<���;�N	�̒����I�e���o|�\��2��v���o��D�QZ��|�K溚w�%�&����}�f��
tp#W�^3ut->c����[����r���!u��#��O����\�i,��Xdޭ�������μ!Ł���B�y�{f�>��ŔI�E�{�jIɱ�kR�.9���y�"tp7~r�~���q�7*�/tk�=��\bG�ݵBo��9��F�*�
�k�k�ܑ��8�f�{C�t�C��k�Zv��cW�n|A���������:y@�
�#t��C�o�\��b��DR���ZnO��C
�C�|��_�%w=eB�dظ;�y�y�]y���U&�{�:Wݷ��[O��uy=���ѭ�(r�����E���[m�[+��-15�]WF�A��С��y�UB�)��l�5$�f��
�oQ��j/�7B�
�#t��K�o��zH���Ǩ��	��~���x�"th�<�)�ߑr�q+Z�z��{X�,�+�n{g�u"/�A���cā���B�%-:y������92~ʽ�������E��P�ײJ�[�i�e��%��z]�7]����ѕ�|��YK�*�?�P����{���ly��]�m��:G�Z`�&��MW�����%/Y�
I��vH��ʨI$��lC�=n�.�W�\��[V+���2�ft�v4-rՙ���]^W"W��w�<�{��ϟ?/�֭���i2��|�%,�#�$��Уm�޸��P;��r��	�%��q5]����+B���b��vH'g�1��y�2���f��v�-®��L���=Q�'NH��8),�W_�|i��=O��|�Y�F���T��!�+�@��=��S�?r��+B����_���;!s��L�z���ϹA����Ó�~����X)W���b�%�����k2��Ϳ�|����aB/�_�|�K�1��Q,].��"'k��9ċ�Cc��'�$��O�Z�G�0�njtkt�W߼E�gΜ���"�6-M�����5_�Z���-���&[�}���7��R�������s]��9
th~P�J�z�\�=�>�3��y�ث�o��Ϳ��#�w�=�����*����i��>_��K����6Q�K���իW�Y���Y��=8�V��[��e��2A�l1s�
thd̞G�Ӣ���s-��mW^���H�ym��<���$''G��'��<��*�A#�%��Z�oc�W�]{S�f-s�'�����<�st��a՝OWBϫ����Z�eҪ�|u�e�i���y^��g�?m,��Yv�N:��OS�ݬ~4M�L\�߷k׮�ɓ'eѢE��4Er�����I�ȓ����&O���{}���S[;��ֿ@:wː[[��wn�����ŋe��$�7t���+v}��o�En�
�-�n�
I���sJ�O?�/U���̹���R�:��Q�)Yk�W݌�~5��վPEu���W-�^�̫��]���4��yY�l�$'O���,),Ȓ�����*Y�i^[�ϟ�3Cff���"˗-�_8�q߃5k�JnV��<Knm[�"���ʣyE���\*�&ݣq掫<�:/S����{���~��H�:��}�|i�o��ւ&�o��4>~�G~�\�"��|��F;vL***d�ʕ^[�ϯ���O>�D.^��_��[6���$����/��[]B��y�e�3������
�=�ץ"thtΜ�h�O�S���=2r��J��2W{�Ț���J�M)���i�p���o��@zzߢ%2tt��ҦDZz�~y�uլS�t�R�r�������y�y:x_��
i���&��2&���RP�`������=ʏ~+���@�<rXR�'H���ަ�+�ou�<8J�+dl�6�l2�t�Q����G�fj�=>}��/\$�r��؛�̭����k��@'N�
S��d���ߡ�+�ouU`�2�6l��0�v���*�n��Ĭ=2~�6	�o�\�7��=��:��[��Ѐ1�g��29)K��C=6�V��C�͕���
ÍJ�"�Y{L�<)s��m<��W��`�>�*�k�R	j���^�M�Jď��򪇜G����ٳ2}Z�Z�*Qa�R��Ֆ��`�����U�8sW���7�!U���x����t��cs�K���%�U�O��m�4�����:tH��*�}�,B�2�[Kw�Ʈ5��u�<<3d���?��"fJP�,�z@�l�%d���!c`�q8s�T�ɕ���ů]��v��[]2�{��=��e3G�t�?,����À�Ӹ|�{c��f������X�$�i�����"N��l��a>tP��&Jd�b	�X*-���F��UA*���:#7��I���܋��
 t�T�
l)fF���6=�]�-�t��.��$K\���K<4�������I��Lu��Q�|�[�*ХL�'��P�:x8�6>m�C�����\)�[���Э]��g���A~XfLK�.�Jſ�l��/��yj��\:�_jt�fϞ/_�g��2��<�m�N��K�����%�*���w��[C�eȘe���gxh|�����<*[�T�,$�!D^�B�[d��_u�C&n�Ԝ���p���{��#t�x�^z�s�}.�}�R�J��?����O>~@ƎO�[�Ζ]�޹+���+��<Ԑ�i�o�$f�2�ԾpՓUC��-蛓L	=s�������:��6=h�y�y�s�>���V�y�D�ɕ�:���yX#�j��ڝ��!7�zZ�^y���x:x�V2��!�W�o�U@�S�9Ң]��]_D�����C��XZ"1����۔{O��u.(�B:Xj$�ͮ��:x{z��=9o��c���J��A3�Җ��6Q.?�Cӄy�ţ��8U-�����^��n����r��I�$9{���^e����q���$w�C��JoS"��Lkҗ�Ԯ`�*�
�ă����eԘX	�X(�g�cj�|�K�~*����i�ts2�Q�_Μcn;B�$��!�fvHR��+}�D���J�>ҥ�^~�*��X,.~ǃ��X��n�]X������Cb<�3�{�Q��؍2%��
]���À�[9~�}Sx-��}����O�O��N]��o�c���_��iB2�eP�v.���w�j�<��i1ǘ
�g��]j�Gվ:s�����G�,|�!�S��A�%�C�
�ɗ��U��D��t�ȫ�A�\�A~�*����i��|�vO�f�7�p�J��|&f�?��c/�9B�G�k6�����}�:ڕ�S��~x�S�T���
�e�*��-�yc����"ˤ�՝��3~�6՝��y���^�^>�{gf�����O�*m�I��9>�|/��T���^*�.]�!�6��y�4o?ۜ�=$�f+r]z�kX���7����}��lG��T�z�����ZpPn����}I�V��N]/�_���woaŝ��б����D޽~�[+8z��ޡ������/��`
th*\���8��/}�Mw��Β�6Y>'u����jO��c�ɥ���=�9��_'���yx��μ�o�E���fe3t�L��k��s]���(&B�&�?��F2��OǪ�l�KV��|M�֛٬������
y
:��0c����L��.�hZ�7%���[A�*��s���r���w:����-#�M���4�����c�bi�r�O�l������_��
���ާ�]�r�uh��ǔyu�F�cj�]+d��-����t.%g�<��;�D��T�r�{���t�>~�V�z��v�۩�.x���/�d���x�<��۟���:Ð��w��<ԡμ��;s-󀨹�y�rIp`^��E����С)���fob�=�>:���7�v�t�3�>`�"y��W�ImkH�Wy�?=���]#��J@�"	���{�Z`ȼ���[���͖�܁���ܨ�С飧E���5���7�%f^��:�'�ޭ����O�0E~~k�tX!��1��!x��S2.�n�y@��4
C�#��2���Ֆy��@�j�;v�C�v]��z������ŗ�8��B���FK`�L��ҭS��?�%Y:�(1���}}�a4������Gߐ��*�g�����g7)��
��Xjo�k�q����p��A��k,_�gǖ�s����a3|z��60�+�4��Khn����ȑWy�\��O�!c��o����$$�T��i:�7��
��g�Ȅ-�g�2�?;~�������+�=��XX���o�J	j���B�]��o�%���˿�l�L��^Ҳ�ȩ�?��z�͟��|)�3w������J1;7��c�+rc߼�嘚5����2��|�^������~�>�٧�g���l
�/��*�O��]gI���ۀ
9��)y��z��>�읖WN}��Cy��w䶱wJ�?.�N}�ɿ�6U~��׍�0��[��7��g�"+��ƭhq�ͷ?祆��)(ءn@e�R�zλ�"����<<S~�b�Q�	�*����j�L��"��z��u��Zs�z�d=.���Wy����S��B�՞x������<���-��(�"�r��+ܶW^���<i��1�Q/�;�y�{�5^f��:�����<ʶߐ��9��&��+�x=��J��okWR5E~�;k%�T�O����J����v��Z�n����t�}���+w�{Y�vE�7�n�������ѵpՓ*��-/3���A�'�p�+�5��A�3l��2
Q7J����uUa�1�5���Ԯ��+���*�Y]�e^�יww�3�լK���F�譯��}��@�Ξ�(�|ҡ���O�M�.��xK��D�7[���
��/=G��d%�x&8�$���'���y�B���_��^"��z��c��>;��e�Ɍ�],�b���^�{i�vg�9W�]*�*ѮG�:2
���a^\���z�H͝^uP�KZ�>�ni:�8…t�$q��|�NJ��ߪE�s�љ����ip�t���?���g�C�9t���e�z9�[���pS��#�y	�7��V.��T��x�ϛ�:�xYB�������t}�K�!K�~z:�w����9�G�S�
�`/��ϷK�z���y`��y�f�d^4ﰜQ��7D4{����l�R�v�H���l�E��+���|�.:".\�E��o}&�Xz���R_"�3�.2�<�3����|�*՝ߢ���[-��9,s]o��/'@�`��;թ���.}ʍN��l�n*�&|�yX�E�5WZ�D�����υ����;Oȷ���b���t�e�>�6%{����Q�dq���[��bW�*��5O�,�|T2}���c��/$@��.^6�����nu�:Φofn�C��d�o%��y��|���Đx�:�̗�;ʋ:��O?��S�~)J��c7Щ�$�V��V
�Y�r����K+ՙ�:ٙ�z��Oy	B�p��5ټ����;��7�N=�N�#������X^�,�[;�ֺ3�`2w94�Z/��!/
@��z�<�s�z^���X�ߑy����B�Fg�Xu�z�}i�H��ݞf�g_|��
tp�����Xk���c�zc���ѭ.��-��.c�\-��Y3w;�9y��x�B��M����ӹ=u��|kj�7�ȍμR�Fg��ٝ�̳J�%���].��U����4�r���Rg^��Ѫen�̫����ܙ=󌢃�o�g�?���/1s�ܑz_K���sT�:�֢��Wa�1��9ٙg�3g�����>�3R�\����~w��L�K���|�
=���;H���6&���G��g�Ͼ8�K:4�_r^�շ�-1�����F��i�G{g�M�k���7nM���׸nؙe����,��BO��wz�=>����[C�yiދ�o�޾�ް�7kv�/�2w��4k͘���:xz�+:���]2<�n��}�q�:���Z^/���uOH�הy��}ݕ�}�a.�yN�C�B���s�%7�I�?`��>�DZexx���o
"�r��U�|�4�:Wz�\c<�	;�~Χ�'��~�n�����ص��z���&v�?���s"��ߴ�{�Zk�dOLw^����_]�e<=��ROT�a-�!��SA�\�Ww��W��4��[=B��7������赒����9�\�s��:x/��S���KR�Ȩ�{��r�j	�q��5r�͌�#}�l���z��y�y�n�2�9�G��;�d�����^�s'�wZ�K�ۥ��e��u�N��I�w����]��H��4h���H���gX�s=�������r\I}�]O�@�!4)�[�3l�4�a\�Ҳ3g�	�9|ӥ�ʵ�G&lU]�.IP�����h
th�l��E�t:�kJ�ح��7I�>���t7^�bR���m��0U��ů2�6!e����gU�Gߖ3��M
g�S�}�����E�|�d5�%v�o���2�\���I��S9�u�K�Q=p	�C����k�с�qI[%\	5�u����\���V�I��"	V{��S�W��Ε'g��+7�3W�P�M�{w�$�*�����M)�m�*�̺��h�5���[#�������+�3����$3�>ⲗ�d�F���ϸc�s�2����hr�]'r_
�Ք�>W�;��e�{���^�b[k6?+/��1n@��{\���K����d����>b���6�H��М>�^����	vO�Y���Q.QCW�x}թ�����e{庶�<�:�6����m�e7�uR��[��@Z�}���u����P���%v=�-X�
�L��u����		-�8���������_�ԥ�$�9���b�6p�1�2�Fw�$؛`�Mw�zS}�e���o�z�M�!i9{]�C����?*.^���6���Y���K_�����Fpnl���m���%x?=BVw�,s3B'�&-�/T�����\�2wU.����Z��i��_���B���T�N���uwf��;��Y�����c�r��{)�[U�#h�ץE�O�'���g��uW�p��o}Ƈ:����ZeKs��X/���K���L����3]|�E��o��f�skt�V4�1�.v�_9��'|8�����R��q�tY��j�=o��Ub����ԃ�>{����R�٭7�{���[^�n�+���UG�����[N7d��3v��YѥW�:�\�zMN�������&7]㧨�ܠ��y�4S��{��	�5��*�����Ix�j�W�%���W,{B��ٿ�
Bp�K�΂��cO��-�*
=&a���\��_
�mr$�C�w,�P-�F�̛`��&�y���	R�x`�<�Z��k���u�������y���v?xR.]�‡:�;x��?e��?��En=�8�>,�n�س\ZG�JP�|i�&[BT�R���ۺr?�V�B�X��������<�Ma7ۻ�����e|Z�^��]}J�@t���X���o�k�=��,�o.��趠�����q�r����'�%�)n�r�����ѿ����|��7��o��Eo��gOU!���J�!˪D��.O���KݹkI|���z������%���
�c���l܀f����a��@���r�1>P��������-��coJ�:!?I�厈�G:��/1��H��rk�	�Xh�;T�=�≣['���~�_	�Y�rc���jI}�LH�Obu@Qu���]A7�Z���r����B�$�W
�n�k��%��߮ϵ��}\�6<~��^"A�t�^*�jI>�C�*ɇ*���:�;~3��ƒ���
��|?uf\w�C&n2�gS�v]�N�7�N����ʩ���
tOE�������Y箻�4%v-���[�����ҾW�D�[(A���y�	�8���[����z�H��,WK��/����H�A+$B��τ��F��m�%�������'�B�&����R��ц���ʡ5�{׿��pI���ߨՆ�[D[J-��_�"�T�o�$���Λќ�ʃ��J`TEU���Q{�j?�u��rۄ
�_'�G��;ҶK��wb�嘙;��ݬ|�u9{�"@��ڱ�t�#)�x��Db-#T��ϐ��-2z�fձ����Һ[���=O:�]`ȼY���ױȨ�gIp��ڵ�0���е\�w����2K����:J֡�Ri���V��@%p}�l��-Ư)9{�}�䪡/;�k�>�ܷ�%��BhJ<���|)���bt�n-}�eO�r_��M=x��~�Q}G��6��I�EQbS�F�_�̖�sjU�������TU^]�"��B��Y+=G�%=t�X-w�n7:n��5V#ԟ_/�'�y؋�ڰ����|}���4I�����r�c�.y�#�c+y]z�^/է��5:\]iy����؍2<n�u5:q��NZv��ֽ�W��������_�{Ηv}��HuL����\]�N�ǐvZ���d�Tv�-fq
p����3��Ē���7��:�ψ���w]�����3�w_W�ct�i;�֞��\��zU
)�ҿ�@�ǜ�5*���i��B�iN�=�#zː����F��k��=B�ݕ7��˛��BG�՜��;#@��m�YtM��u��9v��|w�*-B�1o��<��;��,�Y�<�!7��W�|/���2g�c
6������/]{Ԙ��<��5���1J�G�������������@�
���C�'w�C2�`Bv���NO�{��_ϯ��:@cr��Eٶ�Q��
�1���u��)���}w}�J�^��ݻ.o?g���ߺ<�z��:�WrY�ҥ牯�tUyҔ5WT~١��7}���}��e�)�އg�KT՝w?m�/�Q3𘱪�K��l���^��7�������(}\k�c���'�-ge�]��
���<yݟK
t0�g_����q����2k�a����wo�߿p�2��:B�:B�:B�:B�:B�:BG�:
t@�: t@�: t@�: t@�: t@�: t@�: t@�:
t@�: t@�: t@�� t@���� t@����
t@���� t@���� t@���� t@����
t@���� t@���� t@����
t@�ИB���������Qe�NQEQ�w�G���A���KIEND�B`�PK5~�[���%bbb/tests/fixtures/create_meeting.xmlnu�[���<response>
    <returncode>SUCCESS</returncode>
    <meetingID>random-1665177</meetingID>
   
<internalMeetingID>1a6938c707cdf5d052958672d66c219c30690c47-1524212045514</internalMeetingID>
    <parentMeetingID>bbb-none</parentMeetingID>
    <attendeePW>tK6J5cJv3hMLNx5IBePa</attendeePW>
    <moderatorPW>34Heu0uiZYqCZXX9C4m2</moderatorPW>
    <createTime>1453283819419</createTime>
    <voiceBridge>76286</voiceBridge>
    <dialNumber>613-555-1234</dialNumber>
    <createDate>Wed Jan 20 04:56:59 EST 2016</createDate>
    <hasUserJoined>false</hasUserJoined>
    <duration>20</duration>
    <hasBeenForciblyEnded>false</hasBeenForciblyEnded>
    <messageKey>duplicateWarning</messageKey>
    <message>This conference was already in existence and may
currently be in progress.</message>
</response>
PK5~�[e�g�XX(bbb/tests/fixtures/delete_recordings.xmlnu�[���<response>
    <returncode>SUCCESS</returncode>
    <deleted>true</deleted>
</response>
PK5~�[��##"bbb/tests/fixtures/end_meeting.xmlnu�[���<response>
    <returncode>SUCCESS</returncode>
    <messageKey>sentEndMeetingRequest</messageKey>
    <message>A request to end the meeting was sent. Please wait a few
seconds, and then use the getMeetingInfo or isMeetingRunning API calls to
verify that it was ended.</message>
</response>
PK5~�[P��y��'bbb/tests/fixtures/get_meeting_info.xmlnu�[���<?xml
version="1.0" encoding="UTF-8"?>
<response>
    <returncode>SUCCESS</returncode>
    <meetingName>Mock meeting for testing getMeetingInfo API
method</meetingName>
   
<meetingID>117b12ae2656972d330b6bad58878541-28-15</meetingID>
   
<internalMeetingID>178757fcedd9449054536162cdfe861ddebc70ba-1453206317376</internalMeetingID>
    <createTime>1453206317376</createTime>
    <createDate>Tue Jan 19 07:25:17 EST 2016</createDate>
    <voiceBridge>70100</voiceBridge>
    <dialNumber>613-555-1234</dialNumber>
    <attendeePW>dbfc7207321527bbb870c82028</attendeePW>
    <moderatorPW>4bfbbeeb4a65cacaefe3676633</moderatorPW>
    <running>true</running>
    <duration>20</duration>
    <hasUserJoined>true</hasUserJoined>
    <recording>true</recording>
    <hasBeenForciblyEnded>false</hasBeenForciblyEnded>
    <startTime>1453206317380</startTime>
    <endTime>1453206325002</endTime>
    <participantCount>2</participantCount>
    <listenerCount>1</listenerCount>
    <voiceParticipantCount>2</voiceParticipantCount>
    <videoCount>1</videoCount>
    <maxUsers>20</maxUsers>
    <moderatorCount>2</moderatorCount>
    <attendees>
        <attendee>
            <userID>amslzbgzzddp</userID>
            <fullName>Ernie Abernathy</fullName>
            <role>MODERATOR</role>
            <isPresenter>true</isPresenter>
            <isListeningOnly>false</isListeningOnly>
            <hasJoinedVoice>true</hasJoinedVoice>
            <hasVideo>true</hasVideo>
            <clientType>HTML5</clientType>
            <customdata></customdata>
        </attendee>
        <attendee>
            <userID>xi7y7gpmyq1g</userID>
            <fullName>Barrett Kutch</fullName>
            <role>MODERATOR</role>
            <isPresenter>false</isPresenter>
            <isListeningOnly>false</isListeningOnly>
            <hasJoinedVoice>true</hasJoinedVoice>
            <hasVideo>false</hasVideo>
            <clientType>FLASH</clientType>
            <customdata>
                <skipCheck>true</skipCheck>
                <backgroundColor>#FF0033</backgroundColor>
               
<customStyle>a:focus{color:#0181eb}</customStyle>
            </customdata>
        </attendee>
        <attendee>
            <userID>srfd2uad4x9s</userID>
            <fullName>Peter Parker</fullName>
            <role>VIEWER</role>
            <isPresenter>false</isPresenter>
            <isListeningOnly>false</isListeningOnly>
            <hasJoinedVoice>true</hasJoinedVoice>
            <hasVideo>true</hasVideo>
            <clientType>HTML5</clientType>
            <customdata></customdata>
        </attendee>
        <attendee>
            <userID>6ntb564ibhnq</userID>
            <fullName>Bruce Wayne</fullName>
            <role>VIEWER</role>
            <isPresenter>false</isPresenter>
            <isListeningOnly>true</isListeningOnly>
            <hasJoinedVoice>false</hasJoinedVoice>
            <hasVideo>false</hasVideo>
            <clientType>HTML5</clientType>
            <customdata></customdata>
        </attendee>
    </attendees>
    <isBreakout>true</isBreakout>
   
<parentMeetingID>b97b512f2c92c0ffe7a3476152525807daa1c676-1524213151782</parentMeetingID>
    <sequence>1</sequence>
    <metadata>
        <bbb-context>Best BBB Developers Club</bbb-context>
        <bn-origin>Moodle</bn-origin>
        <bn-recording-ready-url>
           
http://bigbluebutton.org/moodle/mod/bigbluebuttonbn/bbb_broker.php?action=recording_ready
        </bn-recording-ready-url>
        <bbb-origin-tag>moodle-mod_bigbluebuttonbn
(2015080609)</bbb-origin-tag>
        <bbb-origin-version>3.0.2 (Build:
20160111)</bbb-origin-version>
       
<bbb-origin-server-common-name></bbb-origin-server-common-name>
       
<bbb-origin-server-name>bigbluebutton.org</bbb-origin-server-name>
        <bbb-recording-description></bbb-recording-description>
        <bbb-recording-name>Bigbluebutton "Mock meeting for
testing getMeetingInfo"</bbb-recording-name>
        <bbb-recording-tags></bbb-recording-tags>
    </metadata>
    <messageKey></messageKey>
    <message></message>
</response>PK5~�[�W)#bbb/tests/fixtures/get_meetings.xmlnu�[���<response>
    <returncode>SUCCESS</returncode>
    <meetings>
        <meeting>
            <meetingName>Prof. Josie Reichert IV</meetingName>
           
<meetingID>5cf490a7-2c9a-3571-a48c-134ef58d47c2</meetingID>
           
<internalMeetingID>bf32e77309232abb44627ddbb5edd47e0e13e7b8-1554729625768</internalMeetingID>
            <createTime>1554729625768</createTime>
            <createDate>Mon Apr 08 15:20:25 CEST
2019</createDate>
            <voiceBridge>25304</voiceBridge>
            <dialNumber>(985) 807-9923</dialNumber>
            <attendeePW>=g.TrpDM=xB.oOW5h|m</attendeePW>
            <moderatorPW>$is=CM}xF;108o!Jqd</moderatorPW>
            <running>false</running>
            <duration>1913</duration>
            <hasUserJoined>false</hasUserJoined>
            <recording>true</recording>
            <hasBeenForciblyEnded>false</hasBeenForciblyEnded>
            <startTime>1554729625807</startTime>
            <endTime>0</endTime>
            <participantCount>0</participantCount>
            <listenerCount>0</listenerCount>
            <voiceParticipantCount>0</voiceParticipantCount>
            <videoCount>0</videoCount>
            <maxUsers>14</maxUsers>
            <moderatorCount>0</moderatorCount>
            <attendees>
            </attendees>
            <metadata>
                <presenter>Alessandra Funk</presenter>
               
<endcallbackurl>http://www.schiller.info/ut-perspiciatis-et-vero-dolorum-repellendus-nesciunt-commodi-voluptate</endcallbackurl>
            </metadata>
            <isBreakout>false</isBreakout>
        </meeting>
        <meeting>
            <meetingName>Barbara Schiller</meetingName>
           
<meetingID>b2e7555d-b7c6-3b9f-b3ae-4c5754f64427</meetingID>
           
<internalMeetingID>8299be7b3bc6693c3b747fe5178a5f7b6e417ac7-1554729632085</internalMeetingID>
            <createTime>1554729632085</createTime>
            <createDate>Mon Apr 08 15:20:32 CEST
2019</createDate>
            <voiceBridge>81776</voiceBridge>
            <dialNumber>1-971-223-6118 x5746</dialNumber>
            <attendeePW>SlD;CE</attendeePW>
            <moderatorPW>03_bF+p+Fjm|M3</moderatorPW>
            <running>false</running>
            <duration>2873</duration>
            <hasUserJoined>false</hasUserJoined>
            <recording>false</recording>
            <hasBeenForciblyEnded>false</hasBeenForciblyEnded>
            <startTime>1554729632096</startTime>
            <endTime>0</endTime>
            <participantCount>0</participantCount>
            <listenerCount>0</listenerCount>
            <voiceParticipantCount>0</voiceParticipantCount>
            <videoCount>0</videoCount>
            <maxUsers>25</maxUsers>
            <moderatorCount>0</moderatorCount>
            <attendees>
            </attendees>
            <metadata>
                <presenter>Prof. Maud Corkery II</presenter>
               
<endcallbackurl>http://www.hegmann.biz/explicabo-praesentium-labore-dolor</endcallbackurl>
            </metadata>
            <isBreakout>false</isBreakout>
        </meeting>
        <meeting>
            <meetingName>Marty Lueilwitz</meetingName>
           
<meetingID>56e1ae16-3dfc-390d-b0d8-5aa844a25874</meetingID>
           
<internalMeetingID>b97b512f2c92c0ffe7a3476152525807daa1c676-1524213158682</internalMeetingID>
            <createTime>1453210075799</createTime>
            <createDate>Tue Jan 19 08:27:55 EST
2016</createDate>
            <voiceBridge>49518</voiceBridge>
            <dialNumber>580.124.3937x93615</dialNumber>
            <attendeePW>f~kxYJeAV~G?Jb+E:ggn</attendeePW>
           
<moderatorPW>n:"zWc##Bi.y,d^s,mMF</moderatorPW>
            <running>true</running>
            <duration>2206</duration>
            <hasUserJoined>true</hasUserJoined>
            <recording>false</recording>
            <hasBeenForciblyEnded>false</hasBeenForciblyEnded>
            <startTime>1524213049434</startTime>
            <endTime>0</endTime>
            <participantCount>5</participantCount>
            <listenerCount>2</listenerCount>
            <voiceParticipantCount>1</voiceParticipantCount>
            <videoCount>3</videoCount>
            <maxUsers>14</maxUsers>
            <moderatorCount>1</moderatorCount>
            <attendees>
            </attendees>
            <metadata>
                <presenter>Consuelo Gleichner IV</presenter>
               
<endcallbackurl>http://www.muller.biz/autem-dolor-aut-nam-doloribus-molestiae</endcallbackurl>
            </metadata>
            <isBreakout>false</isBreakout>
        </meeting>
    </meetings>
</response>PK5~�[�z�,�,%bbb/tests/fixtures/get_recordings.xmlnu�[���<response>
    <returncode>SUCCESS</returncode>
    <recordings>
        <recording>
           
<recordID>f71d810b6e90a4a34ae02b8c7143e8733178578e-1462807897120</recordID>
           
<meetingID>9d287cf50490ca856ca5273bd303a7e321df6051-4-119[0]</meetingID>
            <name><![CDATA[SAT- Writing-Humanities (All
participants)]]></name>
            <published>true</published>
            <state>published</state>
            <startTime>1462807897120</startTime>
            <endTime>1462812873004</endTime>
            <metadata>
                <bbb-context><![CDATA[SAT Score Booster
Program-Main]]></bbb-context>
                <bbb-origin-version><![CDATA[2.7.7+ (Build:
20150319)]]></bbb-origin-version>
                <bn-origin><![CDATA[Moodle]]></bn-origin>
               
<bbb-origin-tag><![CDATA[moodle-mod_bigbluebuttonbn
(2015080611)]]></bbb-origin-tag>
               
<bbb-origin-server-common-name><![CDATA[]]></bbb-origin-server-common-name>
               
<bbb-origin-server-name><![CDATA[planetinteractive.us]]></bbb-origin-server-name>
               
<bbb-recording-description><![CDATA[]]></bbb-recording-description>
                <bbb-recording-name><![CDATA[SAT-
Writing-Humanities (All participants)]]></bbb-recording-name>
               
<bbb-recording-tags><![CDATA[]]></bbb-recording-tags>
            </metadata>
            <playback>
                <format>
                    <type>podcast</type>
                   
<url>https://test-install.blindsidenetworks.com/podcast/f71d810b6e90a4a34ae02b8c7143e8733178578e-1462807897120/audio.ogg</url>
                    <processingTime>111</processingTime>
                    <length>632</length>
                    <size>10500</size>
                </format>
                <format>
                    <type>presentation</type>
                   
<url>http://test-install.blindsidenetworks.com/playback/presentation/0.9.0/playback.html?meetingId=f71d810b6e90a4a34ae02b8c7143e8733178578e-1462807897120</url>
                    <processingTime>2973</processingTime>
                    <length>532</length>
                    <size>168019</size>
                    <preview>
                        <images>
                            <image alt="Welcome"
height="136"
width="176">https://test-install.blindsidenetworks.com/presentation/f71d810b6e90a4a34ae02b8c7143e8733178578e-1462807897120/presentation/d2d9a672040fbde2a47a10bf6c37b6a4b5ae187f-1632646357291/thumbnails/thumb-1.png</image>
                            <image alt="Course"
height="136"
width="176">https://test-install.blindsidenetworks.com/presentation/f71d810b6e90a4a34ae02b8c7143e8733178578e-1462807897120/presentation/d2d9a672040fbde2a47a10bf6c37b6a4b5ae187f-1632646357291/thumbnails/thumb-2.png</image>
                        </images>
                    </preview>
                </format>
            </playback>
        </recording>
        <recording>
           
<recordID>f71d810b6e90a4a34ae02b8c7143e8733178578e-1463153001071</recordID>
           
<meetingID>9d287cf50490ca856ca5273bd303a7e321df6051-4-119[0]</meetingID>
            <name><![CDATA[SAT- Quadratic Equations (All
participants)]]></name>
            <published>true</published>
            <state>published</state>
            <startTime>1463153001071</startTime>
            <endTime>1463163335375</endTime>
            <metadata>
                <bbb-context><![CDATA[SAT Score Booster
Program-Main]]></bbb-context>
               
<bbb-origin-tag><![CDATA[moodle-mod_bigbluebuttonbn
(2015080611)]]></bbb-origin-tag>
                <bbb-origin-version><![CDATA[2.7.7+ (Build:
20150319)]]></bbb-origin-version>
                <bn-origin><![CDATA[Moodle]]></bn-origin>
               
<bbb-origin-server-common-name><![CDATA[]]></bbb-origin-server-common-name>
               
<bbb-origin-server-name><![CDATA[planetinteractive.us]]></bbb-origin-server-name>
                <bbb-recording-name><![CDATA[SAT- Quadratic
Equations (All participants)]]></bbb-recording-name>
               
<bbb-recording-description><![CDATA[]]></bbb-recording-description>
               
<bbb-recording-tags><![CDATA[]]></bbb-recording-tags>
            </metadata>
            <playback>
                <format>
                    <type>presentation</type>
                   
<url>https://test-install.blindsidenetworks.com/playback/presentation/0.9.0/playback.html?meetingId=f71d810b6e90a4a34ae02b8c7143e8733178578e-1463153001071</url>
                    <length>126</length>
                </format>
            </playback>
        </recording>
        <recording>
           
<recordID>f71d810b6e90a4a34ae02b8c7143e8733178578e-1463067444315</recordID>
           
<meetingID>9d287cf50490ca856ca5273bd303a7e321df6051-4-119[0]</meetingID>
            <name><![CDATA[SAT- Polynomials and Inequalities (All
participants)]]></name>
            <published>true</published>
            <state>published</state>
            <startTime>1463067444315</startTime>
            <endTime>1463073048933</endTime>
            <metadata>
                <bbb-context><![CDATA[SAT Score Booster
Program-Main]]></bbb-context>
                <bn-origin><![CDATA[Moodle]]></bn-origin>
               
<bbb-origin-tag><![CDATA[moodle-mod_bigbluebuttonbn
(2015080611)]]></bbb-origin-tag>
                <bbb-origin-version><![CDATA[2.7.7+ (Build:
20150319)]]></bbb-origin-version>
               
<bbb-origin-server-common-name><![CDATA[]]></bbb-origin-server-common-name>
               
<bbb-origin-server-name><![CDATA[planetinteractive.us]]></bbb-origin-server-name>
               
<bbb-recording-description><![CDATA[]]></bbb-recording-description>
                <bbb-recording-name>
                    <![CDATA[SAT- Polynomials and Inequalities (All
participants)]]></bbb-recording-name>
               
<bbb-recording-tags><![CDATA[]]></bbb-recording-tags>
            </metadata>
            <playback>
                <format>
                    <type>presentation</type>
                   
<url>http://test-install.blindsidenetworks.com/playback/presentation/0.9.0/playback.html?meetingId=f71d810b6e90a4a34ae02b8c7143e8733178578e-1463067444315</url>
                    <length>63</length>
                </format>
            </playback>
        </recording>
        <recording>
           
<recordID>f71d810b6e90a4a34ae02b8c7143e8733178578e-1463413631320</recordID>
           
<meetingID>9d287cf50490ca856ca5273bd303a7e321df6051-4-119[0]</meetingID>
            <name><![CDATA[SAT- Quadratic Equations (All
participants)]]></name>
            <published>true</published>
            <state>published</state>
            <startTime>1463413631320</startTime>
            <endTime>1463419560951</endTime>
            <metadata>
                <bbb-context><![CDATA[SAT Score Booster
Program-Main]]></bbb-context>
                <bbb-origin-version><![CDATA[2.7.7+ (Build:
20150319)]]></bbb-origin-version>
               
<bbb-origin-tag><![CDATA[moodle-mod_bigbluebuttonbn
(2015080611)]]></bbb-origin-tag>
                <bn-origin><![CDATA[Moodle]]></bn-origin>
               
<bbb-origin-server-common-name><![CDATA[]]></bbb-origin-server-common-name>
               
<bbb-origin-server-name><![CDATA[planetinteractive.us]]></bbb-origin-server-name>
                <bbb-recording-name><![CDATA[SAT- Quadratic
Equations (All participants)]]></bbb-recording-name>
               
<bbb-recording-description><![CDATA[]]></bbb-recording-description>
               
<bbb-recording-tags><![CDATA[]]></bbb-recording-tags>
            </metadata>
            <playback>
                <format>
                    <type>presentation</type>
                   
<url>http://test-install.blindsidenetworks.com/playback/presentation/0.9.0/playback.html?meetingId=f71d810b6e90a4a34ae02b8c7143e8733178578e-1463413631320</url>
                    <length>50</length>
                </format>
            </playback>
        </recording>
        <recording>
           
<recordID>f71d810b6e90a4a34ae02b8c7143e8733178578e-1462980100026</recordID>
           
<meetingID>9d287cf50490ca856ca5273bd303a7e321df6051-4-119[0]</meetingID>
            <name><![CDATA[SAT- Writing Section- Social Science
and History (All participants)]]></name>
            <published>true</published>
            <state>published</state>
            <startTime>1462980100026</startTime>
            <endTime>1462986640649</endTime>
            <metadata>
                <bbb-context><![CDATA[SAT Score Booster
Program-Main]]></bbb-context>
                <bbb-origin-version><![CDATA[2.7.7+ (Build:
20150319)]]></bbb-origin-version>
               
<bbb-origin-tag><![CDATA[moodle-mod_bigbluebuttonbn
(2015080611)]]></bbb-origin-tag>
                <bn-origin><![CDATA[Moodle]]></bn-origin>
               
<bbb-origin-server-common-name><![CDATA[]]></bbb-origin-server-common-name>
               
<bbb-origin-server-name><![CDATA[planetinteractive.us]]></bbb-origin-server-name>
               
<bbb-recording-description><![CDATA[]]></bbb-recording-description>
                <bbb-recording-name>
                    <![CDATA[SAT- Writing Section- Social Science and
History (All participants)]]></bbb-recording-name>
               
<bbb-recording-tags><![CDATA[]]></bbb-recording-tags>
            </metadata>
            <playback>
                <format>
                    <type>presentation</type>
                   
<url>http://test-install.blindsidenetworks.com/playback/presentation/0.9.0/playback.html?meetingId=f71d810b6e90a4a34ae02b8c7143e8733178578e-1462980100026</url>
                    <length>86</length>
                </format>
            </playback>
        </recording>
        <recording>
           
<recordID>f71d810b6e90a4a34ae02b8c7143e8733178578e-1462894360422</recordID>
           
<meetingID>9d287cf50490ca856ca5273bd303a7e321df6051-4-119[0]</meetingID>
            <name><![CDATA[SAT- Linear Equations (All
participants)]]></name>
            <published>true</published>
            <state>published</state>
            <startTime>1462894360422</startTime>
            <endTime>1462899112563</endTime>
            <metadata>
                <bbb-context><![CDATA[SAT Score Booster
Program-Main]]></bbb-context>
               
<bbb-origin-tag><![CDATA[moodle-mod_bigbluebuttonbn
(2015080611)]]></bbb-origin-tag>
                <bn-origin><![CDATA[Moodle]]></bn-origin>
                <bbb-origin-version><![CDATA[2.7.7+ (Build:
20150319)]]></bbb-origin-version>
               
<bbb-origin-server-common-name><![CDATA[]]></bbb-origin-server-common-name>
               
<bbb-origin-server-name><![CDATA[planetinteractive.us]]></bbb-origin-server-name>
                <bbb-recording-name><![CDATA[SAT- Linear Equations
(All participants)]]></bbb-recording-name>
               
<bbb-recording-description><![CDATA[]]></bbb-recording-description>
               
<bbb-recording-tags><![CDATA[]]></bbb-recording-tags>
            </metadata>
            <playback>
                <format>
                    <type>presentation</type>
                   
<url>http://test-install.blindsidenetworks.com/playback/presentation/0.9.0/playback.html?meetingId=f71d810b6e90a4a34ae02b8c7143e8733178578e-1462894360422</url>
                    <length>46</length>
                </format>
            </playback>
        </recording>
    </recordings>
</response>PK5~�[��D��#bbb/tests/fixtures/hooks_create.xmlnu�[���<response>
    <returncode>SUCCESS</returncode>
    <hookID>1</hookID>
    <permanentHook>false</permanentHook>
    <rawData>false</rawData>
</response>PK5~�[#_-u��)bbb/tests/fixtures/hooks_create_error.xmlnu�[���<response>
    <returncode>FAILED</returncode>
    <messageKey>createHookError</messageKey>
    <message>An error happened while creating your hook. Check the
logs.</message>
</response>PK5~�[�]����,bbb/tests/fixtures/hooks_create_existing.xmlnu�[���<response>
    <returncode>SUCCESS</returncode>
    <hookID>1</hookID>
    <messageKey>duplicateWarning</messageKey>
    <message>There is already a hook for this callback
URL.</message>
</response>PK5~�[�дѮ�.bbb/tests/fixtures/hooks_create_no_hook_id.xmlnu�[���<response>
    <returncode>FAILED</returncode>
    <messageKey>missingParamHookID</messageKey>
    <message>You must specify a hookID in the
parameters.</message>
</response>PK5~�[�9	FWW$bbb/tests/fixtures/hooks_destroy.xmlnu�[���<response>
    <returncode>SUCCESS</returncode>
    <removed>true</removed>
</response>PK5~�[R�m;��*bbb/tests/fixtures/hooks_destroy_error.xmlnu�[���<response>
    <returncode>FAILED</returncode>
    <messageKey>destroyHookError</messageKey>
    <message>An error happened while removing your hook. Check the
logs.</message>
</response>PK5~�[I�Rɢ�.bbb/tests/fixtures/hooks_destroy_not_found.xmlnu�[���<response>
    <returncode>FAILED</returncode>
    <messageKey>destroyMissingHook</messageKey>
    <message>The hook informed was not found.</message>
</response>PK5~�[���qq!bbb/tests/fixtures/hooks_list.xmlnu�[���<response>
    <returncode>SUCCESS</returncode>
    <hooks>
        <hook>
            <hookID>1</hookID>
           
<callbackURL><![CDATA[http://postcatcher.in/catchers/abcdefghijk]]></callbackURL>
            <meetingID><![CDATA[my-meeting]]></meetingID>
            <permanentHook>false</permanentHook>
            <rawData>false</rawData>
        </hook>
        <hook>
            <hookID>2</hookID>
           
<callbackURL><![CDATA[http://postcatcher.in/catchers/1234567890]]></callbackURL>
            <permanentHook>false</permanentHook>
            <rawData>false</rawData>
        </hook>
    </hooks>
</response>PK5~�[�#o,,bbb/tests/fixtures/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK5~�[���XX)bbb/tests/fixtures/is_meeting_running.xmlnu�[���<response>
    <returncode>SUCCESS</returncode>
    <running>true</running>
</response>
PK5~�[7�J#bbb/tests/fixtures/join_meeting.xmlnu�[���<response>
    <returncode>SUCCESS</returncode>
    <messageKey>successfullyJoined</messageKey>
    <message>You have joined successfully.</message>
   
<meeting_id>fa51ae0c65adef7fe3cf115421da8a6a25855a20-1464618262714</meeting_id>
    <user_id>ao6ehbtvbmhz</user_id>
    <auth_token>huzbpgthac7s</auth_token>
    <session_token>rbe7bbkjzx5mnoda</session_token>
    <guestStatus>ALLOW</guestStatus>
   
<url>https://bigblubutton-server.sample/client/BigBlueButton.html?sessionToken=0wzsph6uaelwc68z</url>
</response>
PK5~�[�ĥ�e�e�6bbb/tests/fixtures/presentation_with_embedded_file.xmlnu�[���<?xml
version="1.0" encoding="UTF-8"?>
<modules>
    <module name="presentation">
        <document
name="bbb_logo.png">iVBORw0KGgoAAAANSUhEUgAAAfQAAAH0CAYAAADL1t+KAACOHElEQVR42uy9B3RUZ7bveWfNmlkzc2fuu+/Om3tf39vd7uR2tjG2iTaYjMk5CpRzzjknJCEhgkAgIQkFFAAhBCLnnAw2YGxwwtgGbMBux3bsPXt/55yqU1Wnqk5VSaiA/V/re3KHd9sGqX7s/f2+vf8JAK7j+RsfPnz48OHD57491/8J/5+fgcPhcDgczv2cn/9JJjuHw+FwOJz7N39joHM4HA6Hw0DncDgcDofDQOdwOBwOh8NA53A4HA6Hw0DncDgcDoeBzuFwOBwOh4HO4XA4HA6Hgc7hcDgcDoeBzuFwOBwOA53D4XA4HA4DncPhcDgcDgOdw+FwOBwOA53D4XA4HAY6h8PhcDgcBjqHw+FwOBwGOofD4XA4HAY6h8PhcDgMdA6Hw+FwOAx0DofD4XA4DHQOh8PhcDgMdA6Hw+FwGOgcDofD4XAY6BwOh8PhcBjoHA6Hw+FwGOgcDofD4TDQORwOh8PhMNA5HA6Hw+Ew0DkcDofD4TDQORwOh8NhoHM4HA6Hw2GgczgcDofDYaBzOBwOh8NhoHM4HA6Hw0DncDgcDofDQOdwOBwOh8NA53A4HA6Hw0DncDgcDoeBzuFwOBwOh4HO4XA4HA6Hgc7hcDgcDoeBzuFwOBwOA52BzuFwOBwOA53D4XA4HA4DncPhcDgcDgOdw+FwOBwOA53D4XA4HAY6h8PhcDgcBjqHw+FwOBwGOofD4XA4HAY6h8PhcDgMdA6Hw+FwOAx0DofD4XA4DHQOh8PhcDgMdA6Hw+FwGOgcDofD4XAY6BwOh8PhcBjoHA6Hw+FwGOgcDofD4TDQORwOh8PhMNA5HA6Hw+Ew0DkcDofD4TDQORwOh8NhoHM4HA6Hw2GgczgcDofDYaBzOBwOh8NhoHM4HA6Hw0DncDgcDofDQOdwOBwOh8NA53A4HA6Hw0DncDgcDoeBzuFwOBwOh4HO4XA4HA6Hgc7hcDgcDoeBzuFwOBwOA53D4XA4HA4DncPhcDgcDgOdw+FwOBwOA53D4XA4HAY6h8PhcDgcBjqHw+FwOBwGOofD4XA4HAY6h8PhcDgMdA6Hw+FwOAx0DofD4XA4DHQOh8PhcDgMdA6Hw+FwGOgMdA6Hw+FwGOgcDofD4XAY6BwOh8PhcBjoHA6Hw+FwGOgcDofD4TDQORwOh8PhMNA5HA6Hw+Ew0DkcDofD4TDQORwOh8NhoHM4HA6Hw2GgczgcDofDYaBzOBwOh8NhoHM4HA6Hw0DncDgcDofDQOdwOBwOh8NA53A4HA6Hw0DncDgcDoeBzuFweiOf3PgbfPzplxZnSeUhSM7r6rHT3nVB83+XDofDYaBzOBwbOX/xUzh+5prh7D18FXwjW8ArvNniLAhp6vGj9b9LZ3X9CZO/Tzq//PoP/g3kcBjoHM7Dkx9//Fmcu198B8vWHDY59wLSPXVS87cb/jlaO84b/jnpcDgcBjqH80DkwuUb4qyqOwYhCRvF8Y9pu68Bbu8o/5x0dux7W/zzX3rnJn8zcDgMdA7n/sm33/0Idc2nxckr2/NAg9vRs3rdcfHrsm33W/yNwuEw0Dkc98r1T76E96/dgZzFuyA2YwuEJ7czvHUc+rWiU4uAp18/OhwOh4HO4dzTHD/9oTDBN2x5g+Hcjads1UHx60p/SOJwOAx0Dqfb88WX38Fnt7+B5dVHILNoJ8O3h08AOgb067xlxyXx6/7TT7/wNyGHw0DncJzP33/4WTwfC3jAJTZ3P1nFO8Xvw+Wrt/ibksNhoHM4+vL1Nz/A6fPXoXj5fojP6mSgutmh35cbt74Sv08cDoeBzuFYhKq/NfUnwDeq1W1hNj+o8Z4dj+BGt/11oAE39PtET+Ju3/2Wv3k5HAY652HPL7/8KgSslTVH3QZWC0PXw5yAepjqWQPTvWtNjgIzz7D1lid0vfa/r/xnNs5C1deF8v8d+t+a5bdOPvXizPRdB/MQ9gtD3evNO/3+7TrwDk+s4zDQ+deB87Dl5mdfw9Zdb4knZjRe9V5DyCO4SVTAdAiOM33qYPKCapi6cC1MmLcGvMKaISl3Oz7r6hQnJn0LROOpa3kd2rZcgvXtb0LTpjegcSOeDeehoe0c1Leeg3UtdF6Hdc2vQ936s1DbdAZqmk5DTeNpWNtwCqrxVNWfhKp1J2BN3QlYXXtcnMqaY1C59iisqj4KK/HQXy+pOABhiRshDIEpviZugkj89SLwT/Oug5kI+hkI+DkBDdI/kxvAPTqtA15/82PxBzUOh4HO4TzAIcmtccPr93xSm6i6/etFlT3DpxbmYgU+L6gB5gU2wHSvGkgp2AEra09BaeURKFx6ANa1nYdDJz+G3Qc/wMrzfdi5/31sL78HW3dfgc6d78CWnW+jAf42dGy/DJu7LkP7trdg07ZLsLHzojgbtlyAts103oRWBH8LnuaN52D9hnPQ1PY6NLW+Do2tZ6Gh+Yw49etPQ13TKahtPAk1DSdgbf1xqFl3HGrxr+lr9bpjUFV3FOrw3y9ashsSs7ZAau5WyCzogoikTTAb/9nm4x9O6MzFf6a5CHkCPbXuF/aSRLdz/zv8Dc9hoHM4D1puff41gu5NiMIK7l5BhdrWBO5JHlWi6vaOaIEYrLaD4zdCVeNZ2LzjCrR0XIKGjW/CDgT20TOfwoHj1+HgiY9h18H3YfN2BPaOd8RXOu3bLiO034KNWy/Bhk48Wy5CW8cFaMXTghU7nWYE9/qN5xHc5xHc56AR4d2A8G5oOYtV+xlYt/4Mgvs0gvuUODUNJxHeJxDYxxHYx2FN7TFYUyNV6JVrj2DFfgRWVh2GlWsOQcXqg7B81QGorDoEVTVHYM3aw+Isq9gH+SU7oHDxDvE1JK5NdD2CYlvFr8FMatf7NwjY3+tWfWLOVjiDguPf//4T/xBwGOgczv0cGsNKrXXviOYersClFrpy50wtdAJ5QMwGKFt9DLJK9kJT+0U4cuYG7D3yEew7dh3249l7FP8aD1XfW6j63nUFttBBkHdsR5jvkEDe3iXBfAPCvI1g3nERWhHoLViFt2IV3tz+hgxzqsAR5huMMK9HmNevJ5gTyLH93iDBfK2oxE/I7XcEOrbdVyPMVxPMqxDk1YdhFcK8gmBeeRBWVB6AZSvp7IeldBDkS5bvgfIVe2H5yn2wdAX+9fLdULZ0Nyxeskv8dVbBVghP3ABxqZvAG+/+Cex0B6+ce9WmTy3Yjt2OK/wDwWGgczj3W2ibWdPG1/HeuaPH78Lp3nsiVuAEcf/oNuwCbIGmzRehru0NaMcq/PSbn8Pxc7cExLuodX7gA+hCgHftfQ+27XkXtu65Cp27rwqYd2A7XVTlBPIuI8g3bn3LtCqXQd5iALlUlTe2mYFcqyqvV6ryE6Iqr5KrcoJ5ZTVV5XJFLlflBHKqzBWQl6/YJyC+ZPleKFu2B0oJ4OW7xCkp2wnFZTugePF2rNi3Q0npdigr3wFlS3ZAdn4nJGe1Q2rWZvCPakFPYL2A+mxszdOv48J71Io/cfYaV+wcBjqH4+758m/fi6dMiqXdEwCnNjrdh09BkE/3roGMot2QjmfxqqMI7Y9hD1bgR87chKNnb8IBbJ9vlyG+A+/C6a8J5tsI5nsR5rslmIuqXIG50mLvMrbYNyLM2wTMLwqYt2w2bbE3ibtxhHmrscWuhjndj1Nlbmyx4zG02I9JVTm12Km9rlTlAuZSm33ZKqkil6ryvaIyV2BeSiBfQgdhXroDivAsIqCXdEFhcRcUFG2DvEWdUFi0FRaVbIUC/Ouc/A5xIhPaIDimRcB8dgDdwcvCYA+DPSF7Kxw6/h7/wHAY6ByOO2Zd6xmISNncY/fhVIFPw6dkntg6DorfBNXr0SzfeAHBfQtOX7wjAL4bYb778Eew8+CHsOPgBwLkBHFx9r0vVeV7jVW5BPIrBpCbVuUSyEVVvsUI8mZVVd60QW6vt2pX5aIyNwO54a68VgXyanOQH7AAuVSVq0Aut9bNQb4IQV5QvE2APB8hnlfYCbl4cgq2CIhn520WJyu3HXLy2iG/YDMkpmFbPrkVK/dmwx+c5gRKgO/Jyj1n8W44cPRd+JFHy3IY6BxO74cGwtCu8e6vxhsFWGagmT521iq8A26B4hWHEdTXYOeha3Di/Odw4txnoiLfhf+aDoFcOVJV/oFpVW7WYreoyrdZabE7Kr6tty++iRa7hvhmqMqxvU6nXAPm5i32Imytm1fl+YsQ5nhyCxDoBph3IMg3Q2ZOO2Rkb4L0rE2QlrURMvGvs7I3Qkp6GySntUJ4XDP4RUh/kJoT2CTA3tOb32hmPIfDQOdweiE0EKYKYdUTcttUz7XiSdks3zrILt0Hq9FK79z9Hrx+6Qs4cPJT2H/8E1GN7zosg/yQKcQtQK5qr9sGuYbBbq293qbdXrcEuaoqV7fXbYDcalVeLlXkoiovk6ryIi2Qy1W5NZDTScuksxFSMzbIIFdOKySntkBqOr4KSGyG0Jj14B+5XkBdOT0B9aD4DaLLw9U6h4HO4dzDXHz7ppgQ1t1vxemdOME8NKkd6lrxOdmBD+HgqRtw/vKXcPj0TQFvpa1OxwTmSotddVfepVmVX7EvvsktdlPx7Q394luDffFtlVaLHS12veKbusVeqLTYRVUugTxX1WI3wrxdVOXpWJWnZm6QYb7BAPJEBHliSgvEJ7dAXFIzfl0PSclNEJfYBOExjeAT3gTeYdSKXy+6Jz0B9ojkdrHljcNhoHM4PRi67ywo39utH+B0N06VOElukalboKb1DbTSP4djr38GR/B+XKnGdx81Bbm6xW6szBHk+9+TKnMCOVbmBpDvMjXYN28nmMsgp/tyVVXe2vGmdF+u0V5vbEGQi6Ew0nM0pb1uFN8I5CcR5PhVBrmAOYF87WFDVb5ytfQcbXml3F5fJYF8aYWxKi+TQS4q87JdUIy2erHcXi9SQE6HQF7UKbXXC7eg0Y7Sm6oqp0Mgz8C2OlXmBPLUDLkiTyeQt0ISwjwhBSFOIE9cD7EJePBrdHwjxNCJa4Do2HqIiqmHoIgG8AqVwR7SMwJkzfpT8O4Ht/mHjsNA53C6M3e//E68J+9OyW22/zqYNL9KDHxZtvYkdGBLfc/Rj+HcW1/CXrLVj9K5jnfk1yWga7XYnRDftAx2c/HNtMVuTXw7bVV8q9Ylvh10SXwztNitiG8EcxLflBY7VeXGFrtUlScJkLciyBHmyRLM4wTMmyCGDoI8Oq4RomIbIBJBHoEnPGodREbXQVhkHQSErwPP0EYB9fkh3T9rwCeyBd586wb8/DOPkuUw0Dkcl/PhR3chMLat20Q3AvnE+WvEh3V51XEB7pNv3IaTb96BQ9hWJ4BLQDeCXFTlMsx3HbymLb7tNYpvnQjzLar78s0I83YLmKta7JtNxTdqrzepKvOGNqrK9YtvVSgJrllrKr5VGO7LD0gwr5TelZuLb6VKi32JscVepBLfChSYY2WeXyiJbzkG8W2z4b6c2utKZW4KcwQ5wTxFqswT1TDHqjwGgR4T3yQq82gEuYA5noioegiLXgdhUXUQijAPiaiF0PAaCAlfC76hdeAdsk4Y8R4C7Ou72YbfxXfrHAY6h+NsqCoqX31YgLc7KnKaoU5DYGjxSfma49hC/xjevPKVuCPfe+wTAXEF5AaYH7asyncesDTYuxwQ3zZpGexmVbmozF0R33Qa7C6Jb2Sw2xHfhMVuJr4lpbaZVeXrpaqcQC5X5VFKVU4gj8aqXAZ5mAzykPBaCA6rgaCwtRAYiiekGoKC14BfMHZcgmvl3/f13f52fUPnG/yDyWGgcziOwjyvbE+3WOu0IGTcnNX4B4NWWIIgJ3ifwmr8BFblexHq+47LMD8qHUOLvYfEN5MWe4f2xDeL0a2Oim9rbYlvxtGtrohveYWK+LbFqviWZkd8E1V5krHFHm1osdcbW+wIc2qzU1UeqsAcK/OgUCPM/YPxBFWBX8Bq8AusBB//1eAZtA4WhOIfBkO7F+w0gfC9D+/wDymHgc7h2Et71wVIyevqlg9fmqdOu8WXrT2FsP5EVOSHTt2E/Sc+tazKj8j35XbENwPIFfFtz7uWVbk9g90AcuvvyiWQn7XRXrdtsEtV+SG5va56V25msJfZeFe+SCW+GQ32ThXILcU3k/Z6hhrkZu11RXwzAbl8Vx6tgLxOBnmdBcgDQtYaQR64Bnzx+CDQvRHmXn6rwMt3FSz0r4IFQfUIdWzDh3XvHfu5C5/wDyuHgc7haOWjj7+A5vZz3dJeJ2ud9ouHJm+G2rY34dJ738KJ87cFvKki33fMWJXfa/GtrcO++NagY+KbLfFt5T0R3zpU4lu7pvgm7sudFN/C6KirctFir5FhTlV5lQRzPEaYVyLMK8HTF4/PSljgtRzPCvDwXQMeCPaFYS0S3LsJ6kdPfSAWAHE4DHQOR86blz7ttp3j4+ZUQgQ+P1u38aJoq1N7nSpygrhorx93EuT77YB8h/3Rra3WQG7eXm9WgdxaVW4GcpP2urzqdPkq6+11E5CXWRvduk2APM+qwd5u3WBPk56iSVW5Vnu9ySrIDe31CC2QS1W5r0VVTiBfJc4Cb4S5dwV4eFXAfM8VMG/BUpi7YBnM864Ej0AEe3hrt7Xi47M6xQ4BDoeBznnoc/7iJ91yV047x2lxSnL+DiG8Xbj6DRw4eUOqyNVVuQ3xzVaL3TDxTavFrkt8u6BffLPSYq/WK75V2hffFpfv0iG+WZ/4lpljX3yzaLGbiG8NGuLbOlPxLdwovhHMAxDmfqIqR5gHmMJctNh96FBlroL5QjrLYY7HMpg9twxm49f5AbUC6J4E9m6AelLuNnj/Gt+rcxjonIc0X339d3FfvtDFSona69O8aiCtcDds3H4Fzr/zNzh69jNLkMtVOX1Vg3z3oY+0DfYDUnudQN61TzbYsTLfiiDvVIN8h6q9vk2uyjsvyjvLEeIdb0JruyS+EcSbNyHMCeQbpOdoWpvR6hoJ6ATykyYgp53l9BytsuaIuC8XO8tVIF8ht9eXGya+7YVyjc1oi8sJ5PJzNBnkixDkhXJ7PZ8gTuKbmPhGIMf7cpX0poBcTHxTQC631+m+PIEqcwHyFgnkSSqQU2VOz9GUqjxmnXiOFk4gj6SnaAhzqsrFfXkNBIRWQ6BclUviG4I8ECVHub3uje11Armn70pYKFfldAjkcxcsF5U5fZ3jsRRmz18KM+cugemzSmHmfPzPfWuwDd8sTneAnUYRczgMdM5DlW+//RESc7a63GKnp2g0ArS08hhW5F/D6Yt3BcRFi10GeveLb1ot9sv6xbcNPS++mbfYy/QY7D0hviVZE98adIlvgTbFN6XFvlKqyrHNrq7KJYgvkypzBPmseQTzcpgxB4GOZ+rMxTB5WhHM8lotuxfdA/Xa5tP8A85hoHMeHpi7YrFTe50Wp0ycXwXR6Z3iHfnpi1/A4TO3TGHuhPhmuDO3Jb7tdFF8o0ExdsW3kz0uvhXdA/EtTtVid0Z8C7Arvsktdu8KM5gvE2f2fAXm5RLM8UyfvQSmzS6DqbPKYPKMxTBxWjFMmr4Y5vrXgVfkBpc7RnSqG7lS5zDQOQ94bn3+tZCIXNpLji12qszjs7vg2LnP4eQbkvRmUZX3kPimDfJLusW3Bh3im5j41sPiG7XZ1SB3VHyjI4lvrVbFtxhN8a1et/hmCnIt8c2yKqczW67KZ6pBPscI8ikzSwXMJxHQEebjpxTB+KnFMGXuClgQ3Ih36y3iqytQzy3dDcdOfcg/9BwGOufBy1q8G/aOcL6t6YGH7srnYnW+Ce/KT1/4QgB9r1ZV7qT4JslvdsS3Llcnvp21K76JqW8uiG9ly3SIb8X2J77ZEt+STWCuLb5Fuyq+BTouvtGZJbfYZ6ha7KYwLxVV+cTpJTBhWgnCvARem7wIRo3LhfHTS8ETq3TvyO4ZN3zy7DX+4ecw0DkPEMwbT7p0V072+nSEOY2BpSUq5y5/KVrt+xwAubXRrabtdX0gV8S3to6LdkBu2V6XlqqoQX7SqsFeaW106yq9BvtObYOdxDebo1vbtUGertdgV41ujbECcrkqF+KbDHJDVR5g2l6ns9CivV5hADm11y3vyk3b6+YgnzhtsajKx08tQphLZ+ykRTByXB6MnVwM0zxWgVdEqziuQv34aa7UOQx0zgMQWkPpyochwXyyRzUsrzkFR9Bep7fl1sQ3ZXSrifh2WL/4tlXP6NatrolvNt+Wa4xudUp8W2JffMsrtCW+bdQhvrXYF98sRrfW2R7daia+eata7NbEN0V+0xLfpiHQJZgvlmA+Q12VF8O4KXQQ5FidE8xHTyyE0RMKYdjYXBg6MhMmzVkO84MawKsbWvDHGOocBjrnfg4943HlQ3C6dw1MWVANK9edgTfe+UoA3arBflSnwX5AAvl2grlisO8xBXnHTmNVbthZ3invLN8iPUdrs/aufMPr0sS3Fo2d5fgcTQH5Whnk1XVyVV5rbK9X2hrdag7yZTLICeiywV4sg7xIfo5m0l63YrDTfblisBueo8kgT1GBPFGpypOlqjyOQJ4ggTxa3V7H52gR8kIVAnmo+ehWOsHyxDcCeZD0HE3dXvf0WyVNfDMD+TwZ4pL4JoN8ngzyuWqQy1X5TEuQi4pcVOVFBpCPHF8gzohx+TD8tTx4ZWSWODO9qsAnaoPLlfqp1z/iDwUOA51z/6UOn++4+iSNdpUTzM+//TfRYu9x8W2nffGtzaIqf8NB8e2kXfFtpYviW5Eu8U2nwW5FfItLtC++hbkovtmqymd7aBjsNsQ3E5hPkdrrY+hMxLtzhPkoAXIJ5sMQ5sPG5sHQMRLUBw3PgBme+AeP2E3ieZuHC9U6jYvlcBjonPsm1Y2uVeYT562B5LwdcPz8bTh14a50X64MijGrzHcfNW5Go0MgJ6ATyHWJbzuNO8s7ZJiLd+V0X975lgC5WnxrbVfBfIOxMjfsLKf2Op66JkvxrZoqc2qz1xrFt0pssa9ae9i4s5yqcgT68lVSZb5U1WJfouwsX2opvtGQmEUE8xKCOd6ZF3VBPlbmor1ucl9OEEeY5xl3lguYZ0r35QLkadJ9uUF8S5buy+NUO8tj42XxLRZhTu11lfgWSjCPMLbYg1Timz++LQ8IqhbtdT9Rlcsw91stnqIJ8c1bgrmHlxHmcxdoiG9zVZW5AvOZCPMZcot9mlSZk/Q2fooMc6zIx2BlTjAnkFNlTiCnynwYVeZj82EowvzV0bnwyqhcGIJfBw3LgMEjsmDcjKUwH6VMHxeFuZNcqXMY6Jz7IbUuVOYKzBNytiPI78BxtNi7Y3SrffHtHbkqf7vHxTdzg73SmsHuivhWbF98s2qw6xTfovWIb+GK+LbWKfHNQ4/4ZtNgtxTfxsh35UpVPnI8Qly02PPhVQL5GAniQ0bnwMsjs8UZPCIboZ4Jzw9MgsEIearQCequVOo5i3fDZ7e/4Q8MDgOd456pajjh/GIVlN/GzlwFSViZn8C35cfPfy5WnGqOcO1G8a3DQfFNqcydFt9qj9kV3wx7y50V34rsi28WLXZHxbc4HeJbmP2Jb7bEN6ky1yu+lTokvpnflw+TYT6UgD4qB6vzHBnm1HLPgoEI9AEy1AcOzxbft75Rrg2iiUnfAjdufcUfHBwGOse9Qu/MnR0WM2UhVnAxG6BuwwU4dPqmeF+uabAfdWZ063umVfkuI8hN78q1QK4hvskgb9TxrlwR36rqjM/R6L6c2usOGexCfNttMrq12HzNqUp8s22wOzi6NVHDYI81BXmYjdGtivhmBPkaU/HNyl35PC2Qz9ML8hIz8c0S5FSR6wd5BvR/NQP6DaWTDs8NSMR/Lwvm+NXhe/VW8Ax3/l69oe0sf3hwGOic+x/mVN3Q+3L6um3/h3DxvW8E0JW95SYgP6pjdOv+D5wU31Qtdrvi2zmXxLdKE5hbE9/2uSS+5d4D8Y3uy+2Jb0J+c0F8s6jKtcS3ma6Jb9RmHyq32F8Zla1ZlUswT4eXhqTDi6+kwQt4COrP9k+CYROKhAEvnrY58TNAsxWOn+HhMxwGOscN4qwARxCfsrAavNAa3nnourRY5ZiqvX7U2F5XQK601y0M9gMqg32fEeRSe/2qjdGtb1nMYLfXXnd4dKt5e71KrsoNID9gYbBL4psM8nIdo1vN2+v5Csg32wR5sjOjW6PrVVW5DPJwI8gDbRjsJu11bwfa6waQL7Ew2CeZgXycCuSjFZBP0DbYjSDP0Q3yvi+nwvODU6HPoBR4dkASPPZ8NAx5rVC03wnqzlbqJ3iiHIeBzunNODs0htrsVJnTE6AdB6/B2UtfYAX+sU3xzV6LXYhv+/SIb9YnvrVa3VmuqspbzmqIb6f0i29rDtkV3yxHtzomvtEsdtO7ckvxTdpbbi6+NesW3+i+3K74Zj66Vbf4tkxusS+xK75NlGFOxxnxzViVZ0swH44wf9UM5nheeFmBeYqA+XMDCejJ8Ez/RPjLs1Hw8pgC8It2vlIXw2d49juHgc7pjTg7NEaqzNcKqO889BGcwcp8rzWQHzHuLFeD3GR8q2ywi53lMsilneXGzWgdOzRAvlV+V67aWd6s3lmutNfNdpavQ4tfiG/ivlxjZ7lSldcYQU47y8VztEo6CPJK2llOMN9ntrNcLb6ZgnyRemd58VbjxDfaWZ4v7SxX2utZssVuurOc7suNO8sNIE+WN6PJO8tjCeTx8pCYOAnkEaqd5YbNaBHKznIJ5IEqkNN9ucnOcj95M5pYdSqPbpV3ls/3NIKcdpabVOU0JGaOur0ugxwr8wnTTUFOlfmYyXJ7Hc9oWXgTMJfvywnk9BxtyJgcvC9HkI9SgXyEXJXjfXm/VyWQ93slXarKX0GQE8wFyJPh2YEEcjxYoT+NQH/ypUT409MRMHh0AfhGu1ap85M2DgOdc0/j7NM0gjgtWPFCiWj7gWtwBt+YE7xtim+H9YtvW10U34wb0qyLb+YtdkfFN6sGu1p8W+Ka+Oawwe6E+BYcZl98E0/Selh8kwx2c/GtUL/4NsK8xZ5hbLHLVXlfuSrvI1flzwqQ4+mXCE+9lABPvpgAT7yQAI88EQ4DR+dzpc5hoHPuj7hyZz4VK/MF+HU7ttnPXLprCXIb4ptFi10W37bulUe3KvflO7TFtw0Ec5r21kmjW4335c2bjOKbEeZyi73ZeF9e2yjBvEbA/ISp+FZjFN9WUYu9ylR8W05npSS+GYbELFeJb+WK+LYTYb7DWJmXqO7LF22DvCKpvS5gni+12LM0xLe0TGOLPVlLfEtqEZV5bJJ6Z7nqvlyMbjUT38KN4lsgtdhDtMU3b6XF7ltpkN8UmNNCFQXm0uhWM5jPMRXfphDMxejWUhPxbdwUo/hGW9KE+DbBUfFNabFnWN6Xvyzdl1N7ne7LRWWOIH9OVOZJ4jzVLwGeejERQR4vzuN4HusbB488GQ6DxxaCX4xrUOdKncNA5/Ro7n7xndOVOcHcC79ux3Y5DY3ZI0tvesU3E5BbE992uiq+2TfYa7QMdofEt312xbciF8W3tEz74hsZ7LEuiG/WDHan35VriG9TZtoX38bYEN9etSm+ZekS3wjiAuQDFJBTVY4gp6r8RQnk5kdU6qPyDJW6s+33dz+4zR86HAY6p/vz7Xc/QnrhDqcqc2qzLwiRYH724heGNnt3i2/mLXbNiW94T75x6xX877yPX9/FcxVhfwWr8wsowJ1HqL+BUD8n2utaE9+Eye6C+EbHnvhGbXZXxLfUDPviW6yr4luwdfHN02XxrUy02CfPsC++CflNeVsui2/Dull8U7fYn5Rb7Fogf9ysUn+ZKnUX2u/L8XuKw2Ggc7r3O+Wrv0NsxhbHK3O5zU6DN3bgnfmpN6XK3Fp73TbI39cAuVF80wa5aqEKnrr1eBfecgFKyuohN28x5BcsQ6lsKbavy7HiPiiq85qG41idv46Av6zajmZmsNdaG90qgXyFTYN9j1lVbiq+mYNc666c2uvaBrtSlZuBXBHf1AZ7vCnII9Qg1zO6VQa5jy2Qe9kAudV35YrBvtgqyNXvykl6G2EG8qG2QG5WldNRV+UW4psB5BLMbYHcolJ/kir1fJcqdZrxwOEw0Dndks/vfAOp+dudrszpaVrX/g+EALcbW+tOi29737UrvrXTUhUr4hvdke8+cBWOnvoUEhJTYNLEUTB/3kzDiYmJg+TkdIiLi4WcvCUI673Yer+AkL+EbfZTRvGt1jXxzbzFriW+UZvdFfHNAPMUG+JbnGvim68O8U3cl7sgvk3QIb7pGt1qQ3x78RVFfEu1L7696BjQDXfqo1170kbPQzkcBjrH5TS3n3PhaZpSmd+W5q9bG916yBbI9Rnsm+wY7HUouNG1AeXKlbdh//4DcPz4cXFOnDgBGRlpEBwUAEGBAeDtvQDCw4Ihv7ACZbTVCPCDUNtwDtbUnUCQHzEF+Rp9o1tLzWawFxuq8u32DXab7fUNlu11GeTxKpCbt9cjzUFu1l63AHmQgwa7ZntdA+SzHDXYtdvrAuQmd+VUlWfLVXmGKciHkMGebmqwD7LeXncU5Fp36gR1WgfsrCTHlTqHgc5xKecvfgJB8Rsc/vCZG1APAbEb0EB/X8B89+Hrrotvu3WIb51WdpYT0PHZ2Z2731n9Z/3666/h1q1b0NzcDIsWFUFUZKSo3KOjQyEhIQHff1dDbdMFbLufRZAfdFp8KzFvsfeE+JasiG/rrYpvEZriW61u8c3cYO8J8c1gsNsS38a6Jr4976T45uj57WMhMGJKGQTGtzvVeieh9Lvvf+QPJQ4DneN4Lr1z06lNUh54xsxcCWsaz8KbV74SbXYDzM3b64csn6JtJ5DTkJi9ppvRtuwyVuWbt1+WdpZvpcr8Ej5Huyieo0l35doGOz07u3P3W93//BcuXIDKykqs1r0hJCQQW/LhkJVTCuXLO7H1fg6BftTYXqf7cgT50gqpKi9fIQ2IUSpzUZXTzvJS/Fq6HZ+jIcgXy1V5MYK8qBO7AZ2S+KYCuUF8y6ZVp0p7faNor0vimwTyJDODPV6sOpVAHqPejBZLz9HkqjyqTuwsD4lUVeXYYg+SN6MFEMixMvcNsjTYvfxkkPsYQe4hg1ypzAXIsTIXIJ+nAvlspb1eJkA+mapyEt/kqpxWndJmtNfkITFUlY+aWCA9RxMT3ySQDyODfYw0JOaV0ebtdQT5cHlIjLxQRYB8iKq9PliS3p5DoBtA3r/7Qa6cPz8bJSp/j+Am0X5fEOx4lZ6Uu034LBwOA53jUIqW7XNun/n8KkjM2S7GuO4/8YlpVW4uvh3UY7BLVbk0vtWO+Ka02NvV29HOiyExaxtO2azQraWpCaEYEwPBwcEQg9V6bEwUVtlt2Go/gueoDHIHxDcNg928xU4gd058a1ZV5XbENwdGtzotvs3TEt/KdItvaoO9O8S3FzTEN2l8q/Pim95Df0j409OR+IeHFJjjXyeuo5z5+SKfhcNhoHN0p2Xzeac+bCbJMD969hYcPnMDq/GP7qn4Zm3iG9nr1fWnHKrQ1blz5w5kZWXBggULIDIyHMEeBskpWXhfTkb7MQFy3eJbiS3xbbOhxW4pvm3ULb4ZWuy2xLcIRXyrcVB8WyVa7Av0iG9zXRPfRk1wVnxL1y2+PWMQ3xKl52gvxvcI0MXB/9u/ezwUBozMBf/YTU7fp196+yZ/SHEY6Bz76dpz2ak2+0zfOkjMRZif+wwOn74hzWDvRvGNQL7JqdGtr4shMVUotN2+863Tvy7fffcdHD58GKKioiAsLAxiYyMgKTkDlmBlvnTlEYT4Ll3im1WDvTvFtzj74psmyA1VuU6DfaEa5MaqfKbL4luhdlWuJb6NMK/KVeLbK2l2xTea+NYd4pve80es0l/CKwECupfYo+4c1M9d+AT+8Y9/8AcWh4HO0c7PP/8KcZmdDn+4EMxJ9Nl//BOE+U0BcHPxTXN0q4X4Zn1nuZDfbIhvpjA3m/iGQtyaWteAroTu1gMDAyE0NEy04JOSMrAqx3b7ikPy6Fbb4ptFi11TfNvkkvgWFWtffAvSFN9W6xbfTGGuLb5NM4hvpU6Jb8P1iG/DtcS39F4R3/SevzwbDa9OKEGob3S69b4wtIk/sDgMdI71ODoJjqQ5MtrpidrytSfhCMLcXnvdFORm4ttO8+doqva6LZDL4luTAvJWeaFKs7RQpRaf/FTWHOsWoFOuXLmCQA8VJy4OK/WkdAQ5VuhLDyLIt4ujbq+bGuydFiA3b6/TSckwB3mr2ehWjfZ6TIMpyKNM2+smz9GcHt26whTk820Z7KYgN22vL5LGtyri24QCy/b62DyNqlxqrw8yMdhV4psAeZqhvS7ENzcBufnQmSHji8An0vmnbG1b3uAqncNA51jmnXc/c/gDZV5gA8K8GpZWHYfTF27DXnxn3lPi2wab4ptUlTdq7iyX5rBXVh9FoH/Tbb9eb731FgQEBEAotd9jwhDqmXhPvg3b7Ltsi28F9sU3w95yp8S3eqtvy22Nbu0J8W3yDC3xrVi/+Kb5tty0xd7fjcQ3R4fO0FO2CXMqIDCu3el572ffuM4fXhwGOseYq+/fBv/oVodbflM910K5DHMy2XdqVeUH5Kp8v/QcbZthZ/lVaWf5Lqm93qECefs2s53lKpC3tEub0ZoFzI3t9UYCeatUlSurTtVrTldWH4HPb3/Trb9uVKmHhISISj0mJhgyMpfjHfpRBHmXeI4mNqSZzWDPsWmwbxQ7y01BjlV5irEqj5Gfo0XjMYAcW+yR6s1oUar2Ot2Xhxo3owUEVYvnaH4yyH0VkMv35dJztFUC4kJ8k0FOx6S9Pl/9HM1sdKsWyKfIBvtk0/Y63ZePGK8CuWiv50nP0RSDfaTZznK1wT5UG+Ti0H25Wnp7qXercsunbNHQB7sJ1OnyjdrgFNSzS3YZBiZxGOgM9Ic8P/74M3hHNDs8o32Gd634IKI35gdPftLz4ttme+Kbcl9uubO8Gk/FmsPdDnTK5cuXUZCLhejoKDGAJie/CSv0fZZDYmTxzbTF3t3i2zqpKrdlsAfZN9h1iW9z7YtvxlWnjopvubrFNwuDfZCGwX6PxTdHnrL94akIhHq66HbRVkJnqvRSfG3BYaAz0DlYKb/l8AfIbL91MD+oETZsewcOn7oBO+yIbzQkZptclW/ZbWVn+Vaj+NaGR+ws32zcWU6VOcG8SYF5q0p8W39GrszlneX45nytsuoU7faqdcdhxepDPQJ0SltbG8yePRvv06PwRCO8m7DNvlOuyqX7coK4WnxLQ5jTUzQS35LV4hvdlacSxFU7yxMI5o0QE4eVeWyjAHlUrLyzPErVYqf2OslvYSrxLdgovvnK4huB3MdMfBNP0Qjm8mY0CebyznIE+ex5ys7ypaLFPgOr8mmzNMS3aUbxTZLfsDKfVASjFfFtvFSZD1fEN3lIjIX4RiAfKYlvA2TxTdyVy5vRXqTRrVSZ087yQVJl/qyys5xa7P0I5vLOcjcDufn5r7+GwNDxxRCS2OEU0P2iWuH9a3f4w4yBzkB/2OPoaFePkEaxdKWx/SKcPP+5gLcu8U0e3eq4+CaPb8U2uy3xzWRneYPZzvKao7Bs1cEeA/rdu3chPz8ffHx8ID4+HJKT8/DufB/el291SnxLSHZNfAvSIb7RtDdrVbke8W3abPvi22uuim/D7Ytvzw+2Lr49+aJ7tditnb8+Hyv+0DHNs0o8Z6OfMUehTnLdV1/zFDkGOuehzHff/wSLKw44bLXTvXl0eqdos++he3O94tuunhffaqkyN99ZLm9HW7ryAHz2+dc99uv51VdfCajTfXo8VuqpacuwMt9m0WInoNsT36S95ebiW6Nu8Y3a7HbFNzOL3VHxjY498W2si+LbQIP4lmFVfOszyH3FN0da7zQa9q99YmHqQrwKiWx1qlLv2H6RP9gY6JyHMW9e+tRhCW6aZw0ERLchzD+FA8c/hh37zcQ3GeTbDCC/at1gF+31tzRHtyrimwnI21QgV8Q3k7tyGeTrzHeW05rTw1C+Yn+PAp1y6tQpmDlzFgpyUVipx0JGVguCvEOHwW7lXbmGwW4c3Wr5rlwR32gWO4HcTyfI5y+08q7cUYN9isbo1gkaIDdpr5uJbw4Y7M+ZgdwdxTfHtrKFwYtDs7Brttnp9+mHjr/PH24MdM7DlOuffgnRaY7d19Gd+YR5a6B8zXE4ce4zAXBji/0eiG9yi92a+CbB/IQJzJWd5SurDkPZ8n09DvSff/5Z3KfT3Pe4WBoPW4rV+Q5xT24V5lriW4IivjVan/jmovhGT9JcEd8m6RHfJrgmvokWu27xLdEtxTeHh848FwMjJpeKVavOLEdKLdgOX3/zA3/IMdA5D0uWVB5y+INihncdlFQchqNnb2rclVsDubEqV8Q36a5cAflFG6NbTdvrliC33l4nkFeqd5avPgilS/fCrc++7vFf2x9//FFY7zExkVilxyPE1yPQt6gM9jYzkDdrGOyN1g121ehWa+11E5BrVeWeBPMKqyCfMUeqyqdrttdLRFVunPhWpGqvF8rt9UIbO8v1GuzpNkH+tJsb7M6eR/vECKjPD6oH32jnnrKdfP0j/pBjoHMehnyM1bkjb86pSpjkUQVxmdvg9Bufw+7D18Q9uXmL3Z74Ju0ttye+WZ/4Zt5itxDfZPmtcu0RI8zxiJ3llQdh8dI9CPSvevzX99dff4Vt27bB/Pke+IwtAhKTF2NV3mGsylNb7IpvUbEOim/md+UB5qNbV9kf3SrEt6W6xTdLmHe/+PaCHvHtPm6xW6/So6HfsGwBc2da7zS+mcNA5zwEWYHVqyMfDnMDGmAuvpGtxzvtgyc/FhCXdpa/Z9xZvueqqMrFzvKdMsi3GzejbVJAjpX5BgR5m7oql8W3po0SyKX2uvSufF2LZLCvEyA/LSBeSy32ddRiP46VuQTy1XTWUmWOMCeQV0sgr1hzUOwsp33lxUt23ROgUz7//HNITEyEkJBgrNLjEOJNeDaKqjyRhsQkSzvL49Q7y+Pprpwqc2lITITGzvJg1c7ygNC1RpAHGatyH6rK/ZWd5aab0Ty8Vgjxbe5CM5DPk4fEzDXdWT4FK/NJMzUM9qlFQnwzAflEVXtd2Vn+mv2d5QNlkPeXQf4S7SwXz9EkkD8vdpaT+CaB/Jn+aoM94YECuflTtjHTlzr9lO3gsff4w46BznmQQ7PMHRogE0bVeTVU1p+GE+dvmaw5NRHfdtkX3za4KL7RsSW+iaq8Wm6x41mxmlabHoDlCPNlK/dDUdm9Azqls7MT/P398V16JCQkliDIt6D4tt7MYG+yP7rVIfFttX7xzcPJ0a1TNAx2a+KbeVXuoPhGBvuDJr458pTt6f7JMN2zGrzCnZv3/u4Ht/lDj4HOeRDz+Z1vID6r0yGrnbaohSRswqdpH+ATtWsSyM3uyzt2GVvs7V1vwyZFfOs0vS9vsyK+NSLMG0h8o2lvYnSrxn15PbXYLcW3SoP4dhhb7AhyrM5XyHfmywXMDwiYL63YB0WlO+HWrXsH9O+//x7v0WMgOjocq/QESEiqR5i3QRyCXBLfpCExFvfldFceZYS5NLpVJb4FmYlv/liZ+5mJb96rwMOq+LYUZs9bZqjMZyown4WVuajKTcU3WnOqFt/GEMwn0oY0rZ3lMsxHa9yXDze/L0+HfkM0xLdBqQLkfZRZ7NRi72cqvj3+gMNcecr2yBPh0Bd/jQKc3J1Orsyvv/LyFgY654EK/VC3d11w2Gp/bc5qWFl3Co6fvSFB3BXxDY9L4puGwW4ivskgX2EG8vIVe2HJ8j1QWLIdbt5DoNNd+vbt22HBgoWQlBiJIC9G+W2jHYNdEt9CI1wT38RSFc8KOwa7Ir4tcU58c9pgz9Qtvj1oBrvDC1yej4NHsVKn1rt3BHovoY5D/cPrd/kDkIHOeZDy00+/ODwneqZPHeSU7hMSXJc98W27ffFNGd3qtPgmw9yq+CZgftAU5niWLN8LZcv2QEHxvQU65c6dO5CcnAwRERHiLj0mvgZb7C12xbcQk53ljotvdFcuwXyFVfFthqb4VuqE+Ga9xf7ySFPxbYDZczS74lv/h6fFbq1Kp2Ezf3w6Cub41YFPdJvDQC9avp8/ABnonAcprR3nHa7OF+IfAOh+fA8CvVMB+S5zg/1tqb2uCXLt52gW4puV0a1rDSBXDHZJfCOYq0Gu1V5XQE6VOcG8dOkuyFu0DYF+77/dGxoa0Hifj8Z7LFbmVViVN4uq3JrBLqryMG2Qm1blZu/KTQx2DZDPc2Z0qznILcU3PQb7ADOD/UUzkPcZqGqvi6o8SQXyhIcO5JZb2aLg5bGF4hmbo0APjG2Dy1dv8YcgA53zIOT23W/xHnyjQ8/UJsxdAwXlB+DgiY/lFrsd8W1rd4lv1ie+rdYhvi3FU75CarMTyCWY74bF5bsgt3BrrwB93759YhxsbCy23eOysCpvsiu+BYZ208Q3DydHt9oU3wqkqvw1++KbrdGtfVl8c+htOrXe5/qvc2rNavnqw/DDjz/zhyEDnXO/Z2Pnmw798M/yW4fv1NtgE0KbZDg9o1s3bLkkgbzjgmZ7Xc/o1hoNkJu01wnkVWqQm7XXVxjvy9UgL1myE4rLdkB2fifcuNk73+5paWkQHh6IQMevUY0ma05N2+vWQe5tZrAL8U0BueGufIUAOYlvs+TtaCbtddVmtMlyVT5xunozWrH+0a1WQW58V07im1WDfSCD3NHd6TSjnmDu48Ssd75LZ6Bz7vN8+92PEByvvzr3wFY7me3NKLLtP/YRbJalN3viW5vN0a2qFrsr4hu12G2Ib0aY71bBfBfCfCca7jvEGtPeADrJcRUVFRAWFgrxCdEQFbMYQb7epvjm76L4Nnu+ffFtkpPi2zAHxDfprlxbfDNtsT+84puj1vvIKUuwSue7dA4D/aHLhs43HGq1T/eqgeS87bAbK/OtYm+58hztsiS+Eci3IcgNc9glkLd2SJvRWgTMCeTnBcibFIO9VQZ5swTyOtVmNHqOJka3rjOCfI2qvb5qjfQcbaWY+HYAViDIl6tBXkHtdQnmCsgXyyAvwcq8aPF2WFTSBVk5HXDjxpe98vtw7do18Pb2hqSkSIiKLsKKvBlCVCCnneX+IViRB0sgF5U5gTygUohvnjQkxtesvS7ENw2DfX65EN9oSIwB5LNlkM/EihzFNwHy6caqXMxhV1Xlo2kz2gQVyF+TDfaxEswJ5ENGSSAn8W3giEwYRCAflgED5Pa6ceKbBPK+BHK8Lxeb0WTxTYC8P9+VO9J6f/KlJHlGRLPD61XfvvoZfygy0Dn3Y2hBg19Uq0Mi3GxstzdseAP24Ztzqsj1im+K/GZLfNMy2B0R36wZ7Fot9hKEeTFW5UWlEswLi7sgI2czVui9A/SPPvoI36NHQ1xsOFbo+QjydaLNbk18k/aWWxrs9sU3Wwa73tGt+sQ3mwY7i28984ytbxz86ZkoUaUHxm1y+C69dOVB+BFfvHAY6Jz7rTrf8oZDQ2QmL1gLCVnbYN9RNcz1iW9GmJ93aeKb8+LbLkNlLmCuVOZ4ChHoBcXbID2rHT7tpQqdsnXrVlGlJ2DbPTR8BUJ8nfX7cn/XxLfpc+yLb+N0iW+5Vu/LB49wRHxLsXpfzqB23Hh/Cn8NCebibbqDrfePPv6CPxwZ6Jz7KR998gVEpm7W/UM+L7AB5vjXQ03LOejac9V0oYr56FYN8W29TpC7Ir4tU4HcalVuBvJCBHl+0VZ8stYJqZmbehXora2t4vlaUlIs3p0vR4DXmYI8QEt8W6khvi23K75NleU3W+KbTZDrEN8MIH81g0e33uO79N8/EQojp5aBX8xGh4FeUnGAPyAZ6Jz7KR9+dNfhITJJuV2w88B7eFcuV+bYXtcrvjXpEN+UveXOim/qqW9a4pvUYt9hUpUXFCHQFyHQCzshJWNjrwL9zJkzEBkZCbExEXhvXoEAr7UqvnmqdpY7I76ZwNya+DbJtYlvdFh8670Jck/1k+7SvcIcn/N+9X2e8c5A59w3WYGAdOipGgK9vvU87Dr4vspgN22v08S3Zq32ug2Q1+ox2Kvtj26VQL7XpCpXxDd1Vb5IA+S5BVsgJ3+LWF/6yae9224sLy+H4CA/iIzKQZhXWW2vC5B7OT+61RLkWlW5GchfswT5K7L4ZtpezxTt9X7yUpUXNdrrz5pX5f34rrxbT19sveNd+ogpZeAfu9Hhu3Sa8c5hoHPug1z/5EuHzHZxd569DXbuf09U5pri22bb4ltDi4vimzWYOyK+yfKbCczxEMyz8zogMbX3gV5SUgIhIYEQH5cgWuym29GM4pvN0a3z7I9upRa7fvHNudGtLw3RIb71Z/Gtx+7SEehUpc93Ymd64dK98M23P/CHJQOd4+4hk9XRXedrm87Ctj1XDCDfgO/Q21Tt9RYtkLdJBnu9DHKxs7xJArk08U2uyuXnaFU2QG4+upXEtyXLEeiq9nqpDPLFBHMCOVbmi0rk9nqJWVW+SAJ5Tn4HZOVthszcdkhIbul1oOfk5Aigx8YmSyD3qTSCXGxGk56jmYIcq3IPs81oBHIU32gzmgC5eme5UpVPVbfXVTvLledoeF9uAPlYjfb6SOsz2E1A/rKqvT5QZbBzVX4P7tLD0Hgvc2ob28nXP+IPSwY6x51z8fINCIjRP3Rilm8dJOZ0wY6970og70HxTewttxDfDukW30RlbkN8EzBfJLXY6WQjzKkyz8pFoOe0QzwB/ZPeBXp1dTWEhQZBDAJdqcpti2/LHBLfJjhksGtV5Tm6xTe6L7dnsLP41tM70+NEF0Qy3h27S6dVyhwGOseNc/7iJw6120mGq2k6A1t3XREgb6NVp+0a4lubsTKvx7NOdV9e20h35qbiWxVW5msI5gTxmiOwuvoorForVeUrVTvLRYt9pQTzcg3xbTHCvESAXB7hStIbnkIBcwR58VYoWCRV5rkFUos9W67Ms7EyV2Cekb0RYhObex3on3/+OYpxoRATk4Qgr9QW3zwI6EtNxbc5VJmXS/flCHEB8xkqmE9VKvMiY4t9olyZE8zHyy12BPnwsfLEN3lIzJBRWJmP1BDfXjUV316g+/KXVeLbYBnm6lWnL0n35Qzye3US8F16JIyYXOrUE7aDx97jD00GOsddk1a43QGzvRbSCnbClh1vi3tz58S300J8MzfYqzTEt1W6RrfaEN9kg92q+FagBfJ2fH++CdIyN0JM/Hr4+JPenWd948YNCeixiVihL8f2+koXRrfaEN8m2RffhtoQ3wbYFN9SWXxzo0NA7zMoDfyiHZfjskt28YcmA53jjjmFd2KOVOcTPaqhoHwf7Nr/riS9uSK+WbTYLe/LV65xceLbYtvimyXMNxlgnppBQG/qdaB/+umnYjd6UmIUhIZnw2yPSk3xbZbT4luRtsWuIb4NMYhv2RbiW38W3+6rcbAkx830qXG47Z6c1wU3bn3FH54MdI67hf60rf/ufB2+X23G6vs8bMR35togP2cY3VqvBnmTGuQnRVVebQPkFVZAvtQE5Kbim9JeF1V5yXa7IM8yAzkdArkE8w2Qkt4GUbGN8PHHbgT0sGwE9yqj+Kaqyk1APssU5BOsvivXY7Dnqgz2bMcM9kEaIOeq3G3kuMFj8sHfiUEzB7jtzkDnuFdu3/kW0gt3ODRIJrtkN2zb9Q6s33TeZfGtyqb4drBbxDcDzG2Ib3SoKk/PIphvkGG+Ad+gt0JkTIP7AD0pCkIQ6DPmrtIU34TJ7oT4NtoB8U1qsWuLby/qEd8Y5m5Xqc/2rXV4E1td82n4+edf+UOUgc5xlxw4+q7+JSx4z0Yt96aNb4jqXAF5kwLyVgXkZy1B3qDHYJfa65ogr9AxurXUFsg7NUGutNclkBurchomk5TaCokprRAeVQ/X3QnooVlYgVdottenzlJ2lttor0+2NNhHyiAfLoP8VRvt9YFKe/1V4135C1archnk/dlgd9+79CgYNLoAvMKbxc+3I1DntjsDneMm+emnX7DKPqf7h3cGynAFS/bB5q63RHVO4pvYW+6K+LbWvvi2tEKP+GZ94hsdW+KbZVWuwLwF36A3Q1jkOrcBejICPRiBPnXWCoP4NgPflU+aXo7QXobQLkdoL8HqewlCuwyhXYameilW3qUI68XYRi9BYBdj5V2MwC7CynsRVt2FCOpCrLoLENb5CGo8Q/MR1Lni9H05B0Gdg5DOwnvwLAR1FjzbPxNBnYEVdwZCOh2eeCEN4ZAGjz2fik+iUrDqS4Y/P5cMf3o2Gf74TCL8Ac8jTyXC759MgN89Ee/0+a/HEUDPxpv8oeAxhrJL5y/PSXfpztjuPN+dgc5xl9/Fr/7u0A/vVM8aWLziIHTuuCztLG+Th8RgZd6AIK/X2IwmdpabgXzN2mOG52gC5NhiX4kgr5BBvly9Ga1CAvkSM5CXyDvLiwnipUaQFxZ1iedoSns9pxBb7AjynHwJ5FlmIE9FkBPMDSBPk0CemNoC8fg1Lnk9hETUwfXrd9wH6CGZaKwvFzCn1vqkGeUwf2EBBARlgq9/ljg+/png45cJ3uJkgJevdDx96KTjO3Y83un49C1NHA8v+Ximoj2PZ2EqSnfSmbsgRZw5HnSSxZlNZ34y3t8nYacAxSpxErFjIJ85Cfj3J51ps+nE49+r62e2Rzx2ChDuTxKI5NNHgvwfn5HOY33juQvg4Jt0Wq86fk4FeEe2OizHcRjoHDfIO+9+pv/uHGW48OR2vDPHe3NstSviW0OLa+LbSl3i2x4N8W2nbvHNvMWuJb4lp0tVOZ0EuTKPT2qGuMT1EBxe61ZAD0KgT8WWO7XQ+7+SDs/1y4IpU8MgPGweBAYs1D6BCyHIcDwtTnCQ9RMS5CWdYO0Tqj4hdLzFCdM6oa6dqAhv8PTC4x2NnYpECAyOh/DIeOxExMMzA+KxoyBB/T8fw7vh5xns+uQ4/APS46EoxxVAUGKHQ0/YfKNaYf+Rd/nDlIHO6e04IsNN86qF6LQO2ILtdrorV8Q3qsoVmNOAGHPxbY25+FZ1BFaqxLeKSmni2zKCeYVafNuDMN8twZxArohvpUbxjYbEFJjdl9Po1tx8U/EtM8covqVptdhT24T8loBVudJmj08kmDdBbEITBIXVwkduBPRABPqIsYvx76sa1tYdwG7HQWhu2Qld2zqgs7PzgT5btnRCV1cnZGYgzAO8ICI8EKKjgiEmOhzf6YdDQnw0TMOuwGtT4uFJBNVv5Ra9gDvD20bbPRr6DMYOTXCTw0/YNndd5A9TBjqnN/P3H36GlPwufTJcEMlwTbCi6ii0YIVuIr6td1F8q7QvvpkY7E6Ib6YGu4b4provV6ryWDz0/jw6rhECQta6D9CTo7EqzYDn+2fh1cO2h/b79+bNm3D58mV477334MCBA5CYmAi5uTkQHY3SYLA35Ocm4NVEPPgFxqOxH4/3+dL9O7fjrT9he+TxMBg9bSn4RW9wCOgx6VtYjmOgc3ozW3e9JSCt5wd2XmCD+EpVedOG103EN9Fmd0V8W2W+s9xSfBMtdjsT32yJb5LJroa52X25OcyxKo/BEx3fCFFxDeAfXO02QE+Rgd53QBb+GnTwN7Kcn376CX755Rc4e/YsLF68GDw9qfXvB2kpUZCWGgf+gQkoAErt+EeeksDOIDe/S4/F1wjJ+Af4Boe3sL1/7Q5/EzLQOb2Rf/zjH9DacV73ZLhpXjWQmr8dWvDunIbFaD9Hc2J0q2p8qybI7Y1uXWR/dKumwa4COS1eESBPMgU5VeaRsQ0QEVMPfkFV8NFHt90G6AFBWKEj0DNzNyLE+B2wVs6fPw8nTpyAlJQUCA4Oxvv3AMjNxjY9Vu3DxiLYn7a05RnosfhiIRHm+K9zGOhX3vucv+kY6JzeyLXrXwiZRV91LrXbq/BevBXb7eIpWjeKb+Ytdq2Jb0WLe158Ey12ArqoyvEgzCMR5uHR68A3YA1ccyOg+wel49vxUhgwJAMOHHqLv6Ft5Ntvv4Xt27dDRkYGzJs3D9JToyE9LQFCEOzP9I+H3/yVq3XzN+kkx/k62HanXRAcBjqnF0L3XbplOO9aUZ1v2vKmXJGbVuUGkNfqGN26yh7Id5mObjUHeZFOkGc5AHK5KjcHOVXm4VHrxBt0b//V7gX0wHS0ukvh6RcSYPvON/gbWmdLfv/+/eggpIC3txdCPQaiohNgwjSalBYPv+c2vDh/eCoC+o/IAT8HR8FGpGzmbzIGOqc3cuLsNZ3tdnx7Ltvtbe3nNcW3qjrXxLcyPeJbsWviGxnsNsU30WJvkGGObfZoqTIPi6qDUHyD7uXnfkAfMW4xPIUfwKfP8DxtR0ISXWFhIYSFhUNiQjQU5sXjW/t4eG6A1IJ/2IFO79H/8mw0TJy70iE5jqbMbdr2Jn+DMdA59zphiZv0tdtRjlmAb1JLlu1HIe6MAPnaeqPBXkXt9Vq6LyeQS8/RVlFVvoaGxCDMldGtq+Sd5WLVKYF8L1blewTES5cizAnkS3YgzGWQL+6CRXJVXkAgx8qcqvI8cV/eATl50n25enQr7S0Xg2IQ5Klqgx1hniTuyyWQx6tBnoAVOcGcQE6HQB4jgTwssg5C8ARH1MBCn1Xw4TU3AXpKNJrbaWhul4jNZpl5G7Gt/AN/UzuYvXv3YqVOb9tDUZqLh8x06S27YsI/zG/SyXYfN3M5BMa1O1Sl16w/xd9YDHTOvU5C9lZdP6BzAhrAJ6JZhvlJ50a32hPfltgX35wa3WpisNsW3wwtdlGVr4PQSKrMa8VAmaCwGljgTUDvXelHAXoqAT0gDV4dUyxmsPcbkg4//PATf1M7kevXr0NVVRUsXOiJv66J+LY9Hn9NGep/ejoSRk5ZIpa16H0JQ2clfi78+OPP/I3FQOfcq9B0uJAEffdjcxHoCVmd0hhXa+JbtYviW9lOu+JbbkHPim/GFvs6qTJHmIcgzIPD1kJg6Frw8FrpRkCPAV//NBg6ught7XwYNCwTtu/ie3Rn8+uvv0JFRYWAenxcNGRlJBig/jC33enr3IA6h4fMvPnWDf6mYqBz7lWWVR3R/cM5x78eVqw5DI3Np62KbytdFN+KnBbfNrkOckV8k+W3UAPIa0RlTjAPwDfo8xeucCug+yDQXx61SOwt/+tzseAfWsXf2C6EnnES1EOx/R4RHgI52UkwaoIE9b/2fTiBTmeGd7XDQP/w+l3+hmKgc+5VHHl/Pt27DoqX7oOG5lNWxbeK1YdcEt8WWYhvW7tdfItVtdg1xTe5xS5gHo4wD5Uq84CQavAProK5CPQPPnQnoKfC4BGFYtVp30EpMGNeOXx64wv+5nYxH3zwAUTHxEBoSCBkZSbAiIe4Uqfnay8NywYfB5e1dOy4iF2Pf/A3EwOd09O5/smXEI8tdD0/mLOxOo9Iahf35dVoslcq4pt5VW5ndGupTYO9yxTkVtrrroxujVGDPNYU5FJ7vc4I8jAjyKkyp4EyvoFrYI7HcrcBelpqDHj7pYpVp7SzfNhr+fCbP4Vgx2QPf4N3Q+7cuSOetsVER2D7PR7GTHo4K/U/4j06AT0gdqNDy1ro/MD36Ax0Ts/n9Tc/1v1DSdV5esF2aGo5LUBuTXxbvspF8a3Ivvimb3SrlvjWpKrKrYtv6hZ7oKjK8SDM/RDmPgGrYfb8ZW4H9AHDCvAePRdeGZUDA/EefdCILNh3kIfMdEeuXr0KHgsWQGpqooD6iHEPX6VOy1qeG5wK8wLrHZoaRy9oOAx0zj3I5Su39APddx0koQ2/rvGkCuSHxHM0RXoziG8aIC9VqvIlBPKdCHL8qlqoUqAy2KWqfIt4jmZeldNzNHOQJ6dLVTk9R6P7cjXIRXsdn6PFqEGOXwnk4TLIw1Tt9WCCeJglyH2DJJh7+1XCzLlLEeifuQ3QvfxSoN/QPHhldA4MHpktoP6HJ6PgtanF/E3eDfnhhx/EnbqnpyckJcYJqNOTtkeefriWtfz+iTAYNrEEq/RN+tepRrbAgaO8TpWBzunR/PTTL7q3q80JqAf/qFYBcboz70nxzabB3l3im8pg1xTfRIu9SoI5tdkDZJj7VyI8K2HGnHJ4/wM3ArpvCrw0JBdeRphTZT5oeBb+63R4Ej+ES5d1wfff/8jf8N0QBepUqedkSbvWf/vEwzP//ZEnw2HszGUQFN/uUNs9t3Q3f/Mw0Dk9WnXgvZZ3hL7W2Wy/egiMaRN350J6o7PqICyrlECuvi8XQ2IU8W2J8b68SC2+IcgLCeR0X14o3ZfnKOJb3hYZ5lJ73eK+HKvyFAR6klp8S1btLCeIq8W3WIR5jCy+RdVDGFXmkYr4hvflYfi2XBbfAvD4U2UeJMlvojKX2+w0Hc4TYe7puwqmz3IvoHv6pMCLr+TC4OESzKnlTueFl1Phv/+XP7xzlZ8OdUfIfl+xYgX4+/sLSc7DKx7+8AwtMXl42u50j74gpNGhtvtKlGc5DHROD0fvhDh6rhaWuBGr88NifKtNg31Zz4tv9ka3xqhHt5qIb0pVblt8U4Oc5rZTVe6FIKcJcQu8V8K0mWVuA/T01Fj8+0qGvoOzBcQHvJoB/fH0G5ohqvTH+sSCh+9K+PnnX/gbvpugTotd/Pz8IS83AWbMjYf/fCweuyEPR9v9j09FwJQF+PMRpX8MbEnFAR4ww0Dn9GRo4IN/tP0nKB545gc1wmKsvFevPWxXfBOjW10Q35TK3Jb4lpTqrPhWK7XYI2yLb+Ywp6qczkKEuYdXBUyZWep2QH9+UDaKcZli/Gu/oekC5i++koYnFf7tdwEwZc4S+DtPkOuWHD58GLy8vLD1Hg9xcQjzl6S96g9D6/3RPjEw02ctPl9rc8h0P37mGn/jMNA5PRW619Lzg6gAvWTpHjGXfZktg71cG+SFGqNbFfHNvCq3BnLTqlxDfLMC8nCVwW6syu2D3NsM5AtkmM/3XAGTpy+G996/5R5AT4vFv7ckeG5gpgnIX3g5Dfpiy/15NJNfwH8tQb0M/v53hnp3pKurC833hdh6T4TIKAQdtt3//NzDAfSpC9c4DPRjpz/kbxoGOqensmzNYX0/jKHSG/RFZbtQhjtoX3yzNrpVp/iWblN8a5Za7MmuiW9Bqha7NfFNVOY+1GYnmFfIMK+AeQuXw6RpJW4G9GR4pn+mKcwHE8xToM+gFIR9svj6z//hAxNnlXL7sxty+/ZtCA4OhpCQUHGfTtb7Hx4C6/3Pz0ZD3yGZ4g7dkbnuJ1//iL9pGOicnsoqFNz0LmSJSN4k35nvM2uv77ZorxcZqnI1yLeatdc77LbXCeZSe93yrjwuUdlZrlGVk/imBnmElsGuAnmgKcg9fbVAvgJBvgLmLlgOczyWwYQpxW5XoT/VL0NU4hLI8cggp/NM/yR4dkASPIPnX/7TH4aNL0APYhf/ELgYWuYSHByCT9miITyCpLGHA+jPDkpzGOjccmegc3ooX3/zAxQs2avrB3Gmbz1kFnTBmupDusS3RS6Kb3T0jG61N/FNW3yTZrGbG+zm4psE85UmMKfKnGA+e/5SGD+5CN51I6B7eCXhPW663GJXqvIUhHiyAPnTCPSn+yXifydB/Hv/iu33/+X/8YDsRe38w+BiaDtbaGiI2Mw2eoIkyD3Id+kE9D4vpzsM9LCkTfDV13/nbxgGOqe7c+j4+7p/EGfhk7WUnC2wEs32JcslkEvim9xeLzO218XO8hIZ5LSzfJFxZzmBPFsGuVSZbzLAXN1eVypzMfFNDfIkub2eQCBvMuwsj1B2luNXaWc5im8E8ggVyEOrIVA22P2DaEhMFfgEqkFeKUDuiTb4QqrKvY0gny+DfO6CZTALv86cVw6vTVoE777nHkDPIKB7JuKHbaoE8kHJAtpUlT89QAZ5vwTxJl1tKz+K9vt/wydtPiFr4MCRy/xD4UKV7uPjg3+wSoDQsHj89X6wK3UC+vOvZOCT11aHgE7niy+/428YBjqnu0PtL30LWZpgus86iE/fDBWV+wzym03xrcg18c2awW4ivsX1vPg233O5aLErbXaqzGfNW4rPlMph7EQC+k33AHp6LP6hIxEe65sq2usC5jLIn6LzUqIAuFbVSBX7//ZvnvDvfwqBTVtO8wAaJ/Ljjz9CY2Mj+Pr6i2Ez/YfGw++ffLA3rxHUR01dAn7R+p+ueYU3w5d/+56/YRjonN4C+jy022nLWm7RdliK7XYjzHfCInFfjiDHily5L6eqPN+sxZ6Va4S5NLrVKL7RgJiUNKkyT0yVF6vIQ2LiVOJbtFp8owExVJmLveUIcrovj1DBPNQovvkr9+WBpuKbD4Hchvg2d4HUYqeq3ADzuUth5twlMB2ff42ZUOg+FToCfR5W6H99PsVYmfdPEjB/AoH9xAsJNj+g6b/3+ycj4Z//pw8MGpkNd7/4ln9AHMyWLVtg/vz5okqfPEN6wvYg36P//olweHlsoUMjYAno333PLywY6JxeA/osvwYIS9gAFSjDFZeZGuzWxLdcV8W3ZEV8W29VfKM2u33xrUpDfFttw2A3im8mIJ9HIC8Xlfn02Utg6qwyGDWuwI0q9Dj8+07ENq8E86fEXblclTvwIU3/f/473q33QaEuZ9FmuPUZ/zjrDRnvcXFxEBUVCvHx8fgHK+kZ24MK9D88FQFDxxeDf8xGh4D+6c2v4BdepcpA53RvLr19U7fhHhzXBuUowVGLvdikxd5D4luSffEt3GnxbZUQ30SL3Yb4ZgJzvDOfMUeqzKch0GmozIjX8uHqu24E9AUJ8KdnjeKb+r7ckUN/GPgffwiC/++PweJfL6nYATdufsk/MDrS0dEhnrFlpsfj9048/O7JB3um+4jJZQ7PdC9atg8+ucGYYKBzui137n4L2SW79AM9tg3KUIITVTnJb3ZAThPfTO/KLd+VG/aWmxjszToMdrkqj7QOcjG6NUjLYK+0a7BLIF+mAfIyUZkTzCfNWAzDxuS5DdAzEehzEeh/eDrRaZCbjvdU7klj4J/+ZT5W7CmQkb8RvvvuR36/biNffPGFmPGem52AHZ14+M1fH1TbnYTKOLzWSYHZvrVCjnNkScv1T/kPiAx0Trflw+t3df8AEtCDYlvRbN8pVeUlXXbFN2qxOye+KTDXIb5FdJf4tkJTfJNa7MaqXIH5ZIT5pOkE9Fy3AvqcBVg1PZXQ7QChu/j/+HOIeObWF9+4DxufD7v2XYAjx6/wD5L5H5Tv3IG8vDxIjI8EX/94+GvfB7Xtjt9neD3zyFPhMHHuShTj9LfdC8r3wscMdAY6p/tCP1B0n+UI0EvKthvmsFNV7pDBbtJeb7MEuXozmgHkDRogt6zKA7Eq97dor6+xBLmPJcjnWQP5HC2QS5X5xOklMGFqCQwdlQNX3u3dDWYmQPfouRYv3cVTxf67JyLgt4+Hw7/8lx/862/9ISalCZKzWuH2na/5h0rOiRMnYOFCT8jJjocR4/D35IkHC+SPv2g8f34uGqZ4rHZoSQsDnYHO6SWgewRLXzPzOkV1ni8b7PbFt012xLcW2+JbrH3xLcjmxLfVdka3ahjsZuKbusU+mdrs0wnmi2HCtBIYP7UYhoxEoF91owrd497d2SpdgP/7N77wv/+/njB4VDb0H54J7Z1n4MKl63DyzHtw89bD+VFA893nzp0L2VmJMGBYPP4B6AEBuRnMGegMdM59CHR6h04VeWGxEeS5JiDfLO8sV1XlmRLIUzMkkCcTyFMlkCfIVXlcEu0sx7fltOpUBnkUQRxhHhlt3FkeJoM8hCCOlXlgmNRep8o8gEAuV+YC5FiZK5vRxMQ3GhLjo6rKZYPdMPHNQwVyvC8XVfkcBLksvk2euViqyvFMmC6BfNyUEnhtShG8MjwLgf5wVOj2qvf//GuYaMv/z7+Ewm8eDYX/6999BOSXr95tOGTNHz919YH/2frggw8gNTUVYmPDxe/Jo30ehF3p1oAeIwNd/5KWouX74fZdfhbJQOf0GtCzsK1eQFPfVC12W+IbgdwV8S1ch/gmWuxaVXk3iG9TzVvs0xSYF8Nrk4tg7KRFMGhYFrzDQNcYOiKZ8o/gu/b/89+9Deef/nme+M9nLlzm0qE7/ILSLXAVnwx+8417jhFduxa/RwP8ICkxHp4bKEH9QQL54y8miuMM0EnGvfTOTf4QZqBzuiuf3f7GMaAjwPNRgBMwzzdW5tbEN2Gym7fYdYlv9UaY2xPfzGDuvPhWri2+yfIbwXyCDPNxUySYj5m4CAa+mslAd/A5HEH+334f6NL5b3h3T50Aelo3Bn8/mlqPud3PV3l5OQQF+UN0dDw80/9+BboWyI0wV4A+w6vaoWlxdBJztvKHMAOd011594PbDgE9I7dDVOc2QZ6hNthbXRPfLEBuKb75aopvq/SLb3PtiG/TJPnNAPLJiwTMRyPMR00ogP5D0+GdKwz03ho9Sl9/+1g4/B//wwtGTCyA5o0n4OdffnWLn6/q6moICQm8T4FuH+TK+cvzcdB/RJ6YJEmHgc5A5/RC0hft0PWDZwB6zmZxb276HK0Hxbdw++Kbj6vi2xz74hsdarHTGSNX5qMmFMLI8QXQbwgD3V3OP/+Hr5hwd/OWe8hWNDUuMTEOf29i7iOgJzgEczqP4vXKE/2SYX5Qg0NAT87r4g9hBjqnuxKf1ekQ0NOy2sWWNBOQZ9oBeZIzo1trDSCn9jrB3KbBrvUcbaGe9roZyGeYglzclU8hkC8yATlV5iPGFcDw1/LhxZfT4O0rnzLQ3eCQmPfffx8A6bkb3OLn6+uvv4bk5IT7BOiOg/zxl5LEIaA/MyhNTIpjoDPQOb0U+oFyBOipmZsgSx7fajK61Yr4RsdSfGvULb4F6hDf9I1uXaY5ulWIb7PsiG+y/DZ6YiGMlqtyOsPH5cOwsXnwwuBUBrobnf/C9jtNtvvw2ue9/vP15ZdfQlJS/IMJ9JcY6Ax0zv0L9BAC+kasziWQp2UaDfZki4UqzWJnuVh1qjbY44yb0Whnebg5yMON7XXaWe4fot1e91ba677G9rqH3F6XVp0uM8DcAPK5qudooiovE1X5ZPEcrQQmySCfILfX6b6cqvKxBHI6BHJRmeeLynw4wnzo2Fx4fmAKXH6Hge4uh+bX/6//ugBiU9cz0LvBYLcFcgY6A51zHwM9GVvrJMClZNgx2BO1DHYnxLegnhffJtkR30bLLXaqyiWY54nK/NUxeTBkdA70GZDMQHezQ8/jsgrbGejdKL5Zg7kR6OkMdAY6534CehJW49KdOVXlUos9gWCe1CJ2lscaxLdGiIlrgqh449vycKrMo+T7ctpZHq6Ibwhxui+X2+vmO8u9lcrc11J8I+mNgG4ivs1XtdgR4lSZT1MmvmFVPmWGIr6ViPvyiVSZT9EQ3ybgffl4hPl4FczH5otlLK+OyYWho3LhlZE58JwA+icMdAb6fQT0hG6pzI1AT2CgM9A59xXQ8Q6d5q8L+U2v+Bbrmvjmo0N8k0DuvPgmQD7F0mBXxDeTqpza7KNzRWX+yqgcGDwyG57Bd9UMdAb6/QH0hG6ryqWTLI4A+mAGOgOdc18BPSGlFVLSZJin2BLfpKo8MsY18c3b3774ZnyO5qj4pm6xWxff6L781bFyVT7GCPOXEeaDRmTB0/iBd/ltBjoD/QEEug6YM9AZ6Jz7DeghUss9DityWncan2wb5Ir4pg1ys3flwbaq8koTkHtovivXEN9ma4hv1GLXeFcuTXyTxDeT9vpr+fJdOULcDOSDRyDMh2fBwGGZYu/4Wwx0BrpbA71nQP54P+k8+gIDnYHOuf+AjhBPVLXY7YlvYVGuim86Vp3OtzW61b74NsaO+DbUAuZZojIfOCwLBryaAU+gEMRAZ6C7L9C7v8WuhrkE9EQEegYDnYHOuV+ATl9jEtZjZa4Bcq32ugB5nQB5sArkAdZGt4r2uqnBvkANcq278nk6R7dOs95eVya+mYJcbq+T+GYB8kwYgKc/wrzf0HR47Pk4eOsyA52B7m5A7z7pzRrIH++XIg4DnYHOuQ8r9Jh4qsxlmMebt9gtxbcQVYvdKL5V6xbfRGVuRXyb1U3im0WL3Ux8EzAfKbfYh5vC/KUh6fDXPrFw6fLHDHQGupsAvbvFtyQrMGegM9A59zXQo+Ok+3KqyukoO8uVqlzsLI+k9nqtGBITrAK5srPcN0jZWS61173kylyA3Mesve6p2lmubq/L4pv0HE3aWU7i2yR5OxrtLJ8g7ywfJ49upRa7ur0+YlwhjBhvZrCL+3IE+WgF5FkSyLEyHzBcBvmrEshffCUNXng5Df7ybAwDnYHuJkDv+fa6GuQMdAY65z4GemQsyW/GFrs98U3sLbcrvq1ySXyjYym+legX317TNtgN4huCfKChKs+QYI6HYN53cCr8+RkGOgPdHYDeQ+LbS7ZhbgR6JgOdgc65X4BOX8MR5NFKiz2q3kR8C1aJbwGhNLpVMtn9RVUuwdzXfw1W5KsNo1sJ5gtUMJdGt6rENxoSM8+2+DZFbrFPmrZYQ3wz7i0fPV5DfBujqswVmI8wE9/ozhzb6/2GSG12qszp9EWgPz84Bf70TDQDnYHey0DvncrcCPRkeOZlBjoDnXNfVejh2F6PjNE22DXFtyAt8a1Sv/g237wqt2GwOyu+jbYnvskgH6KAPFVU5n0GpcBzA5PhD09FwcW3GOgM9N4A+r0Q36yD/PH+qeI8+mISA52BzrlfgK6csCjJZJda7Ir4VmtVfPPTbLGv1C++zbMvvk28B+IbnRfEnXkqVuV4ZJg/OyAZHnkykoHOQO8FoHcnzJMch3m/VAY6A53jTglL3OQQ0EMiCea2QG52V66Ib9ZGt1qryucuFSA3im9m7fXpSnu9WF51qr4rV4tvGqNbze/KFfFteJZJVW4Q32T5TQ1yOs8gzJ/ulwi/ezwcLjDQGej3DOj31mC3VZmrgf7EgDSYH9TAQGegc3orK2uPiZGuuoEeIT1JU1rs9sQ30WJ3QXybrkN8M4W5Ir4V6hffRtgR31QtdjpUlT87IAme7p8ETyHQaf/2hbeuM9AZ6PcA6L0nvplX5erzlxeSoP+oQgFzR4CemLOVP4QZ6Jxu+8D52/fgHdGs+wcwKKxWF8i9/FZbfVc+z6K9rtdgN2+vF5tW5SYGe4HJ6Nah8qpTbYM9S4C8vwxy0/Z6mqjK+wxKNrTYn0GQU2X+FH5YPoEfpP/5aBhcuMRAZ6D3JNC7E+RJ3QZy6aTBn/smwQzvGvCL3uBQx4+BzkDndGM+/vRL8ArXD/TgsLXSUpUQo8GuwFz/xLcVusU3ixa7hvg2ZpKz4ptssNsR3/oY7suTTGBOM9zpw/Y3j4Yy0BnoPQj0XhbfNFrsapgrQJ+yAD8Hotp0f5Zkl+yCS+/c5A9hBjqnN4BOprtvSB1W51XgHyKDHC12PxnkPorB7rdKiG8E8oXeEsg9vGjVqVSVU4tdXZWT+DZ9rvlmtDKYNFMy2CeqQT4VIT7FzGDHryMnyCAfp6rKx8ogH62qykfK0hsNiUGYC5C/KoMcT99XNNrrAwnk0n05tdgJ5E/IMH+sbxwDnYHeg0B3H/HNGsydBXrR8v1w++63/CHMQOf0DtDxfiykUZr4pjbYbYhvxlWnjopvpaIqnzhdh/imZbDLd+VDdIhvLw2xLb6ZVOUvEcyNH7iP9eUKnYHeE0DvbZCn6AK5OCjD/fkFx4FeUL5XfP5wGOicXgK6Z0g9muzGt+X2xDdLmDsmvimz2B0X35QWe5YN8S1NiG9aLXa1+CZV5gkC5uYfvAx0Bnr3A909xTdrMGegM9A59yvQg+sR5JUyyHtefBunR3xzYHSrlvjWV67K+6jeltuqyhnoDPSeAbp7i29aIH98QDo8MTADHnkuASbOW+2QFMdAZ6BzujkfXr+r+wdQtNwR6D7+q+SqvOfFNwPMJy3SEN+UFruz4ps0i53Gt9oS35T7cgY6A73ngO7+4pslzCWgP4p/EHj65SyY7VeHL2ZaGOgMdE5v5bvvf4KGtrP6fghDmwXQvc0Ndm9rQ2IkmBPIZ5qB3CC+zdAQ3+wa7Pk2DHZje126K8903GDvZx/kDHQGevcAvbfb6/9/e+cBXWWVtu1Z3/+1mfX/U7+pCqkkIfQSQhJ6Exh610BCElIo6Q1SIAm9C9JEmoLSQVFE/RwZLKhYkHHU0RH7WEYBB0EExOff+z05yUlI4LynJOfkXNdaz0JZ6sLkPe+VZ+97P9txkVvLr32B9B21WtLy9huT4uwVetG8w/LBR2d5CSN0cCX66IjdZ0e11FM2qfT6GlU3D77pZfabTXy7YfBt6A1Gt14XfCt3KPhmZokdoSN01wndu4JvtUVuLf8OhdJz2EpJNrHcrodZ3bv7JfnnV9/wAkbo4EqOv/SBKaFPStmsAm93yUQl9Yn1La/fKME+drnN6FbLxDd9HO26BPtQLfKFNUU+yHZ061xD5N36W5bXtcz1cbQoQ+RzKuewW46jdbJdXo9SMo+2HkernPimRd7FfpEjdITuuNC9UeR1y9wi9Jmmha6HWV258j0vX4QOjS70KZsMoTueYHdt8C2mb/3Bt872BN+6WLvyAtPiQOgI3ZzQvTH4Vr/MdSCuebtCif7jMknJ2Wf3e0QHcfWUSkDo4GKOHT9tv9Bn7JSJSRslduIqS2c+8S4ZP9HmznI9JGaCLi1xS2euRT5CnSsfWnlnuZa47s4HWYNvw5TMh9YMvhlnywdVD4rpaV1i72+zX96nsjO3Db71qLlfbnTm0bozn1Vzv7yLknlEZWfe2XFxIHSEbr/QCyxCt7cz7+w5wbe6a7aERJZKqJL6sEnqCKuJQBxCR+jgJs5/850sWPmk/VKful1uj1srE5TAbxZ8q7FX7kjwbeDNg29d6wy+ldTRlTsWfEPoCN0lQu+qhN7B04JvxQ6JPCzKUoGd1epX3wUyJWu3ejfsMDXH/czZi7x8ETq4g/XbnjO17H573DrVla+8afBteJ0T35a4NPimq+bZ8urgW3sXBN8QOkJ3vdC9K/hWQ+Y2Qg+KKJa2veZK/IwHTN3auGjVn4wTNoDQwQ2s3vi0CaE/IOPUMvtYJXD7RrfWnva2uMboVntErqsq+FbrXHmE7fK6bfDNtiu3Bt9cJHKEjtAdE7p3Bt9qi9xW6LpDNyt0LmVB6OBG5i5/wpTQx8evVyJfURl8W1lv8G3IKEeDb5Yl9u79Gz/4htARuluF3pjBNzOdeS2Z673z4C6lMjJ+syRm7ja13P7cifd56SJ0cBen3vhUHTux70MZp4NxadtVR75cRjmSYB9Sh8gHzquVYK8wltevE3mvOka3dnN8dCtCR+gNJ/TCmkJ3ucgbpiu3yHyOUVroYxO3mha6PlkDCB3cyIzC/XYLPTb1XiP0drPgm+OjW61L7HYE3+oc3TrTbV05QkfoTgvdi4Jv9ck8LLpM/DoWyYj4TaYuZVm69qhcvnyVFy5CB3ehP2DTCvbZL/SUe1VHvtQi89H6OJoSeWXwTQ+J0UKvSrAPrXVn+aAFRlfeu/LO8p6VIu/Rv+ad5bor71rjzvLKm9Gq7iwvrhZ51Ey3L68jdITutNA7NuLo1kjXiNxaQRElEjFgsTr1skPtoe+0W+jrtjzLCxehgzv5TgndzJKZlvrYSetliOrCbxh8G+pc8M0yvtV2r7zhg28IHaG7ROhRWujeF3yrS+a6mnecJYMmrJO03H2mZrjrvA4gdHAjV69eM3V0LT5jj4yLv1sGqw68+s5ym/3yIXXslw+sI/jWT++Zl9UMvvWyXKoSaSyxl1hk3q2u4NvM6v3yiOrOvCHFgdARuv1Cn3kDoXtm8K0+mYfFlEmzDkXSe8RqScmxf+RrUuYuOfrs33nhInRwNx9+ctZ+oafvlnGTNyqBL3Rr8K2zPcG3BlxiR+gI3bVCb+zgmzmRh0brKpMgFYZr12u+3JG63TiyZu97Q+d0AKFDA/Dyax+bWnbXH+ShY1eobnxB/cG3wbWX2M0F3zp5QPANoSN01wvdQ4JvDshcl3/nYrV/vkRSsveYWm5PydlDIA6hQ4N8185fkiV3PWVC6Ltk2Lg71XnyeZVdea0Euw6+VSbYe9Y6Vx7dt47gW0+b4Jt1eT2muP7RrY0ocoSO0B0TuptF7uLgW22RWyvACMQtMTW/XVdG0UGEjtChodh54FUTQt8pt6dsqzUkpmbwrdcNgm9R9gTfai+xN0LwDaEjdJcL3UuCbxaZ1xR6SJTl78eo8+cJ6eaEfuLVD+WHH3jPInRoELY88KIpod+Rcp9xK1q/epbXe1jvLK8rwW57Z/l1Ii++QYK9wGPEgdARuv1CnyUtOnmTyMvqreDIOTJ+yr2mhf76m5/ykkXo0FDom9eySh60W+ixadtlwLAlxtJ6XcE3XdcH3+bU0ZXXE3zr6llL7J4q9A8//FASExOloqwQoXuN0BvqbHmp0125bbXoOkfa9lpgBOImmwjETVeBuL+/9yUvWYQODUn6rAN2f0gTs/bKqEkbJKbPbEPmPW6zLq9XilwPielbVivBrqoy+GZ05fp2NC1y1Zm3i7ZdXlciV7+Gd/E8kXua0M+fPy/r1q2TgrxpMvaOfLklLN8jtiQQuo3Qo22F3rjBt1AHO/Ow6HLjuNrACesl1cRxNV2b73+RlytCh4amYtnjdn9IJ2fsljHxG9V58jKbrrxmgr128C3CruDbTI/tyj1R6JoTJ05IwuQ4KSzMV1/TfGkejtA9T+jeE3yrWeVGhai/DlT/7SGxGyvvQLfzPZG+U/Y/coqXK0KHhub0B1+Z+sk7IXO3DBi+TKJ6ldrsl8+5QfCt2P7gm4eLw5OEfuTIEbnjjlgpV8vu42LzJaC15c/nazLXz82//XyS5BTd72FCL6pf6B4WfKtL5qEx5eIXUSxdBi61+yIna+XNOcSLFaFDY/DRJ+ckycRP31roA0etMIRuanRrdJFXBN+8RehnzpyRoqIimTYtTYqL8tXXNV/8Wvne0vstoekS2CZb3n3vC88XujeIvFLmugK6qM/4kBWmunNdyer8OSB0aAR+UOdK9h56zVzaPfU+ozPXEr958K3Yq4Jv9gj9zb/9wyO+d4899pikpqYqoefJ1Gn5Etw+X/4Q5kuduurOfzZR8kse8Ijvx9WrV9UPWYWSmVmH0D04+FaXzFuof69l97kyQZ1sMXMZCxeyIHRoZMyeR9fTorqp/XMt8Krgm21XXt/o1kjvFHltoZ889YHHCCQnJ0fi4yfL7JI8ycwqkEEj8iWkg1qCb2PZV9dde1OsZi1z5Se/iZPpuds85nN0+PBh1Z1PV0LPqxa6l4m8Wuhl0qrnfHWyZYdpoX/2xXleqggdGotnnj9tLJOZWXYfHrtOOqrgT1MLvt2sfhs0TcZMXOUR37dr167JyZMnZdGiRZKUNEVys6fJ7NICSc/Ik76D89T3Jk+tpOR7fcX0zVNbO5bq1r9AOnfLkFtbjJcVd271qM/R4sWLZcb0JOk3dKb4tSt2ffCtq+uDb7VFbqkK8Y+YLYNu3yBJmeaW23NKH5JPP/8XL1WEDo3JzLmP2H+LUrY6vha3UdopWWuZV92Mpn41jqPVvlBFdebh6lct8pZevsyrhd5dnb33NJ5//nlZtmyZJCdPkfy8LCksyJK83BmSkZ4qWZlpXlv6z5+bM0NmFmYZlZGeIsuXLZAXXzjmcd+DNWvWSm5WsvQcPEtubVviIpGb7MqjHBV5RY3y61wqwybdowJx5o6rHTz8Oi9ThA6Nzep7nrH/fvTpD0iCOsLWfcB8aR2Rb+fo1oImsW/764A0GT5+hUd+D69cuSIff/yxfPHFF0YdO3ZMKioqZOXKlV5b+s+vE/3W/6dPPvlELl686JFf/61bNqkfqJIkqn+R+Lcv8YrgW11C19155KBl6jO+0/is2/2DvgrPPfUM16UidGh0zpy9aP9P4lPvl8TMPTJy0t1K4rMMiRsyVx1728iawbeWSuhNKYjlF55p/HDyzPNv89BAFXp636IFJTJ0dKbc0qZEWnrNfnnFddWsU4l0G7pS0nL3qbyM/d35rHmHeRAQOngCX525IGn55pbXJqfvMia/te5SUJ1g9/Lg283PPRfKj34aKxkF9/HQQBWPPHJYUpMnSMIUtdzepsQrgm91yTw4SgXioitkbNI2mWwyDLd07VEeBIQOnsLjR/9matk9Pn2n2i9cJOGdcquX2JuwzK31H7+MlxVrjvDAQBUnTrwgU5LiZMDwmeLfocQrgm91VWDXMuk2bJXpMBzpdoQOHsbTKu1u5gKGxKw9Mn7KNgnvnG+IXO+XN4Xgmz3L7jrR/8Zbn/DQgDHkZ9nS+TI5KUsClMxDPTb4Vr/IQ7vNlbDu86S5CsONStgiyVl7TMk8KXOXsW0HCB08hKtXrxn7YKY+yCoF22vIUglqk6XEXuATA030SsSP/u8d8qqHnEeHxuXs2bMyfVqSWq0qUWG4Uq8IvtWWua5g9e+Eq7Pn45LvVYE4c1elHv7fN40hVYDQwYN4+bWPjXSr3WMec/dL3+HLJaBVhk+NHP1t4DTJ9YD54dD4HDp0SB2xmyqRfYssQvcykVtLd+f9xq41HYbTdez4uzwICB08ETMfZL2Xrj/8rSJmSlDbLJ8RekDrbLklZIa84SFjYKFxOHPmrFTMyZXR49PFr12phHbx/OBbXTLXe+fhPecZn2UzR9V0FZQ/LJe+u8rDgNDB07h85XtjFrO9H2b9Apiilt37jVihJJdpzNf2BaHrrMB//CJOpuds46HxYR4+dFDi4yZKZL9iCehYKi2jHBX57EYRua4QVUEq3d5/3DojDDfR1EmXnfLci+/zICB08FT0DWwpZkbBqv02Pd9d7y2HdMjzmS7957ckS1zKBvnmm0s8NL745vv6nJQU5cr4SbnSTHXn4VGeHnyrW+ihKgwX0KVMxiff51C6HRA6eDirNj5t6kOdovbS+49cKc1bpvuM0K1d+rFn3uKB8UEOH35YZkxLkC79SsW/02yv2i+vrnlqub1cOvRfanTmZs+eL1/3Z/nuMsvtCB08mm27TpjaS9PL7oPG3iWBKu0e2tF3uvRbQ9NlyJhl8tHHZ3hofIgLF76RwsIcGTwqW4JUmCwksiFEXuZCkVtkHqLKX3XnQyZuktScvabCcPqo2nsf8twjdPB49F56/Axz4Rh9Lr19t1KfSrzrs/c/+vHt7KX7GE8+fkDGjk+QW9rOlhZd9N65K5bYG6ort8g81JD5HGnfb7EkZu4yvdS+cNWTHFVD6OAt6JuTTAk9c48MmbDW6NLDOvrOETY9aKZ5ywx5jXPpPsH7759W3XmBRPbJlYA6l9rrFnlYIwbfaovc2p0HqOX2IRM3mhZ6Wt5eeff9r3gYEDp4C+e+/lYyiw/a/SGPV/tvk1VArlOPOdKiXY7PCF1fRKPHwebM2sFD4wOsWFoiMf2mye/blHtP8K2WzHUQLii6QjoOWGok1c2uxul/BxA6eBl7H3rN1Ac9OW+/DL1jvfi3SvepQTP60paf/DZRFi4/xEPThHn5xaOSkDhVLbEXq73z2V61vG4VubX81HL70EmbJDl7j+nl9p0HXmW5HaGDt3H+m+8kd/ZDpu9KbxdTIreETGvSl7TUrmC1KvGj/54gBw69xIPTBPnk47dl1JhYCepYKP4dZ6tjat4RfKtL6H4qCKeT7frIadx0czKfUbhfzpxjbjtCB68kp/QhE4NmdkhSlr4rfaNE9K6QoLbZSuo+0qWrH15+5Zcqt41YLBcufseD08RYtfpu+V1YupL5HJsQnJ1DYjyoM9d754FRFfLH2I0yJcvcIBld2/e8zMOA0MFbOX7ifVMfeC315Jx9kpZ/0NhP9w9P95lOXQ/X+fFvEuSPY5fK999f4+FpQjL/ZVCqBHYuq5S5dwTfass8rMcCaRYxx5gKp2e2m11q10fVvjpzgQcCoYO3ogdHlCx81CGpD1P76UHtsiWkQ64PDZzJl//6VbwMGrVEvr10mQfIq/lB7ly9QX4ZmCrN2uvjabPdE3yLdk/wrWbNN4Jw4b0WSqz6fCZmmD+qtmMv3TlCB69Hz2s2++G3Dpzp0H22OtqV7lP76fp+eKNTH7NUvuPiCq9l5SqLzC2deWMH3xwXubX8Isuk3xjVnefsM37oNtWdq+V5nakBhA5ejl4+1ntnZoWuj7GNT9oqbboWSYv2OT6WfC+Q/1TH2QaPXiqXLl3hIfI2mRudeYo0bz/bnMw9JPhmK3JdesRrWI/5lTeqmf/h/P59r5BsR+jQVLh69Zrp86q6C5hacFBuG73K6NJ9SehWqetOXS+/X/yW5XdvYcWdG+QXAakS0LHuztzjRN69fpFbKzh6rgwYv96hpfap+fvksy/O82AgdGgqXLv2gxw4/BfTLwN9lE13BK27zpKgNlk+J3W9/P6fak/9j2OWyaXv6NQ9nTnz7pZfByeLn5J5eLTZzrzxg2+1Ra678mYRZRIzdLVMzdtr+r5zXfft4SgmQocmxz+/+kYyiw6aT8eqo2y6Sw9Wx9h8TejWm9msnfqZs9/wIHkgOvyZMGOr/J/fTJXgLupoWrQ3Jdjn11tB0Srd3nOBjJ1yr+rOdzqUhfmWLSOEDk2T3Q+eNL30rrsCvfTeY/Biad5yhk8F5GyPtP2Pf5qxDF+x+CAPkgex8d6npV2Pcvl1aK6Ex5R5dfCtRqljav5dK2Tk5C2Skr3HdBAuJWePPPn0OxzBROjQVLly5XuHlu10lz5+ylbjetXgdr7bqf8ueLr8+y/iZMGyh3iYPIDN25+Rn9w6w5C5lnftzjzUoc68rNE7cy3zgKi50nngcklwYF67rkWr/sQDgtChKaOTrmZvYrM9mz46/h6fuze9doV0yDPEPmD4Inno0VfUD0kcbWtIvld5kD89/ZYMjV0jzdoWSkCHIgmL9t4Ee81aYMi8hfrrW9Xe+fD4zZbu3IGl9tPcqIbQoemjp0Wl5e81/YLQN7IlZu6WiF7lEtA6wyeX3q2dupb6T/8wRX5+a4p0H1gh584xgashePjxUzIu8W75eUCm/DQgQ4IjitUy+xyvDr7VlnmIqkCVau87dp1DqXZdi+96iocFoYOv8MWX3zj0otAXQui709tGFUtg60yf7dKtU+X0rz+7JVk69ygxluHPfX2RYTSu7sjVHvDjR9+QEZPWKpFnqOX1HIu4o2c3KZHrCuu50Fhqb9lroXHN6eQZ5oNwxQse5aFB6OBrLF/3Z8eW3nP3G6n35mEzfHrp3TYw9yu/NPmfAEtobuDIxfLIkVd5wFzA40+9IWMS1stvlMT/+w/TJCSyVO2Tz2k6wTcbmesKipln1MiELeqHZ/My1z8EHDt+mgcHoYOvoffTK5Y94dhYWLWf3m/ESglqm+XzQrddhvdvlSW3hqXLv/1sokycsl7SsrbIqdc/rPp6w82fydMffCnpM3eqvePthsT/0EoFMTsXN67IY9wrcmPfvJvlmJo11e7I5zKjiBMYCB18lhde/sCY8+zIfro+yhbZp8Jnj7LdbCDNL5unKrFPkrZdZ0mvwfOl24AKOfLEKXnltfeNeub42z7+7J2WV059oOpDefr5d+S2sXdKtz8ulk595sm//zZVfqaW143hMPXcW+7twTfb0mfN/SIrpNPAFcataHEOyvzNtz/npYbQwZcpKH/YoW5AH2UbpVLves67niKH1OseH9s8PFN+32K6Ub8JnCq/DrDUf/1qskzN3iLL73rUzXWk7lpzs3rMZD0uy9faV3mz98j/81PHzUKy1Z54trGk/vvwPKOatS2Q8CiTIo9yh8gr3LZXXrMWqhDcPGnff5kxlVEvmzvyedx76DVeZggdofs6+qf6GYX7HTzKtt+QupY5++km994ru3g9hc75SrTUb2tXUh01RX78O2sl21Ttv0+RH/++rkq9vv6QdoOaWrNumaq673TVfeu7yesrE3eWe1nwrXYFRc83pG78kKz2zc0OkNG1cNWTKpD5LS8zhI7QQeSRJ95wqCvQNa3wQekzbJncGjINUTdKqZWRznVVYd0VMfMGNau6utSuovorsrieKqlZXa1lXuYe15l3d74z19WsS7n0GrVGpuitr6mOfQb1qRVA6AgdDM6euygL7nzSoZeJ3k+PTdsu7buVin94BkvviNwDRO6ZwTdbmYeoCoqZLz1HrpFkJfN4ByY46iT8roMn5fKV73mJAUIHm6fhX5ccErpeItT76Xr/r2P32T47GrbBZd7JjMwLXSzzYtfL3F6he2nwrXZn7hc5V9r2XSrJKtGuR7s6Mg2usOJhXlyA0OF69EjNnQdedVDq90ta/gEZPvFuaRY6zTjChXTdJHGXiXymx4q86QXfqkUe1nOR0ZnrGha3yeFpcPp0ysnXP+HFBQgd6mfPQ685dBmEvvRlsno56VvZ/MLTEXBT68ojHZF5CcE3G5mHVi6zB6hU+/B4x8+b6zryp7d4WQFCh5uTnL3b4f10fYlLryFL1X56Osl3t4q8wDmRR7hT5A2VYC/zAJHPt0vkeqyrlnlgjJJ53GanZF4077CcUbkXAIQON0QPNHvl1McOv2ysUrd26kid4JuvBt9sq0XlxSvWG9Qc/XyVLjoiFy5c5kUFCB3s569vfSaTHVh61/vp1VJfIgGtM6suMqE8oDP3uP3ypht8qyrVnd+ijqfFDFst0/L2OSxzXW+98wUvJ0DoYJ7ypY871amn5h2QLn3KjU6d42wE324q8iYSfLMVeVivReIXNVdaq0T7hJT7jM+Fo5+prTtPyLeXrvBiAoQO5tH7dPllhxw+zjYle6+MnLRRAttkcZyN4FvDB99iGlfmoSrR7h81T8L7LLF8HlQyfaKDw2Pu2f4CLyRA6OAcFy5eNvbtHJW6vm51hDrOpm9mC26XQ6feZIJvJQTf6hJ5jc58nrTqu8SQeJI6AeKozJevO8qLCBA6uIZPP/+XU/t+KUrqw2M30Km7JPhWyOhWDw2+Wbpyi8z9o+dLK9WZxzrZmet6/c1PeQkBQgfXcPXqNdm84wWnpK479eETN6hOPZtO3SOmvRX50PL63AZYXrcssVs789a6M9cDYDJ3OTQFzlovvPIhLyBA6OB6tjzwonOdel6l1NtYlt+RedMOvoX5QvCtRme+WHXmepl9aeVI5N0O3Z5mrWdffI+XDiB0cB+bnOzU9fL7sFhrp57tY516Y4u8iNGtLu/KLZ25LmPPXC2zG6NZM3c79Tl54eUPeNkAQgf3s00dn5mcvtO5PXWfC8oRfGtqwTeryI3OvFLmRmeul9md6MyzSh7kJQMIHRqOxMxdLunUA1WnrofPNO2Jcq4MvvlSZ17uocfRqmVu7cyrjqapztyZPfOMooPcbw4IHRqWZ54/7ZTQ9csvMXOP3JF6XxMeE0vwreES7HMbVOQ6/Naih54AV2EMjTGOpjnZmWcWH5QzZ5nRDggdGoHn1T6fM1K3XAO5p4nOfnflEvtM80vsBN/cEnyzCj2om57Nvkiih682JsAZnbkTR9PSZx2Qz744z0sFEDo0Hsdfcl7q1be0LTGk7t33qftG8M1pkUd7Z/BN75drmQfGzDduTZuat9e4btiZZfbs0gflLLenAUIHT+C5F993evk9Pr36lrZbQ6d5aQLei4Jvkd6+xN6wwTdrBXabLwGVMnfm1jRrzZi5n84cEDp4FnoAhis69YSMXTI89m7p2H22cac6y+vuWl4v8eDldU9IsNeUeYj6fd2V633zYS6SeU7pQ+yZA0IHz+SZF95z+iUXN/0BSc0/YPzaPqZEAlpleHin3gSDbw0i83KPD75Vy3yRNO86V3qMXGM8owkZO51+zqcX7ifNDggdmn6nbpmytcfo2LXU9b56i/a5HiZ2EuweP7q1u3Mit4bftMx7jlprzGRPTHde5tnqnPmXX13gZQEIHTwfPbLSFVJPVMlhLfUht69TQblcD9pXd9MSu1cF3+Y0jeBbPULX4Te9xB6i/rrX6LWSnLXbCL85+1zrc+bIHBA6eBUvuqhTn5y+S1LzDsio+HuMqXL+agm+cY+2NXLwzYzMI33xbLnz++V6n7x513nSbsAy4znUR9LipzuXZLfK/PN/EoADhA5eyHMn3nda6rZL8LGp26X30GWG1HXHTvDNSZF39fUE+/VdueVI2gLpNGilkeNIzNjlkmdYj3M9+/W3vBQAoYP3clxJffFdT7lA6pYhNCmqW+8zbJk0C5thXPDSsjNnywm+OR9806X3yrXMRyZsVV35LklQ++XODIvhaBogdGiSbL7/RZd0OrprSsjYrZbgN0mXPuXqzPp0N17wYlLknRnd6m3BtzBVAdHzxa8y+DYhZbuxxO6KZ1XXE0ffljMMjQGEDk0NZ+9Tr325i/6128BFhnwD22Q1sSV2gm/uDr6FGjK3XKzSf9wGSc3ZUznCdYdLnlE9cAkAoUOTxdn71GsPotGBuXFJWyVcCTWwdaaxt+5ct87oVpcfSfO4BPsiCVZ75frKU71XnqjOlSdnu64rN+4zV6FQAIQOTZ57d78kmSrx66rAnL61TR8pum30KuPMuuPDaAi+NfUEu65bI+caAbgRk7cY++Su2iunMweEDr759J2/JDPnPuKyl+hklUaekrPPuGO9c68ylYTXw2hyCL5dJ3JfCr7VlLk+V64785jhq2XslHuN8a3OXqxiW2s2Pysvv/YxH25A6OB7XPz2skulrrv1ZLW3ruU+YtLd0jaqSJqp0Jw+t15/x+7K4BsJdk8LvlmPot0SUS5RQ1fJeH3VqZ74lrHLZXvlurbuPMEHGhA6+Dbn1NncbeplGDfddVK33VuPHrBAWqh99YDK/XXvD76V+FDwzfEldj3hLVj9INBMpdd16K3v2PXGCQkt8zgX7pXnlx2S/Y+c4oMMCB3Ayl/e/NSloSTrlDmdhtdi7zZwoTEP3jKURnfshSTYm2DwTXfk+npTfRStZe/F0m/ceolN2yFpOXtd9kOjtYrnPyoXLl7mwwsIHaA2r/7lE1m29qhLX7rG6M7svUZwbmzCFom5baGEqCV4Pz1CVnfpnixzM0In+CYtui9UgbeKqo5cf++TMndVLq+79plavfFp+fpfl/jQAkIHuBG7Dp5U3fVOl76AdXdmnQuvO/bugxZZluLV+fUWumPXcvaqBHspo1tV6SNouhvXpUXeT50n1/LWZ8r1/HVX/3Co669vfcaHFBA6gL3o6VplSx5z+ctYL8UbHbvaSx2XuMUYTBOq9tH9wjNdEHybRfCtAYNv+hKVZpFza3Tk+lY0yzG0HS5/duav/F85+fonfDgBoQOY5fLlq1Kx7HG3dFmWEbJqjz1vv4xVYo8ZuMjo1IPUPnuLjvnSUsvZrTejFXvwufLyhlte726+K9fHz/xVR97K6MjXW043ZO+WyTN2uuVZ0aVXjQAQOoATXL16TU698anaA9/llhe19SY3XeOnqPDcoMUS2nmmNFMdu5Z7tdgJvjXqErsqv6i5quZJeO9qkVedJZ/qHpFXLHtC/vHZv/ggAkIHcBV/f+9Ll86Cr6tjT8zcLckqDT0mYbP0HrZcuvZfIP5tciS4Q4EEdyyQUC32RunMm2Dw7SadeZiqFuqfCVLdeGDMPOMIWo+Ra6T3mHWGvK23obnredDH23Y/eFIuXbrChw8QOoA7eOf0P2X5uj+77UVuPe6Wln/QOM8+LPZu6dizXFpHl0pQh3xp3iZbQlQH31KLmQS727pyP5VW10IP77NYooetlvHJ9xkXp+iOPM5NYTfbu8v1D5AACB3Azfzwg2UefFr+XreKXQt9SqVAdPUZsdJYktfi9m+ba4g9pPMsgm8uCL616Lag6sIUvbTeceByGRa32ejCJ6sl9Slu2nKpvbz++NG/8QEDhA7Q0Hzx5Tfy6JNvuv1FbxW63mdPVSG68cn3So8hy6pE7t8uT/zb50sL3blrSRN8u+nyepiqEPX7+h7yACXwlur4mQ65DbpjowyL32zcgGa9l9zVA2GuuwdA/cCwcsMxPlCA0AEam6PP/t3ortwt9qpjb0rsOiE/Se3ljoi7Rzr3nS8xg5ZI65jZcmvrHAnqWGjIO1SfPe/iiaNbGyf4pgUeon7PXwm8WZdyY3+8y+CVakl9lUxIuU9idUBRdeL66Jn+AcpdQTfbWrH+z3L6g6/4EAFCB/Akjh1/VwrKH24QsWvh6CX5BLXfrs+16859XNI2GTx+ncQMXiJBnXS3XirBakk+oEOhBCrJhyqxt/Q6kTt+M5ruwoOi54l/1wqjCw+pFHw/dWZcd+JDJm4ywmdTsnYZXbJOqzfE907X2s3Pyqm//oMPDSB0AE9Fp5Kff/kDtwyluVnnrrv2NCV2LfqxiVuNjrP38JXSvleFRPRbKEGdi6R5uwIJ6DjT8eBblKcE3+oWeguVSPeLLFdL6RWqCy+Ttv2WSOdBKyRC1Rj1A8+ElO1GF67DbdYl9YaszOKD8tEn5/igAEIH8Cae+PPbUrzg0YYVu6r4yqE1unvXv+rjcEmqBqnuvd+o1YbkW0QUW0otyQerX4MiilQVG9JvEakkr+XszpvRnOjKg6LnSmBURVUFq78PjlF74Wo/vHXvxXLbhA2qC18nvUevlTvStkuykndihuWYmTuPmt2sHnz0dTl77iIfDEDoAN7asb908iMprHi40URiLSNUl7vPkPvohC0yevJm1bGqgN3QFdK6W5m07z1POvZdYMi8WfuZ4texyKjmHWdJcKTq2rWgGzD4FqbkHdC1XJp3maO67jJLqa67jTpK1qH/Ummvuu9WvRfJQCVwfaxs5OQtxq8pOXuMffDkqqEvOxrta54+64Dct+clhsMAQgdoSjz21N8afCm+votidNduLX0RjWVP3nJf98j4TRI9eLn0HH6nUX1Hr5Y2veZJsw5FEhhRYlOlRgXoX7vMluCuc2pV2fUVpau8qgKVpANUBRpVXl2VIo8cvEL6jFkrPUfeJT10jVgtd6RuNzpu/ec1ViPUn18voye5ediLmdqw7bjs2PuKfH2eG9EAoQM0Sb7//pq8cupjyS550CPEYyt5XXrJXi/Vp+TsNTpcXWl5+4wU+JDYjTI8btN1NTpxiwwYt05adquQ1r3mV9YCm7+2+b3eC4xfw3vOl3Z9Fxn//kh1TMzy39pcXer3hk66x5B2Wq76s2TtsVR29S1mcQ1wpMzU8TP1w8SSu56SN9/+nAcdEDqAz4j92g/GEBF3Xf7i8sCdkabXM+d3X1fWY3SxaTuMf9aeiq1cBtfL/3pVICnz+tK/H99Ax8ecrTUqtf7Oaaa7AUIH8GlOqD32I396y5Cjp4vrRqXla6bcPULV3ZU355DxvfvLm5/yEANCR+gA1Zz/5jsjQKWXbb1ZdE259Jx1/f05dvy0fHf5Kg8tAEIHuDFvvvO5PPn0Ox4RoqMs41mPPPkWITcAhA7gGFeufC+v/fUfMmfxYw02hY6ylP6aL1171JjZ/+WZCzyMAAgdwDXohPyBw38xSs8AR7qur6n5+4yv79Hn3uWBA0DoAA2DvtRDiyd39kMyrWAfQnag9NdOT/N7+91/Gl/Pr+jEARA6QGNy5txF2bbzhFGlC48g6xsdMdv0jPF12v/IKR4cAIQO4LnofXd9lEqXXprX3bsubz8WZ7as/9+6HjzyetXXBAAQOoBXclkdr9Kl54mv3vh0VXnSlDVXVH7Zoar/N338z/r/fZnjZQAIHaAp896HZ+T4Sx9U1Z13P22ML61RMx7wmLGqtUuH12z//N9eusI3FQChA4Dm3Nff1ih9XGvlhmOy4M4n6y1nZZ1d+uAN//u7Hzx53Z9LFwAgdAAwwWdfnJeP/3Gu3trywIsya95hh+vY8Xdv+N+/cOEy3wQAhA4AAAAIHQAAABA6AAAAQgcAAACEDgAAAAgdAAAAEDoAAABCBwAAAIQOAAAACB0AAAAQOgAAAEIHAAAAhA4AAAAIHQAAABA6AAAAQgcAAACEDgAAAAgdAAAAEDoAAABCBwAAAIQOAAAACB0AAAAQOgAAAEJH6AAAAAgdAAAAEDoAAAAgdAAAAEDoAAAACB0AAAAQOgAAACB0AAAAQOgAAAAIHQAAABA6AAAAIHQAAABA6AAAAAgdAAAAEDoAAAAgdAAAAEDoAAAACB0AAAAQOgAAACB0AAAAQOgAAAAIHQAAABA6AAAAIHQAAABA6AAAAAgdAAAAEDoAAAAgdAAAAEDoAAAACB0AAAAQOgAAACB0AAAAQOgAAAAIHQAAABA6AAAAIHQAAABA6AAAAAgdAAAAEDoAAAAgdAAAAEDoAAAACB2hAwAAIHQAAABA6AAAAIDQAQAAAKEDAAAgdAAAAEDoAAAAgNABAAAAoQMAACB0AAAAQOgAAACA0AEAAAChAwAAIHQAAABA6AAAAIDQAQAAAKEDAAAgdAAAAEDoAAAAgNABAAAAoQMAACB0AAAAQOgAAACA0AEAAAChAwAAIHQAAABA6AAAAIDQAQAAAKEDAAAgdAAAAEDoAAAAgNABAAAAoQMAACB0AAAAQOgAAACA0AEAAAChAwAAIHQAAABA6AAAANCYQr/K1wEAAMCruaqF/lFll05RFEVRlHfWR/8fnvlB7dQXjEsAAAAASUVORK5CYII=</document>
    </module>
</modules>
PK5~�[~@��1bbb/tests/fixtures/presentation_with_filename.xmlnu�[���<?xml
version="1.0" encoding="UTF-8"?>
<modules>
    <module name="presentation">
        <document
url="http://test-install.blindsidenetworks.com/default.pdf"
filename="presentation.pdf"/>
    </module>
</modules>
PK5~�[��w
��,bbb/tests/fixtures/presentation_with_url.xmlnu�[���<?xml
version="1.0" encoding="UTF-8"?>
<modules>
    <module name="presentation">
        <document
url="http://test-install.blindsidenetworks.com/default.pdf"/>
    </module>
</modules>
PK5~�[�o�\\)bbb/tests/fixtures/publish_recordings.xmlnu�[���<response>
    <returncode>SUCCESS</returncode>
    <published>true</published>
</response>
PK5~�[�i*�XX(bbb/tests/fixtures/update_recordings.xmlnu�[���<response>
    <returncode>SUCCESS</returncode>
    <updated>true</updated>
</response>
PK5~�[�#o,,bbb/tests/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK,�[BT�=-a-a&bootstraprtl/css/bootstrap.rtl.min.cssnu�[���@charset
"UTF-8";/*!
 * Bootstrap v5.0.2 (https://getbootstrap.com/)
 * Copyright 2011-2021 The Bootstrap Authors
 * Copyright 2011-2021 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
 */:root{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-font-sans-serif:system-ui,-apple-system,"Segoe
UI",Roboto,"Helvetica Neue",Arial,"Noto
Sans","Liberation Sans",sans-serif,"Apple Color
Emoji","Segoe UI Emoji","Segoe UI
Symbol","Noto Color
Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation
Mono","Courier
New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255,
255, 0.15), rgba(255, 255, 255,
0))}*,::after,::before{box-sizing:border-box}@media
(prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-font-sans-serif);font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem
0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:calc(1.375rem
+ 1.5vw)}@media
(min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem
+ .9vw)}@media
(min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem +
.6vw)}@media
(min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem
+ .3vw)}@media
(min-width:1200px){.h4,h4{font-size:1.5rem}}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline
dotted;text-decoration:underline
dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-right:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol
ol,ol ul,ul ol,ul
ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-right:0}blockquote{margin:0
0
1rem}b,strong{font-weight:bolder}.small,small{font-size:.875em}.mark,mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre
code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem
.4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd
kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0
1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:right}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:right;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem
+ .3vw);line-height:inherit}@media
(min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:right}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}[type=email],[type=number],[type=tel],[type=url]{direction:ltr}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem
+ 4.5vw);font-weight:300;line-height:1.2}@media
(min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem
+ 3.9vw);font-weight:300;line-height:1.2}@media
(min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem
+ 3.3vw);font-weight:300;line-height:1.2}@media
(min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem
+ 2.7vw);font-weight:300;line-height:1.2}@media
(min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem
+ 2.1vw);font-weight:300;line-height:1.2}@media
(min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem
+ 1.5vw);font-weight:300;line-height:1.2}@media
(min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-right:0;list-style:none}.list-inline{padding-right:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-left:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px
solid
#dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:#6c757d}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{width:100%;padding-left:var(--bs-gutter-x,.75rem);padding-right:var(--bs-gutter-x,.75rem);margin-left:auto;margin-right:auto}@media
(min-width:576px){.container,.container-sm{max-width:540px}}@media
(min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media
(min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media
(min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media
(min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(var(--bs-gutter-y)
* -1);margin-left:calc(var(--bs-gutter-x) *
-.5);margin-right:calc(var(--bs-gutter-x) *
-.5)}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-left:calc(var(--bs-gutter-x)
* .5);padding-right:calc(var(--bs-gutter-x) *
.5);margin-top:var(--bs-gutter-y)}.col{flex:1 0
0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0
auto;width:100%}.row-cols-2>*{flex:0 0
auto;width:50%}.row-cols-3>*{flex:0 0
auto;width:33.3333333333%}.row-cols-4>*{flex:0 0
auto;width:25%}.row-cols-5>*{flex:0 0
auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.6666666667%}@media
(min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0
auto;width:auto}.row-cols-sm-1>*{flex:0 0
auto;width:100%}.row-cols-sm-2>*{flex:0 0
auto;width:50%}.row-cols-sm-3>*{flex:0 0
auto;width:33.3333333333%}.row-cols-sm-4>*{flex:0 0
auto;width:25%}.row-cols-sm-5>*{flex:0 0
auto;width:20%}.row-cols-sm-6>*{flex:0 0
auto;width:16.6666666667%}}@media (min-width:768px){.col-md{flex:1 0
0%}.row-cols-md-auto>*{flex:0 0
auto;width:auto}.row-cols-md-1>*{flex:0 0
auto;width:100%}.row-cols-md-2>*{flex:0 0
auto;width:50%}.row-cols-md-3>*{flex:0 0
auto;width:33.3333333333%}.row-cols-md-4>*{flex:0 0
auto;width:25%}.row-cols-md-5>*{flex:0 0
auto;width:20%}.row-cols-md-6>*{flex:0 0
auto;width:16.6666666667%}}@media (min-width:992px){.col-lg{flex:1 0
0%}.row-cols-lg-auto>*{flex:0 0
auto;width:auto}.row-cols-lg-1>*{flex:0 0
auto;width:100%}.row-cols-lg-2>*{flex:0 0
auto;width:50%}.row-cols-lg-3>*{flex:0 0
auto;width:33.3333333333%}.row-cols-lg-4>*{flex:0 0
auto;width:25%}.row-cols-lg-5>*{flex:0 0
auto;width:20%}.row-cols-lg-6>*{flex:0 0
auto;width:16.6666666667%}}@media (min-width:1200px){.col-xl{flex:1 0
0%}.row-cols-xl-auto>*{flex:0 0
auto;width:auto}.row-cols-xl-1>*{flex:0 0
auto;width:100%}.row-cols-xl-2>*{flex:0 0
auto;width:50%}.row-cols-xl-3>*{flex:0 0
auto;width:33.3333333333%}.row-cols-xl-4>*{flex:0 0
auto;width:25%}.row-cols-xl-5>*{flex:0 0
auto;width:20%}.row-cols-xl-6>*{flex:0 0
auto;width:16.6666666667%}}@media (min-width:1400px){.col-xxl{flex:1 0
0%}.row-cols-xxl-auto>*{flex:0 0
auto;width:auto}.row-cols-xxl-1>*{flex:0 0
auto;width:100%}.row-cols-xxl-2>*{flex:0 0
auto;width:50%}.row-cols-xxl-3>*{flex:0 0
auto;width:33.3333333333%}.row-cols-xxl-4>*{flex:0 0
auto;width:25%}.row-cols-xxl-5>*{flex:0 0
auto;width:20%}.row-cols-xxl-6>*{flex:0 0
auto;width:16.6666666667%}}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0
0 auto;width:8.33333333%}.col-2{flex:0 0
auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0
auto;width:33.33333333%}.col-5{flex:0 0
auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0
auto;width:58.33333333%}.col-8{flex:0 0
auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0
auto;width:83.33333333%}.col-11{flex:0 0
auto;width:91.66666667%}.col-12{flex:0 0
auto;width:100%}.offset-1{margin-right:8.33333333%}.offset-2{margin-right:16.66666667%}.offset-3{margin-right:25%}.offset-4{margin-right:33.33333333%}.offset-5{margin-right:41.66666667%}.offset-6{margin-right:50%}.offset-7{margin-right:58.33333333%}.offset-8{margin-right:66.66666667%}.offset-9{margin-right:75%}.offset-10{margin-right:83.33333333%}.offset-11{margin-right:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media
(min-width:576px){.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0
auto;width:8.33333333%}.col-sm-2{flex:0 0
auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0
0 auto;width:33.33333333%}.col-sm-5{flex:0 0
auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0
0 auto;width:58.33333333%}.col-sm-8{flex:0 0
auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0
0 auto;width:83.33333333%}.col-sm-11{flex:0 0
auto;width:91.66666667%}.col-sm-12{flex:0 0
auto;width:100%}.offset-sm-0{margin-right:0}.offset-sm-1{margin-right:8.33333333%}.offset-sm-2{margin-right:16.66666667%}.offset-sm-3{margin-right:25%}.offset-sm-4{margin-right:33.33333333%}.offset-sm-5{margin-right:41.66666667%}.offset-sm-6{margin-right:50%}.offset-sm-7{margin-right:58.33333333%}.offset-sm-8{margin-right:66.66666667%}.offset-sm-9{margin-right:75%}.offset-sm-10{margin-right:83.33333333%}.offset-sm-11{margin-right:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media
(min-width:768px){.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0
auto;width:8.33333333%}.col-md-2{flex:0 0
auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0
0 auto;width:33.33333333%}.col-md-5{flex:0 0
auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0
0 auto;width:58.33333333%}.col-md-8{flex:0 0
auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0
0 auto;width:83.33333333%}.col-md-11{flex:0 0
auto;width:91.66666667%}.col-md-12{flex:0 0
auto;width:100%}.offset-md-0{margin-right:0}.offset-md-1{margin-right:8.33333333%}.offset-md-2{margin-right:16.66666667%}.offset-md-3{margin-right:25%}.offset-md-4{margin-right:33.33333333%}.offset-md-5{margin-right:41.66666667%}.offset-md-6{margin-right:50%}.offset-md-7{margin-right:58.33333333%}.offset-md-8{margin-right:66.66666667%}.offset-md-9{margin-right:75%}.offset-md-10{margin-right:83.33333333%}.offset-md-11{margin-right:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media
(min-width:992px){.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0
auto;width:8.33333333%}.col-lg-2{flex:0 0
auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0
0 auto;width:33.33333333%}.col-lg-5{flex:0 0
auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0
0 auto;width:58.33333333%}.col-lg-8{flex:0 0
auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0
0 auto;width:83.33333333%}.col-lg-11{flex:0 0
auto;width:91.66666667%}.col-lg-12{flex:0 0
auto;width:100%}.offset-lg-0{margin-right:0}.offset-lg-1{margin-right:8.33333333%}.offset-lg-2{margin-right:16.66666667%}.offset-lg-3{margin-right:25%}.offset-lg-4{margin-right:33.33333333%}.offset-lg-5{margin-right:41.66666667%}.offset-lg-6{margin-right:50%}.offset-lg-7{margin-right:58.33333333%}.offset-lg-8{margin-right:66.66666667%}.offset-lg-9{margin-right:75%}.offset-lg-10{margin-right:83.33333333%}.offset-lg-11{margin-right:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media
(min-width:1200px){.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0
auto;width:8.33333333%}.col-xl-2{flex:0 0
auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0
0 auto;width:33.33333333%}.col-xl-5{flex:0 0
auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0
0 auto;width:58.33333333%}.col-xl-8{flex:0 0
auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0
0 auto;width:83.33333333%}.col-xl-11{flex:0 0
auto;width:91.66666667%}.col-xl-12{flex:0 0
auto;width:100%}.offset-xl-0{margin-right:0}.offset-xl-1{margin-right:8.33333333%}.offset-xl-2{margin-right:16.66666667%}.offset-xl-3{margin-right:25%}.offset-xl-4{margin-right:33.33333333%}.offset-xl-5{margin-right:41.66666667%}.offset-xl-6{margin-right:50%}.offset-xl-7{margin-right:58.33333333%}.offset-xl-8{margin-right:66.66666667%}.offset-xl-9{margin-right:75%}.offset-xl-10{margin-right:83.33333333%}.offset-xl-11{margin-right:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media
(min-width:1400px){.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0
0 auto;width:8.33333333%}.col-xxl-2{flex:0 0
auto;width:16.66666667%}.col-xxl-3{flex:0 0
auto;width:25%}.col-xxl-4{flex:0 0
auto;width:33.33333333%}.col-xxl-5{flex:0 0
auto;width:41.66666667%}.col-xxl-6{flex:0 0
auto;width:50%}.col-xxl-7{flex:0 0
auto;width:58.33333333%}.col-xxl-8{flex:0 0
auto;width:66.66666667%}.col-xxl-9{flex:0 0
auto;width:75%}.col-xxl-10{flex:0 0
auto;width:83.33333333%}.col-xxl-11{flex:0 0
auto;width:91.66666667%}.col-xxl-12{flex:0 0
auto;width:100%}.offset-xxl-0{margin-right:0}.offset-xxl-1{margin-right:8.33333333%}.offset-xxl-2{margin-right:16.66666667%}.offset-xxl-3{margin-right:25%}.offset-xxl-4{margin-right:33.33333333%}.offset-xxl-5{margin-right:41.66666667%}.offset-xxl-6{margin-right:50%}.offset-xxl-7{margin-right:58.33333333%}.offset-xxl-8{margin-right:66.66666667%}.offset-xxl-9{margin-right:75%}.offset-xxl-10{margin-right:83.33333333%}.offset-xxl-11{margin-right:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table{--bs-table-bg:transparent;--bs-table-accent-bg:transparent;--bs-table-striped-color:#212529;--bs-table-striped-bg:rgba(0,
0, 0, 0.05);--bs-table-active-color:#212529;--bs-table-active-bg:rgba(0, 0,
0, 0.1);--bs-table-hover-color:#212529;--bs-table-hover-bg:rgba(0, 0, 0,
0.075);width:100%;margin-bottom:1rem;color:#212529;vertical-align:top;border-color:#dee2e6}.table>:not(caption)>*>*{padding:.5rem
.5rem;background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset
0 0 0 9999px
var(--bs-table-accent-bg)}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table>:not(:last-child)>:last-child>*{border-bottom-color:currentColor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem
.25rem}.table-bordered>:not(caption)>*{border-width:1px
0}.table-bordered>:not(caption)>*>*{border-width:0
1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-striped>tbody>tr:nth-of-type(odd){--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg:var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover{--bs-table-accent-bg:var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-bg:#cfe2ff;--bs-table-striped-bg:#c5d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe6;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000;color:#000;border-color:#bacbe6}.table-secondary{--bs-table-bg:#e2e3e5;--bs-table-striped-bg:#d7d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbccce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000;color:#000;border-color:#cbccce}.table-success{--bs-table-bg:#d1e7dd;--bs-table-striped-bg:#c7dbd2;--bs-table-striped-color:#000;--bs-table-active-bg:#bcd0c7;--bs-table-active-color:#000;--bs-table-hover-bg:#c1d6cc;--bs-table-hover-color:#000;color:#000;border-color:#bcd0c7}.table-info{--bs-table-bg:#cff4fc;--bs-table-striped-bg:#c5e8ef;--bs-table-striped-color:#000;--bs-table-active-bg:#badce3;--bs-table-active-color:#000;--bs-table-hover-bg:#bfe2e9;--bs-table-hover-color:#000;color:#000;border-color:#badce3}.table-warning{--bs-table-bg:#fff3cd;--bs-table-striped-bg:#f2e7c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dbb9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece1be;--bs-table-hover-color:#000;color:#000;border-color:#e6dbb9}.table-danger{--bs-table-bg:#f8d7da;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc2c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7ca;--bs-table-hover-color:#000;color:#000;border-color:#dfc2c4}.table-light{--bs-table-bg:#f8f9fa;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#e5e6e7;--bs-table-hover-color:#000;color:#000;border-color:#dfe0e1}.table-dark{--bs-table-bg:#212529;--bs-table-striped-bg:#2c3034;--bs-table-striped-color:#fff;--bs-table-active-bg:#373b3e;--bs-table-active-color:#fff;--bs-table-hover-bg:#323539;--bs-table-hover-color:#fff;color:#fff;border-color:#373b3e}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media
(max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media
(max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media
(max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media
(max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media
(max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem
+ 1px);padding-bottom:calc(.375rem +
1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem
+ 1px);padding-bottom:calc(.5rem +
1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem +
1px);padding-bottom:calc(.25rem +
1px);font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:#6c757d}.form-control{display:block;width:100%;padding:.375rem
.75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-clip:padding-box;border:1px
solid
#ced4da;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.25rem;transition:border-color
.15s ease-in-out,box-shadow .15s ease-in-out}@media
(prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0
0 0 .25rem
rgba(13,110,253,.25)}.form-control::-webkit-date-and-time-value{height:1.5em}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}.form-control::file-selector-button{padding:.375rem
.75rem;margin:-.375rem
-.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color
.15s ease-in-out,background-color .15s ease-in-out,border-color .15s
ease-in-out,box-shadow .15s ease-in-out}@media
(prefers-reduced-motion:reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#dde0e3}.form-control::-webkit-file-upload-button{padding:.375rem
.75rem;margin:-.375rem
-.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;-webkit-transition:color
.15s ease-in-out,background-color .15s ease-in-out,border-color .15s
ease-in-out,box-shadow .15s ease-in-out;transition:color .15s
ease-in-out,background-color .15s ease-in-out,border-color .15s
ease-in-out,box-shadow .15s ease-in-out}@media
(prefers-reduced-motion:reduce){.form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#dde0e3}.form-control-plaintext{display:block;width:100%;padding:.375rem
0;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid
transparent;border-width:1px
0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-left:0;padding-right:0}.form-control-sm{min-height:calc(1.5em
+ (.5rem + 2px));padding:.25rem
.5rem;font-size:.875rem;border-radius:.2rem}.form-control-sm::file-selector-button{padding:.25rem
.5rem;margin:-.25rem
-.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-sm::-webkit-file-upload-button{padding:.25rem
.5rem;margin:-.25rem
-.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em
+ (1rem + 2px));padding:.5rem
1rem;font-size:1.25rem;border-radius:.3rem}.form-control-lg::file-selector-button{padding:.5rem
1rem;margin:-.5rem
-1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg::-webkit-file-upload-button{padding:.5rem
1rem;margin:-.5rem
-1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em
+ (.75rem + 2px))}textarea.form-control-sm{min-height:calc(1.5em + (.5rem +
2px))}textarea.form-control-lg{min-height:calc(1.5em + (1rem +
2px))}.form-control-color{max-width:3rem;height:auto;padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{height:1.5em;border-radius:.25rem}.form-control-color::-webkit-color-swatch{height:1.5em;border-radius:.25rem}.form-select{display:block;width:100%;padding:.375rem
.75rem .375rem 2.25rem;-moz-padding-start:calc(0.75rem -
3px);font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:url("data:image/svg+xml,%3csvg
xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16
16'%3e%3cpath fill='none' stroke='%23343a40'
stroke-linecap='round' stroke-linejoin='round'
stroke-width='2' d='M2 5l6 6
6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:left
.75rem center;background-size:16px 12px;border:1px solid
#ced4da;border-radius:.25rem;transition:border-color .15s
ease-in-out,box-shadow .15s
ease-in-out;-webkit-appearance:none;-moz-appearance:none;appearance:none}@media
(prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0
0 0 .25rem
rgba(13,110,253,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-left:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:transparent;text-shadow:0
0 0
#212529}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-right:.5rem;font-size:.875rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-right:1rem;font-size:1.25rem}.form-check{display:block;min-height:1.5rem;padding-right:1.5em;margin-bottom:.125rem}.form-check
.form-check-input{float:right;margin-right:-1.5em}.form-check-input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px
solid
rgba(0,0,0,.25);-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0
0 0 .25rem
rgba(13,110,253,.25)}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{background-image:url("data:image/svg+xml,%3csvg
xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20
20'%3e%3cpath fill='none' stroke='%23fff'
stroke-linecap='round' stroke-linejoin='round'
stroke-width='3' d='M6 10l3
3l6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{background-image:url("data:image/svg+xml,%3csvg
xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8
8'%3e%3ccircle r='2'
fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;background-image:url("data:image/svg+xml,%3csvg
xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20
20'%3e%3cpath fill='none' stroke='%23fff'
stroke-linecap='round' stroke-linejoin='round'
stroke-width='3' d='M6
10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{opacity:.5}.form-switch{padding-right:2.5em}.form-switch
.form-check-input{width:2em;margin-right:-2.5em;background-image:url("data:image/svg+xml,%3csvg
xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8
8'%3e%3ccircle r='3' fill='rgba%280, 0, 0,
0.25%29'/%3e%3c/svg%3e");background-position:right
center;border-radius:2em;transition:background-position .15s
ease-in-out}@media (prefers-reduced-motion:reduce){.form-switch
.form-check-input{transition:none}}.form-switch
.form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg
xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8
8'%3e%3ccircle r='3'
fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch
.form-check-input:checked{background-position:left
center;background-image:url("data:image/svg+xml,%3csvg
xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8
8'%3e%3ccircle r='3'
fill='%23fff'/%3e%3c/svg%3e")}.form-check-inline{display:inline-block;margin-left:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}.form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0
0 0 1px #fff,0 0 0 .25rem
rgba(13,110,253,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0
1px #fff,0 0 0 .25rem
rgba(13,110,253,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#0d6efd;border:0;border-radius:1rem;-webkit-transition:background-color
.15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s
ease-in-out;transition:background-color .15s ease-in-out,border-color .15s
ease-in-out,box-shadow .15s
ease-in-out;-webkit-appearance:none;appearance:none}@media
(prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#0d6efd;border:0;border-radius:1rem;-moz-transition:background-color
.15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s
ease-in-out;transition:background-color .15s ease-in-out,border-color .15s
ease-in-out,box-shadow .15s
ease-in-out;-moz-appearance:none;appearance:none}@media
(prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.form-range:disabled::-moz-range-thumb{background-color:#adb5bd}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-select{height:calc(3.5rem
+
2px);line-height:1.25}.form-floating>label{position:absolute;top:0;right:0;height:100%;padding:1rem
.75rem;pointer-events:none;border:1px solid
transparent;transform-origin:100% 0;transition:opacity .1s
ease-in-out,transform .1s ease-in-out}@media
(prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control{padding:1rem
.75rem}.form-floating>.form-control::-moz-placeholder{color:transparent}.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control:not(:-moz-placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:not(:-moz-placeholder-shown)~label{opacity:.65;transform:scale(.85)
translateY(-.5rem)
translateX(-.15rem)}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{opacity:.65;transform:scale(.85)
translateY(-.5rem)
translateX(-.15rem)}.form-floating>.form-control:-webkit-autofill~label{opacity:.65;transform:scale(.85)
translateY(-.5rem)
translateX(-.15rem)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select{position:relative;flex:1
1
auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus{z-index:3}.input-group
.btn{position:relative;z-index:2}.input-group
.btn:focus{z-index:3}.input-group-text{display:flex;align-items:center;padding:.375rem
.75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px
solid
#ced4da;border-radius:.25rem}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:.5rem
1rem;font-size:1.25rem;border-radius:.3rem}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.25rem
.5rem;font-size:.875rem;border-radius:.2rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-left:3rem}.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu){border-top-left-radius:0;border-bottom-left-radius:0}.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-right:-1px;border-top-right-radius:0;border-bottom-right-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#198754}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem
.5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(25,135,84,.9);border-radius:.25rem}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated
:valid~.valid-feedback,.was-validated
:valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated
.form-control:valid{border-color:#198754;padding-left:calc(1.5em +
.75rem);background-image:url("data:image/svg+xml,%3csvg
xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8
8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6
4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4
4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:left
calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem)
calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated
.form-control:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem
rgba(25,135,84,.25)}.was-validated
textarea.form-control:valid,textarea.form-control.is-valid{padding-left:calc(1.5em
+ .75rem);background-position:top calc(.375em + .1875rem) left calc(.375em
+ .1875rem)}.form-select.is-valid,.was-validated
.form-select:valid{border-color:#198754}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated
.form-select:valid:not([multiple]):not([size]),.was-validated
.form-select:valid:not([multiple])[size="1"]{padding-left:4.125rem;background-image:url("data:image/svg+xml,%3csvg
xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16
16'%3e%3cpath fill='none' stroke='%23343a40'
stroke-linecap='round' stroke-linejoin='round'
stroke-width='2' d='M2 5l6 6
6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg
xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8
8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6
4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4
4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-position:left
.75rem center,center left 2.25rem;background-size:16px 12px,calc(.75em +
.375rem) calc(.75em + .375rem)}.form-select.is-valid:focus,.was-validated
.form-select:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem
rgba(25,135,84,.25)}.form-check-input.is-valid,.was-validated
.form-check-input:valid{border-color:#198754}.form-check-input.is-valid:checked,.was-validated
.form-check-input:valid:checked{background-color:#198754}.form-check-input.is-valid:focus,.was-validated
.form-check-input:valid:focus{box-shadow:0 0 0 .25rem
rgba(25,135,84,.25)}.form-check-input.is-valid~.form-check-label,.was-validated
.form-check-input:valid~.form-check-label{color:#198754}.form-check-inline
.form-check-input~.valid-feedback{margin-right:.5em}.input-group
.form-control.is-valid,.input-group .form-select.is-valid,.was-validated
.input-group .form-control:valid,.was-validated .input-group
.form-select:valid{z-index:1}.input-group
.form-control.is-valid:focus,.input-group
.form-select.is-valid:focus,.was-validated .input-group
.form-control:valid:focus,.was-validated .input-group
.form-select:valid:focus{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem
.5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated
:invalid~.invalid-feedback,.was-validated
:invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated
.form-control:invalid{border-color:#dc3545;padding-left:calc(1.5em +
.75rem);background-image:url("data:image/svg+xml,%3csvg
xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'
width='12' height='12' fill='none'
stroke='%23dc3545'%3e%3ccircle cx='6' cy='6'
r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8
3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2'
r='.6' fill='%23dc3545'
stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:left
calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem)
calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated
.form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem
rgba(220,53,69,.25)}.was-validated
textarea.form-control:invalid,textarea.form-control.is-invalid{padding-left:calc(1.5em
+ .75rem);background-position:top calc(.375em + .1875rem) left calc(.375em
+ .1875rem)}.form-select.is-invalid,.was-validated
.form-select:invalid{border-color:#dc3545}.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],.was-validated
.form-select:invalid:not([multiple]):not([size]),.was-validated
.form-select:invalid:not([multiple])[size="1"]{padding-left:4.125rem;background-image:url("data:image/svg+xml,%3csvg
xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16
16'%3e%3cpath fill='none' stroke='%23343a40'
stroke-linecap='round' stroke-linejoin='round'
stroke-width='2' d='M2 5l6 6
6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg
xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'
width='12' height='12' fill='none'
stroke='%23dc3545'%3e%3ccircle cx='6' cy='6'
r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8
3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2'
r='.6' fill='%23dc3545'
stroke='none'/%3e%3c/svg%3e");background-position:left
.75rem center,center left 2.25rem;background-size:16px 12px,calc(.75em +
.375rem) calc(.75em + .375rem)}.form-select.is-invalid:focus,.was-validated
.form-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem
rgba(220,53,69,.25)}.form-check-input.is-invalid,.was-validated
.form-check-input:invalid{border-color:#dc3545}.form-check-input.is-invalid:checked,.was-validated
.form-check-input:invalid:checked{background-color:#dc3545}.form-check-input.is-invalid:focus,.was-validated
.form-check-input:invalid:focus{box-shadow:0 0 0 .25rem
rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated
.form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-inline
.form-check-input~.invalid-feedback{margin-right:.5em}.input-group
.form-control.is-invalid,.input-group
.form-select.is-invalid,.was-validated .input-group
.form-control:invalid,.was-validated .input-group
.form-select:invalid{z-index:2}.input-group
.form-control.is-invalid:focus,.input-group
.form-select.is-invalid:focus,.was-validated .input-group
.form-control:invalid:focus,.was-validated .input-group
.form-select:invalid:focus{z-index:3}.btn{display:inline-block;font-weight:400;line-height:1.5;color:#212529;text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;background-color:transparent;border:1px
solid transparent;padding:.375rem
.75rem;font-size:1rem;border-radius:.25rem;transition:color .15s
ease-in-out,background-color .15s ease-in-out,border-color .15s
ease-in-out,box-shadow .15s ease-in-out}@media
(prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529}.btn-check:focus+.btn,.btn:focus{outline:0;box-shadow:0
0 0 .25rem
rgba(13,110,253,.25)}.btn.disabled,.btn:disabled,fieldset:disabled
.btn{pointer-events:none;opacity:.65}.btn-primary{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-primary:hover{color:#fff;background-color:#0b5ed7;border-color:#0a58ca}.btn-check:focus+.btn-primary,.btn-primary:focus{color:#fff;background-color:#0b5ed7;border-color:#0a58ca;box-shadow:0
0 0 .25rem
rgba(49,132,253,.5)}.btn-check:active+.btn-primary,.btn-check:checked+.btn-primary,.btn-primary.active,.btn-primary:active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0a58ca;border-color:#0a53be}.btn-check:active+.btn-primary:focus,.btn-check:checked+.btn-primary:focus,.btn-primary.active:focus,.btn-primary:active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0
0 0 .25rem
rgba(49,132,253,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5c636a;border-color:#565e64}.btn-check:focus+.btn-secondary,.btn-secondary:focus{color:#fff;background-color:#5c636a;border-color:#565e64;box-shadow:0
0 0 .25rem
rgba(130,138,145,.5)}.btn-check:active+.btn-secondary,.btn-check:checked+.btn-secondary,.btn-secondary.active,.btn-secondary:active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#565e64;border-color:#51585e}.btn-check:active+.btn-secondary:focus,.btn-check:checked+.btn-secondary:focus,.btn-secondary.active:focus,.btn-secondary:active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0
0 0 .25rem
rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-success{color:#fff;background-color:#198754;border-color:#198754}.btn-success:hover{color:#fff;background-color:#157347;border-color:#146c43}.btn-check:focus+.btn-success,.btn-success:focus{color:#fff;background-color:#157347;border-color:#146c43;box-shadow:0
0 0 .25rem
rgba(60,153,110,.5)}.btn-check:active+.btn-success,.btn-check:checked+.btn-success,.btn-success.active,.btn-success:active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#146c43;border-color:#13653f}.btn-check:active+.btn-success:focus,.btn-check:checked+.btn-success:focus,.btn-success.active:focus,.btn-success:active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0
0 0 .25rem
rgba(60,153,110,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#198754;border-color:#198754}.btn-info{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-info:hover{color:#000;background-color:#31d2f2;border-color:#25cff2}.btn-check:focus+.btn-info,.btn-info:focus{color:#000;background-color:#31d2f2;border-color:#25cff2;box-shadow:0
0 0 .25rem
rgba(11,172,204,.5)}.btn-check:active+.btn-info,.btn-check:checked+.btn-info,.btn-info.active,.btn-info:active,.show>.btn-info.dropdown-toggle{color:#000;background-color:#3dd5f3;border-color:#25cff2}.btn-check:active+.btn-info:focus,.btn-check:checked+.btn-info:focus,.btn-info.active:focus,.btn-info:active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0
0 0 .25rem
rgba(11,172,204,.5)}.btn-info.disabled,.btn-info:disabled{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-warning{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#000;background-color:#ffca2c;border-color:#ffc720}.btn-check:focus+.btn-warning,.btn-warning:focus{color:#000;background-color:#ffca2c;border-color:#ffc720;box-shadow:0
0 0 .25rem
rgba(217,164,6,.5)}.btn-check:active+.btn-warning,.btn-check:checked+.btn-warning,.btn-warning.active,.btn-warning:active,.show>.btn-warning.dropdown-toggle{color:#000;background-color:#ffcd39;border-color:#ffc720}.btn-check:active+.btn-warning:focus,.btn-check:checked+.btn-warning:focus,.btn-warning.active:focus,.btn-warning:active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0
0 0 .25rem
rgba(217,164,6,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#bb2d3b;border-color:#b02a37}.btn-check:focus+.btn-danger,.btn-danger:focus{color:#fff;background-color:#bb2d3b;border-color:#b02a37;box-shadow:0
0 0 .25rem
rgba(225,83,97,.5)}.btn-check:active+.btn-danger,.btn-check:checked+.btn-danger,.btn-danger.active,.btn-danger:active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#b02a37;border-color:#a52834}.btn-check:active+.btn-danger:focus,.btn-check:checked+.btn-danger:focus,.btn-danger.active:focus,.btn-danger:active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0
0 0 .25rem
rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-light{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:focus+.btn-light,.btn-light:focus{color:#000;background-color:#f9fafb;border-color:#f9fafb;box-shadow:0
0 0 .25rem
rgba(211,212,213,.5)}.btn-check:active+.btn-light,.btn-check:checked+.btn-light,.btn-light.active,.btn-light:active,.show>.btn-light.dropdown-toggle{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:active+.btn-light:focus,.btn-check:checked+.btn-light:focus,.btn-light.active:focus,.btn-light:active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0
0 0 .25rem
rgba(211,212,213,.5)}.btn-light.disabled,.btn-light:disabled{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-dark{color:#fff;background-color:#212529;border-color:#212529}.btn-dark:hover{color:#fff;background-color:#1c1f23;border-color:#1a1e21}.btn-check:focus+.btn-dark,.btn-dark:focus{color:#fff;background-color:#1c1f23;border-color:#1a1e21;box-shadow:0
0 0 .25rem
rgba(66,70,73,.5)}.btn-check:active+.btn-dark,.btn-check:checked+.btn-dark,.btn-dark.active,.btn-dark:active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1a1e21;border-color:#191c1f}.btn-check:active+.btn-dark:focus,.btn-check:checked+.btn-dark:focus,.btn-dark.active:focus,.btn-dark:active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0
0 0 .25rem
rgba(66,70,73,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#212529;border-color:#212529}.btn-outline-primary{color:#0d6efd;border-color:#0d6efd}.btn-outline-primary:hover{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:focus+.btn-outline-primary,.btn-outline-primary:focus{box-shadow:0
0 0 .25rem
rgba(13,110,253,.5)}.btn-check:active+.btn-outline-primary,.btn-check:checked+.btn-outline-primary,.btn-outline-primary.active,.btn-outline-primary.dropdown-toggle.show,.btn-outline-primary:active{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:active+.btn-outline-primary:focus,.btn-check:checked+.btn-outline-primary:focus,.btn-outline-primary.active:focus,.btn-outline-primary.dropdown-toggle.show:focus,.btn-outline-primary:active:focus{box-shadow:0
0 0 .25rem
rgba(13,110,253,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#0d6efd;background-color:transparent}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:focus+.btn-outline-secondary,.btn-outline-secondary:focus{box-shadow:0
0 0 .25rem
rgba(108,117,125,.5)}.btn-check:active+.btn-outline-secondary,.btn-check:checked+.btn-outline-secondary,.btn-outline-secondary.active,.btn-outline-secondary.dropdown-toggle.show,.btn-outline-secondary:active{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:active+.btn-outline-secondary:focus,.btn-check:checked+.btn-outline-secondary:focus,.btn-outline-secondary.active:focus,.btn-outline-secondary.dropdown-toggle.show:focus,.btn-outline-secondary:active:focus{box-shadow:0
0 0 .25rem
rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-success{color:#198754;border-color:#198754}.btn-outline-success:hover{color:#fff;background-color:#198754;border-color:#198754}.btn-check:focus+.btn-outline-success,.btn-outline-success:focus{box-shadow:0
0 0 .25rem
rgba(25,135,84,.5)}.btn-check:active+.btn-outline-success,.btn-check:checked+.btn-outline-success,.btn-outline-success.active,.btn-outline-success.dropdown-toggle.show,.btn-outline-success:active{color:#fff;background-color:#198754;border-color:#198754}.btn-check:active+.btn-outline-success:focus,.btn-check:checked+.btn-outline-success:focus,.btn-outline-success.active:focus,.btn-outline-success.dropdown-toggle.show:focus,.btn-outline-success:active:focus{box-shadow:0
0 0 .25rem
rgba(25,135,84,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#198754;background-color:transparent}.btn-outline-info{color:#0dcaf0;border-color:#0dcaf0}.btn-outline-info:hover{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:focus+.btn-outline-info,.btn-outline-info:focus{box-shadow:0
0 0 .25rem
rgba(13,202,240,.5)}.btn-check:active+.btn-outline-info,.btn-check:checked+.btn-outline-info,.btn-outline-info.active,.btn-outline-info.dropdown-toggle.show,.btn-outline-info:active{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:active+.btn-outline-info:focus,.btn-check:checked+.btn-outline-info:focus,.btn-outline-info.active:focus,.btn-outline-info.dropdown-toggle.show:focus,.btn-outline-info:active:focus{box-shadow:0
0 0 .25rem
rgba(13,202,240,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#0dcaf0;background-color:transparent}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:focus+.btn-outline-warning,.btn-outline-warning:focus{box-shadow:0
0 0 .25rem
rgba(255,193,7,.5)}.btn-check:active+.btn-outline-warning,.btn-check:checked+.btn-outline-warning,.btn-outline-warning.active,.btn-outline-warning.dropdown-toggle.show,.btn-outline-warning:active{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:active+.btn-outline-warning:focus,.btn-check:checked+.btn-outline-warning:focus,.btn-outline-warning.active:focus,.btn-outline-warning.dropdown-toggle.show:focus,.btn-outline-warning:active:focus{box-shadow:0
0 0 .25rem
rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:focus+.btn-outline-danger,.btn-outline-danger:focus{box-shadow:0
0 0 .25rem
rgba(220,53,69,.5)}.btn-check:active+.btn-outline-danger,.btn-check:checked+.btn-outline-danger,.btn-outline-danger.active,.btn-outline-danger.dropdown-toggle.show,.btn-outline-danger:active{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:active+.btn-outline-danger:focus,.btn-check:checked+.btn-outline-danger:focus,.btn-outline-danger.active:focus,.btn-outline-danger.dropdown-toggle.show:focus,.btn-outline-danger:active:focus{box-shadow:0
0 0 .25rem
rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:focus+.btn-outline-light,.btn-outline-light:focus{box-shadow:0
0 0 .25rem
rgba(248,249,250,.5)}.btn-check:active+.btn-outline-light,.btn-check:checked+.btn-outline-light,.btn-outline-light.active,.btn-outline-light.dropdown-toggle.show,.btn-outline-light:active{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:active+.btn-outline-light:focus,.btn-check:checked+.btn-outline-light:focus,.btn-outline-light.active:focus,.btn-outline-light.dropdown-toggle.show:focus,.btn-outline-light:active:focus{box-shadow:0
0 0 .25rem
rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-dark{color:#212529;border-color:#212529}.btn-outline-dark:hover{color:#fff;background-color:#212529;border-color:#212529}.btn-check:focus+.btn-outline-dark,.btn-outline-dark:focus{box-shadow:0
0 0 .25rem
rgba(33,37,41,.5)}.btn-check:active+.btn-outline-dark,.btn-check:checked+.btn-outline-dark,.btn-outline-dark.active,.btn-outline-dark.dropdown-toggle.show,.btn-outline-dark:active{color:#fff;background-color:#212529;border-color:#212529}.btn-check:active+.btn-outline-dark:focus,.btn-check:checked+.btn-outline-dark:focus,.btn-outline-dark.active:focus,.btn-outline-dark.dropdown-toggle.show:focus,.btn-outline-dark:active:focus{box-shadow:0
0 0 .25rem
rgba(33,37,41,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#212529;background-color:transparent}.btn-link{font-weight:400;color:#0d6efd;text-decoration:underline}.btn-link:hover{color:#0a58ca}.btn-link.disabled,.btn-link:disabled{color:#6c757d}.btn-group-lg>.btn,.btn-lg{padding:.5rem
1rem;font-size:1.25rem;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem
.5rem;font-size:.875rem;border-radius:.2rem}.fade{transition:opacity .15s
linear}@media
(prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height
.35s ease}@media
(prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropend,.dropstart,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em
solid;border-left:.3em solid transparent;border-bottom:0;border-right:.3em
solid
transparent}.dropdown-toggle:empty::after{margin-right:0}.dropdown-menu{position:absolute;z-index:1000;display:none;min-width:10rem;padding:.5rem
0;margin:0;font-size:1rem;color:#212529;text-align:right;list-style:none;background-color:#fff;background-clip:padding-box;border:1px
solid
rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu[data-bs-popper]{top:100%;right:0;margin-top:.125rem}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{left:auto;right:0}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{left:0;right:auto}@media
(min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{left:auto;right:0}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{left:0;right:auto}}@media
(min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{left:auto;right:0}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{left:0;right:auto}}@media
(min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{left:auto;right:0}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{left:0;right:auto}}@media
(min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{left:auto;right:0}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{left:0;right:auto}}@media
(min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{left:auto;right:0}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{left:0;right:auto}}.dropup
.dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup
.dropdown-toggle::after{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:0;border-left:.3em
solid transparent;border-bottom:.3em solid;border-right:.3em solid
transparent}.dropup .dropdown-toggle:empty::after{margin-right:0}.dropend
.dropdown-menu[data-bs-popper]{top:0;left:auto;right:100%;margin-top:0;margin-right:.125rem}.dropend
.dropdown-toggle::after{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em
solid transparent;border-left:0;border-bottom:.3em solid
transparent;border-right:.3em solid}.dropend
.dropdown-toggle:empty::after{margin-right:0}.dropend
.dropdown-toggle::after{vertical-align:0}.dropstart
.dropdown-menu[data-bs-popper]{top:0;left:100%;right:auto;margin-top:0;margin-left:.125rem}.dropstart
.dropdown-toggle::after{display:inline-block;margin-right:.255em;vertical-align:.255em;content:""}.dropstart
.dropdown-toggle::after{display:none}.dropstart
.dropdown-toggle::before{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em
solid transparent;border-left:.3em solid;border-bottom:.3em solid
transparent}.dropstart
.dropdown-toggle:empty::after{margin-right:0}.dropstart
.dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:.5rem
0;overflow:hidden;border-top:1px solid
rgba(0,0,0,.15)}.dropdown-item{display:block;width:100%;padding:.25rem
1rem;clear:both;font-weight:400;color:#212529;text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#1e2125;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#0d6efd}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem
1rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem
1rem;color:#212529}.dropdown-menu-dark{color:#dee2e6;background-color:#343a40;border-color:rgba(0,0,0,.15)}.dropdown-menu-dark
.dropdown-item{color:#dee2e6}.dropdown-menu-dark
.dropdown-item:focus,.dropdown-menu-dark
.dropdown-item:hover{color:#fff;background-color:rgba(255,255,255,.15)}.dropdown-menu-dark
.dropdown-item.active,.dropdown-menu-dark
.dropdown-item:active{color:#fff;background-color:#0d6efd}.dropdown-menu-dark
.dropdown-item.disabled,.dropdown-menu-dark
.dropdown-item:disabled{color:#adb5bd}.dropdown-menu-dark
.dropdown-divider{border-color:rgba(0,0,0,.15)}.dropdown-menu-dark
.dropdown-item-text{color:#dee2e6}.dropdown-menu-dark
.dropdown-header{color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1
1
auto}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar
.input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-right:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-top-right-radius:0;border-bottom-right-radius:0}.dropdown-toggle-split{padding-left:.5625rem;padding-right:.5625rem}.dropdown-toggle-split::after,.dropend
.dropdown-toggle-split::after,.dropup
.dropdown-toggle-split::after{margin-right:0}.dropstart
.dropdown-toggle-split::before{margin-left:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-left:.375rem;padding-right:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-left:.75rem;padding-right:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-left-radius:0;border-bottom-right-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn~.btn{border-top-right-radius:0;border-top-left-radius:0}.nav{display:flex;flex-wrap:wrap;padding-right:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem
1rem;color:#0d6efd;text-decoration:none;transition:color .15s
ease-in-out,background-color .15s ease-in-out,border-color .15s
ease-in-out}@media
(prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:focus,.nav-link:hover{color:#0a58ca}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px
solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;background:0
0;border:1px solid
transparent;border-top-right-radius:.25rem;border-top-left-radius:.25rem}.nav-tabs
.nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef
#dee2e6;isolation:isolate}.nav-tabs
.nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs
.nav-item.show .nav-link,.nav-tabs
.nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6
#dee2e6 #fff}.nav-tabs
.dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.nav-pills
.nav-link{background:0 0;border:0;border-radius:.25rem}.nav-pills
.nav-link.active,.nav-pills
.show>.nav-link{color:#fff;background-color:#0d6efd}.nav-fill
.nav-item,.nav-fill>.nav-link{flex:1 1
auto;text-align:center}.nav-justified
.nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.nav-fill
.nav-item .nav-link,.nav-justified .nav-item
.nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding-top:.5rem;padding-bottom:.5rem}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:.3125rem;padding-bottom:.3125rem;margin-left:1rem;font-size:1.25rem;text-decoration:none;white-space:nowrap}.navbar-nav{display:flex;flex-direction:column;padding-right:0;margin-bottom:0;list-style:none}.navbar-nav
.nav-link{padding-left:0;padding-right:0}.navbar-nav
.dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem
.75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px
solid transparent;border-radius:.25rem;transition:box-shadow .15s
ease-in-out}@media
(prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0
0 0
.25rem}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media
(min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm
.navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav
.dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav
.nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand-sm
.navbar-nav-scroll{overflow:visible}.navbar-expand-sm
.navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm
.navbar-toggler{display:none}}@media
(min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md
.navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav
.dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav
.nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand-md
.navbar-nav-scroll{overflow:visible}.navbar-expand-md
.navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md
.navbar-toggler{display:none}}@media
(min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg
.navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav
.dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav
.nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand-lg
.navbar-nav-scroll{overflow:visible}.navbar-expand-lg
.navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg
.navbar-toggler{display:none}}@media
(min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl
.navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav
.dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav
.nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand-xl
.navbar-nav-scroll{overflow:visible}.navbar-expand-xl
.navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl
.navbar-toggler{display:none}}@media
(min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl
.navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav
.dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav
.nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand-xxl
.navbar-nav-scroll{overflow:visible}.navbar-expand-xxl
.navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl
.navbar-toggler{display:none}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand
.navbar-nav{flex-direction:row}.navbar-expand .navbar-nav
.dropdown-menu{position:absolute}.navbar-expand .navbar-nav
.nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand
.navbar-nav-scroll{overflow:visible}.navbar-expand
.navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand
.navbar-toggler{display:none}.navbar-light
.navbar-brand{color:rgba(0,0,0,.9)}.navbar-light
.navbar-brand:focus,.navbar-light
.navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav
.nav-link{color:rgba(0,0,0,.55)}.navbar-light .navbar-nav
.nav-link:focus,.navbar-light .navbar-nav
.nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav
.nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav
.nav-link.active,.navbar-light .navbar-nav
.show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light
.navbar-toggler{color:rgba(0,0,0,.55);border-color:rgba(0,0,0,.1)}.navbar-light
.navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg
xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30
30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29'
stroke-linecap='round' stroke-miterlimit='10'
stroke-width='2' d='M4 7h22M4 15h22M4
23h22'/%3e%3c/svg%3e")}.navbar-light
.navbar-text{color:rgba(0,0,0,.55)}.navbar-light .navbar-text
a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text
a:hover{color:rgba(0,0,0,.9)}.navbar-dark
.navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark
.navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav
.nav-link{color:rgba(255,255,255,.55)}.navbar-dark .navbar-nav
.nav-link:focus,.navbar-dark .navbar-nav
.nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav
.nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav
.nav-link.active,.navbar-dark .navbar-nav
.show>.nav-link{color:#fff}.navbar-dark
.navbar-toggler{color:rgba(255,255,255,.55);border-color:rgba(255,255,255,.1)}.navbar-dark
.navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg
xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30
30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29'
stroke-linecap='round' stroke-miterlimit='10'
stroke-width='2' d='M4 7h22M4 15h22M4
23h22'/%3e%3c/svg%3e")}.navbar-dark
.navbar-text{color:rgba(255,255,255,.55)}.navbar-dark .navbar-text
a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text
a:hover{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px
solid
rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-left:0;margin-right:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-right-radius:calc(.25rem
- 1px);border-top-left-radius:calc(.25rem -
1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-left-radius:calc(.25rem
- 1px);border-bottom-right-radius:calc(.25rem -
1px)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1
1 auto;padding:1rem
1rem}.card-title{margin-bottom:.5rem}.card-subtitle{margin-top:-.25rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-right:1rem}.card-header{padding:.5rem
1rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px
solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem -
1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.5rem
1rem;background-color:rgba(0,0,0,.03);border-top:1px solid
rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem -
1px) calc(.25rem -
1px)}.card-header-tabs{margin-left:-.5rem;margin-bottom:-.5rem;margin-right:-.5rem;border-bottom:0}.card-header-pills{margin-left:-.5rem;margin-right:-.5rem}.card-img-overlay{position:absolute;top:0;left:0;bottom:0;right:0;padding:1rem;border-radius:calc(.25rem
-
1px)}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-right-radius:calc(.25rem
- 1px);border-top-left-radius:calc(.25rem -
1px)}.card-img,.card-img-bottom{border-bottom-left-radius:calc(.25rem -
1px);border-bottom-right-radius:calc(.25rem -
1px)}.card-group>.card{margin-bottom:.75rem}@media
(min-width:576px){.card-group{display:flex;flex-flow:row
wrap}.card-group>.card{flex:1 0
0%;margin-bottom:0}.card-group>.card+.card{margin-right:0;border-right:0}.card-group>.card:not(:last-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:last-child)
.card-header,.card-group>.card:not(:last-child)
.card-img-top{border-top-left-radius:0}.card-group>.card:not(:last-child)
.card-footer,.card-group>.card:not(:last-child)
.card-img-bottom{border-bottom-left-radius:0}.card-group>.card:not(:first-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:first-child)
.card-header,.card-group>.card:not(:first-child)
.card-img-top{border-top-right-radius:0}.card-group>.card:not(:first-child)
.card-footer,.card-group>.card:not(:first-child)
.card-img-bottom{border-bottom-right-radius:0}}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:1rem
1.25rem;font-size:1rem;color:#212529;text-align:right;background-color:#fff;border:0;border-radius:0;overflow-anchor:none;transition:color
.15s ease-in-out,background-color .15s ease-in-out,border-color .15s
ease-in-out,box-shadow .15s ease-in-out,border-radius .15s ease}@media
(prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:#0c63e4;background-color:#e7f1ff;box-shadow:inset
0 -1px 0
rgba(0,0,0,.125)}.accordion-button:not(.collapsed)::after{background-image:url("data:image/svg+xml,%3csvg
xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'
fill='%230c63e4'%3e%3cpath fill-rule='evenodd'
d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1
.708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1
0-.708z'/%3e%3c/svg%3e");transform:rotate(180deg)}.accordion-button::after{flex-shrink:0;width:1.25rem;height:1.25rem;margin-right:auto;content:"";background-image:url("data:image/svg+xml,%3csvg
xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'
fill='%23212529'%3e%3cpath fill-rule='evenodd'
d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1
.708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1
0-.708z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-size:1.25rem;transition:transform
.2s ease-in-out}@media
(prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:#86b7fe;outline:0;box-shadow:0
0 0 .25rem
rgba(13,110,253,.25)}.accordion-header{margin-bottom:0}.accordion-item{background-color:#fff;border:1px
solid
rgba(0,0,0,.125)}.accordion-item:first-of-type{border-top-right-radius:.25rem;border-top-left-radius:.25rem}.accordion-item:first-of-type
.accordion-button{border-top-right-radius:calc(.25rem -
1px);border-top-left-radius:calc(.25rem -
1px)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.accordion-item:last-of-type
.accordion-button.collapsed{border-bottom-left-radius:calc(.25rem -
1px);border-bottom-right-radius:calc(.25rem -
1px)}.accordion-item:last-of-type
.accordion-collapse{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.accordion-body{padding:1rem
1.25rem}.accordion-flush
.accordion-collapse{border-width:0}.accordion-flush
.accordion-item{border-left:0;border-right:0;border-radius:0}.accordion-flush
.accordion-item:first-child{border-top:0}.accordion-flush
.accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item
.accordion-button{border-radius:0}.breadcrumb{display:flex;flex-wrap:wrap;padding:0
0;margin-bottom:1rem;list-style:none}.breadcrumb-item+.breadcrumb-item{padding-right:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:right;padding-left:.5rem;color:#6c757d;content:var(--bs-breadcrumb-divider,
"/")}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-right:0;list-style:none}.page-link{position:relative;display:block;color:#0d6efd;text-decoration:none;background-color:#fff;border:1px
solid #dee2e6;transition:color .15s ease-in-out,background-color .15s
ease-in-out,border-color .15s ease-in-out,box-shadow .15s
ease-in-out}@media
(prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:#0a58ca;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;color:#0a58ca;background-color:#e9ecef;outline:0;box-shadow:0
0 0 .25rem rgba(13,110,253,.25)}.page-item:not(:first-child)
.page-link{margin-right:-1px}.page-item.active
.page-link{z-index:3;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.page-item.disabled
.page-link{color:#6c757d;pointer-events:none;background-color:#fff;border-color:#dee2e6}.page-link{padding:.375rem
.75rem}.page-item:first-child
.page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item:last-child
.page-link{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.pagination-lg
.page-link{padding:.75rem 1.5rem;font-size:1.25rem}.pagination-lg
.page-item:first-child
.page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-lg
.page-item:last-child
.page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-sm
.page-link{padding:.25rem .5rem;font-size:.875rem}.pagination-sm
.page-item:first-child
.page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.pagination-sm
.page-item:last-child
.page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.badge{display:inline-block;padding:.35em
.65em;font-size:.75em;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn
.badge{position:relative;top:-1px}.alert{position:relative;padding:1rem
1rem;margin-bottom:1rem;border:1px solid
transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-left:3rem}.alert-dismissible
.btn-close{position:absolute;top:0;left:0;z-index:2;padding:1.25rem
1rem}.alert-primary{color:#084298;background-color:#cfe2ff;border-color:#b6d4fe}.alert-primary
.alert-link{color:#06357a}.alert-secondary{color:#41464b;background-color:#e2e3e5;border-color:#d3d6d8}.alert-secondary
.alert-link{color:#34383c}.alert-success{color:#0f5132;background-color:#d1e7dd;border-color:#badbcc}.alert-success
.alert-link{color:#0c4128}.alert-info{color:#055160;background-color:#cff4fc;border-color:#b6effb}.alert-info
.alert-link{color:#04414d}.alert-warning{color:#664d03;background-color:#fff3cd;border-color:#ffecb5}.alert-warning
.alert-link{color:#523e02}.alert-danger{color:#842029;background-color:#f8d7da;border-color:#f5c2c7}.alert-danger
.alert-link{color:#6a1a21}.alert-light{color:#636464;background-color:#fefefe;border-color:#fdfdfe}.alert-light
.alert-link{color:#4f5050}.alert-dark{color:#141619;background-color:#d3d3d4;border-color:#bcbebf}.alert-dark
.alert-link{color:#101214}@-webkit-keyframes
progress-bar-stripes{0%{background-position-x:1rem}}@keyframes
progress-bar-stripes{0%{background-position-x:1rem}}.progress{display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#0d6efd;transition:width
.6s ease}@media
(prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(-45deg,rgba(255,255,255,.15)
25%,transparent 25%,transparent 50%,rgba(255,255,255,.15)
50%,rgba(255,255,255,.15) 75%,transparent
75%,transparent);background-size:1rem
1rem}.progress-bar-animated{-webkit-animation:1s linear infinite
progress-bar-stripes;animation:1s linear infinite
progress-bar-stripes}@media
(prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.list-group{display:flex;flex-direction:column;padding-right:0;margin-bottom:0;border-radius:.25rem}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>li::before{content:counters(section,
".") ".
";counter-increment:section}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.5rem
1rem;color:#212529;text-decoration:none;background-color:#fff;border:1px
solid
rgba(0,0,0,.125)}.list-group-item:first-child{border-top-right-radius:inherit;border-top-left-radius:inherit}.list-group-item:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-right-radius:.25rem;border-top-left-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-left-radius:.25rem;border-bottom-right-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-right-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-right:-1px;border-right-width:1px}@media
(min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-right-radius:.25rem;border-top-left-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-left-radius:.25rem;border-bottom-right-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-right-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-right:-1px;border-right-width:1px}}@media
(min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-right-radius:.25rem;border-top-left-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-left-radius:.25rem;border-bottom-right-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-right-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-right:-1px;border-right-width:1px}}@media
(min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-right-radius:.25rem;border-top-left-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-left-radius:.25rem;border-bottom-right-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-right-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-right:-1px;border-right-width:1px}}@media
(min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-right-radius:.25rem;border-top-left-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-left-radius:.25rem;border-bottom-right-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-right-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-right:-1px;border-right-width:1px}}@media
(min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child{border-bottom-right-radius:.25rem;border-top-left-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child{border-top-left-radius:.25rem;border-bottom-right-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:1px;border-right-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-right:-1px;border-right-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0
0
1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#084298;background-color:#cfe2ff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#084298;background-color:#bacbe6}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#084298;border-color:#084298}.list-group-item-secondary{color:#41464b;background-color:#e2e3e5}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#41464b;background-color:#cbccce}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#41464b;border-color:#41464b}.list-group-item-success{color:#0f5132;background-color:#d1e7dd}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#0f5132;background-color:#bcd0c7}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#0f5132;border-color:#0f5132}.list-group-item-info{color:#055160;background-color:#cff4fc}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#055160;background-color:#badce3}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#055160;border-color:#055160}.list-group-item-warning{color:#664d03;background-color:#fff3cd}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#664d03;background-color:#e6dbb9}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#664d03;border-color:#664d03}.list-group-item-danger{color:#842029;background-color:#f8d7da}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#842029;background-color:#dfc2c4}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#842029;border-color:#842029}.list-group-item-light{color:#636464;background-color:#fefefe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#636464;background-color:#e5e5e5}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#636464;border-color:#636464}.list-group-item-dark{color:#141619;background-color:#d3d3d4}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#141619;background-color:#bebebf}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#141619;border-color:#141619}.btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em
.25em;color:#000;background:transparent url("data:image/svg+xml,%3csvg
xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'
fill='%23000'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586
14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8
9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0
010-1.414z'/%3e%3c/svg%3e") center/1em auto
no-repeat;border:0;border-radius:.25rem;opacity:.5}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{outline:0;box-shadow:0
0 0 .25rem
rgba(13,110,253,.25);opacity:1}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:.25}.btn-close-white{filter:invert(1)
grayscale(100%)
brightness(200%)}.toast{width:350px;max-width:100%;font-size:.875rem;pointer-events:auto;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px
solid rgba(0,0,0,.1);box-shadow:0 .5rem 1rem
rgba(0,0,0,.15);border-radius:.25rem}.toast:not(.showing):not(.show){opacity:0}.toast.hide{display:none}.toast-container{width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:.75rem}.toast-header{display:flex;align-items:center;padding:.5rem
.75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px
solid rgba(0,0,0,.05);border-top-right-radius:calc(.25rem -
1px);border-top-left-radius:calc(.25rem - 1px)}.toast-header
.btn-close{margin-left:-.375rem;margin-right:.75rem}.toast-body{padding:.75rem;word-wrap:break-word}.modal{position:fixed;top:0;right:0;z-index:1060;display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade
.modal-dialog{transition:transform .3s
ease-out;transform:translate(0,-50px)}@media
(prefers-reduced-motion:reduce){.modal.fade
.modal-dialog{transition:none}}.modal.show
.modal-dialog{transform:none}.modal.modal-static
.modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100%
- 1rem)}.modal-dialog-scrollable
.modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable
.modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100%
-
1rem)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px
solid
rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;right:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:1rem
1rem;border-bottom:1px solid #dee2e6;border-top-right-radius:calc(.3rem -
1px);border-top-left-radius:calc(.3rem - 1px)}.modal-header
.btn-close{padding:.5rem .5rem;margin:-.5rem auto -.5rem
-.5rem}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1
1
auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;flex-shrink:0;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px
solid #dee2e6;border-bottom-left-radius:calc(.3rem -
1px);border-bottom-right-radius:calc(.3rem -
1px)}.modal-footer>*{margin:.25rem}@media
(min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem
auto}.modal-dialog-scrollable{height:calc(100% -
3.5rem)}.modal-dialog-centered{min-height:calc(100% -
3.5rem)}.modal-sm{max-width:300px}}@media
(min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media
(min-width:1200px){.modal-xl{max-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen
.modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen
.modal-header{border-radius:0}.modal-fullscreen
.modal-body{overflow-y:auto}.modal-fullscreen
.modal-footer{border-radius:0}@media
(max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down
.modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down
.modal-header{border-radius:0}.modal-fullscreen-sm-down
.modal-body{overflow-y:auto}.modal-fullscreen-sm-down
.modal-footer{border-radius:0}}@media
(max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down
.modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down
.modal-header{border-radius:0}.modal-fullscreen-md-down
.modal-body{overflow-y:auto}.modal-fullscreen-md-down
.modal-footer{border-radius:0}}@media
(max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down
.modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down
.modal-header{border-radius:0}.modal-fullscreen-lg-down
.modal-body{overflow-y:auto}.modal-fullscreen-lg-down
.modal-footer{border-radius:0}}@media
(max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down
.modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down
.modal-header{border-radius:0}.modal-fullscreen-xl-down
.modal-body{overflow-y:auto}.modal-fullscreen-xl-down
.modal-footer{border-radius:0}}@media
(max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down
.modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down
.modal-header{border-radius:0}.modal-fullscreen-xxl-down
.modal-body{overflow-y:auto}.modal-fullscreen-xxl-down
.modal-footer{border-radius:0}}.tooltip{position:absolute;z-index:1080;display:block;margin:0;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:right;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip
.tooltip-arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip
.tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[data-popper-placement^=top],.bs-tooltip-top{padding:.4rem
0}.bs-tooltip-auto[data-popper-placement^=top]
.tooltip-arrow,.bs-tooltip-top
.tooltip-arrow{bottom:0}.bs-tooltip-auto[data-popper-placement^=top]
.tooltip-arrow::before,.bs-tooltip-top
.tooltip-arrow::before{top:-1px;border-width:.4rem .4rem
0;border-top-color:#000}.bs-tooltip-auto[data-popper-placement^=right],.bs-tooltip-end{padding:0
.4rem}.bs-tooltip-auto[data-popper-placement^=right]
.tooltip-arrow,.bs-tooltip-end
.tooltip-arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[data-popper-placement^=right]
.tooltip-arrow::before,.bs-tooltip-end
.tooltip-arrow::before{left:-1px;border-width:.4rem 0 .4rem
.4rem;border-left-color:#000}.bs-tooltip-auto[data-popper-placement^=bottom],.bs-tooltip-bottom{padding:.4rem
0}.bs-tooltip-auto[data-popper-placement^=bottom]
.tooltip-arrow,.bs-tooltip-bottom
.tooltip-arrow{top:0}.bs-tooltip-auto[data-popper-placement^=bottom]
.tooltip-arrow::before,.bs-tooltip-bottom
.tooltip-arrow::before{bottom:-1px;border-width:0 .4rem
.4rem;border-bottom-color:#000}.bs-tooltip-auto[data-popper-placement^=left],.bs-tooltip-start{padding:0
.4rem}.bs-tooltip-auto[data-popper-placement^=left]
.tooltip-arrow,.bs-tooltip-start
.tooltip-arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[data-popper-placement^=left]
.tooltip-arrow::before,.bs-tooltip-start
.tooltip-arrow::before{right:-1px;border-width:.4rem .4rem .4rem
0;border-right-color:#000}.tooltip-inner{max-width:200px;padding:.25rem
.5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1070;display:block;max-width:276px;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:right;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px
solid rgba(0,0,0,.2);border-radius:.3rem}.popover
.popover-arrow{position:absolute;display:block;width:1rem;height:.5rem}.popover
.popover-arrow::after,.popover
.popover-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(-.5rem
-
1px)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::before{bottom:0;border-width:.5rem
.5rem
0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-top>.popover-arrow::after{bottom:1px;border-width:.5rem
.5rem
0;border-top-color:#fff}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{right:calc(-.5rem
-
1px);width:.5rem;height:1rem}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::before{right:0;border-width:.5rem
0 .5rem
.5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-end>.popover-arrow::after{right:1px;border-width:.5rem
0 .5rem
.5rem;border-left-color:#fff}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(-.5rem
-
1px)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::before{top:0;border-width:0
.5rem .5rem
.5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::after{top:1px;border-width:0
.5rem .5rem
.5rem;border-bottom-color:#fff}.bs-popover-auto[data-popper-placement^=bottom]
.popover-header::before,.bs-popover-bottom
.popover-header::before{position:absolute;top:0;right:50%;display:block;width:1rem;margin-right:-.5rem;content:"";border-bottom:1px
solid
#f0f0f0}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{left:calc(-.5rem
-
1px);width:.5rem;height:1rem}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::before{left:0;border-width:.5rem
.5rem .5rem
0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-start>.popover-arrow::after{left:1px;border-width:.5rem
.5rem .5rem 0;border-right-color:#fff}.popover-header{padding:.5rem
1rem;margin-bottom:0;font-size:1rem;background-color:#f0f0f0;border-bottom:1px
solid rgba(0,0,0,.2);border-top-right-radius:calc(.3rem -
1px);border-top-left-radius:calc(.3rem -
1px)}.popover-header:empty{display:none}.popover-body{padding:1rem
1rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:right;width:100%;margin-left:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform
.6s ease-in-out}@media
(prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.carousel-fade
.carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade
.carousel-item-next.carousel-item-start,.carousel-fade
.carousel-item-prev.carousel-item-end,.carousel-fade
.carousel-item.active{z-index:1;opacity:1}.carousel-fade
.active.carousel-item-end,.carousel-fade
.active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s
.6s}@media (prefers-reduced-motion:reduce){.carousel-fade
.active.carousel-item-end,.carousel-fade
.active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0
0;border:0;opacity:.5;transition:opacity .15s ease}@media
(prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{right:0}.carousel-control-next{left:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100%
100%}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg
xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'
fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0
.708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1
0-.708l6-6a.5.5 0 0 1 .708
0z'/%3e%3c/svg%3e")}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg
xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'
fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6
6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0
1
0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;left:0;bottom:0;right:0;z-index:2;display:flex;justify-content:center;padding:0;margin-left:15%;margin-bottom:1rem;margin-right:15%;list-style:none}.carousel-indicators
[data-bs-target]{box-sizing:content-box;flex:0 1
auto;width:30px;height:3px;padding:0;margin-left:3px;margin-right:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px
solid transparent;border-bottom:10px solid
transparent;opacity:.5;transition:opacity .6s ease}@media
(prefers-reduced-motion:reduce){.carousel-indicators
[data-bs-target]{transition:none}}.carousel-indicators
.active{opacity:1}.carousel-caption{position:absolute;left:15%;bottom:1.25rem;right:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark
.carousel-control-next-icon,.carousel-dark
.carousel-control-prev-icon{filter:invert(1) grayscale(100)}.carousel-dark
.carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark
.carousel-caption{color:#000}@-webkit-keyframes
spinner-border{to{transform:rotate(360deg)}}@keyframes
spinner-border{to{transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;border:.25em
solid
currentColor;border-left-color:transparent;border-radius:50%;-webkit-animation:.75s
linear infinite spinner-border;animation:.75s linear infinite
spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes
spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}@keyframes
spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:.75s
linear infinite spinner-grow;animation:.75s linear infinite
spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media
(prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{-webkit-animation-duration:1.5s;animation-duration:1.5s}}.offcanvas{position:fixed;bottom:0;z-index:1050;display:flex;flex-direction:column;max-width:100%;visibility:hidden;background-color:#fff;background-clip:padding-box;outline:0;transition:transform
.3s ease-in-out}@media
(prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas-header{display:flex;align-items:center;justify-content:space-between;padding:1rem
1rem}.offcanvas-header .btn-close{padding:.5rem
.5rem;margin-top:-.5rem;margin-left:-.5rem;margin-bottom:-.5rem}.offcanvas-title{margin-bottom:0;line-height:1.5}.offcanvas-body{flex-grow:1;padding:1rem
1rem;overflow-y:auto}.offcanvas-start{top:0;right:0;width:400px;border-left:1px
solid
rgba(0,0,0,.2);transform:translateX(100%)}.offcanvas-end{top:0;left:0;width:400px;border-right:1px
solid
rgba(0,0,0,.2);transform:translateX(-100%)}.offcanvas-top{top:0;left:0;right:0;height:30vh;max-height:100%;border-bottom:1px
solid
rgba(0,0,0,.2);transform:translateY(-100%)}.offcanvas-bottom{left:0;right:0;height:30vh;max-height:100%;border-top:1px
solid
rgba(0,0,0,.2);transform:translateY(100%)}.offcanvas.show{transform:none}.clearfix::after{display:block;clear:both;content:""}.link-primary{color:#0d6efd}.link-primary:focus,.link-primary:hover{color:#0a58ca}.link-secondary{color:#6c757d}.link-secondary:focus,.link-secondary:hover{color:#565e64}.link-success{color:#198754}.link-success:focus,.link-success:hover{color:#146c43}.link-info{color:#0dcaf0}.link-info:focus,.link-info:hover{color:#3dd5f3}.link-warning{color:#ffc107}.link-warning:focus,.link-warning:hover{color:#ffcd39}.link-danger{color:#dc3545}.link-danger:focus,.link-danger:hover{color:#b02a37}.link-light{color:#f8f9fa}.link-light:focus,.link-light:hover{color:#f9fafb}.link-dark{color:#212529}.link-dark:focus,.link-dark:hover{color:#1a1e21}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;right:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:calc(3
/ 4 * 100%)}.ratio-16x9{--bs-aspect-ratio:calc(9 / 16 *
100%)}.ratio-21x9{--bs-aspect-ratio:calc(9 / 21 *
100%)}.fixed-top{position:fixed;top:0;left:0;right:0;z-index:1030}.fixed-bottom{position:fixed;left:0;bottom:0;right:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}@media
(min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media
(min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media
(min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media
(min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media
(min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.stretched-link::after{position:absolute;top:0;left:0;bottom:0;right:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:right!important}.float-end{float:left!important}.float-none{float:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:0
.5rem 1rem rgba(0,0,0,.15)!important}.shadow-sm{box-shadow:0 .125rem .25rem
rgba(0,0,0,.075)!important}.shadow-lg{box-shadow:0 1rem 3rem
rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{right:0!important}.start-50{right:50%!important}.start-100{right:100%!important}.end-0{left:0!important}.end-50{left:50%!important}.end-100{left:100%!important}.translate-middle{transform:translate(50%,-50%)!important}.translate-middle-x{transform:translateX(50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:1px
solid
#dee2e6!important}.border-0{border:0!important}.border-top{border-top:1px
solid
#dee2e6!important}.border-top-0{border-top:0!important}.border-end{border-left:1px
solid
#dee2e6!important}.border-end-0{border-left:0!important}.border-bottom{border-bottom:1px
solid
#dee2e6!important}.border-bottom-0{border-bottom:0!important}.border-start{border-right:1px
solid
#dee2e6!important}.border-start-0{border-right:0!important}.border-primary{border-color:#0d6efd!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#198754!important}.border-info{border-color:#0dcaf0!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#212529!important}.border-white{border-color:#fff!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1
1
auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-left:0!important;margin-right:0!important}.mx-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-3{margin-left:1rem!important;margin-right:1rem!important}.mx-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-5{margin-left:3rem!important;margin-right:3rem!important}.mx-auto{margin-left:auto!important;margin-right:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-left:0!important}.me-1{margin-left:.25rem!important}.me-2{margin-left:.5rem!important}.me-3{margin-left:1rem!important}.me-4{margin-left:1.5rem!important}.me-5{margin-left:3rem!important}.me-auto{margin-left:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-right:0!important}.ms-1{margin-right:.25rem!important}.ms-2{margin-right:.5rem!important}.ms-3{margin-right:1rem!important}.ms-4{margin-right:1.5rem!important}.ms-5{margin-right:3rem!important}.ms-auto{margin-right:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-left:0!important;padding-right:0!important}.px-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-3{padding-left:1rem!important;padding-right:1rem!important}.px-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-5{padding-left:3rem!important;padding-right:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-left:0!important}.pe-1{padding-left:.25rem!important}.pe-2{padding-left:.5rem!important}.pe-3{padding-left:1rem!important}.pe-4{padding-left:1.5rem!important}.pe-5{padding-left:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-right:0!important}.ps-1{padding-right:.25rem!important}.ps-2{padding-right:.5rem!important}.ps-3{padding-right:1rem!important}.ps-4{padding-right:1.5rem!important}.ps-5{padding-right:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem
+ 1.5vw)!important}.fs-2{font-size:calc(1.325rem +
.9vw)!important}.fs-3{font-size:calc(1.3rem +
.6vw)!important}.fs-4{font-size:calc(1.275rem +
.3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-light{font-weight:300!important}.fw-lighter{font-weight:lighter!important}.fw-normal{font-weight:400!important}.fw-bold{font-weight:700!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:right!important}.text-end{text-align:left!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-primary{color:#0d6efd!important}.text-secondary{color:#6c757d!important}.text-success{color:#198754!important}.text-info{color:#0dcaf0!important}.text-warning{color:#ffc107!important}.text-danger{color:#dc3545!important}.text-light{color:#f8f9fa!important}.text-dark{color:#212529!important}.text-white{color:#fff!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-reset{color:inherit!important}.bg-primary{background-color:#0d6efd!important}.bg-secondary{background-color:#6c757d!important}.bg-success{background-color:#198754!important}.bg-info{background-color:#0dcaf0!important}.bg-warning{background-color:#ffc107!important}.bg-danger{background-color:#dc3545!important}.bg-light{background-color:#f8f9fa!important}.bg-dark{background-color:#212529!important}.bg-body{background-color:#fff!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:.25rem!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:.2rem!important}.rounded-2{border-radius:.25rem!important}.rounded-3{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-top{border-top-right-radius:.25rem!important;border-top-left-radius:.25rem!important}.rounded-end{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-bottom{border-bottom-left-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-start{border-bottom-right-radius:.25rem!important;border-top-right-radius:.25rem!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media
(min-width:576px){.float-sm-start{float:right!important}.float-sm-end{float:left!important}.float-sm-none{float:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1
1
auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-left:0!important;margin-right:0!important}.mx-sm-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-sm-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-sm-3{margin-left:1rem!important;margin-right:1rem!important}.mx-sm-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-sm-5{margin-left:3rem!important;margin-right:3rem!important}.mx-sm-auto{margin-left:auto!important;margin-right:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-left:0!important}.me-sm-1{margin-left:.25rem!important}.me-sm-2{margin-left:.5rem!important}.me-sm-3{margin-left:1rem!important}.me-sm-4{margin-left:1.5rem!important}.me-sm-5{margin-left:3rem!important}.me-sm-auto{margin-left:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-right:0!important}.ms-sm-1{margin-right:.25rem!important}.ms-sm-2{margin-right:.5rem!important}.ms-sm-3{margin-right:1rem!important}.ms-sm-4{margin-right:1.5rem!important}.ms-sm-5{margin-right:3rem!important}.ms-sm-auto{margin-right:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-left:0!important;padding-right:0!important}.px-sm-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-sm-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-sm-3{padding-left:1rem!important;padding-right:1rem!important}.px-sm-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-sm-5{padding-left:3rem!important;padding-right:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-left:0!important}.pe-sm-1{padding-left:.25rem!important}.pe-sm-2{padding-left:.5rem!important}.pe-sm-3{padding-left:1rem!important}.pe-sm-4{padding-left:1.5rem!important}.pe-sm-5{padding-left:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-right:0!important}.ps-sm-1{padding-right:.25rem!important}.ps-sm-2{padding-right:.5rem!important}.ps-sm-3{padding-right:1rem!important}.ps-sm-4{padding-right:1.5rem!important}.ps-sm-5{padding-right:3rem!important}.text-sm-start{text-align:right!important}.text-sm-end{text-align:left!important}.text-sm-center{text-align:center!important}}@media
(min-width:768px){.float-md-start{float:right!important}.float-md-end{float:left!important}.float-md-none{float:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1
1
auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-left:0!important;margin-right:0!important}.mx-md-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-md-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-md-3{margin-left:1rem!important;margin-right:1rem!important}.mx-md-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-md-5{margin-left:3rem!important;margin-right:3rem!important}.mx-md-auto{margin-left:auto!important;margin-right:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-left:0!important}.me-md-1{margin-left:.25rem!important}.me-md-2{margin-left:.5rem!important}.me-md-3{margin-left:1rem!important}.me-md-4{margin-left:1.5rem!important}.me-md-5{margin-left:3rem!important}.me-md-auto{margin-left:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-right:0!important}.ms-md-1{margin-right:.25rem!important}.ms-md-2{margin-right:.5rem!important}.ms-md-3{margin-right:1rem!important}.ms-md-4{margin-right:1.5rem!important}.ms-md-5{margin-right:3rem!important}.ms-md-auto{margin-right:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-left:0!important;padding-right:0!important}.px-md-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-md-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-md-3{padding-left:1rem!important;padding-right:1rem!important}.px-md-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-md-5{padding-left:3rem!important;padding-right:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-left:0!important}.pe-md-1{padding-left:.25rem!important}.pe-md-2{padding-left:.5rem!important}.pe-md-3{padding-left:1rem!important}.pe-md-4{padding-left:1.5rem!important}.pe-md-5{padding-left:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-right:0!important}.ps-md-1{padding-right:.25rem!important}.ps-md-2{padding-right:.5rem!important}.ps-md-3{padding-right:1rem!important}.ps-md-4{padding-right:1.5rem!important}.ps-md-5{padding-right:3rem!important}.text-md-start{text-align:right!important}.text-md-end{text-align:left!important}.text-md-center{text-align:center!important}}@media
(min-width:992px){.float-lg-start{float:right!important}.float-lg-end{float:left!important}.float-lg-none{float:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1
1
auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-left:0!important;margin-right:0!important}.mx-lg-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-lg-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-lg-3{margin-left:1rem!important;margin-right:1rem!important}.mx-lg-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-lg-5{margin-left:3rem!important;margin-right:3rem!important}.mx-lg-auto{margin-left:auto!important;margin-right:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-left:0!important}.me-lg-1{margin-left:.25rem!important}.me-lg-2{margin-left:.5rem!important}.me-lg-3{margin-left:1rem!important}.me-lg-4{margin-left:1.5rem!important}.me-lg-5{margin-left:3rem!important}.me-lg-auto{margin-left:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-right:0!important}.ms-lg-1{margin-right:.25rem!important}.ms-lg-2{margin-right:.5rem!important}.ms-lg-3{margin-right:1rem!important}.ms-lg-4{margin-right:1.5rem!important}.ms-lg-5{margin-right:3rem!important}.ms-lg-auto{margin-right:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-left:0!important;padding-right:0!important}.px-lg-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-lg-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-lg-3{padding-left:1rem!important;padding-right:1rem!important}.px-lg-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-lg-5{padding-left:3rem!important;padding-right:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-left:0!important}.pe-lg-1{padding-left:.25rem!important}.pe-lg-2{padding-left:.5rem!important}.pe-lg-3{padding-left:1rem!important}.pe-lg-4{padding-left:1.5rem!important}.pe-lg-5{padding-left:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-right:0!important}.ps-lg-1{padding-right:.25rem!important}.ps-lg-2{padding-right:.5rem!important}.ps-lg-3{padding-right:1rem!important}.ps-lg-4{padding-right:1.5rem!important}.ps-lg-5{padding-right:3rem!important}.text-lg-start{text-align:right!important}.text-lg-end{text-align:left!important}.text-lg-center{text-align:center!important}}@media
(min-width:1200px){.float-xl-start{float:right!important}.float-xl-end{float:left!important}.float-xl-none{float:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1
1
auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-left:0!important;margin-right:0!important}.mx-xl-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-xl-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-xl-3{margin-left:1rem!important;margin-right:1rem!important}.mx-xl-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-xl-5{margin-left:3rem!important;margin-right:3rem!important}.mx-xl-auto{margin-left:auto!important;margin-right:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-left:0!important}.me-xl-1{margin-left:.25rem!important}.me-xl-2{margin-left:.5rem!important}.me-xl-3{margin-left:1rem!important}.me-xl-4{margin-left:1.5rem!important}.me-xl-5{margin-left:3rem!important}.me-xl-auto{margin-left:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-right:0!important}.ms-xl-1{margin-right:.25rem!important}.ms-xl-2{margin-right:.5rem!important}.ms-xl-3{margin-right:1rem!important}.ms-xl-4{margin-right:1.5rem!important}.ms-xl-5{margin-right:3rem!important}.ms-xl-auto{margin-right:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-left:0!important;padding-right:0!important}.px-xl-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-xl-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-xl-3{padding-left:1rem!important;padding-right:1rem!important}.px-xl-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-xl-5{padding-left:3rem!important;padding-right:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-left:0!important}.pe-xl-1{padding-left:.25rem!important}.pe-xl-2{padding-left:.5rem!important}.pe-xl-3{padding-left:1rem!important}.pe-xl-4{padding-left:1.5rem!important}.pe-xl-5{padding-left:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-right:0!important}.ps-xl-1{padding-right:.25rem!important}.ps-xl-2{padding-right:.5rem!important}.ps-xl-3{padding-right:1rem!important}.ps-xl-4{padding-right:1.5rem!important}.ps-xl-5{padding-right:3rem!important}.text-xl-start{text-align:right!important}.text-xl-end{text-align:left!important}.text-xl-center{text-align:center!important}}@media
(min-width:1400px){.float-xxl-start{float:right!important}.float-xxl-end{float:left!important}.float-xxl-none{float:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1
1
auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-left:0!important;margin-right:0!important}.mx-xxl-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-xxl-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-xxl-3{margin-left:1rem!important;margin-right:1rem!important}.mx-xxl-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-xxl-5{margin-left:3rem!important;margin-right:3rem!important}.mx-xxl-auto{margin-left:auto!important;margin-right:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-left:0!important}.me-xxl-1{margin-left:.25rem!important}.me-xxl-2{margin-left:.5rem!important}.me-xxl-3{margin-left:1rem!important}.me-xxl-4{margin-left:1.5rem!important}.me-xxl-5{margin-left:3rem!important}.me-xxl-auto{margin-left:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-right:0!important}.ms-xxl-1{margin-right:.25rem!important}.ms-xxl-2{margin-right:.5rem!important}.ms-xxl-3{margin-right:1rem!important}.ms-xxl-4{margin-right:1.5rem!important}.ms-xxl-5{margin-right:3rem!important}.ms-xxl-auto{margin-right:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-left:0!important;padding-right:0!important}.px-xxl-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-xxl-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-xxl-3{padding-left:1rem!important;padding-right:1rem!important}.px-xxl-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-xxl-5{padding-left:3rem!important;padding-right:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-left:0!important}.pe-xxl-1{padding-left:.25rem!important}.pe-xxl-2{padding-left:.5rem!important}.pe-xxl-3{padding-left:1rem!important}.pe-xxl-4{padding-left:1.5rem!important}.pe-xxl-5{padding-left:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-right:0!important}.ps-xxl-1{padding-right:.25rem!important}.ps-xxl-2{padding-right:.5rem!important}.ps-xxl-3{padding-right:1rem!important}.ps-xxl-4{padding-right:1.5rem!important}.ps-xxl-5{padding-right:3rem!important}.text-xxl-start{text-align:right!important}.text-xxl-end{text-align:left!important}.text-xxl-center{text-align:center!important}}@media
(min-width:1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media
print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}}
/*# sourceMappingURL=bootstrap.rtl.min.css.map
*/PK,�[�#o,,bootstraprtl/css/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK,�[�#o,,bootstraprtl/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK,�[���ˆr�r"bootstrapv45/css/bootstrap.min.cssnu�[���/*!
 * Bootstrap v4.5.3 (https://getbootstrap.com/)
 * Copyright 2011-2020 The Bootstrap Authors
 * Copyright 2011-2020 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
 */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe
UI",Roboto,"Helvetica Neue",Arial,"Noto
Sans",sans-serif,"Apple Color Emoji","Segoe UI
Emoji","Segoe UI Symbol","Noto Color
Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation
Mono","Courier
New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe
UI",Roboto,"Helvetica Neue",Arial,"Noto
Sans",sans-serif,"Apple Color Emoji","Segoe UI
Emoji","Segoe UI Symbol","Noto Color
Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline
dotted;text-decoration:underline
dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol
ol,ol ul,ul ol,ul
ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0
0
1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([class]){color:inherit;text-decoration:none}a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation
Mono","Courier
New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0
0
1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit;text-align:-webkit-match-parent}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px
dotted;outline:5px auto
-webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px
solid
rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px
solid
#dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem
.4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd
kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre
code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media
(min-width:576px){.container,.container-sm{max-width:540px}}@media
(min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media
(min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media
(min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-1>*{-ms-flex:0
0 100%;flex:0 0 100%;max-width:100%}.row-cols-2>*{-ms-flex:0 0
50%;flex:0 0 50%;max-width:50%}.row-cols-3>*{-ms-flex:0 0
33.333333%;flex:0 0
33.333333%;max-width:33.333333%}.row-cols-4>*{-ms-flex:0 0 25%;flex:0 0
25%;max-width:25%}.row-cols-5>*{-ms-flex:0 0 20%;flex:0 0
20%;max-width:20%}.row-cols-6>*{-ms-flex:0 0 16.666667%;flex:0 0
16.666667%;max-width:16.666667%}.col-auto{-ms-flex:0 0 auto;flex:0 0
auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0
8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0
16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0
25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0
33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0
41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0
50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0
58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0
66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0
75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0
83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0
91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0
100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media
(min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-sm-1>*{-ms-flex:0
0 100%;flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{-ms-flex:0 0
50%;flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{-ms-flex:0 0
33.333333%;flex:0 0
33.333333%;max-width:33.333333%}.row-cols-sm-4>*{-ms-flex:0 0 25%;flex:0
0 25%;max-width:25%}.row-cols-sm-5>*{-ms-flex:0 0 20%;flex:0 0
20%;max-width:20%}.row-cols-sm-6>*{-ms-flex:0 0 16.666667%;flex:0 0
16.666667%;max-width:16.666667%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0
auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0
8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0
16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0
25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0
33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0
41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0
50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0
58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0
66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0
75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0
83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0
91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0
100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media
(min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-md-1>*{-ms-flex:0
0 100%;flex:0 0 100%;max-width:100%}.row-cols-md-2>*{-ms-flex:0 0
50%;flex:0 0 50%;max-width:50%}.row-cols-md-3>*{-ms-flex:0 0
33.333333%;flex:0 0
33.333333%;max-width:33.333333%}.row-cols-md-4>*{-ms-flex:0 0 25%;flex:0
0 25%;max-width:25%}.row-cols-md-5>*{-ms-flex:0 0 20%;flex:0 0
20%;max-width:20%}.row-cols-md-6>*{-ms-flex:0 0 16.666667%;flex:0 0
16.666667%;max-width:16.666667%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0
auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0
8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0
16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0
25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0
33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0
41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0
50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0
58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0
66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0
75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0
83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0
91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0
100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media
(min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-lg-1>*{-ms-flex:0
0 100%;flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{-ms-flex:0 0
50%;flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{-ms-flex:0 0
33.333333%;flex:0 0
33.333333%;max-width:33.333333%}.row-cols-lg-4>*{-ms-flex:0 0 25%;flex:0
0 25%;max-width:25%}.row-cols-lg-5>*{-ms-flex:0 0 20%;flex:0 0
20%;max-width:20%}.row-cols-lg-6>*{-ms-flex:0 0 16.666667%;flex:0 0
16.666667%;max-width:16.666667%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0
auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0
8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0
16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0
25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0
33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0
41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0
50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0
58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0
66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0
75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0
83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0
91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0
100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media
(min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-xl-1>*{-ms-flex:0
0 100%;flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{-ms-flex:0 0
50%;flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{-ms-flex:0 0
33.333333%;flex:0 0
33.333333%;max-width:33.333333%}.row-cols-xl-4>*{-ms-flex:0 0 25%;flex:0
0 25%;max-width:25%}.row-cols-xl-5>*{-ms-flex:0 0 20%;flex:0 0
20%;max-width:20%}.row-cols-xl-6>*{-ms-flex:0 0 16.666667%;flex:0 0
16.666667%;max-width:16.666667%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0
auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0
8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0
16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0
25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0
33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0
41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0
50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0
58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0
66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0
75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0
83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0
91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0
100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table
td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid
#dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid
#dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm
td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid
#dee2e6}.table-bordered td,.table-bordered th{border:1px solid
#dee2e6}.table-bordered thead td,.table-bordered thead
th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless
td,.table-borderless th,.table-borderless thead th{border:0}.table-striped
tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover
tbody
tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary
tbody+tbody,.table-primary td,.table-primary th,.table-primary thead
th{border-color:#7abaff}.table-hover
.table-primary:hover{background-color:#9fcdff}.table-hover
.table-primary:hover>td,.table-hover
.table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary
tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead
th{border-color:#b3b7bb}.table-hover
.table-secondary:hover{background-color:#c8cbcf}.table-hover
.table-secondary:hover>td,.table-hover
.table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success
tbody+tbody,.table-success td,.table-success th,.table-success thead
th{border-color:#8fd19e}.table-hover
.table-success:hover{background-color:#b1dfbb}.table-hover
.table-success:hover>td,.table-hover
.table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info
tbody+tbody,.table-info td,.table-info th,.table-info thead
th{border-color:#86cfda}.table-hover
.table-info:hover{background-color:#abdde5}.table-hover
.table-info:hover>td,.table-hover
.table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning
tbody+tbody,.table-warning td,.table-warning th,.table-warning thead
th{border-color:#ffdf7e}.table-hover
.table-warning:hover{background-color:#ffe8a1}.table-hover
.table-warning:hover>td,.table-hover
.table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-danger
tbody+tbody,.table-danger td,.table-danger th,.table-danger thead
th{border-color:#ed969e}.table-hover
.table-danger:hover{background-color:#f1b0b7}.table-hover
.table-danger:hover>td,.table-hover
.table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light
tbody+tbody,.table-light td,.table-light th,.table-light thead
th{border-color:#fbfcfc}.table-hover
.table-light:hover{background-color:#ececf6}.table-hover
.table-light:hover>td,.table-hover
.table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark
tbody+tbody,.table-dark td,.table-dark th,.table-dark thead
th{border-color:#95999c}.table-hover
.table-dark:hover{background-color:#b9bbbe}.table-hover
.table-dark:hover>td,.table-hover
.table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover
.table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover
.table-active:hover>td,.table-hover
.table-active:hover>th{background-color:rgba(0,0,0,.075)}.table
.thead-dark
th{color:#fff;background-color:#343a40;border-color:#454d55}.table
.thead-light
th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark
td,.table-dark th,.table-dark thead
th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped
tbody
tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover
tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.075)}@media
(max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media
(max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media
(max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media
(max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em
+ .75rem + 2px);padding:.375rem
.75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px
solid #ced4da;border-radius:.25rem;transition:border-color .15s
ease-in-out,box-shadow .15s ease-in-out}@media
(prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:-moz-focusring{color:transparent;text-shadow:0
0 0
#495057}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0
0 0 .2rem
rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{-webkit-appearance:none;-moz-appearance:none;appearance:none}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem
+ 1px);padding-bottom:calc(.375rem +
1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem
+ 1px);padding-bottom:calc(.5rem +
1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem
+ 1px);padding-bottom:calc(.25rem +
1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding:.375rem
0;margin-bottom:0;font-size:1rem;line-height:1.5;color:#212529;background-color:transparent;border:solid
transparent;border-width:1px
0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em
+ .5rem + 2px);padding:.25rem
.5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em
+ 1rem + 2px);padding:.5rem
1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline
.form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem
.5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated
:valid~.valid-feedback,.was-validated
:valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated
.form-control:valid{border-color:#28a745;padding-right:calc(1.5em +
.75rem);background-image:url("data:image/svg+xml,%3csvg
xmlns='http://www.w3.org/2000/svg' width='8'
height='8' viewBox='0 0 8 8'%3e%3cpath
fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4
1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4
4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right
calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem)
calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated
.form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem
rgba(40,167,69,.25)}.was-validated
textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em
+ .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em
+ .1875rem)}.custom-select.is-valid,.was-validated
.custom-select:valid{border-color:#28a745;padding-right:calc(.75em +
2.3125rem);background:url("data:image/svg+xml,%3csvg
xmlns='http://www.w3.org/2000/svg' width='4'
height='5' viewBox='0 0 4 5'%3e%3cpath
fill='%23343a40' d='M2 0L0 2h4zm0 5L0
3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px
10px,url("data:image/svg+xml,%3csvg
xmlns='http://www.w3.org/2000/svg' width='8'
height='8' viewBox='0 0 8 8'%3e%3cpath
fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4
1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4
4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center
right 1.75rem/calc(.75em + .375rem) calc(.75em +
.375rem)}.custom-select.is-valid:focus,.was-validated
.custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem
rgba(40,167,69,.25)}.form-check-input.is-valid~.form-check-label,.was-validated
.form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated
.form-check-input:valid~.valid-feedback,.was-validated
.form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated
.custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated
.custom-control-input:valid~.custom-control-label::before{border-color:#28a745}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated
.custom-control-input:valid:checked~.custom-control-label::before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated
.custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0
0 0 .2rem
rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,.was-validated
.custom-control-input:valid:focus:not(:checked)~.custom-control-label::before{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label,.was-validated
.custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated
.custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0
0 0 .2rem
rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem
.5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated
:invalid~.invalid-feedback,.was-validated
:invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated
.form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em +
.75rem);background-image:url("data:image/svg+xml,%3csvg
xmlns='http://www.w3.org/2000/svg' width='12'
height='12' fill='none' stroke='%23dc3545'
viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6'
r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8
3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2'
r='.6' fill='%23dc3545'
stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right
calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem)
calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated
.form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem
rgba(220,53,69,.25)}.was-validated
textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em
+ .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em
+ .1875rem)}.custom-select.is-invalid,.was-validated
.custom-select:invalid{border-color:#dc3545;padding-right:calc(.75em +
2.3125rem);background:url("data:image/svg+xml,%3csvg
xmlns='http://www.w3.org/2000/svg' width='4'
height='5' viewBox='0 0 4 5'%3e%3cpath
fill='%23343a40' d='M2 0L0 2h4zm0 5L0
3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px
10px,url("data:image/svg+xml,%3csvg
xmlns='http://www.w3.org/2000/svg' width='12'
height='12' fill='none' stroke='%23dc3545'
viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6'
r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8
3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2'
r='.6' fill='%23dc3545'
stroke='none'/%3e%3c/svg%3e") #fff no-repeat center right
1.75rem/calc(.75em + .375rem) calc(.75em +
.375rem)}.custom-select.is-invalid:focus,.was-validated
.custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem
rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated
.form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated
.form-check-input:invalid~.invalid-feedback,.was-validated
.form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated
.custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated
.custom-control-input:invalid~.custom-control-label::before{border-color:#dc3545}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated
.custom-control-input:invalid:checked~.custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated
.custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0
0 0 .2rem
rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,.was-validated
.custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label,.was-validated
.custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated
.custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0
0 0 .2rem
rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row
wrap;flex-flow:row
wrap;-ms-flex-align:center;align-items:center}.form-inline
.form-check{width:100%}@media (min-width:576px){.form-inline
label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline
.form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0
auto;-ms-flex-flow:row wrap;flex-flow:row
wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline
.form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline
.form-control-plaintext{display:inline-block}.form-inline
.custom-select,.form-inline .input-group{width:auto}.form-inline
.form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline
.form-check-input{position:relative;-ms-flex-negative:0;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline
.custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline
.custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px
solid transparent;padding:.375rem
.75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color
.15s ease-in-out,background-color .15s ease-in-out,border-color .15s
ease-in-out,box-shadow .15s ease-in-out}@media
(prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0
0 0 .2rem
rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled
a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#0069d9;border-color:#0062cc;box-shadow:0
0 0 .2rem
rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0
0 0 .2rem
rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{color:#fff;background-color:#5a6268;border-color:#545b62;box-shadow:0
0 0 .2rem
rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0
0 0 .2rem
rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#218838;border-color:#1e7e34;box-shadow:0
0 0 .2rem
rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0
0 0 .2rem
rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#138496;border-color:#117a8b;box-shadow:0
0 0 .2rem
rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0
0 0 .2rem
rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{color:#212529;background-color:#e0a800;border-color:#d39e00;box-shadow:0
0 0 .2rem
rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0
0 0 .2rem
rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c82333;border-color:#bd2130;box-shadow:0
0 0 .2rem
rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0
0 0 .2rem
rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{color:#212529;background-color:#e2e6ea;border-color:#dae0e5;box-shadow:0
0 0 .2rem
rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0
0 0 .2rem
rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{color:#fff;background-color:#23272b;border-color:#1d2124;box-shadow:0
0 0 .2rem
rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0
0 0 .2rem
rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0
0 0 .2rem
rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0
0 0 .2rem
rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0
0 0 .2rem
rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0
0 0 .2rem
rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0
0 0 .2rem
rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0
0 0 .2rem
rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0
0 0 .2rem
rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0
0 0 .2rem
rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0
0 0 .2rem
rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0
0 0 .2rem
rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0
0 0 .2rem
rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0
0 0 .2rem
rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0
0 0 .2rem
rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0
0 0 .2rem
rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0
0 0 .2rem
rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0
0 0 .2rem
rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3;text-decoration:underline}.btn-link.focus,.btn-link:focus{text-decoration:underline}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem
1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem
.5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity
.15s linear}@media
(prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height
.35s ease}@media
(prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em
solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em
solid
transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem
0;margin:.125rem 0
0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px
solid
rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media
(min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media
(min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media
(min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media
(min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup
.dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup
.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em
solid transparent;border-bottom:.3em solid;border-left:.3em solid
transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright
.dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright
.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em
solid transparent;border-right:0;border-bottom:.3em solid
transparent;border-left:.3em solid}.dropright
.dropdown-toggle:empty::after{margin-left:0}.dropright
.dropdown-toggle::after{vertical-align:0}.dropleft
.dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft
.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft
.dropdown-toggle::after{display:none}.dropleft
.dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em
solid transparent;border-right:.3em solid;border-bottom:.3em solid
transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft
.dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem
0;overflow:hidden;border-top:1px solid
#e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem
1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem
1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem
1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:1
1 auto;flex:1 1
auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar
.input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright
.dropdown-toggle-split::after,.dropup
.dropdown-toggle-split::after{margin-left:0}.dropleft
.dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn
input[type=checkbox],.btn-group-toggle>.btn
input[type=radio],.btn-group-toggle>.btn-group>.btn
input[type=checkbox],.btn-group-toggle>.btn-group>.btn
input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;-ms-flex:1
1 auto;flex:1 1
auto;width:1%;min-width:0;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file
.custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file
.custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child)
.custom-file-label,.input-group>.custom-file:not(:last-child)
.custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child)
.custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append
.btn,.input-group-prepend
.btn{position:relative;z-index:2}.input-group-append
.btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append
.btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append
.input-group-text+.btn,.input-group-append
.input-group-text+.input-group-text,.input-group-prepend
.btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend
.input-group-text+.btn,.input-group-prepend
.input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem
.75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px
solid #ced4da;border-radius:.25rem}.input-group-text
input[type=checkbox],.input-group-text
input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em
+ 1rem +
2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem
1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em
+ .5rem +
2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem
.5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;z-index:1;display:block;min-height:1.5rem;padding-left:1.5rem;-webkit-print-color-adjust:exact;color-adjust:exact}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;left:0;z-index:-1;width:1rem;height:1.25rem;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0
0 0 .2rem
rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label,.custom-control-input[disabled]~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before,.custom-control-input[disabled]~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:#adb5bd
solid
1px}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:no-repeat
50%/50% 50%}.custom-checkbox
.custom-control-label::before{border-radius:.25rem}.custom-checkbox
.custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg
xmlns='http://www.w3.org/2000/svg' width='8'
height='8' viewBox='0 0 8 8'%3e%3cpath
fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0
4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox
.custom-control-input:indeterminate~.custom-control-label::before{border-color:#007bff;background-color:#007bff}.custom-checkbox
.custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg
xmlns='http://www.w3.org/2000/svg' width='4'
height='4' viewBox='0 0 4 4'%3e%3cpath
stroke='%23fff' d='M0
2h4'/%3e%3c/svg%3e")}.custom-checkbox
.custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox
.custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio
.custom-control-label::before{border-radius:50%}.custom-radio
.custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg
xmlns='http://www.w3.org/2000/svg' width='12'
height='12' viewBox='-4 -4 8 8'%3e%3ccircle
r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio
.custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch
.custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch
.custom-control-label::after{top:calc(.25rem + 2px);left:calc(-2.25rem +
2px);width:calc(1rem - 4px);height:calc(1rem -
4px);background-color:#adb5bd;border-radius:.5rem;transition:background-color
.15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s
ease-in-out,-webkit-transform .15s ease-in-out;transition:transform .15s
ease-in-out,background-color .15s ease-in-out,border-color .15s
ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s
ease-in-out,background-color .15s ease-in-out,border-color .15s
ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s
ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch
.custom-control-label::after{transition:none}}.custom-switch
.custom-control-input:checked~.custom-control-label::after{background-color:#fff;-webkit-transform:translateX(.75rem);transform:translateX(.75rem)}.custom-switch
.custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em
+ .75rem + 2px);padding:.375rem 1.75rem .375rem
.75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:#fff
url("data:image/svg+xml,%3csvg
xmlns='http://www.w3.org/2000/svg' width='4'
height='5' viewBox='0 0 4 5'%3e%3cpath
fill='%23343a40' d='M2 0L0 2h4zm0 5L0
3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px
10px;border:1px solid
#ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0
0 0 .2rem
rgba(0,123,255,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:transparent;text-shadow:0
0 0 #495057}.custom-select-sm{height:calc(1.5em + .5rem +
2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em
+ 1rem +
2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em
+ .75rem +
2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em
+ .75rem +
2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0
0 0 .2rem
rgba(0,123,255,.25)}.custom-file-input:disabled~.custom-file-label,.custom-file-input[disabled]~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em
+ .75rem + 2px);padding:.375rem
.75rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px
solid
#ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em
+ .75rem);padding:.375rem
.75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0
.25rem .25rem
0}.custom-range{width:100%;height:1.4rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0
0 0 1px #fff,0 0 0 .2rem
rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0
1px #fff,0 0 0 .2rem
rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px
#fff,0 0 0 .2rem
rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;-webkit-transition:background-color
.15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s
ease-in-out;transition:background-color .15s ease-in-out,border-color .15s
ease-in-out,box-shadow .15s
ease-in-out;-webkit-appearance:none;appearance:none}@media
(prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;-moz-transition:background-color
.15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s
ease-in-out;transition:background-color .15s ease-in-out,border-color .15s
ease-in-out,box-shadow .15s
ease-in-out;-moz-appearance:none;appearance:none}@media
(prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{-moz-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;-ms-transition:background-color
.15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s
ease-in-out;transition:background-color .15s ease-in-out,border-color .15s
ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media
(prefers-reduced-motion:reduce){.custom-range::-ms-thumb{-ms-transition:none;transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color
.15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s
ease-in-out}@media
(prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem
1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px
solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs
.nav-link{border:1px solid
transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs
.nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef
#dee2e6}.nav-tabs
.nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs
.nav-item.show .nav-link,.nav-tabs
.nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6
#dee2e6 #fff}.nav-tabs
.dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills
.nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills
.show>.nav-link{color:#fff;background-color:#007bff}.nav-fill
.nav-item,.nav-fill>.nav-link{-ms-flex:1 1 auto;flex:1 1
auto;text-align:center}.nav-justified
.nav-item,.nav-justified>.nav-link{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem
1rem}.navbar .container,.navbar .container-fluid,.navbar
.container-lg,.navbar .container-md,.navbar .container-sm,.navbar
.container-xl{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav
.nav-link{padding-right:0;padding-left:0}.navbar-nav
.dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem
.75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px
solid
transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat
center center;background-size:100% 100%}@media
(max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{padding-right:0;padding-left:0}}@media
(min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row
nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm
.navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm
.navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav
.nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm
.navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm
.navbar-toggler{display:none}}@media
(max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{padding-right:0;padding-left:0}}@media
(min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row
nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md
.navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md
.navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav
.nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md
.navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md
.navbar-toggler{display:none}}@media
(max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{padding-right:0;padding-left:0}}@media
(min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row
nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg
.navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg
.navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav
.nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg
.navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg
.navbar-toggler{display:none}}@media
(max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{padding-right:0;padding-left:0}}@media
(min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row
nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl
.navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl
.navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav
.nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl
.navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl
.navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row
nowrap;flex-flow:row
nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{padding-right:0;padding-left:0}.navbar-expand
.navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand
.navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav
.nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand
.navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand
.navbar-toggler{display:none}.navbar-light
.navbar-brand{color:rgba(0,0,0,.9)}.navbar-light
.navbar-brand:focus,.navbar-light
.navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav
.nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav
.nav-link:focus,.navbar-light .navbar-nav
.nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav
.nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav
.active>.nav-link,.navbar-light .navbar-nav
.nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light
.navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light
.navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light
.navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg
xmlns='http://www.w3.org/2000/svg' width='30'
height='30' viewBox='0 0 30 30'%3e%3cpath
stroke='rgba%280, 0, 0, 0.5%29' stroke-linecap='round'
stroke-miterlimit='10' stroke-width='2' d='M4
7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light
.navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text
a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light
.navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark
.navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark
.navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav
.nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav
.nav-link:focus,.navbar-dark .navbar-nav
.nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav
.nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav
.active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark
.navbar-nav .nav-link.show,.navbar-dark .navbar-nav
.show>.nav-link{color:#fff}.navbar-dark
.navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark
.navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg
xmlns='http://www.w3.org/2000/svg' width='30'
height='30' viewBox='0 0 30 30'%3e%3cpath
stroke='rgba%28255, 255, 255, 0.5%29'
stroke-linecap='round' stroke-miterlimit='10'
stroke-width='2' d='M4 7h22M4 15h22M4
23h22'/%3e%3c/svg%3e")}.navbar-dark
.navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text
a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text
a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px
solid
rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.25rem
- 1px);border-top-right-radius:calc(.25rem -
1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.25rem
- 1px);border-bottom-left-radius:calc(.25rem -
1px)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{-ms-flex:1
1 auto;flex:1 1
auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem
1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px
solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem -
1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.75rem
1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid
rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem -
1px) calc(.25rem -
1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem;border-radius:calc(.25rem
-
1px)}.card-img,.card-img-bottom,.card-img-top{-ms-flex-negative:0;flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem
- 1px);border-top-right-radius:calc(.25rem -
1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem -
1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck
.card{margin-bottom:15px}@media
(min-width:576px){.card-deck{display:-ms-flexbox;display:flex;-ms-flex-flow:row
wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck
.card{-ms-flex:1 0 0%;flex:1 0
0%;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group>.card{margin-bottom:15px}@media
(min-width:576px){.card-group{display:-ms-flexbox;display:flex;-ms-flex-flow:row
wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0
0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child)
.card-header,.card-group>.card:not(:last-child)
.card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child)
.card-footer,.card-group>.card:not(:last-child)
.card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child)
.card-header,.card-group>.card:not(:first-child)
.card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child)
.card-footer,.card-group>.card:not(:first-child)
.card-img-bottom{border-bottom-left-radius:0}}.card-columns
.card{margin-bottom:.75rem}@media
(min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns
.card{display:inline-block;width:100%}}.accordion{overflow-anchor:none}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem
1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item{display:-ms-flexbox;display:flex}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem
.75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px
solid
#dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;outline:0;box-shadow:0
0 0 .2rem rgba(0,123,255,.25)}.page-item:first-child
.page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child
.page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active
.page-link{z-index:3;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled
.page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg
.page-link{padding:.75rem
1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg
.page-item:first-child
.page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg
.page-item:last-child
.page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm
.page-link{padding:.25rem
.5rem;font-size:.875rem;line-height:1.5}.pagination-sm
.page-item:first-child
.page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm
.page-item:last-child
.page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em
.4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;transition:color
.15s ease-in-out,background-color .15s ease-in-out,border-color .15s
ease-in-out,box-shadow .15s ease-in-out}@media
(prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn
.badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0
0 0 .2rem
rgba(0,123,255,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0
0 0 .2rem
rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0
0 0 .2rem
rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0
0 0 .2rem
rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0
0 0 .2rem
rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0
0 0 .2rem
rgba(220,53,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0
0 0 .2rem
rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0
0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem
1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media
(min-width:576px){.jumbotron{padding:4rem
2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem
1.25rem;margin-bottom:1rem;border:1px solid
transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible
.close{position:absolute;top:0;right:0;z-index:2;padding:.75rem
1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary
hr{border-top-color:#9fcdff}.alert-primary
.alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary
hr{border-top-color:#c8cbcf}.alert-secondary
.alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success
hr{border-top-color:#b1dfbb}.alert-success
.alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info
hr{border-top-color:#abdde5}.alert-info
.alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning
hr{border-top-color:#ffe8a1}.alert-warning
.alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger
hr{border-top-color:#f1b0b7}.alert-danger
.alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light
hr{border-top-color:#ececf6}.alert-light
.alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark
hr{border-top-color:#b9bbbe}.alert-dark
.alert-link{color:#040505}@-webkit-keyframes
progress-bar-stripes{from{background-position:1rem
0}to{background-position:0 0}}@keyframes
progress-bar-stripes{from{background-position:1rem
0}to{background-position:0
0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;line-height:0;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width
.6s ease}@media
(prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15)
25%,transparent 25%,transparent 50%,rgba(255,255,255,.15)
50%,rgba(255,255,255,.15) 75%,transparent
75%,transparent);background-size:1rem
1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s
linear infinite;animation:progress-bar-stripes 1s linear infinite}@media
(prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem
1.25rem;background-color:#fff;border:1px solid
rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media
(min-width:576px){.list-group-horizontal-sm{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media
(min-width:768px){.list-group-horizontal-md{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media
(min-width:992px){.list-group-horizontal-lg{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media
(min-width:1200px){.list-group-horizontal-xl{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0
0
1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0
1px 0
#fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0}a.close.disabled{pointer-events:none}.toast{-ms-flex-preferred-size:350px;flex-basis:350px;max-width:350px;font-size:.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px
solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem
rgba(0,0,0,.1);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.25rem
.75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px
solid rgba(0,0,0,.05);border-top-left-radius:calc(.25rem -
1px);border-top-right-radius:calc(.25rem -
1px)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open
.modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade
.modal-dialog{transition:-webkit-transform .3s
ease-out;transition:transform .3s ease-out;transition:transform .3s
ease-out,-webkit-transform .3s
ease-out;-webkit-transform:translate(0,-50px);transform:translate(0,-50px)}@media
(prefers-reduced-motion:reduce){.modal.fade
.modal-dialog{transition:none}}.modal.show
.modal-dialog{-webkit-transform:none;transform:none}.modal.modal-static
.modal-dialog{-webkit-transform:scale(1.02);transform:scale(1.02)}.modal-dialog-scrollable{display:-ms-flexbox;display:flex;max-height:calc(100%
- 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh -
1rem);overflow:hidden}.modal-dialog-scrollable
.modal-footer,.modal-dialog-scrollable
.modal-header{-ms-flex-negative:0;flex-shrink:0}.modal-dialog-scrollable
.modal-body{overflow-y:auto}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100%
- 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh -
1rem);height:-webkit-min-content;height:-moz-min-content;height:min-content;content:""}.modal-dialog-centered.modal-dialog-scrollable{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable
.modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px
solid
rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem
1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem -
1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header
.close{padding:1rem 1rem;margin:-1rem -1rem -1rem
auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1
1 auto;flex:1 1
auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:.75rem;border-top:1px
solid #dee2e6;border-bottom-right-radius:calc(.3rem -
1px);border-bottom-left-radius:calc(.3rem -
1px)}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media
(min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem
auto}.modal-dialog-scrollable{max-height:calc(100% -
3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh -
3.5rem)}.modal-dialog-centered{min-height:calc(100% -
3.5rem)}.modal-dialog-centered::before{height:calc(100vh -
3.5rem);height:-webkit-min-content;height:-moz-min-content;height:min-content}.modal-sm{max-width:300px}}@media
(min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media
(min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe
UI",Roboto,"Helvetica Neue",Arial,"Noto
Sans",sans-serif,"Apple Color Emoji","Segoe UI
Emoji","Segoe UI Symbol","Noto Color
Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip
.arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip
.arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem
0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top
.arrow{bottom:0}.bs-tooltip-auto[x-placement^=top]
.arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem
.4rem
0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0
.4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right
.arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right]
.arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem
.4rem .4rem
0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem
0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom
.arrow{top:0}.bs-tooltip-auto[x-placement^=bottom]
.arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0
.4rem
.4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0
.4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left
.arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left]
.arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0
.4rem
.4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem
.5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe
UI",Roboto,"Helvetica Neue",Arial,"Noto
Sans",sans-serif,"Apple Color Emoji","Segoe UI
Emoji","Segoe UI Symbol","Noto Color
Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px
solid rgba(0,0,0,.2);border-radius:.3rem}.popover
.arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0
.3rem}.popover .arrow::after,.popover
.arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem
-
1px)}.bs-popover-auto[x-placement^=top]>.arrow::before,.bs-popover-top>.arrow::before{bottom:0;border-width:.5rem
.5rem
0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow::after,.bs-popover-top>.arrow::after{bottom:1px;border-width:.5rem
.5rem
0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc(-.5rem
- 1px);width:.5rem;height:1rem;margin:.3rem
0}.bs-popover-auto[x-placement^=right]>.arrow::before,.bs-popover-right>.arrow::before{left:0;border-width:.5rem
.5rem .5rem
0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow::after,.bs-popover-right>.arrow::after{left:1px;border-width:.5rem
.5rem .5rem
0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem
-
1px)}.bs-popover-auto[x-placement^=bottom]>.arrow::before,.bs-popover-bottom>.arrow::before{top:0;border-width:0
.5rem .5rem
.5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow::after,.bs-popover-bottom>.arrow::after{top:1px;border-width:0
.5rem .5rem
.5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom]
.popover-header::before,.bs-popover-bottom
.popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px
solid
#f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc(-.5rem
- 1px);width:.5rem;height:1rem;margin:.3rem
0}.bs-popover-auto[x-placement^=left]>.arrow::before,.bs-popover-left>.arrow::before{right:0;border-width:.5rem
0 .5rem
.5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow::after,.bs-popover-left>.arrow::after{right:1px;border-width:.5rem
0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem
.75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px
solid #ebebeb;border-top-left-radius:calc(.3rem -
1px);border-top-right-radius:calc(.3rem -
1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem
.75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:-webkit-transform
.6s ease-in-out;transition:transform .6s ease-in-out;transition:transform
.6s ease-in-out,-webkit-transform .6s ease-in-out}@media
(prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade
.carousel-item{opacity:0;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade
.carousel-item-next.carousel-item-left,.carousel-fade
.carousel-item-prev.carousel-item-right,.carousel-fade
.carousel-item.active{z-index:1;opacity:1}.carousel-fade
.active.carousel-item-left,.carousel-fade
.active.carousel-item-right{z-index:0;opacity:0;transition:opacity 0s
.6s}@media (prefers-reduced-motion:reduce){.carousel-fade
.active.carousel-item-left,.carousel-fade
.active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity
.15s ease}@media
(prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:no-repeat
50%/100%
100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg
xmlns='http://www.w3.org/2000/svg' fill='%23fff'
width='8' height='8' viewBox='0 0 8
8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25
0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg
xmlns='http://www.w3.org/2000/svg' fill='%23fff'
width='8' height='8' viewBox='0 0 8
8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75
8l4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators
li{box-sizing:content-box;-ms-flex:0 1 auto;flex:0 1
auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px
solid transparent;border-bottom:10px solid
transparent;opacity:.5;transition:opacity .6s ease}@media
(prefers-reduced-motion:reduce){.carousel-indicators
li{transition:none}}.carousel-indicators
.active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes
spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes
spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em
solid
currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:spinner-border
.75s linear infinite;animation:spinner-border .75s linear
infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes
spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1;-webkit-transform:none;transform:none}}@keyframes
spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1;-webkit-transform:none;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow
.75s linear infinite;animation:spinner-grow .75s linear
infinite}.spinner-grow-sm{width:1rem;height:1rem}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px
solid #dee2e6!important}.border-top{border-top:1px solid
#dee2e6!important}.border-right{border-right:1px solid
#dee2e6!important}.border-bottom{border-bottom:1px solid
#dee2e6!important}.border-left{border-left:1px solid
#dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media
(min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media
(min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media
(min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media
(min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media
print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive
.embed-responsive-item,.embed-responsive embed,.embed-responsive
iframe,.embed-responsive object,.embed-responsive
video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1
1 auto!important;flex:1 1
auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media
(min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1
1 auto!important;flex:1 1
auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media
(min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1
1 auto!important;flex:1 1
auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media
(min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1
1 auto!important;flex:1 1
auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media
(min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1
1 auto!important;flex:1 1
auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media
(min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media
(min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media
(min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media
(min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;-ms-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;-ms-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports
((position:-webkit-sticky) or
(position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0
.125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem
rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem
rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media
(min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media
(min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media
(min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media
(min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation
Mono","Courier
New",monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media
(min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media
(min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media
(min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media
(min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0
a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;word-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media
print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:"
(" attr(title)
")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px
solid
#adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px
solid #000}.table{border-collapse:collapse!important}.table td,.table
th{background-color:#fff!important}.table-bordered td,.table-bordered
th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark
tbody+tbody,.table-dark td,.table-dark th,.table-dark thead
th{border-color:#dee2e6}.table .thead-dark
th{color:inherit;border-color:#dee2e6}}
/*# sourceMappingURL=bootstrap.min.css.map
*/PK,�[�#o,,bootstrapv45/css/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK,�[{�ќ�@bootstrapv45/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2nu�[���Couldn't
find the requested file /dist/css/bootstrap.min.css
integrity=sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2
in
bootstrap.PK,�[�#o,,bootstrapv45/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK,�[���V�H�H'bootstrapv45/js/bootstrap.bundle.min.jsnu�[���/*!
  * Bootstrap v4.5.3 (https://getbootstrap.com/)
  * Copyright 2011-2020 The Bootstrap Authors
(https://github.com/twbs/bootstrap/graphs/contributors)
  * Licensed under MIT
(https://github.com/twbs/bootstrap/blob/main/LICENSE)
  */
!function(t,e){"object"==typeof
exports&&"undefined"!=typeof
module?e(exports,require("jquery")):"function"==typeof
define&&define.amd?define(["exports","jquery"],e):e((t="undefined"!=typeof
globalThis?globalThis:t||self).bootstrap={},t.jQuery)}(this,(function(t,e){"use
strict";function n(t){return t&&"object"==typeof
t&&"default"in t?t:{default:t}}var i=n(e);function
o(t,e){for(var n=0;n<e.length;n++){var
i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in
i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function
r(t,e,n){return e&&o(t.prototype,e),n&&o(t,n),t}function
a(){return(a=Object.assign||function(t){for(var
e=1;e<arguments.length;e++){var n=arguments[e];for(var i in
n)Object.prototype.hasOwnProperty.call(n,i)&&(t[i]=n[i])}return
t}).apply(this,arguments)}function s(t){var e=this,n=!1;return
i.default(this).one(l.TRANSITION_END,(function(){n=!0})),setTimeout((function(){n||l.triggerTransitionEnd(e)}),t),this}var
l={TRANSITION_END:"bsTransitionEnd",getUID:function(t){do{t+=~~(1e6*Math.random())}while(document.getElementById(t));return
t},getSelectorFromElement:function(t){var
e=t.getAttribute("data-target");if(!e||"#"===e){var
n=t.getAttribute("href");e=n&&"#"!==n?n.trim():""}try{return
document.querySelector(e)?e:null}catch(t){return
null}},getTransitionDurationFromElement:function(t){if(!t)return 0;var
e=i.default(t).css("transition-duration"),n=i.default(t).css("transition-delay"),o=parseFloat(e),r=parseFloat(n);return
o||r?(e=e.split(",")[0],n=n.split(",")[0],1e3*(parseFloat(e)+parseFloat(n))):0},reflow:function(t){return
t.offsetHeight},triggerTransitionEnd:function(t){i.default(t).trigger("transitionend")},supportsTransitionEnd:function(){return
Boolean("transitionend")},isElement:function(t){return(t[0]||t).nodeType},typeCheckConfig:function(t,e,n){for(var
i in n)if(Object.prototype.hasOwnProperty.call(n,i)){var
o=n[i],r=e[i],a=r&&l.isElement(r)?"element":null===(s=r)||"undefined"==typeof
s?""+s:{}.toString.call(s).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new
RegExp(o).test(a))throw new Error(t.toUpperCase()+': Option
"'+i+'" provided type "'+a+'" but
expected type "'+o+'".')}var
s},findShadowRoot:function(t){if(!document.documentElement.attachShadow)return
null;if("function"==typeof t.getRootNode){var
e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof
ShadowRoot?t:t.parentNode?l.findShadowRoot(t.parentNode):null},jQueryDetection:function(){if("undefined"==typeof
i.default)throw new TypeError("Bootstrap's JavaScript requires
jQuery. jQuery must be included before Bootstrap's
JavaScript.");var t=i.default.fn.jquery.split("
")[0].split(".");if(t[0]<2&&t[1]<9||1===t[0]&&9===t[1]&&t[2]<1||t[0]>=4)throw
new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1
but less than
v4.0.0")}};l.jQueryDetection(),i.default.fn.emulateTransitionEnd=s,i.default.event.special[l.TRANSITION_END]={bindType:"transitionend",delegateType:"transitionend",handle:function(t){if(i.default(t.target).is(this))return
t.handleObj.handler.apply(this,arguments)}};var
u="alert",f=i.default.fn[u],d=function(){function
t(t){this._element=t}var e=t.prototype;return e.close=function(t){var
e=this._element;t&&(e=this._getRootElement(t)),this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},e.dispose=function(){i.default.removeData(this._element,"bs.alert"),this._element=null},e._getRootElement=function(t){var
e=l.getSelectorFromElement(t),n=!1;return
e&&(n=document.querySelector(e)),n||(n=i.default(t).closest(".alert")[0]),n},e._triggerCloseEvent=function(t){var
e=i.default.Event("close.bs.alert");return
i.default(t).trigger(e),e},e._removeElement=function(t){var
e=this;if(i.default(t).removeClass("show"),i.default(t).hasClass("fade")){var
n=l.getTransitionDurationFromElement(t);i.default(t).one(l.TRANSITION_END,(function(n){return
e._destroyElement(t,n)})).emulateTransitionEnd(n)}else
this._destroyElement(t)},e._destroyElement=function(t){i.default(t).detach().trigger("closed.bs.alert").remove()},t._jQueryInterface=function(e){return
this.each((function(){var
n=i.default(this),o=n.data("bs.alert");o||(o=new
t(this),n.data("bs.alert",o)),"close"===e&&o[e](this)}))},t._handleDismiss=function(t){return
function(e){e&&e.preventDefault(),t.close(this)}},r(t,null,[{key:"VERSION",get:function(){return"4.5.3"}}]),t}();i.default(document).on("click.bs.alert.data-api",'[data-dismiss="alert"]',d._handleDismiss(new
d)),i.default.fn[u]=d._jQueryInterface,i.default.fn[u].Constructor=d,i.default.fn[u].noConflict=function(){return
i.default.fn[u]=f,d._jQueryInterface};var
c=i.default.fn.button,h=function(){function
t(t){this._element=t,this.shouldAvoidTriggerChange=!1}var
e=t.prototype;return e.toggle=function(){var
t=!0,e=!0,n=i.default(this._element).closest('[data-toggle="buttons"]')[0];if(n){var
o=this._element.querySelector('input:not([type="hidden"])');if(o){if("radio"===o.type)if(o.checked&&this._element.classList.contains("active"))t=!1;else{var
r=n.querySelector(".active");r&&i.default(r).removeClass("active")}t&&("checkbox"!==o.type&&"radio"!==o.type||(o.checked=!this._element.classList.contains("active")),this.shouldAvoidTriggerChange||i.default(o).trigger("change")),o.focus(),e=!1}}this._element.hasAttribute("disabled")||this._element.classList.contains("disabled")||(e&&this._element.setAttribute("aria-pressed",!this._element.classList.contains("active")),t&&i.default(this._element).toggleClass("active"))},e.dispose=function(){i.default.removeData(this._element,"bs.button"),this._element=null},t._jQueryInterface=function(e,n){return
this.each((function(){var
o=i.default(this),r=o.data("bs.button");r||(r=new
t(this),o.data("bs.button",r)),r.shouldAvoidTriggerChange=n,"toggle"===e&&r[e]()}))},r(t,null,[{key:"VERSION",get:function(){return"4.5.3"}}]),t}();i.default(document).on("click.bs.button.data-api",'[data-toggle^="button"]',(function(t){var
e=t.target,n=e;if(i.default(e).hasClass("btn")||(e=i.default(e).closest(".btn")[0]),!e||e.hasAttribute("disabled")||e.classList.contains("disabled"))t.preventDefault();else{var
o=e.querySelector('input:not([type="hidden"])');if(o&&(o.hasAttribute("disabled")||o.classList.contains("disabled")))return
void
t.preventDefault();"INPUT"!==n.tagName&&"LABEL"===e.tagName||h._jQueryInterface.call(i.default(e),"toggle","INPUT"===n.tagName)}})).on("focus.bs.button.data-api
blur.bs.button.data-api",'[data-toggle^="button"]',(function(t){var
e=i.default(t.target).closest(".btn")[0];i.default(e).toggleClass("focus",/^focus(in)?$/.test(t.type))})),i.default(window).on("load.bs.button.data-api",(function(){for(var
t=[].slice.call(document.querySelectorAll('[data-toggle="buttons"]
.btn')),e=0,n=t.length;e<n;e++){var
i=t[e],o=i.querySelector('input:not([type="hidden"])');o.checked||o.hasAttribute("checked")?i.classList.add("active"):i.classList.remove("active")}for(var
r=0,a=(t=[].slice.call(document.querySelectorAll('[data-toggle="button"]'))).length;r<a;r++){var
s=t[r];"true"===s.getAttribute("aria-pressed")?s.classList.add("active"):s.classList.remove("active")}})),i.default.fn.button=h._jQueryInterface,i.default.fn.button.Constructor=h,i.default.fn.button.noConflict=function(){return
i.default.fn.button=c,h._jQueryInterface};var
p="carousel",m=".bs.carousel",g=i.default.fn[p],v={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0,touch:!0},_={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean",touch:"boolean"},b={TOUCH:"touch",PEN:"pen"},y=function(){function
t(t,e){this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this.touchStartX=0,this.touchDeltaX=0,this._config=this._getConfig(e),this._element=t,this._indicatorsElement=this._element.querySelector(".carousel-indicators"),this._touchSupported="ontouchstart"in
document.documentElement||navigator.maxTouchPoints>0,this._pointerEvent=Boolean(window.PointerEvent||window.MSPointerEvent),this._addEventListeners()}var
e=t.prototype;return
e.next=function(){this._isSliding||this._slide("next")},e.nextWhenVisible=function(){var
t=i.default(this._element);!document.hidden&&t.is(":visible")&&"hidden"!==t.css("visibility")&&this.next()},e.prev=function(){this._isSliding||this._slide("prev")},e.pause=function(t){t||(this._isPaused=!0),this._element.querySelector(".carousel-item-next,
.carousel-item-prev")&&(l.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},e.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},e.to=function(t){var
e=this;this._activeElement=this._element.querySelector(".active.carousel-item");var
n=this._getItemIndex(this._activeElement);if(!(t>this._items.length-1||t<0))if(this._isSliding)i.default(this._element).one("slid.bs.carousel",(function(){return
e.to(t)}));else{if(n===t)return this.pause(),void this.cycle();var
o=t>n?"next":"prev";this._slide(o,this._items[t])}},e.dispose=function(){i.default(this._element).off(m),i.default.removeData(this._element,"bs.carousel"),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},e._getConfig=function(t){return
t=a({},v,t),l.typeCheckConfig(p,t,_),t},e._handleSwipe=function(){var
t=Math.abs(this.touchDeltaX);if(!(t<=40)){var
e=t/this.touchDeltaX;this.touchDeltaX=0,e>0&&this.prev(),e<0&&this.next()}},e._addEventListeners=function(){var
t=this;this._config.keyboard&&i.default(this._element).on("keydown.bs.carousel",(function(e){return
t._keydown(e)})),"hover"===this._config.pause&&i.default(this._element).on("mouseenter.bs.carousel",(function(e){return
t.pause(e)})).on("mouseleave.bs.carousel",(function(e){return
t.cycle(e)})),this._config.touch&&this._addTouchEventListeners()},e._addTouchEventListeners=function(){var
t=this;if(this._touchSupported){var
e=function(e){t._pointerEvent&&b[e.originalEvent.pointerType.toUpperCase()]?t.touchStartX=e.originalEvent.clientX:t._pointerEvent||(t.touchStartX=e.originalEvent.touches[0].clientX)},n=function(e){t._pointerEvent&&b[e.originalEvent.pointerType.toUpperCase()]&&(t.touchDeltaX=e.originalEvent.clientX-t.touchStartX),t._handleSwipe(),"hover"===t._config.pause&&(t.pause(),t.touchTimeout&&clearTimeout(t.touchTimeout),t.touchTimeout=setTimeout((function(e){return
t.cycle(e)}),500+t._config.interval))};i.default(this._element.querySelectorAll(".carousel-item
img")).on("dragstart.bs.carousel",(function(t){return
t.preventDefault()})),this._pointerEvent?(i.default(this._element).on("pointerdown.bs.carousel",(function(t){return
e(t)})),i.default(this._element).on("pointerup.bs.carousel",(function(t){return
n(t)})),this._element.classList.add("pointer-event")):(i.default(this._element).on("touchstart.bs.carousel",(function(t){return
e(t)})),i.default(this._element).on("touchmove.bs.carousel",(function(e){return
function(e){e.originalEvent.touches&&e.originalEvent.touches.length>1?t.touchDeltaX=0:t.touchDeltaX=e.originalEvent.touches[0].clientX-t.touchStartX}(e)})),i.default(this._element).on("touchend.bs.carousel",(function(t){return
n(t)})))}},e._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case
37:t.preventDefault(),this.prev();break;case
39:t.preventDefault(),this.next()}},e._getItemIndex=function(t){return
this._items=t&&t.parentNode?[].slice.call(t.parentNode.querySelectorAll(".carousel-item")):[],this._items.indexOf(t)},e._getItemByDirection=function(t,e){var
n="next"===t,i="prev"===t,o=this._getItemIndex(e),r=this._items.length-1;if((i&&0===o||n&&o===r)&&!this._config.wrap)return
e;var
a=(o+("prev"===t?-1:1))%this._items.length;return-1===a?this._items[this._items.length-1]:this._items[a]},e._triggerSlideEvent=function(t,e){var
n=this._getItemIndex(t),o=this._getItemIndex(this._element.querySelector(".active.carousel-item")),r=i.default.Event("slide.bs.carousel",{relatedTarget:t,direction:e,from:o,to:n});return
i.default(this._element).trigger(r),r},e._setActiveIndicatorElement=function(t){if(this._indicatorsElement){var
e=[].slice.call(this._indicatorsElement.querySelectorAll(".active"));i.default(e).removeClass("active");var
n=this._indicatorsElement.children[this._getItemIndex(t)];n&&i.default(n).addClass("active")}},e._slide=function(t,e){var
n,o,r,a=this,s=this._element.querySelector(".active.carousel-item"),u=this._getItemIndex(s),f=e||s&&this._getItemByDirection(t,s),d=this._getItemIndex(f),c=Boolean(this._interval);if("next"===t?(n="carousel-item-left",o="carousel-item-next",r="left"):(n="carousel-item-right",o="carousel-item-prev",r="right"),f&&i.default(f).hasClass("active"))this._isSliding=!1;else
if(!this._triggerSlideEvent(f,r).isDefaultPrevented()&&s&&f){this._isSliding=!0,c&&this.pause(),this._setActiveIndicatorElement(f);var
h=i.default.Event("slid.bs.carousel",{relatedTarget:f,direction:r,from:u,to:d});if(i.default(this._element).hasClass("slide")){i.default(f).addClass(o),l.reflow(f),i.default(s).addClass(n),i.default(f).addClass(n);var
p=parseInt(f.getAttribute("data-interval"),10);p?(this._config.defaultInterval=this._config.defaultInterval||this._config.interval,this._config.interval=p):this._config.interval=this._config.defaultInterval||this._config.interval;var
m=l.getTransitionDurationFromElement(s);i.default(s).one(l.TRANSITION_END,(function(){i.default(f).removeClass(n+"
"+o).addClass("active"),i.default(s).removeClass("active
"+o+" "+n),a._isSliding=!1,setTimeout((function(){return
i.default(a._element).trigger(h)}),0)})).emulateTransitionEnd(m)}else
i.default(s).removeClass("active"),i.default(f).addClass("active"),this._isSliding=!1,i.default(this._element).trigger(h);c&&this.cycle()}},t._jQueryInterface=function(e){return
this.each((function(){var
n=i.default(this).data("bs.carousel"),o=a({},v,i.default(this).data());"object"==typeof
e&&(o=a({},o,e));var r="string"==typeof
e?e:o.slide;if(n||(n=new
t(this,o),i.default(this).data("bs.carousel",n)),"number"==typeof
e)n.to(e);else if("string"==typeof
r){if("undefined"==typeof n[r])throw new TypeError('No
method named "'+r+'"');n[r]()}else
o.interval&&o.ride&&(n.pause(),n.cycle())}))},t._dataApiClickHandler=function(e){var
n=l.getSelectorFromElement(this);if(n){var
o=i.default(n)[0];if(o&&i.default(o).hasClass("carousel")){var
r=a({},i.default(o).data(),i.default(this).data()),s=this.getAttribute("data-slide-to");s&&(r.interval=!1),t._jQueryInterface.call(i.default(o),r),s&&i.default(o).data("bs.carousel").to(s),e.preventDefault()}}},r(t,null,[{key:"VERSION",get:function(){return"4.5.3"}},{key:"Default",get:function(){return
v}}]),t}();i.default(document).on("click.bs.carousel.data-api","[data-slide],
[data-slide-to]",y._dataApiClickHandler),i.default(window).on("load.bs.carousel.data-api",(function(){for(var
t=[].slice.call(document.querySelectorAll('[data-ride="carousel"]')),e=0,n=t.length;e<n;e++){var
o=i.default(t[e]);y._jQueryInterface.call(o,o.data())}})),i.default.fn[p]=y._jQueryInterface,i.default.fn[p].Constructor=y,i.default.fn[p].noConflict=function(){return
i.default.fn[p]=g,y._jQueryInterface};var
w="collapse",E=i.default.fn[w],T={toggle:!0,parent:""},C={toggle:"boolean",parent:"(string|element)"},S=function(){function
t(t,e){this._isTransitioning=!1,this._element=t,this._config=this._getConfig(e),this._triggerArray=[].slice.call(document.querySelectorAll('[data-toggle="collapse"][href="#'+t.id+'"],[data-toggle="collapse"][data-target="#'+t.id+'"]'));for(var
n=[].slice.call(document.querySelectorAll('[data-toggle="collapse"]')),i=0,o=n.length;i<o;i++){var
r=n[i],a=l.getSelectorFromElement(r),s=[].slice.call(document.querySelectorAll(a)).filter((function(e){return
e===t}));null!==a&&s.length>0&&(this._selector=a,this._triggerArray.push(r))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var
e=t.prototype;return
e.toggle=function(){i.default(this._element).hasClass("show")?this.hide():this.show()},e.show=function(){var
e,n,o=this;if(!this._isTransitioning&&!i.default(this._element).hasClass("show")&&(this._parent&&0===(e=[].slice.call(this._parent.querySelectorAll(".show,
.collapsing")).filter((function(t){return"string"==typeof
o._config.parent?t.getAttribute("data-parent")===o._config.parent:t.classList.contains("collapse")}))).length&&(e=null),!(e&&(n=i.default(e).not(this._selector).data("bs.collapse"))&&n._isTransitioning))){var
r=i.default.Event("show.bs.collapse");if(i.default(this._element).trigger(r),!r.isDefaultPrevented()){e&&(t._jQueryInterface.call(i.default(e).not(this._selector),"hide"),n||i.default(e).data("bs.collapse",null));var
a=this._getDimension();i.default(this._element).removeClass("collapse").addClass("collapsing"),this._element.style[a]=0,this._triggerArray.length&&i.default(this._triggerArray).removeClass("collapsed").attr("aria-expanded",!0),this.setTransitioning(!0);var
s="scroll"+(a[0].toUpperCase()+a.slice(1)),u=l.getTransitionDurationFromElement(this._element);i.default(this._element).one(l.TRANSITION_END,(function(){i.default(o._element).removeClass("collapsing").addClass("collapse
show"),o._element.style[a]="",o.setTransitioning(!1),i.default(o._element).trigger("shown.bs.collapse")})).emulateTransitionEnd(u),this._element.style[a]=this._element[s]+"px"}}},e.hide=function(){var
t=this;if(!this._isTransitioning&&i.default(this._element).hasClass("show")){var
e=i.default.Event("hide.bs.collapse");if(i.default(this._element).trigger(e),!e.isDefaultPrevented()){var
n=this._getDimension();this._element.style[n]=this._element.getBoundingClientRect()[n]+"px",l.reflow(this._element),i.default(this._element).addClass("collapsing").removeClass("collapse
show");var o=this._triggerArray.length;if(o>0)for(var
r=0;r<o;r++){var
a=this._triggerArray[r],s=l.getSelectorFromElement(a);if(null!==s)i.default([].slice.call(document.querySelectorAll(s))).hasClass("show")||i.default(a).addClass("collapsed").attr("aria-expanded",!1)}this.setTransitioning(!0);this._element.style[n]="";var
u=l.getTransitionDurationFromElement(this._element);i.default(this._element).one(l.TRANSITION_END,(function(){t.setTransitioning(!1),i.default(t._element).removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")})).emulateTransitionEnd(u)}}},e.setTransitioning=function(t){this._isTransitioning=t},e.dispose=function(){i.default.removeData(this._element,"bs.collapse"),this._config=null,this._parent=null,this._element=null,this._triggerArray=null,this._isTransitioning=null},e._getConfig=function(t){return(t=a({},T,t)).toggle=Boolean(t.toggle),l.typeCheckConfig(w,t,C),t},e._getDimension=function(){return
i.default(this._element).hasClass("width")?"width":"height"},e._getParent=function(){var
e,n=this;l.isElement(this._config.parent)?(e=this._config.parent,"undefined"!=typeof
this._config.parent.jquery&&(e=this._config.parent[0])):e=document.querySelector(this._config.parent);var
o='[data-toggle="collapse"][data-parent="'+this._config.parent+'"]',r=[].slice.call(e.querySelectorAll(o));return
i.default(r).each((function(e,i){n._addAriaAndCollapsedClass(t._getTargetFromElement(i),[i])})),e},e._addAriaAndCollapsedClass=function(t,e){var
n=i.default(t).hasClass("show");e.length&&i.default(e).toggleClass("collapsed",!n).attr("aria-expanded",n)},t._getTargetFromElement=function(t){var
e=l.getSelectorFromElement(t);return
e?document.querySelector(e):null},t._jQueryInterface=function(e){return
this.each((function(){var
n=i.default(this),o=n.data("bs.collapse"),r=a({},T,n.data(),"object"==typeof
e&&e?e:{});if(!o&&r.toggle&&"string"==typeof
e&&/show|hide/.test(e)&&(r.toggle=!1),o||(o=new
t(this,r),n.data("bs.collapse",o)),"string"==typeof
e){if("undefined"==typeof o[e])throw new TypeError('No
method named
"'+e+'"');o[e]()}}))},r(t,null,[{key:"VERSION",get:function(){return"4.5.3"}},{key:"Default",get:function(){return
T}}]),t}();i.default(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',(function(t){"A"===t.currentTarget.tagName&&t.preventDefault();var
e=i.default(this),n=l.getSelectorFromElement(this),o=[].slice.call(document.querySelectorAll(n));i.default(o).each((function(){var
t=i.default(this),n=t.data("bs.collapse")?"toggle":e.data();S._jQueryInterface.call(t,n)}))})),i.default.fn[w]=S._jQueryInterface,i.default.fn[w].Constructor=S,i.default.fn[w].noConflict=function(){return
i.default.fn[w]=E,S._jQueryInterface};var D="undefined"!=typeof
window&&"undefined"!=typeof
document&&"undefined"!=typeof
navigator,N=function(){for(var
t=["Edge","Trident","Firefox"],e=0;e<t.length;e+=1)if(D&&navigator.userAgent.indexOf(t[e])>=0)return
1;return 0}();var k=D&&window.Promise?function(t){var e=!1;return
function(){e||(e=!0,window.Promise.resolve().then((function(){e=!1,t()})))}}:function(t){var
e=!1;return
function(){e||(e=!0,setTimeout((function(){e=!1,t()}),N))}};function
A(t){return t&&"[object
Function]"==={}.toString.call(t)}function
I(t,e){if(1!==t.nodeType)return[];var
n=t.ownerDocument.defaultView.getComputedStyle(t,null);return
e?n[e]:n}function
O(t){return"HTML"===t.nodeName?t:t.parentNode||t.host}function
x(t){if(!t)return
document.body;switch(t.nodeName){case"HTML":case"BODY":return
t.ownerDocument.body;case"#document":return t.body}var
e=I(t),n=e.overflow,i=e.overflowX,o=e.overflowY;return/(auto|scroll|overlay)/.test(n+o+i)?t:x(O(t))}function
j(t){return t&&t.referenceNode?t.referenceNode:t}var
L=D&&!(!window.MSInputMethodContext||!document.documentMode),P=D&&/MSIE
10/.test(navigator.userAgent);function F(t){return
11===t?L:10===t?P:L||P}function R(t){if(!t)return
document.documentElement;for(var
e=F(10)?document.body:null,n=t.offsetParent||null;n===e&&t.nextElementSibling;)n=(t=t.nextElementSibling).offsetParent;var
i=n&&n.nodeName;return
i&&"BODY"!==i&&"HTML"!==i?-1!==["TH","TD","TABLE"].indexOf(n.nodeName)&&"static"===I(n,"position")?R(n):n:t?t.ownerDocument.documentElement:document.documentElement}function
H(t){return null!==t.parentNode?H(t.parentNode):t}function
M(t,e){if(!(t&&t.nodeType&&e&&e.nodeType))return
document.documentElement;var
n=t.compareDocumentPosition(e)&Node.DOCUMENT_POSITION_FOLLOWING,i=n?t:e,o=n?e:t,r=document.createRange();r.setStart(i,0),r.setEnd(o,0);var
a,s,l=r.commonAncestorContainer;if(t!==l&&e!==l||i.contains(o))return"BODY"===(s=(a=l).nodeName)||"HTML"!==s&&R(a.firstElementChild)!==a?R(l):l;var
u=H(t);return u.host?M(u.host,e):M(t,H(e).host)}function B(t){var
e=arguments.length>1&&void
0!==arguments[1]?arguments[1]:"top",n="top"===e?"scrollTop":"scrollLeft",i=t.nodeName;if("BODY"===i||"HTML"===i){var
o=t.ownerDocument.documentElement,r=t.ownerDocument.scrollingElement||o;return
r[n]}return t[n]}function q(t,e){var n=arguments.length>2&&void
0!==arguments[2]&&arguments[2],i=B(e,"top"),o=B(e,"left"),r=n?-1:1;return
t.top+=i*r,t.bottom+=i*r,t.left+=o*r,t.right+=o*r,t}function Q(t,e){var
n="x"===e?"Left":"Top",i="Left"===n?"Right":"Bottom";return
parseFloat(t["border"+n+"Width"])+parseFloat(t["border"+i+"Width"])}function
W(t,e,n,i){return
Math.max(e["offset"+t],e["scroll"+t],n["client"+t],n["offset"+t],n["scroll"+t],F(10)?parseInt(n["offset"+t])+parseInt(i["margin"+("Height"===t?"Top":"Left")])+parseInt(i["margin"+("Height"===t?"Bottom":"Right")]):0)}function
U(t){var
e=t.body,n=t.documentElement,i=F(10)&&getComputedStyle(n);return{height:W("Height",e,n,i),width:W("Width",e,n,i)}}var
V=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call
a class as a function")},Y=function(){function t(t,e){for(var
n=0;n<e.length;n++){var
i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in
i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}return
function(e,n,i){return
n&&t(e.prototype,n),i&&t(e,i),e}}(),z=function(t,e,n){return
e in
t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t},X=Object.assign||function(t){for(var
e=1;e<arguments.length;e++){var n=arguments[e];for(var i in
n)Object.prototype.hasOwnProperty.call(n,i)&&(t[i]=n[i])}return
t};function K(t){return
X({},t,{right:t.left+t.width,bottom:t.top+t.height})}function G(t){var
e={};try{if(F(10)){e=t.getBoundingClientRect();var
n=B(t,"top"),i=B(t,"left");e.top+=n,e.left+=i,e.bottom+=n,e.right+=i}else
e=t.getBoundingClientRect()}catch(t){}var
o={left:e.left,top:e.top,width:e.right-e.left,height:e.bottom-e.top},r="HTML"===t.nodeName?U(t.ownerDocument):{},a=r.width||t.clientWidth||o.width,s=r.height||t.clientHeight||o.height,l=t.offsetWidth-a,u=t.offsetHeight-s;if(l||u){var
f=I(t);l-=Q(f,"x"),u-=Q(f,"y"),o.width-=l,o.height-=u}return
K(o)}function $(t,e){var n=arguments.length>2&&void
0!==arguments[2]&&arguments[2],i=F(10),o="HTML"===e.nodeName,r=G(t),a=G(e),s=x(t),l=I(e),u=parseFloat(l.borderTopWidth),f=parseFloat(l.borderLeftWidth);n&&o&&(a.top=Math.max(a.top,0),a.left=Math.max(a.left,0));var
d=K({top:r.top-a.top-u,left:r.left-a.left-f,width:r.width,height:r.height});if(d.marginTop=0,d.marginLeft=0,!i&&o){var
c=parseFloat(l.marginTop),h=parseFloat(l.marginLeft);d.top-=u-c,d.bottom-=u-c,d.left-=f-h,d.right-=f-h,d.marginTop=c,d.marginLeft=h}return(i&&!n?e.contains(s):e===s&&"BODY"!==s.nodeName)&&(d=q(d,e)),d}function
J(t){var e=arguments.length>1&&void
0!==arguments[1]&&arguments[1],n=t.ownerDocument.documentElement,i=$(t,n),o=Math.max(n.clientWidth,window.innerWidth||0),r=Math.max(n.clientHeight,window.innerHeight||0),a=e?0:B(n),s=e?0:B(n,"left"),l={top:a-i.top+i.marginTop,left:s-i.left+i.marginLeft,width:o,height:r};return
K(l)}function Z(t){var
e=t.nodeName;if("BODY"===e||"HTML"===e)return!1;if("fixed"===I(t,"position"))return!0;var
n=O(t);return!!n&&Z(n)}function
tt(t){if(!t||!t.parentElement||F())return document.documentElement;for(var
e=t.parentElement;e&&"none"===I(e,"transform");)e=e.parentElement;return
e||document.documentElement}function et(t,e,n,i){var
o=arguments.length>4&&void
0!==arguments[4]&&arguments[4],r={top:0,left:0},a=o?tt(t):M(t,j(e));if("viewport"===i)r=J(a,o);else{var
s=void
0;"scrollParent"===i?"BODY"===(s=x(O(e))).nodeName&&(s=t.ownerDocument.documentElement):s="window"===i?t.ownerDocument.documentElement:i;var
l=$(s,a,o);if("HTML"!==s.nodeName||Z(a))r=l;else{var
u=U(t.ownerDocument),f=u.height,d=u.width;r.top+=l.top-l.marginTop,r.bottom=f+l.top,r.left+=l.left-l.marginLeft,r.right=d+l.left}}var
c="number"==typeof(n=n||0);return
r.left+=c?n:n.left||0,r.top+=c?n:n.top||0,r.right-=c?n:n.right||0,r.bottom-=c?n:n.bottom||0,r}function
nt(t){return t.width*t.height}function it(t,e,n,i,o){var
r=arguments.length>5&&void
0!==arguments[5]?arguments[5]:0;if(-1===t.indexOf("auto"))return
t;var
a=et(n,i,r,o),s={top:{width:a.width,height:e.top-a.top},right:{width:a.right-e.right,height:a.height},bottom:{width:a.width,height:a.bottom-e.bottom},left:{width:e.left-a.left,height:a.height}},l=Object.keys(s).map((function(t){return
X({key:t},s[t],{area:nt(s[t])})})).sort((function(t,e){return
e.area-t.area})),u=l.filter((function(t){var e=t.width,i=t.height;return
e>=n.clientWidth&&i>=n.clientHeight})),f=u.length>0?u[0].key:l[0].key,d=t.split("-")[1];return
f+(d?"-"+d:"")}function ot(t,e,n){var
i=arguments.length>3&&void
0!==arguments[3]?arguments[3]:null,o=i?tt(e):M(e,j(n));return
$(n,o,i)}function rt(t){var
e=t.ownerDocument.defaultView.getComputedStyle(t),n=parseFloat(e.marginTop||0)+parseFloat(e.marginBottom||0),i=parseFloat(e.marginLeft||0)+parseFloat(e.marginRight||0);return{width:t.offsetWidth+i,height:t.offsetHeight+n}}function
at(t){var
e={left:"right",right:"left",bottom:"top",top:"bottom"};return
t.replace(/left|right|bottom|top/g,(function(t){return e[t]}))}function
st(t,e,n){n=n.split("-")[0];var
i=rt(t),o={width:i.width,height:i.height},r=-1!==["right","left"].indexOf(n),a=r?"top":"left",s=r?"left":"top",l=r?"height":"width",u=r?"width":"height";return
o[a]=e[a]+e[l]/2-i[l]/2,o[s]=n===s?e[s]-i[u]:e[at(s)],o}function
lt(t,e){return Array.prototype.find?t.find(e):t.filter(e)[0]}function
ut(t,e,n){return(void
0===n?t:t.slice(0,function(t,e,n){if(Array.prototype.findIndex)return
t.findIndex((function(t){return t[e]===n}));var i=lt(t,(function(t){return
t[e]===n}));return
t.indexOf(i)}(t,"name",n))).forEach((function(t){t.function&&console.warn("`modifier.function`
is deprecated, use `modifier.fn`!");var
n=t.function||t.fn;t.enabled&&A(n)&&(e.offsets.popper=K(e.offsets.popper),e.offsets.reference=K(e.offsets.reference),e=n(e,t))})),e}function
ft(){if(!this.state.isDestroyed){var
t={instance:this,styles:{},arrowStyles:{},attributes:{},flipped:!1,offsets:{}};t.offsets.reference=ot(this.state,this.popper,this.reference,this.options.positionFixed),t.placement=it(this.options.placement,t.offsets.reference,this.popper,this.reference,this.options.modifiers.flip.boundariesElement,this.options.modifiers.flip.padding),t.originalPlacement=t.placement,t.positionFixed=this.options.positionFixed,t.offsets.popper=st(this.popper,t.offsets.reference,t.placement),t.offsets.popper.position=this.options.positionFixed?"fixed":"absolute",t=ut(this.modifiers,t),this.state.isCreated?this.options.onUpdate(t):(this.state.isCreated=!0,this.options.onCreate(t))}}function
dt(t,e){return t.some((function(t){var n=t.name;return
t.enabled&&n===e}))}function ct(t){for(var
e=[!1,"ms","Webkit","Moz","O"],n=t.charAt(0).toUpperCase()+t.slice(1),i=0;i<e.length;i++){var
o=e[i],r=o?""+o+n:t;if("undefined"!=typeof
document.body.style[r])return r}return null}function ht(){return
this.state.isDestroyed=!0,dt(this.modifiers,"applyStyle")&&(this.popper.removeAttribute("x-placement"),this.popper.style.position="",this.popper.style.top="",this.popper.style.left="",this.popper.style.right="",this.popper.style.bottom="",this.popper.style.willChange="",this.popper.style[ct("transform")]=""),this.disableEventListeners(),this.options.removeOnDestroy&&this.popper.parentNode.removeChild(this.popper),this}function
pt(t){var e=t.ownerDocument;return e?e.defaultView:window}function
mt(t,e,n,i){n.updateBound=i,pt(t).addEventListener("resize",n.updateBound,{passive:!0});var
o=x(t);return function t(e,n,i,o){var
r="BODY"===e.nodeName,a=r?e.ownerDocument.defaultView:e;a.addEventListener(n,i,{passive:!0}),r||t(x(a.parentNode),n,i,o),o.push(a)}(o,"scroll",n.updateBound,n.scrollParents),n.scrollElement=o,n.eventsEnabled=!0,n}function
gt(){this.state.eventsEnabled||(this.state=mt(this.reference,this.options,this.state,this.scheduleUpdate))}function
vt(){var
t,e;this.state.eventsEnabled&&(cancelAnimationFrame(this.scheduleUpdate),this.state=(t=this.reference,e=this.state,pt(t).removeEventListener("resize",e.updateBound),e.scrollParents.forEach((function(t){t.removeEventListener("scroll",e.updateBound)})),e.updateBound=null,e.scrollParents=[],e.scrollElement=null,e.eventsEnabled=!1,e))}function
_t(t){return""!==t&&!isNaN(parseFloat(t))&&isFinite(t)}function
bt(t,e){Object.keys(e).forEach((function(n){var
i="";-1!==["width","height","top","right","bottom","left"].indexOf(n)&&_t(e[n])&&(i="px"),t.style[n]=e[n]+i}))}var
yt=D&&/Firefox/i.test(navigator.userAgent);function wt(t,e,n){var
i=lt(t,(function(t){return
t.name===e})),o=!!i&&t.some((function(t){return
t.name===n&&t.enabled&&t.order<i.order}));if(!o){var
r="`"+e+"`",a="`"+n+"`";console.warn(a+"
modifier is required by "+r+" modifier in order to work, be sure
to include it before "+r+"!")}return o}var
Et=["auto-start","auto","auto-end","top-start","top","top-end","right-start","right","right-end","bottom-end","bottom","bottom-start","left-end","left","left-start"],Tt=Et.slice(3);function
Ct(t){var e=arguments.length>1&&void
0!==arguments[1]&&arguments[1],n=Tt.indexOf(t),i=Tt.slice(n+1).concat(Tt.slice(0,n));return
e?i.reverse():i}var
St="flip",Dt="clockwise",Nt="counterclockwise";function
kt(t,e,n,i){var
o=[0,0],r=-1!==["right","left"].indexOf(i),a=t.split(/(\+|\-)/).map((function(t){return
t.trim()})),s=a.indexOf(lt(a,(function(t){return-1!==t.search(/,|\s/)})));a[s]&&-1===a[s].indexOf(",")&&console.warn("Offsets
separated by white space(s) are deprecated, use a comma (,)
instead.");var
l=/\s*,\s*|\s+/,u=-1!==s?[a.slice(0,s).concat([a[s].split(l)[0]]),[a[s].split(l)[1]].concat(a.slice(s+1))]:[a];return(u=u.map((function(t,i){var
o=(1===i?!r:r)?"height":"width",a=!1;return
t.reduce((function(t,e){return""===t[t.length-1]&&-1!==["+","-"].indexOf(e)?(t[t.length-1]=e,a=!0,t):a?(t[t.length-1]+=e,a=!1,t):t.concat(e)}),[]).map((function(t){return
function(t,e,n,i){var
o=t.match(/((?:\-|\+)?\d*\.?\d*)(.*)/),r=+o[1],a=o[2];if(!r)return
t;if(0===a.indexOf("%")){var s=void
0;switch(a){case"%p":s=n;break;case"%":case"%r":default:s=i}return
K(s)[e]/100*r}if("vh"===a||"vw"===a){return("vh"===a?Math.max(document.documentElement.clientHeight,window.innerHeight||0):Math.max(document.documentElement.clientWidth,window.innerWidth||0))/100*r}return
r}(t,o,e,n)}))}))).forEach((function(t,e){t.forEach((function(n,i){_t(n)&&(o[e]+=n*("-"===t[i-1]?-1:1))}))})),o}var
At={placement:"bottom",positionFixed:!1,eventsEnabled:!0,removeOnDestroy:!1,onCreate:function(){},onUpdate:function(){},modifiers:{shift:{order:100,enabled:!0,fn:function(t){var
e=t.placement,n=e.split("-")[0],i=e.split("-")[1];if(i){var
o=t.offsets,r=o.reference,a=o.popper,s=-1!==["bottom","top"].indexOf(n),l=s?"left":"top",u=s?"width":"height",f={start:z({},l,r[l]),end:z({},l,r[l]+r[u]-a[u])};t.offsets.popper=X({},a,f[i])}return
t}},offset:{order:200,enabled:!0,fn:function(t,e){var
n=e.offset,i=t.placement,o=t.offsets,r=o.popper,a=o.reference,s=i.split("-")[0],l=void
0;return
l=_t(+n)?[+n,0]:kt(n,r,a,s),"left"===s?(r.top+=l[0],r.left-=l[1]):"right"===s?(r.top+=l[0],r.left+=l[1]):"top"===s?(r.left+=l[0],r.top-=l[1]):"bottom"===s&&(r.left+=l[0],r.top+=l[1]),t.popper=r,t},offset:0},preventOverflow:{order:300,enabled:!0,fn:function(t,e){var
n=e.boundariesElement||R(t.instance.popper);t.instance.reference===n&&(n=R(n));var
i=ct("transform"),o=t.instance.popper.style,r=o.top,a=o.left,s=o[i];o.top="",o.left="",o[i]="";var
l=et(t.instance.popper,t.instance.reference,e.padding,n,t.positionFixed);o.top=r,o.left=a,o[i]=s,e.boundaries=l;var
u=e.priority,f=t.offsets.popper,d={primary:function(t){var n=f[t];return
f[t]<l[t]&&!e.escapeWithReference&&(n=Math.max(f[t],l[t])),z({},t,n)},secondary:function(t){var
n="right"===t?"left":"top",i=f[n];return
f[t]>l[t]&&!e.escapeWithReference&&(i=Math.min(f[n],l[t]-("right"===t?f.width:f.height))),z({},n,i)}};return
u.forEach((function(t){var
e=-1!==["left","top"].indexOf(t)?"primary":"secondary";f=X({},f,d[e](t))})),t.offsets.popper=f,t},priority:["left","right","top","bottom"],padding:5,boundariesElement:"scrollParent"},keepTogether:{order:400,enabled:!0,fn:function(t){var
e=t.offsets,n=e.popper,i=e.reference,o=t.placement.split("-")[0],r=Math.floor,a=-1!==["top","bottom"].indexOf(o),s=a?"right":"bottom",l=a?"left":"top",u=a?"width":"height";return
n[s]<r(i[l])&&(t.offsets.popper[l]=r(i[l])-n[u]),n[l]>r(i[s])&&(t.offsets.popper[l]=r(i[s])),t}},arrow:{order:500,enabled:!0,fn:function(t,e){var
n;if(!wt(t.instance.modifiers,"arrow","keepTogether"))return
t;var i=e.element;if("string"==typeof
i){if(!(i=t.instance.popper.querySelector(i)))return t}else
if(!t.instance.popper.contains(i))return console.warn("WARNING:
`arrow.element` must be child of its popper element!"),t;var
o=t.placement.split("-")[0],r=t.offsets,a=r.popper,s=r.reference,l=-1!==["left","right"].indexOf(o),u=l?"height":"width",f=l?"Top":"Left",d=f.toLowerCase(),c=l?"left":"top",h=l?"bottom":"right",p=rt(i)[u];s[h]-p<a[d]&&(t.offsets.popper[d]-=a[d]-(s[h]-p)),s[d]+p>a[h]&&(t.offsets.popper[d]+=s[d]+p-a[h]),t.offsets.popper=K(t.offsets.popper);var
m=s[d]+s[u]/2-p/2,g=I(t.instance.popper),v=parseFloat(g["margin"+f]),_=parseFloat(g["border"+f+"Width"]),b=m-t.offsets.popper[d]-v-_;return
b=Math.max(Math.min(a[u]-p,b),0),t.arrowElement=i,t.offsets.arrow=(z(n={},d,Math.round(b)),z(n,c,""),n),t},element:"[x-arrow]"},flip:{order:600,enabled:!0,fn:function(t,e){if(dt(t.instance.modifiers,"inner"))return
t;if(t.flipped&&t.placement===t.originalPlacement)return t;var
n=et(t.instance.popper,t.instance.reference,e.padding,e.boundariesElement,t.positionFixed),i=t.placement.split("-")[0],o=at(i),r=t.placement.split("-")[1]||"",a=[];switch(e.behavior){case
St:a=[i,o];break;case Dt:a=Ct(i);break;case
Nt:a=Ct(i,!0);break;default:a=e.behavior}return
a.forEach((function(s,l){if(i!==s||a.length===l+1)return
t;i=t.placement.split("-")[0],o=at(i);var
u=t.offsets.popper,f=t.offsets.reference,d=Math.floor,c="left"===i&&d(u.right)>d(f.left)||"right"===i&&d(u.left)<d(f.right)||"top"===i&&d(u.bottom)>d(f.top)||"bottom"===i&&d(u.top)<d(f.bottom),h=d(u.left)<d(n.left),p=d(u.right)>d(n.right),m=d(u.top)<d(n.top),g=d(u.bottom)>d(n.bottom),v="left"===i&&h||"right"===i&&p||"top"===i&&m||"bottom"===i&&g,_=-1!==["top","bottom"].indexOf(i),b=!!e.flipVariations&&(_&&"start"===r&&h||_&&"end"===r&&p||!_&&"start"===r&&m||!_&&"end"===r&&g),y=!!e.flipVariationsByContent&&(_&&"start"===r&&p||_&&"end"===r&&h||!_&&"start"===r&&g||!_&&"end"===r&&m),w=b||y;(c||v||w)&&(t.flipped=!0,(c||v)&&(i=a[l+1]),w&&(r=function(t){return"end"===t?"start":"start"===t?"end":t}(r)),t.placement=i+(r?"-"+r:""),t.offsets.popper=X({},t.offsets.popper,st(t.instance.popper,t.offsets.reference,t.placement)),t=ut(t.instance.modifiers,t,"flip"))})),t},behavior:"flip",padding:5,boundariesElement:"viewport",flipVariations:!1,flipVariationsByContent:!1},inner:{order:700,enabled:!1,fn:function(t){var
e=t.placement,n=e.split("-")[0],i=t.offsets,o=i.popper,r=i.reference,a=-1!==["left","right"].indexOf(n),s=-1===["top","left"].indexOf(n);return
o[a?"left":"top"]=r[n]-(s?o[a?"width":"height"]:0),t.placement=at(e),t.offsets.popper=K(o),t}},hide:{order:800,enabled:!0,fn:function(t){if(!wt(t.instance.modifiers,"hide","preventOverflow"))return
t;var
e=t.offsets.reference,n=lt(t.instance.modifiers,(function(t){return"preventOverflow"===t.name})).boundaries;if(e.bottom<n.top||e.left>n.right||e.top>n.bottom||e.right<n.left){if(!0===t.hide)return
t;t.hide=!0,t.attributes["x-out-of-boundaries"]=""}else{if(!1===t.hide)return
t;t.hide=!1,t.attributes["x-out-of-boundaries"]=!1}return
t}},computeStyle:{order:850,enabled:!0,fn:function(t,e){var
n=e.x,i=e.y,o=t.offsets.popper,r=lt(t.instance.modifiers,(function(t){return"applyStyle"===t.name})).gpuAcceleration;void
0!==r&&console.warn("WARNING: `gpuAcceleration` option moved
to `computeStyle` modifier and will not be supported in future versions of
Popper.js!");var a=void
0!==r?r:e.gpuAcceleration,s=R(t.instance.popper),l=G(s),u={position:o.position},f=function(t,e){var
n=t.offsets,i=n.popper,o=n.reference,r=Math.round,a=Math.floor,s=function(t){return
t},l=r(o.width),u=r(i.width),f=-1!==["left","right"].indexOf(t.placement),d=-1!==t.placement.indexOf("-"),c=e?f||d||l%2==u%2?r:a:s,h=e?r:s;return{left:c(l%2==1&&u%2==1&&!d&&e?i.left-1:i.left),top:h(i.top),bottom:h(i.bottom),right:c(i.right)}}(t,window.devicePixelRatio<2||!yt),d="bottom"===n?"top":"bottom",c="right"===i?"left":"right",h=ct("transform"),p=void
0,m=void
0;if(m="bottom"===d?"HTML"===s.nodeName?-s.clientHeight+f.bottom:-l.height+f.bottom:f.top,p="right"===c?"HTML"===s.nodeName?-s.clientWidth+f.right:-l.width+f.right:f.left,a&&h)u[h]="translate3d("+p+"px,
"+m+"px,
0)",u[d]=0,u[c]=0,u.willChange="transform";else{var
g="bottom"===d?-1:1,v="right"===c?-1:1;u[d]=m*g,u[c]=p*v,u.willChange=d+",
"+c}var _={"x-placement":t.placement};return
t.attributes=X({},_,t.attributes),t.styles=X({},u,t.styles),t.arrowStyles=X({},t.offsets.arrow,t.arrowStyles),t},gpuAcceleration:!0,x:"bottom",y:"right"},applyStyle:{order:900,enabled:!0,fn:function(t){var
e,n;return
bt(t.instance.popper,t.styles),e=t.instance.popper,n=t.attributes,Object.keys(n).forEach((function(t){!1!==n[t]?e.setAttribute(t,n[t]):e.removeAttribute(t)})),t.arrowElement&&Object.keys(t.arrowStyles).length&&bt(t.arrowElement,t.arrowStyles),t},onLoad:function(t,e,n,i,o){var
r=ot(o,e,t,n.positionFixed),a=it(n.placement,r,e,t,n.modifiers.flip.boundariesElement,n.modifiers.flip.padding);return
e.setAttribute("x-placement",a),bt(e,{position:n.positionFixed?"fixed":"absolute"}),n},gpuAcceleration:void
0}}},It=function(){function t(e,n){var
i=this,o=arguments.length>2&&void
0!==arguments[2]?arguments[2]:{};V(this,t),this.scheduleUpdate=function(){return
requestAnimationFrame(i.update)},this.update=k(this.update.bind(this)),this.options=X({},t.Defaults,o),this.state={isDestroyed:!1,isCreated:!1,scrollParents:[]},this.reference=e&&e.jquery?e[0]:e,this.popper=n&&n.jquery?n[0]:n,this.options.modifiers={},Object.keys(X({},t.Defaults.modifiers,o.modifiers)).forEach((function(e){i.options.modifiers[e]=X({},t.Defaults.modifiers[e]||{},o.modifiers?o.modifiers[e]:{})})),this.modifiers=Object.keys(this.options.modifiers).map((function(t){return
X({name:t},i.options.modifiers[t])})).sort((function(t,e){return
t.order-e.order})),this.modifiers.forEach((function(t){t.enabled&&A(t.onLoad)&&t.onLoad(i.reference,i.popper,i.options,t,i.state)})),this.update();var
r=this.options.eventsEnabled;r&&this.enableEventListeners(),this.state.eventsEnabled=r}return
Y(t,[{key:"update",value:function(){return
ft.call(this)}},{key:"destroy",value:function(){return
ht.call(this)}},{key:"enableEventListeners",value:function(){return
gt.call(this)}},{key:"disableEventListeners",value:function(){return
vt.call(this)}}]),t}();It.Utils=("undefined"!=typeof
window?window:global).PopperUtils,It.placements=Et,It.Defaults=At;var
Ot="dropdown",xt=i.default.fn[Ot],jt=new
RegExp("38|40|27"),Lt={offset:0,flip:!0,boundary:"scrollParent",reference:"toggle",display:"dynamic",popperConfig:null},Pt={offset:"(number|string|function)",flip:"boolean",boundary:"(string|element)",reference:"(string|element)",display:"string",popperConfig:"(null|object)"},Ft=function(){function
t(t,e){this._element=t,this._popper=null,this._config=this._getConfig(e),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}var
e=t.prototype;return
e.toggle=function(){if(!this._element.disabled&&!i.default(this._element).hasClass("disabled")){var
e=i.default(this._menu).hasClass("show");t._clearMenus(),e||this.show(!0)}},e.show=function(e){if(void
0===e&&(e=!1),!(this._element.disabled||i.default(this._element).hasClass("disabled")||i.default(this._menu).hasClass("show"))){var
n={relatedTarget:this._element},o=i.default.Event("show.bs.dropdown",n),r=t._getParentFromElement(this._element);if(i.default(r).trigger(o),!o.isDefaultPrevented()){if(!this._inNavbar&&e){if("undefined"==typeof
It)throw new TypeError("Bootstrap's dropdowns require Popper.js
(https://popper.js.org/)");var
a=this._element;"parent"===this._config.reference?a=r:l.isElement(this._config.reference)&&(a=this._config.reference,"undefined"!=typeof
this._config.reference.jquery&&(a=this._config.reference[0])),"scrollParent"!==this._config.boundary&&i.default(r).addClass("position-static"),this._popper=new
It(a,this._menu,this._getPopperConfig())}"ontouchstart"in
document.documentElement&&0===i.default(r).closest(".navbar-nav").length&&i.default(document.body).children().on("mouseover",null,i.default.noop),this._element.focus(),this._element.setAttribute("aria-expanded",!0),i.default(this._menu).toggleClass("show"),i.default(r).toggleClass("show").trigger(i.default.Event("shown.bs.dropdown",n))}}},e.hide=function(){if(!this._element.disabled&&!i.default(this._element).hasClass("disabled")&&i.default(this._menu).hasClass("show")){var
e={relatedTarget:this._element},n=i.default.Event("hide.bs.dropdown",e),o=t._getParentFromElement(this._element);i.default(o).trigger(n),n.isDefaultPrevented()||(this._popper&&this._popper.destroy(),i.default(this._menu).toggleClass("show"),i.default(o).toggleClass("show").trigger(i.default.Event("hidden.bs.dropdown",e)))}},e.dispose=function(){i.default.removeData(this._element,"bs.dropdown"),i.default(this._element).off(".bs.dropdown"),this._element=null,this._menu=null,null!==this._popper&&(this._popper.destroy(),this._popper=null)},e.update=function(){this._inNavbar=this._detectNavbar(),null!==this._popper&&this._popper.scheduleUpdate()},e._addEventListeners=function(){var
t=this;i.default(this._element).on("click.bs.dropdown",(function(e){e.preventDefault(),e.stopPropagation(),t.toggle()}))},e._getConfig=function(t){return
t=a({},this.constructor.Default,i.default(this._element).data(),t),l.typeCheckConfig(Ot,t,this.constructor.DefaultType),t},e._getMenuElement=function(){if(!this._menu){var
e=t._getParentFromElement(this._element);e&&(this._menu=e.querySelector(".dropdown-menu"))}return
this._menu},e._getPlacement=function(){var
t=i.default(this._element.parentNode),e="bottom-start";return
t.hasClass("dropup")?e=i.default(this._menu).hasClass("dropdown-menu-right")?"top-end":"top-start":t.hasClass("dropright")?e="right-start":t.hasClass("dropleft")?e="left-start":i.default(this._menu).hasClass("dropdown-menu-right")&&(e="bottom-end"),e},e._detectNavbar=function(){return
i.default(this._element).closest(".navbar").length>0},e._getOffset=function(){var
t=this,e={};return"function"==typeof
this._config.offset?e.fn=function(e){return
e.offsets=a({},e.offsets,t._config.offset(e.offsets,t._element)||{}),e}:e.offset=this._config.offset,e},e._getPopperConfig=function(){var
t={placement:this._getPlacement(),modifiers:{offset:this._getOffset(),flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}};return"static"===this._config.display&&(t.modifiers.applyStyle={enabled:!1}),a({},t,this._config.popperConfig)},t._jQueryInterface=function(e){return
this.each((function(){var
n=i.default(this).data("bs.dropdown");if(n||(n=new
t(this,"object"==typeof
e?e:null),i.default(this).data("bs.dropdown",n)),"string"==typeof
e){if("undefined"==typeof n[e])throw new TypeError('No
method named
"'+e+'"');n[e]()}}))},t._clearMenus=function(e){if(!e||3!==e.which&&("keyup"!==e.type||9===e.which))for(var
n=[].slice.call(document.querySelectorAll('[data-toggle="dropdown"]')),o=0,r=n.length;o<r;o++){var
a=t._getParentFromElement(n[o]),s=i.default(n[o]).data("bs.dropdown"),l={relatedTarget:n[o]};if(e&&"click"===e.type&&(l.clickEvent=e),s){var
u=s._menu;if(i.default(a).hasClass("show")&&!(e&&("click"===e.type&&/input|textarea/i.test(e.target.tagName)||"keyup"===e.type&&9===e.which)&&i.default.contains(a,e.target))){var
f=i.default.Event("hide.bs.dropdown",l);i.default(a).trigger(f),f.isDefaultPrevented()||("ontouchstart"in
document.documentElement&&i.default(document.body).children().off("mouseover",null,i.default.noop),n[o].setAttribute("aria-expanded","false"),s._popper&&s._popper.destroy(),i.default(u).removeClass("show"),i.default(a).removeClass("show").trigger(i.default.Event("hidden.bs.dropdown",l)))}}}},t._getParentFromElement=function(t){var
e,n=l.getSelectorFromElement(t);return
n&&(e=document.querySelector(n)),e||t.parentNode},t._dataApiKeydownHandler=function(e){if(!(/input|textarea/i.test(e.target.tagName)?32===e.which||27!==e.which&&(40!==e.which&&38!==e.which||i.default(e.target).closest(".dropdown-menu").length):!jt.test(e.which))&&!this.disabled&&!i.default(this).hasClass("disabled")){var
n=t._getParentFromElement(this),o=i.default(n).hasClass("show");if(o||27!==e.which){if(e.preventDefault(),e.stopPropagation(),!o||27===e.which||32===e.which)return
27===e.which&&i.default(n.querySelector('[data-toggle="dropdown"]')).trigger("focus"),void
i.default(this).trigger("click");var
r=[].slice.call(n.querySelectorAll(".dropdown-menu
.dropdown-item:not(.disabled):not(:disabled)")).filter((function(t){return
i.default(t).is(":visible")}));if(0!==r.length){var
a=r.indexOf(e.target);38===e.which&&a>0&&a--,40===e.which&&a<r.length-1&&a++,a<0&&(a=0),r[a].focus()}}}},r(t,null,[{key:"VERSION",get:function(){return"4.5.3"}},{key:"Default",get:function(){return
Lt}},{key:"DefaultType",get:function(){return
Pt}}]),t}();i.default(document).on("keydown.bs.dropdown.data-api",'[data-toggle="dropdown"]',Ft._dataApiKeydownHandler).on("keydown.bs.dropdown.data-api",".dropdown-menu",Ft._dataApiKeydownHandler).on("click.bs.dropdown.data-api
keyup.bs.dropdown.data-api",Ft._clearMenus).on("click.bs.dropdown.data-api",'[data-toggle="dropdown"]',(function(t){t.preventDefault(),t.stopPropagation(),Ft._jQueryInterface.call(i.default(this),"toggle")})).on("click.bs.dropdown.data-api",".dropdown
form",(function(t){t.stopPropagation()})),i.default.fn[Ot]=Ft._jQueryInterface,i.default.fn[Ot].Constructor=Ft,i.default.fn[Ot].noConflict=function(){return
i.default.fn[Ot]=xt,Ft._jQueryInterface};var
Rt=i.default.fn.modal,Ht={backdrop:!0,keyboard:!0,focus:!0,show:!0},Mt={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean",show:"boolean"},Bt=function(){function
t(t,e){this._config=this._getConfig(e),this._element=t,this._dialog=t.querySelector(".modal-dialog"),this._backdrop=null,this._isShown=!1,this._isBodyOverflowing=!1,this._ignoreBackdropClick=!1,this._isTransitioning=!1,this._scrollbarWidth=0}var
e=t.prototype;return e.toggle=function(t){return
this._isShown?this.hide():this.show(t)},e.show=function(t){var
e=this;if(!this._isShown&&!this._isTransitioning){i.default(this._element).hasClass("fade")&&(this._isTransitioning=!0);var
n=i.default.Event("show.bs.modal",{relatedTarget:t});i.default(this._element).trigger(n),this._isShown||n.isDefaultPrevented()||(this._isShown=!0,this._checkScrollbar(),this._setScrollbar(),this._adjustDialog(),this._setEscapeEvent(),this._setResizeEvent(),i.default(this._element).on("click.dismiss.bs.modal",'[data-dismiss="modal"]',(function(t){return
e.hide(t)})),i.default(this._dialog).on("mousedown.dismiss.bs.modal",(function(){i.default(e._element).one("mouseup.dismiss.bs.modal",(function(t){i.default(t.target).is(e._element)&&(e._ignoreBackdropClick=!0)}))})),this._showBackdrop((function(){return
e._showElement(t)})))}},e.hide=function(t){var
e=this;if(t&&t.preventDefault(),this._isShown&&!this._isTransitioning){var
n=i.default.Event("hide.bs.modal");if(i.default(this._element).trigger(n),this._isShown&&!n.isDefaultPrevented()){this._isShown=!1;var
o=i.default(this._element).hasClass("fade");if(o&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),i.default(document).off("focusin.bs.modal"),i.default(this._element).removeClass("show"),i.default(this._element).off("click.dismiss.bs.modal"),i.default(this._dialog).off("mousedown.dismiss.bs.modal"),o){var
r=l.getTransitionDurationFromElement(this._element);i.default(this._element).one(l.TRANSITION_END,(function(t){return
e._hideModal(t)})).emulateTransitionEnd(r)}else
this._hideModal()}}},e.dispose=function(){[window,this._element,this._dialog].forEach((function(t){return
i.default(t).off(".bs.modal")})),i.default(document).off("focusin.bs.modal"),i.default.removeData(this._element,"bs.modal"),this._config=null,this._element=null,this._dialog=null,this._backdrop=null,this._isShown=null,this._isBodyOverflowing=null,this._ignoreBackdropClick=null,this._isTransitioning=null,this._scrollbarWidth=null},e.handleUpdate=function(){this._adjustDialog()},e._getConfig=function(t){return
t=a({},Ht,t),l.typeCheckConfig("modal",t,Mt),t},e._triggerBackdropTransition=function(){var
t=this;if("static"===this._config.backdrop){var
e=i.default.Event("hidePrevented.bs.modal");if(i.default(this._element).trigger(e),e.isDefaultPrevented())return;var
n=this._element.scrollHeight>document.documentElement.clientHeight;n||(this._element.style.overflowY="hidden"),this._element.classList.add("modal-static");var
o=l.getTransitionDurationFromElement(this._dialog);i.default(this._element).off(l.TRANSITION_END),i.default(this._element).one(l.TRANSITION_END,(function(){t._element.classList.remove("modal-static"),n||i.default(t._element).one(l.TRANSITION_END,(function(){t._element.style.overflowY=""})).emulateTransitionEnd(t._element,o)})).emulateTransitionEnd(o),this._element.focus()}else
this.hide()},e._showElement=function(t){var
e=this,n=i.default(this._element).hasClass("fade"),o=this._dialog?this._dialog.querySelector(".modal-body"):null;this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),i.default(this._dialog).hasClass("modal-dialog-scrollable")&&o?o.scrollTop=0:this._element.scrollTop=0,n&&l.reflow(this._element),i.default(this._element).addClass("show"),this._config.focus&&this._enforceFocus();var
r=i.default.Event("shown.bs.modal",{relatedTarget:t}),a=function(){e._config.focus&&e._element.focus(),e._isTransitioning=!1,i.default(e._element).trigger(r)};if(n){var
s=l.getTransitionDurationFromElement(this._dialog);i.default(this._dialog).one(l.TRANSITION_END,a).emulateTransitionEnd(s)}else
a()},e._enforceFocus=function(){var
t=this;i.default(document).off("focusin.bs.modal").on("focusin.bs.modal",(function(e){document!==e.target&&t._element!==e.target&&0===i.default(t._element).has(e.target).length&&t._element.focus()}))},e._setEscapeEvent=function(){var
t=this;this._isShown?i.default(this._element).on("keydown.dismiss.bs.modal",(function(e){t._config.keyboard&&27===e.which?(e.preventDefault(),t.hide()):t._config.keyboard||27!==e.which||t._triggerBackdropTransition()})):this._isShown||i.default(this._element).off("keydown.dismiss.bs.modal")},e._setResizeEvent=function(){var
t=this;this._isShown?i.default(window).on("resize.bs.modal",(function(e){return
t.handleUpdate(e)})):i.default(window).off("resize.bs.modal")},e._hideModal=function(){var
t=this;this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._showBackdrop((function(){i.default(document.body).removeClass("modal-open"),t._resetAdjustments(),t._resetScrollbar(),i.default(t._element).trigger("hidden.bs.modal")}))},e._removeBackdrop=function(){this._backdrop&&(i.default(this._backdrop).remove(),this._backdrop=null)},e._showBackdrop=function(t){var
e=this,n=i.default(this._element).hasClass("fade")?"fade":"";if(this._isShown&&this._config.backdrop){if(this._backdrop=document.createElement("div"),this._backdrop.className="modal-backdrop",n&&this._backdrop.classList.add(n),i.default(this._backdrop).appendTo(document.body),i.default(this._element).on("click.dismiss.bs.modal",(function(t){e._ignoreBackdropClick?e._ignoreBackdropClick=!1:t.target===t.currentTarget&&e._triggerBackdropTransition()})),n&&l.reflow(this._backdrop),i.default(this._backdrop).addClass("show"),!t)return;if(!n)return
void t();var
o=l.getTransitionDurationFromElement(this._backdrop);i.default(this._backdrop).one(l.TRANSITION_END,t).emulateTransitionEnd(o)}else
if(!this._isShown&&this._backdrop){i.default(this._backdrop).removeClass("show");var
r=function(){e._removeBackdrop(),t&&t()};if(i.default(this._element).hasClass("fade")){var
a=l.getTransitionDurationFromElement(this._backdrop);i.default(this._backdrop).one(l.TRANSITION_END,r).emulateTransitionEnd(a)}else
r()}else t&&t()},e._adjustDialog=function(){var
t=this._element.scrollHeight>document.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},e._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},e._checkScrollbar=function(){var
t=document.body.getBoundingClientRect();this._isBodyOverflowing=Math.round(t.left+t.right)<window.innerWidth,this._scrollbarWidth=this._getScrollbarWidth()},e._setScrollbar=function(){var
t=this;if(this._isBodyOverflowing){var
e=[].slice.call(document.querySelectorAll(".fixed-top, .fixed-bottom,
.is-fixed,
.sticky-top")),n=[].slice.call(document.querySelectorAll(".sticky-top"));i.default(e).each((function(e,n){var
o=n.style.paddingRight,r=i.default(n).css("padding-right");i.default(n).data("padding-right",o).css("padding-right",parseFloat(r)+t._scrollbarWidth+"px")})),i.default(n).each((function(e,n){var
o=n.style.marginRight,r=i.default(n).css("margin-right");i.default(n).data("margin-right",o).css("margin-right",parseFloat(r)-t._scrollbarWidth+"px")}));var
o=document.body.style.paddingRight,r=i.default(document.body).css("padding-right");i.default(document.body).data("padding-right",o).css("padding-right",parseFloat(r)+this._scrollbarWidth+"px")}i.default(document.body).addClass("modal-open")},e._resetScrollbar=function(){var
t=[].slice.call(document.querySelectorAll(".fixed-top, .fixed-bottom,
.is-fixed, .sticky-top"));i.default(t).each((function(t,e){var
n=i.default(e).data("padding-right");i.default(e).removeData("padding-right"),e.style.paddingRight=n||""}));var
e=[].slice.call(document.querySelectorAll(".sticky-top"));i.default(e).each((function(t,e){var
n=i.default(e).data("margin-right");"undefined"!=typeof
n&&i.default(e).css("margin-right",n).removeData("margin-right")}));var
n=i.default(document.body).data("padding-right");i.default(document.body).removeData("padding-right"),document.body.style.paddingRight=n||""},e._getScrollbarWidth=function(){var
t=document.createElement("div");t.className="modal-scrollbar-measure",document.body.appendChild(t);var
e=t.getBoundingClientRect().width-t.clientWidth;return
document.body.removeChild(t),e},t._jQueryInterface=function(e,n){return
this.each((function(){var
o=i.default(this).data("bs.modal"),r=a({},Ht,i.default(this).data(),"object"==typeof
e&&e?e:{});if(o||(o=new
t(this,r),i.default(this).data("bs.modal",o)),"string"==typeof
e){if("undefined"==typeof o[e])throw new TypeError('No
method named "'+e+'"');o[e](n)}else
r.show&&o.show(n)}))},r(t,null,[{key:"VERSION",get:function(){return"4.5.3"}},{key:"Default",get:function(){return
Ht}}]),t}();i.default(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',(function(t){var
e,n=this,o=l.getSelectorFromElement(this);o&&(e=document.querySelector(o));var
r=i.default(e).data("bs.modal")?"toggle":a({},i.default(e).data(),i.default(this).data());"A"!==this.tagName&&"AREA"!==this.tagName||t.preventDefault();var
s=i.default(e).one("show.bs.modal",(function(t){t.isDefaultPrevented()||s.one("hidden.bs.modal",(function(){i.default(n).is(":visible")&&n.focus()}))}));Bt._jQueryInterface.call(i.default(e),r,this)})),i.default.fn.modal=Bt._jQueryInterface,i.default.fn.modal.Constructor=Bt,i.default.fn.modal.noConflict=function(){return
i.default.fn.modal=Rt,Bt._jQueryInterface};var
qt=["background","cite","href","itemtype","longdesc","poster","src","xlink:href"],Qt={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Wt=/^(?:(?:https?|mailto|ftp|tel|file):|[^#&/:?]*(?:[#/?]|$))/gi,Ut=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i;function
Vt(t,e,n){if(0===t.length)return
t;if(n&&"function"==typeof n)return n(t);for(var i=(new
window.DOMParser).parseFromString(t,"text/html"),o=Object.keys(e),r=[].slice.call(i.body.querySelectorAll("*")),a=function(t,n){var
i=r[t],a=i.nodeName.toLowerCase();if(-1===o.indexOf(i.nodeName.toLowerCase()))return
i.parentNode.removeChild(i),"continue";var
s=[].slice.call(i.attributes),l=[].concat(e["*"]||[],e[a]||[]);s.forEach((function(t){(function(t,e){var
n=t.nodeName.toLowerCase();if(-1!==e.indexOf(n))return-1===qt.indexOf(n)||Boolean(t.nodeValue.match(Wt)||t.nodeValue.match(Ut));for(var
i=e.filter((function(t){return t instanceof
RegExp})),o=0,r=i.length;o<r;o++)if(n.match(i[o]))return!0;return!1})(t,l)||i.removeAttribute(t.nodeName)}))},s=0,l=r.length;s<l;s++)a(s);return
i.body.innerHTML}var Yt="tooltip",zt=i.default.fn[Yt],Xt=new
RegExp("(^|\\s)bs-tooltip\\S+","g"),Kt=["sanitize","whiteList","sanitizeFn"],Gt={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(number|string|function)",container:"(string|element|boolean)",fallbackPlacement:"(string|array)",boundary:"(string|element)",sanitize:"boolean",sanitizeFn:"(null|function)",whiteList:"object",popperConfig:"(null|object)"},$t={AUTO:"auto",TOP:"top",RIGHT:"right",BOTTOM:"bottom",LEFT:"left"},Jt={animation:!0,template:'<div
class="tooltip" role="tooltip"><div
class="arrow"></div><div
class="tooltip-inner"></div></div>',trigger:"hover
focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:Qt,popperConfig:null},Zt={HIDE:"hide.bs.tooltip",HIDDEN:"hidden.bs.tooltip",SHOW:"show.bs.tooltip",SHOWN:"shown.bs.tooltip",INSERTED:"inserted.bs.tooltip",CLICK:"click.bs.tooltip",FOCUSIN:"focusin.bs.tooltip",FOCUSOUT:"focusout.bs.tooltip",MOUSEENTER:"mouseenter.bs.tooltip",MOUSELEAVE:"mouseleave.bs.tooltip"},te=function(){function
t(t,e){if("undefined"==typeof It)throw new
TypeError("Bootstrap's tooltips require Popper.js
(https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var
e=t.prototype;return
e.enable=function(){this._isEnabled=!0},e.disable=function(){this._isEnabled=!1},e.toggleEnabled=function(){this._isEnabled=!this._isEnabled},e.toggle=function(t){if(this._isEnabled)if(t){var
e=this.constructor.DATA_KEY,n=i.default(t.currentTarget).data(e);n||(n=new
this.constructor(t.currentTarget,this._getDelegateConfig()),i.default(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(i.default(this.getTipElement()).hasClass("show"))return
void
this._leave(null,this);this._enter(null,this)}},e.dispose=function(){clearTimeout(this._timeout),i.default.removeData(this.element,this.constructor.DATA_KEY),i.default(this.element).off(this.constructor.EVENT_KEY),i.default(this.element).closest(".modal").off("hide.bs.modal",this._hideModalHandler),this.tip&&i.default(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},e.show=function(){var
t=this;if("none"===i.default(this.element).css("display"))throw
new Error("Please use show on visible elements");var
e=i.default.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){i.default(this.element).trigger(e);var
n=l.findShadowRoot(this.element),o=i.default.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(e.isDefaultPrevented()||!o)return;var
r=this.getTipElement(),a=l.getUID(this.constructor.NAME);r.setAttribute("id",a),this.element.setAttribute("aria-describedby",a),this.setContent(),this.config.animation&&i.default(r).addClass("fade");var
s="function"==typeof
this.config.placement?this.config.placement.call(this,r,this.element):this.config.placement,u=this._getAttachment(s);this.addAttachmentClass(u);var
f=this._getContainer();i.default(r).data(this.constructor.DATA_KEY,this),i.default.contains(this.element.ownerDocument.documentElement,this.tip)||i.default(r).appendTo(f),i.default(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new
It(this.element,r,this._getPopperConfig(u)),i.default(r).addClass("show"),"ontouchstart"in
document.documentElement&&i.default(document.body).children().on("mouseover",null,i.default.noop);var
d=function(){t.config.animation&&t._fixTransition();var
e=t._hoverState;t._hoverState=null,i.default(t.element).trigger(t.constructor.Event.SHOWN),"out"===e&&t._leave(null,t)};if(i.default(this.tip).hasClass("fade")){var
c=l.getTransitionDurationFromElement(this.tip);i.default(this.tip).one(l.TRANSITION_END,d).emulateTransitionEnd(c)}else
d()}},e.hide=function(t){var
e=this,n=this.getTipElement(),o=i.default.Event(this.constructor.Event.HIDE),r=function(){"show"!==e._hoverState&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute("aria-describedby"),i.default(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(i.default(this.element).trigger(o),!o.isDefaultPrevented()){if(i.default(n).removeClass("show"),"ontouchstart"in
document.documentElement&&i.default(document.body).children().off("mouseover",null,i.default.noop),this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1,i.default(this.tip).hasClass("fade")){var
a=l.getTransitionDurationFromElement(n);i.default(n).one(l.TRANSITION_END,r).emulateTransitionEnd(a)}else
r();this._hoverState=""}},e.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},e.isWithContent=function(){return
Boolean(this.getTitle())},e.addAttachmentClass=function(t){i.default(this.getTipElement()).addClass("bs-tooltip-"+t)},e.getTipElement=function(){return
this.tip=this.tip||i.default(this.config.template)[0],this.tip},e.setContent=function(){var
t=this.getTipElement();this.setElementContent(i.default(t.querySelectorAll(".tooltip-inner")),this.getTitle()),i.default(t).removeClass("fade
show")},e.setElementContent=function(t,e){"object"!=typeof
e||!e.nodeType&&!e.jquery?this.config.html?(this.config.sanitize&&(e=Vt(e,this.config.whiteList,this.config.sanitizeFn)),t.html(e)):t.text(e):this.config.html?i.default(e).parent().is(t)||t.empty().append(e):t.text(i.default(e).text())},e.getTitle=function(){var
t=this.element.getAttribute("data-original-title");return
t||(t="function"==typeof
this.config.title?this.config.title.call(this.element):this.config.title),t},e._getPopperConfig=function(t){var
e=this;return
a({},{placement:t,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:".arrow"},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return
e._handlePopperPlacementChange(t)}},this.config.popperConfig)},e._getOffset=function(){var
t=this,e={};return"function"==typeof
this.config.offset?e.fn=function(e){return
e.offsets=a({},e.offsets,t.config.offset(e.offsets,t.element)||{}),e}:e.offset=this.config.offset,e},e._getContainer=function(){return!1===this.config.container?document.body:l.isElement(this.config.container)?i.default(this.config.container):i.default(document).find(this.config.container)},e._getAttachment=function(t){return
$t[t.toUpperCase()]},e._setListeners=function(){var
t=this;this.config.trigger.split("
").forEach((function(e){if("click"===e)i.default(t.element).on(t.constructor.Event.CLICK,t.config.selector,(function(e){return
t.toggle(e)}));else if("manual"!==e){var
n="hover"===e?t.constructor.Event.MOUSEENTER:t.constructor.Event.FOCUSIN,o="hover"===e?t.constructor.Event.MOUSELEAVE:t.constructor.Event.FOCUSOUT;i.default(t.element).on(n,t.config.selector,(function(e){return
t._enter(e)})).on(o,t.config.selector,(function(e){return
t._leave(e)}))}})),this._hideModalHandler=function(){t.element&&t.hide()},i.default(this.element).closest(".modal").on("hide.bs.modal",this._hideModalHandler),this.config.selector?this.config=a({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},e._fixTitle=function(){var
t=typeof
this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},e._enter=function(t,e){var
n=this.constructor.DATA_KEY;(e=e||i.default(t.currentTarget).data(n))||(e=new
this.constructor(t.currentTarget,this._getDelegateConfig()),i.default(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?"focus":"hover"]=!0),i.default(e.getTipElement()).hasClass("show")||"show"===e._hoverState?e._hoverState="show":(clearTimeout(e._timeout),e._hoverState="show",e.config.delay&&e.config.delay.show?e._timeout=setTimeout((function(){"show"===e._hoverState&&e.show()}),e.config.delay.show):e.show())},e._leave=function(t,e){var
n=this.constructor.DATA_KEY;(e=e||i.default(t.currentTarget).data(n))||(e=new
this.constructor(t.currentTarget,this._getDelegateConfig()),i.default(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?"focus":"hover"]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState="out",e.config.delay&&e.config.delay.hide?e._timeout=setTimeout((function(){"out"===e._hoverState&&e.hide()}),e.config.delay.hide):e.hide())},e._isWithActiveTrigger=function(){for(var
t in
this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},e._getConfig=function(t){var
e=i.default(this.element).data();return
Object.keys(e).forEach((function(t){-1!==Kt.indexOf(t)&&delete
e[t]})),"number"==typeof(t=a({},this.constructor.Default,e,"object"==typeof
t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof
t.title&&(t.title=t.title.toString()),"number"==typeof
t.content&&(t.content=t.content.toString()),l.typeCheckConfig(Yt,t,this.constructor.DefaultType),t.sanitize&&(t.template=Vt(t.template,t.whiteList,t.sanitizeFn)),t},e._getDelegateConfig=function(){var
t={};if(this.config)for(var e in
this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return
t},e._cleanTipClass=function(){var
t=i.default(this.getTipElement()),e=t.attr("class").match(Xt);null!==e&&e.length&&t.removeClass(e.join(""))},e._handlePopperPlacementChange=function(t){this.tip=t.instance.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},e._fixTransition=function(){var
t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(i.default(t).removeClass("fade"),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},t._jQueryInterface=function(e){return
this.each((function(){var
n=i.default(this),o=n.data("bs.tooltip"),r="object"==typeof
e&&e;if((o||!/dispose|hide/.test(e))&&(o||(o=new
t(this,r),n.data("bs.tooltip",o)),"string"==typeof
e)){if("undefined"==typeof o[e])throw new TypeError('No
method named
"'+e+'"');o[e]()}}))},r(t,null,[{key:"VERSION",get:function(){return"4.5.3"}},{key:"Default",get:function(){return
Jt}},{key:"NAME",get:function(){return
Yt}},{key:"DATA_KEY",get:function(){return"bs.tooltip"}},{key:"Event",get:function(){return
Zt}},{key:"EVENT_KEY",get:function(){return".bs.tooltip"}},{key:"DefaultType",get:function(){return
Gt}}]),t}();i.default.fn[Yt]=te._jQueryInterface,i.default.fn[Yt].Constructor=te,i.default.fn[Yt].noConflict=function(){return
i.default.fn[Yt]=zt,te._jQueryInterface};var
ee="popover",ne=i.default.fn[ee],ie=new
RegExp("(^|\\s)bs-popover\\S+","g"),oe=a({},te.Default,{placement:"right",trigger:"click",content:"",template:'<div
class="popover" role="tooltip"><div
class="arrow"></div><h3
class="popover-header"></h3><div
class="popover-body"></div></div>'}),re=a({},te.DefaultType,{content:"(string|element|function)"}),ae={HIDE:"hide.bs.popover",HIDDEN:"hidden.bs.popover",SHOW:"show.bs.popover",SHOWN:"shown.bs.popover",INSERTED:"inserted.bs.popover",CLICK:"click.bs.popover",FOCUSIN:"focusin.bs.popover",FOCUSOUT:"focusout.bs.popover",MOUSEENTER:"mouseenter.bs.popover",MOUSELEAVE:"mouseleave.bs.popover"},se=function(t){var
e,n;function o(){return
t.apply(this,arguments)||this}n=t,(e=o).prototype=Object.create(n.prototype),e.prototype.constructor=e,e.__proto__=n;var
a=o.prototype;return a.isWithContent=function(){return
this.getTitle()||this._getContent()},a.addAttachmentClass=function(t){i.default(this.getTipElement()).addClass("bs-popover-"+t)},a.getTipElement=function(){return
this.tip=this.tip||i.default(this.config.template)[0],this.tip},a.setContent=function(){var
t=i.default(this.getTipElement());this.setElementContent(t.find(".popover-header"),this.getTitle());var
e=this._getContent();"function"==typeof
e&&(e=e.call(this.element)),this.setElementContent(t.find(".popover-body"),e),t.removeClass("fade
show")},a._getContent=function(){return
this.element.getAttribute("data-content")||this.config.content},a._cleanTipClass=function(){var
t=i.default(this.getTipElement()),e=t.attr("class").match(ie);null!==e&&e.length>0&&t.removeClass(e.join(""))},o._jQueryInterface=function(t){return
this.each((function(){var
e=i.default(this).data("bs.popover"),n="object"==typeof
t?t:null;if((e||!/dispose|hide/.test(t))&&(e||(e=new
o(this,n),i.default(this).data("bs.popover",e)),"string"==typeof
t)){if("undefined"==typeof e[t])throw new TypeError('No
method named
"'+t+'"');e[t]()}}))},r(o,null,[{key:"VERSION",get:function(){return"4.5.3"}},{key:"Default",get:function(){return
oe}},{key:"NAME",get:function(){return
ee}},{key:"DATA_KEY",get:function(){return"bs.popover"}},{key:"Event",get:function(){return
ae}},{key:"EVENT_KEY",get:function(){return".bs.popover"}},{key:"DefaultType",get:function(){return
re}}]),o}(te);i.default.fn[ee]=se._jQueryInterface,i.default.fn[ee].Constructor=se,i.default.fn[ee].noConflict=function(){return
i.default.fn[ee]=ne,se._jQueryInterface};var
le="scrollspy",ue=i.default.fn[le],fe={offset:10,method:"auto",target:""},de={offset:"number",method:"string",target:"(string|element)"},ce=function(){function
t(t,e){var
n=this;this._element=t,this._scrollElement="BODY"===t.tagName?window:t,this._config=this._getConfig(e),this._selector=this._config.target+"
.nav-link,"+this._config.target+"
.list-group-item,"+this._config.target+"
.dropdown-item",this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,i.default(this._scrollElement).on("scroll.bs.scrollspy",(function(t){return
n._process(t)})),this.refresh(),this._process()}var e=t.prototype;return
e.refresh=function(){var
t=this,e=this._scrollElement===this._scrollElement.window?"offset":"position",n="auto"===this._config.method?e:this._config.method,o="position"===n?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),[].slice.call(document.querySelectorAll(this._selector)).map((function(t){var
e,r=l.getSelectorFromElement(t);if(r&&(e=document.querySelector(r)),e){var
a=e.getBoundingClientRect();if(a.width||a.height)return[i.default(e)[n]().top+o,r]}return
null})).filter((function(t){return t})).sort((function(t,e){return
t[0]-e[0]})).forEach((function(e){t._offsets.push(e[0]),t._targets.push(e[1])}))},e.dispose=function(){i.default.removeData(this._element,"bs.scrollspy"),i.default(this._scrollElement).off(".bs.scrollspy"),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},e._getConfig=function(t){if("string"!=typeof(t=a({},fe,"object"==typeof
t&&t?t:{})).target&&l.isElement(t.target)){var
e=i.default(t.target).attr("id");e||(e=l.getUID(le),i.default(t.target).attr("id",e)),t.target="#"+e}return
l.typeCheckConfig(le,t,de),t},e._getScrollTop=function(){return
this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},e._getScrollHeight=function(){return
this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},e._getOffsetHeight=function(){return
this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},e._process=function(){var
t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=n){var
i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t<this._offsets[0]&&this._offsets[0]>0)return
this._activeTarget=null,void this._clear();for(var
o=this._offsets.length;o--;){this._activeTarget!==this._targets[o]&&t>=this._offsets[o]&&("undefined"==typeof
this._offsets[o+1]||t<this._offsets[o+1])&&this._activate(this._targets[o])}}},e._activate=function(t){this._activeTarget=t,this._clear();var
e=this._selector.split(",").map((function(e){return
e+'[data-target="'+t+'"],'+e+'[href="'+t+'"]'})),n=i.default([].slice.call(document.querySelectorAll(e.join(","))));n.hasClass("dropdown-item")?(n.closest(".dropdown").find(".dropdown-toggle").addClass("active"),n.addClass("active")):(n.addClass("active"),n.parents(".nav,
.list-group").prev(".nav-link,
.list-group-item").addClass("active"),n.parents(".nav,
.list-group").prev(".nav-item").children(".nav-link").addClass("active")),i.default(this._scrollElement).trigger("activate.bs.scrollspy",{relatedTarget:t})},e._clear=function(){[].slice.call(document.querySelectorAll(this._selector)).filter((function(t){return
t.classList.contains("active")})).forEach((function(t){return
t.classList.remove("active")}))},t._jQueryInterface=function(e){return
this.each((function(){var
n=i.default(this).data("bs.scrollspy");if(n||(n=new
t(this,"object"==typeof
e&&e),i.default(this).data("bs.scrollspy",n)),"string"==typeof
e){if("undefined"==typeof n[e])throw new TypeError('No
method named
"'+e+'"');n[e]()}}))},r(t,null,[{key:"VERSION",get:function(){return"4.5.3"}},{key:"Default",get:function(){return
fe}}]),t}();i.default(window).on("load.bs.scrollspy.data-api",(function(){for(var
t=[].slice.call(document.querySelectorAll('[data-spy="scroll"]')),e=t.length;e--;){var
n=i.default(t[e]);ce._jQueryInterface.call(n,n.data())}})),i.default.fn[le]=ce._jQueryInterface,i.default.fn[le].Constructor=ce,i.default.fn[le].noConflict=function(){return
i.default.fn[le]=ue,ce._jQueryInterface};var
he=i.default.fn.tab,pe=function(){function t(t){this._element=t}var
e=t.prototype;return e.show=function(){var
t=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&i.default(this._element).hasClass("active")||i.default(this._element).hasClass("disabled"))){var
e,n,o=i.default(this._element).closest(".nav,
.list-group")[0],r=l.getSelectorFromElement(this._element);if(o){var
a="UL"===o.nodeName||"OL"===o.nodeName?"> li
>
.active":".active";n=(n=i.default.makeArray(i.default(o).find(a)))[n.length-1]}var
s=i.default.Event("hide.bs.tab",{relatedTarget:this._element}),u=i.default.Event("show.bs.tab",{relatedTarget:n});if(n&&i.default(n).trigger(s),i.default(this._element).trigger(u),!u.isDefaultPrevented()&&!s.isDefaultPrevented()){r&&(e=document.querySelector(r)),this._activate(this._element,o);var
f=function(){var
e=i.default.Event("hidden.bs.tab",{relatedTarget:t._element}),o=i.default.Event("shown.bs.tab",{relatedTarget:n});i.default(n).trigger(e),i.default(t._element).trigger(o)};e?this._activate(e,e.parentNode,f):f()}}},e.dispose=function(){i.default.removeData(this._element,"bs.tab"),this._element=null},e._activate=function(t,e,n){var
o=this,r=(!e||"UL"!==e.nodeName&&"OL"!==e.nodeName?i.default(e).children(".active"):i.default(e).find(">
li >
.active"))[0],a=n&&r&&i.default(r).hasClass("fade"),s=function(){return
o._transitionComplete(t,r,n)};if(r&&a){var
u=l.getTransitionDurationFromElement(r);i.default(r).removeClass("show").one(l.TRANSITION_END,s).emulateTransitionEnd(u)}else
s()},e._transitionComplete=function(t,e,n){if(e){i.default(e).removeClass("active");var
o=i.default(e.parentNode).find("> .dropdown-menu
.active")[0];o&&i.default(o).removeClass("active"),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!1)}if(i.default(t).addClass("active"),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),l.reflow(t),t.classList.contains("fade")&&t.classList.add("show"),t.parentNode&&i.default(t.parentNode).hasClass("dropdown-menu")){var
r=i.default(t).closest(".dropdown")[0];if(r){var
a=[].slice.call(r.querySelectorAll(".dropdown-toggle"));i.default(a).addClass("active")}t.setAttribute("aria-expanded",!0)}n&&n()},t._jQueryInterface=function(e){return
this.each((function(){var
n=i.default(this),o=n.data("bs.tab");if(o||(o=new
t(this),n.data("bs.tab",o)),"string"==typeof
e){if("undefined"==typeof o[e])throw new TypeError('No
method named
"'+e+'"');o[e]()}}))},r(t,null,[{key:"VERSION",get:function(){return"4.5.3"}}]),t}();i.default(document).on("click.bs.tab.data-api",'[data-toggle="tab"],
[data-toggle="pill"],
[data-toggle="list"]',(function(t){t.preventDefault(),pe._jQueryInterface.call(i.default(this),"show")})),i.default.fn.tab=pe._jQueryInterface,i.default.fn.tab.Constructor=pe,i.default.fn.tab.noConflict=function(){return
i.default.fn.tab=he,pe._jQueryInterface};var
me=i.default.fn.toast,ge={animation:"boolean",autohide:"boolean",delay:"number"},ve={animation:!0,autohide:!0,delay:500},_e=function(){function
t(t,e){this._element=t,this._config=this._getConfig(e),this._timeout=null,this._setListeners()}var
e=t.prototype;return e.show=function(){var
t=this,e=i.default.Event("show.bs.toast");if(i.default(this._element).trigger(e),!e.isDefaultPrevented()){this._clearTimeout(),this._config.animation&&this._element.classList.add("fade");var
n=function(){t._element.classList.remove("showing"),t._element.classList.add("show"),i.default(t._element).trigger("shown.bs.toast"),t._config.autohide&&(t._timeout=setTimeout((function(){t.hide()}),t._config.delay))};if(this._element.classList.remove("hide"),l.reflow(this._element),this._element.classList.add("showing"),this._config.animation){var
o=l.getTransitionDurationFromElement(this._element);i.default(this._element).one(l.TRANSITION_END,n).emulateTransitionEnd(o)}else
n()}},e.hide=function(){if(this._element.classList.contains("show")){var
t=i.default.Event("hide.bs.toast");i.default(this._element).trigger(t),t.isDefaultPrevented()||this._close()}},e.dispose=function(){this._clearTimeout(),this._element.classList.contains("show")&&this._element.classList.remove("show"),i.default(this._element).off("click.dismiss.bs.toast"),i.default.removeData(this._element,"bs.toast"),this._element=null,this._config=null},e._getConfig=function(t){return
t=a({},ve,i.default(this._element).data(),"object"==typeof
t&&t?t:{}),l.typeCheckConfig("toast",t,this.constructor.DefaultType),t},e._setListeners=function(){var
t=this;i.default(this._element).on("click.dismiss.bs.toast",'[data-dismiss="toast"]',(function(){return
t.hide()}))},e._close=function(){var
t=this,e=function(){t._element.classList.add("hide"),i.default(t._element).trigger("hidden.bs.toast")};if(this._element.classList.remove("show"),this._config.animation){var
n=l.getTransitionDurationFromElement(this._element);i.default(this._element).one(l.TRANSITION_END,e).emulateTransitionEnd(n)}else
e()},e._clearTimeout=function(){clearTimeout(this._timeout),this._timeout=null},t._jQueryInterface=function(e){return
this.each((function(){var
n=i.default(this),o=n.data("bs.toast");if(o||(o=new
t(this,"object"==typeof
e&&e),n.data("bs.toast",o)),"string"==typeof
e){if("undefined"==typeof o[e])throw new TypeError('No
method named
"'+e+'"');o[e](this)}}))},r(t,null,[{key:"VERSION",get:function(){return"4.5.3"}},{key:"DefaultType",get:function(){return
ge}},{key:"Default",get:function(){return
ve}}]),t}();i.default.fn.toast=_e._jQueryInterface,i.default.fn.toast.Constructor=_e,i.default.fn.toast.noConflict=function(){return
i.default.fn.toast=me,_e._jQueryInterface},t.Alert=d,t.Button=h,t.Carousel=y,t.Collapse=S,t.Dropdown=Ft,t.Modal=Bt,t.Popover=se,t.Scrollspy=ce,t.Tab=pe,t.Toast=_e,t.Tooltip=te,t.Util=l,Object.defineProperty(t,"__esModule",{value:!0})}));
//#
sourceMappingURL=bootstrap.bundle.min.js.mapPK,�[�#o,,bootstrapv45/js/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK,�[�#o,,css/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK,�[�o�+!�!�fullCalendar/main.cssnu�[���
/* classes attached to <body> */

.fc-not-allowed,
.fc-not-allowed .fc-event { /* override events' custom cursors */
  cursor: not-allowed;
}

.fc-unselectable {
  -webkit-user-select: none;
     -moz-user-select: none;
      -ms-user-select: none;
          user-select: none;
  -webkit-touch-callout: none;
  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
.fc {
  /* layout of immediate children */
  display: flex;
  flex-direction: column;

  font-size: 1em
}
.fc,
  .fc *,
  .fc *:before,
  .fc *:after {
    box-sizing: border-box;
  }
.fc table {
    border-collapse: collapse;
    border-spacing: 0;
    font-size: 1em; /* normalize cross-browser */
  }
.fc th {
    text-align: center;
  }
.fc th,
  .fc td {
    vertical-align: top;
    padding: 0;
  }
.fc a[data-navlink] {
    cursor: pointer;
  }
.fc a[data-navlink]:hover {
    text-decoration: underline;
  }
.fc-direction-ltr {
  direction: ltr;
  text-align: left;
}
.fc-direction-rtl {
  direction: rtl;
  text-align: right;
}
.fc-theme-standard td,
  .fc-theme-standard th {
    border: 1px solid #ddd;
    border: 1px solid var(--fc-border-color, #ddd);
  }
/* for FF, which doesn't expand a 100% div within a table cell. use
absolute positioning */
/* inner-wrappers are responsible for being absolute */
/* TODO: best place for this? */
.fc-liquid-hack td,
  .fc-liquid-hack th {
    position: relative;
  }

@font-face {
  font-family: 'fcicons';
  src:
url("data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBfAAAAC8AAAAYGNtYXAXVtKNAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5ZgYydxIAAAF4AAAFNGhlYWQUJ7cIAAAGrAAAADZoaGVhB20DzAAABuQAAAAkaG10eCIABhQAAAcIAAAALGxvY2ED4AU6AAAHNAAAABhtYXhwAA8AjAAAB0wAAAAgbmFtZXsr690AAAdsAAABhnBvc3QAAwAAAAAI9AAAACAAAwPAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpBgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6Qb//f//AAAAAAAg6QD//f//AAH/4xcEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAWIAjQKeAskAEwAAJSc3NjQnJiIHAQYUFwEWMjc2NCcCnuLiDQ0MJAz/AA0NAQAMJAwNDcni4gwjDQwM/wANIwz/AA0NDCMNAAAAAQFiAI0CngLJABMAACUBNjQnASYiBwYUHwEHBhQXFjI3AZ4BAA0N/wAMJAwNDeLiDQ0MJAyNAQAMIw0BAAwMDSMM4uINIwwNDQAAAAIA4gC3Ax4CngATACcAACUnNzY0JyYiDwEGFB8BFjI3NjQnISc3NjQnJiIPAQYUHwEWMjc2NCcB87e3DQ0MIw3VDQ3VDSMMDQ0BK7e3DQ0MJAzVDQ3VDCQMDQ3zuLcMJAwNDdUNIwzWDAwNIwy4twwkDA0N1Q0jDNYMDA0jDAAAAgDiALcDHgKeABMAJwAAJTc2NC8BJiIHBhQfAQcGFBcWMjchNzY0LwEmIgcGFB8BBwYUFxYyNwJJ1Q0N1Q0jDA0Nt7cNDQwjDf7V1Q0N1QwkDA0Nt7cNDQwkDLfWDCMN1Q0NDCQMt7gMIw0MDNYMIw3VDQ0MJAy3uAwjDQwMAAADAFUAAAOrA1UAMwBoAHcAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMhMjY1NCYjISIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAAVYRGRkR/qoRGRkRA1UFBAUOCQkVDAsZDf2rDRkLDBUJCA4FBQUFBQUOCQgVDAsZDQJVDRkLDBUJCQ4FBAVVAgECBQMCBwQECAX9qwQJAwQHAwMFAQICAgIBBQMDBwQDCQQCVQUIBAQHAgMFAgEC/oAZEhEZGRESGQAAAAADAFUAAAOrA1UAMwBoAIkAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMzFRQWMzI2PQEzMjY1NCYrATU0JiMiBh0BIyIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAgBkSEhmAERkZEYAZEhIZgBEZGREDVQUEBQ4JCRUMCxkN/asNGQsMFQkIDgUFBQUFBQ4JCBUMCxkNAlUNGQsMFQkJDgUEBVUCAQIFAwIHBAQIBf2rBAkDBAcDAwUBAgICAgEFAwMHBAMJBAJVBQgEBAcCAwUCAQL+gIASGRkSgBkSERmAEhkZEoAZERIZAAABAOIAjQMeAskAIAAAExcHBhQXFjI/ARcWMjc2NC8BNzY0JyYiDwEnJiIHBhQX4uLiDQ0MJAzi4gwkDA0N4uINDQwkDOLiDCQMDQ0CjeLiDSMMDQ3h4Q0NDCMN4uIMIw0MDOLiDAwNIwwAAAABAAAAAQAAa5n0y18PPPUACwQAAAAAANivOVsAAAAA2K85WwAAAAADqwNVAAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAOrAAEAAAAAAAAAAAAAAAAAAAALBAAAAAAAAAAAAAAAAgAAAAQAAWIEAAFiBAAA4gQAAOIEAABVBAAAVQQAAOIAAAAAAAoAFAAeAEQAagCqAOoBngJkApoAAQAAAAsAigADAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAcAAAABAAAAAAACAAcAYAABAAAAAAADAAcANgABAAAAAAAEAAcAdQABAAAAAAAFAAsAFQABAAAAAAAGAAcASwABAAAAAAAKABoAigADAAEECQABAA4ABwADAAEECQACAA4AZwADAAEECQADAA4APQADAAEECQAEAA4AfAADAAEECQAFABYAIAADAAEECQAGAA4AUgADAAEECQAKADQApGZjaWNvbnMAZgBjAGkAYwBvAG4Ac1ZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGZjaWNvbnMAZgBjAGkAYwBvAG4Ac2ZjaWNvbnMAZgBjAGkAYwBvAG4Ac1JlZ3VsYXIAUgBlAGcAdQBsAGEAcmZjaWNvbnMAZgBjAGkAYwBvAG4Ac0ZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=")
format('truetype');
  font-weight: normal;
  font-style: normal;
}

.fc-icon {
  /* added for fc */
  display: inline-block;
  width: 1em;
  height: 1em;
  text-align: center;
  -webkit-user-select: none;
     -moz-user-select: none;
      -ms-user-select: none;
          user-select: none;

  /* use !important to prevent issues with browser extensions that change
fonts */
  font-family: 'fcicons' !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;
}

.fc-icon-chevron-left:before {
  content: "\e900";
}

.fc-icon-chevron-right:before {
  content: "\e901";
}

.fc-icon-chevrons-left:before {
  content: "\e902";
}

.fc-icon-chevrons-right:before {
  content: "\e903";
}

.fc-icon-minus-square:before {
  content: "\e904";
}

.fc-icon-plus-square:before {
  content: "\e905";
}

.fc-icon-x:before {
  content: "\e906";
}
/*
Lots taken from Flatly (MIT): https://bootswatch.com/4/flatly/bootstrap.css

These styles only apply when the standard-theme is activated.
When it's NOT activated, the fc-button classes won't even be in
the DOM.
*/
.fc {

  /* reset */

}
.fc .fc-button {
    border-radius: 0;
    overflow: visible;
    text-transform: none;
    margin: 0;
    font-family: inherit;
    font-size: inherit;
    line-height: inherit;
  }
.fc .fc-button:focus {
    outline: 1px dotted;
    outline: 5px auto -webkit-focus-ring-color;
  }
.fc .fc-button {
    -webkit-appearance: button;
  }
.fc .fc-button:not(:disabled) {
    cursor: pointer;
  }
.fc .fc-button::-moz-focus-inner {
    padding: 0;
    border-style: none;
  }
.fc {

  /* theme */

}
.fc .fc-button {
    display: inline-block;
    font-weight: 400;
    text-align: center;
    vertical-align: middle;
    -webkit-user-select: none;
       -moz-user-select: none;
        -ms-user-select: none;
            user-select: none;
    background-color: transparent;
    border: 1px solid transparent;
    padding: 0.4em 0.65em;
    font-size: 1em;
    line-height: 1.5;
    border-radius: 0.25em;
  }
.fc .fc-button:hover {
    text-decoration: none;
  }
.fc .fc-button:focus {
    outline: 0;
    box-shadow: 0 0 0 0.2rem rgba(44, 62, 80, 0.25);
  }
.fc .fc-button:disabled {
    opacity: 0.65;
  }
.fc {

  /* "primary" coloring */

}
.fc .fc-button-primary {
    color: #fff;
    color: var(--fc-button-text-color, #fff);
    background-color: #2C3E50;
    background-color: var(--fc-button-bg-color, #2C3E50);
    border-color: #2C3E50;
    border-color: var(--fc-button-border-color, #2C3E50);
  }
.fc .fc-button-primary:hover {
    color: #fff;
    color: var(--fc-button-text-color, #fff);
    background-color: #1e2b37;
    background-color: var(--fc-button-hover-bg-color, #1e2b37);
    border-color: #1a252f;
    border-color: var(--fc-button-hover-border-color, #1a252f);
  }
.fc .fc-button-primary:disabled { /* not DRY */
    color: #fff;
    color: var(--fc-button-text-color, #fff);
    background-color: #2C3E50;
    background-color: var(--fc-button-bg-color, #2C3E50);
    border-color: #2C3E50;
    border-color: var(--fc-button-border-color, #2C3E50); /* overrides
:hover */
  }
.fc .fc-button-primary:focus {
    box-shadow: 0 0 0 0.2rem rgba(76, 91, 106, 0.5);
  }
.fc .fc-button-primary:not(:disabled):active,
  .fc .fc-button-primary:not(:disabled).fc-button-active {
    color: #fff;
    color: var(--fc-button-text-color, #fff);
    background-color: #1a252f;
    background-color: var(--fc-button-active-bg-color, #1a252f);
    border-color: #151e27;
    border-color: var(--fc-button-active-border-color, #151e27);
  }
.fc .fc-button-primary:not(:disabled):active:focus,
  .fc .fc-button-primary:not(:disabled).fc-button-active:focus {
    box-shadow: 0 0 0 0.2rem rgba(76, 91, 106, 0.5);
  }
.fc {

  /* icons within buttons */

}
.fc .fc-button .fc-icon {
    vertical-align: middle;
    font-size: 1.5em; /* bump up the size (but don't make it bigger
than line-height of button, which is 1.5em also) */
  }
.fc .fc-button-group {
    position: relative;
    display: inline-flex;
    vertical-align: middle;
  }
.fc .fc-button-group > .fc-button {
    position: relative;
    flex: 1 1 auto;
  }
.fc .fc-button-group > .fc-button:hover {
    z-index: 1;
  }
.fc .fc-button-group > .fc-button:focus,
  .fc .fc-button-group > .fc-button:active,
  .fc .fc-button-group > .fc-button.fc-button-active {
    z-index: 1;
  }
.fc-direction-ltr .fc-button-group > .fc-button:not(:first-child) {
    margin-left: -1px;
    border-top-left-radius: 0;
    border-bottom-left-radius: 0;
  }
.fc-direction-ltr .fc-button-group > .fc-button:not(:last-child) {
    border-top-right-radius: 0;
    border-bottom-right-radius: 0;
  }
.fc-direction-rtl .fc-button-group > .fc-button:not(:first-child) {
    margin-right: -1px;
    border-top-right-radius: 0;
    border-bottom-right-radius: 0;
  }
.fc-direction-rtl .fc-button-group > .fc-button:not(:last-child) {
    border-top-left-radius: 0;
    border-bottom-left-radius: 0;
  }
.fc .fc-toolbar {
    display: flex;
    justify-content: space-between;
    align-items: center;
  }
.fc .fc-toolbar.fc-header-toolbar {
    margin-bottom: 1.5em;
  }
.fc .fc-toolbar.fc-footer-toolbar {
    margin-top: 1.5em;
  }
.fc .fc-toolbar-title {
    font-size: 1.75em;
    margin: 0;
  }
.fc-direction-ltr .fc-toolbar > * > :not(:first-child) {
    margin-left: .75em; /* space between */
  }
.fc-direction-rtl .fc-toolbar > * > :not(:first-child) {
    margin-right: .75em; /* space between */
  }
.fc-direction-rtl .fc-toolbar-ltr { /* when the toolbar-chunk positioning
system is explicitly left-to-right */
    flex-direction: row-reverse;
  }
.fc .fc-scroller {
    -webkit-overflow-scrolling: touch;
    position: relative; /* for abs-positioned elements within */
  }
.fc .fc-scroller-liquid {
    height: 100%;
  }
.fc .fc-scroller-liquid-absolute {
    position: absolute;
    top: 0;
    right: 0;
    left: 0;
    bottom: 0;
  }
.fc .fc-scroller-harness {
    position: relative;
    overflow: hidden;
    direction: ltr;
      /* hack for chrome computing the scroller's right/left wrong for
rtl. undone below... */
      /* TODO: demonstrate in codepen */
  }
.fc .fc-scroller-harness-liquid {
    height: 100%;
  }
.fc-direction-rtl .fc-scroller-harness > .fc-scroller { /* undo above
hack */
    direction: rtl;
  }
.fc-theme-standard .fc-scrollgrid {
    border: 1px solid #ddd;
    border: 1px solid var(--fc-border-color, #ddd); /* bootstrap does this.
match */
  }
.fc .fc-scrollgrid,
    .fc .fc-scrollgrid table { /* all tables (self included) */
      width: 100%; /* because tables don't normally do this */
      table-layout: fixed;
    }
.fc .fc-scrollgrid table { /* inner tables */
      border-top-style: hidden;
      border-left-style: hidden;
      border-right-style: hidden;
    }
.fc .fc-scrollgrid {

    border-collapse: separate;
    border-right-width: 0;
    border-bottom-width: 0;

  }
.fc .fc-scrollgrid-liquid {
    height: 100%;
  }
.fc .fc-scrollgrid-section { /* a <tr> */
    height: 1px /* better than 0, for firefox */

  }
.fc .fc-scrollgrid-section > td {
      height: 1px; /* needs a height so inner div within grow. better than
0, for firefox */
    }
.fc .fc-scrollgrid-section table {
      height: 1px;
        /* for most browsers, if a height isn't set on the table,
can't do liquid-height within cells */
        /* serves as a min-height. harmless */
    }
.fc .fc-scrollgrid-section-liquid {
    height: auto

  }
.fc .fc-scrollgrid-section-liquid > td {
      height: 100%; /* better than `auto`, for firefox */
    }
.fc .fc-scrollgrid-section > * {
    border-top-width: 0;
    border-left-width: 0;
  }
.fc .fc-scrollgrid-section-header > *,
  .fc .fc-scrollgrid-section-footer > * {
    border-bottom-width: 0;
  }
.fc .fc-scrollgrid-section-body table,
  .fc .fc-scrollgrid-section-footer table {
    border-bottom-style: hidden; /* head keeps its bottom border tho */
  }
.fc {

  /* stickiness */

}
.fc .fc-scrollgrid-section-sticky > * {
    background: #fff;
    background: var(--fc-page-bg-color, #fff);
    position: -webkit-sticky;
    position: sticky;
    z-index: 2; /* TODO: var */
    /* TODO: box-shadow when sticking */
  }
.fc .fc-scrollgrid-section-header.fc-scrollgrid-section-sticky > * {
    top: 0; /* because border-sharing causes a gap at the top */
      /* TODO: give safari -1. has bug */
  }
.fc .fc-scrollgrid-section-footer.fc-scrollgrid-section-sticky > * {
    bottom: 0; /* known bug: bottom-stickiness doesn't work in safari
*/
  }
.fc .fc-scrollgrid-sticky-shim { /* for horizontal scrollbar */
    height: 1px; /* needs height to create scrollbars */
    margin-bottom: -1px;
  }
.fc-sticky { /* no .fc wrap because used as child of body */
  position: -webkit-sticky;
  position: sticky;
}
.fc .fc-view-harness {
    flex-grow: 1; /* because this harness is WITHIN the .fc's flexbox
*/
    position: relative;
  }
.fc {

  /* when the harness controls the height, make the view liquid */

}
.fc .fc-view-harness-active > .fc-view {
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
  }
.fc .fc-col-header-cell-cushion {
    display: inline-block; /* x-browser for when sticky (when multi-tier
header) */
    padding: 2px 4px;
  }
.fc .fc-bg-event,
  .fc .fc-non-business,
  .fc .fc-highlight {
    /* will always have a harness with position:relative/absolute, so
absolutely expand */
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
  }
.fc .fc-non-business {
    background: rgba(215, 215, 215, 0.3);
    background: var(--fc-non-business-color, rgba(215, 215, 215, 0.3));
  }
.fc .fc-bg-event {
    background: rgb(143, 223, 130);
    background: var(--fc-bg-event-color, rgb(143, 223, 130));
    opacity: 0.3;
    opacity: var(--fc-bg-event-opacity, 0.3)
  }
.fc .fc-bg-event .fc-event-title {
      margin: .5em;
      font-size: .85em;
      font-size: var(--fc-small-font-size, .85em);
      font-style: italic;
    }
.fc .fc-highlight {
    background: rgba(188, 232, 241, 0.3);
    background: var(--fc-highlight-color, rgba(188, 232, 241, 0.3));
  }
.fc .fc-cell-shaded,
  .fc .fc-day-disabled {
    background: rgba(208, 208, 208, 0.3);
    background: var(--fc-neutral-bg-color, rgba(208, 208, 208, 0.3));
  }
/* link resets */
/*
----------------------------------------------------------------------------------------------------
*/
a.fc-event,
a.fc-event:hover {
  text-decoration: none;
}
/* cursor */
.fc-event[href],
.fc-event.fc-event-draggable {
  cursor: pointer;
}
/* event text content */
/*
----------------------------------------------------------------------------------------------------
*/
.fc-event .fc-event-main {
    position: relative;
    z-index: 2;
  }
/* dragging */
/*
----------------------------------------------------------------------------------------------------
*/
.fc-event-dragging:not(.fc-event-selected) { /* MOUSE */
    opacity: 0.75;
  }
.fc-event-dragging.fc-event-selected { /* TOUCH */
    box-shadow: 0 2px 7px rgba(0, 0, 0, 0.3);
  }
/* resizing */
/*
----------------------------------------------------------------------------------------------------
*/
/* (subclasses should hone positioning for touch and non-touch) */
.fc-event .fc-event-resizer {
    display: none;
    position: absolute;
    z-index: 4;
  }
.fc-event:hover, /* MOUSE */
.fc-event-selected { /* TOUCH */

}
.fc-event:hover .fc-event-resizer, .fc-event-selected .fc-event-resizer {
    display: block;
  }
.fc-event-selected .fc-event-resizer {
    border-radius: 4px;
    border-radius: calc(var(--fc-event-resizer-dot-total-width, 8px) / 2);
    border-width: 1px;
    border-width: var(--fc-event-resizer-dot-border-width, 1px);
    width: 8px;
    width: var(--fc-event-resizer-dot-total-width, 8px);
    height: 8px;
    height: var(--fc-event-resizer-dot-total-width, 8px);
    border-style: solid;
    border-color: inherit;
    background: #fff;
    background: var(--fc-page-bg-color, #fff)

    /* expand hit area */

  }
.fc-event-selected .fc-event-resizer:before {
      content: '';
      position: absolute;
      top: -20px;
      left: -20px;
      right: -20px;
      bottom: -20px;
    }
/* selecting (always TOUCH) */
/*
----------------------------------------------------------------------------------------------------
*/
.fc-event-selected {
  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2)

  /* expand hit area (subclasses should expand) */

}
.fc-event-selected:before {
    content: "";
    position: absolute;
    z-index: 3;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
  }
.fc-event-selected {

  /* dimmer effect */

}
.fc-event-selected:after {
    content: "";
    background: rgba(0, 0, 0, 0.25);
    background: var(--fc-event-selected-overlay-color, rgba(0, 0, 0,
0.25));
    position: absolute;
    z-index: 1;

    /* assume there's a border on all sides. overcome it. */
    /* sometimes there's NOT a border, in which case the dimmer will
go over */
    /* an adjacent border, which looks fine. */
    top: -1px;
    left: -1px;
    right: -1px;
    bottom: -1px;
  }
/*
A HORIZONTAL event
*/
.fc-h-event { /* allowed to be top-level */
  display: block;
  border: 1px solid #3788d8;
  border: 1px solid var(--fc-event-border-color, #3788d8);
  background-color: #3788d8;
  background-color: var(--fc-event-bg-color, #3788d8)

}
.fc-h-event .fc-event-main {
    color: #fff;
    color: var(--fc-event-text-color, #fff);
  }
.fc-h-event .fc-event-main-frame {
    display: flex; /* for make fc-event-title-container expand */
  }
.fc-h-event .fc-event-time {
    max-width: 100%; /* clip overflow on this element */
    overflow: hidden;
  }
.fc-h-event .fc-event-title-container { /* serves as a container for the
sticky cushion */
    flex-grow: 1;
    flex-shrink: 1;
    min-width: 0; /* important for allowing to shrink all the way */
  }
.fc-h-event .fc-event-title {
    display: inline-block; /* need this to be sticky cross-browser */
    vertical-align: top; /* for not messing up line-height */
    left: 0;  /* for sticky */
    right: 0; /* for sticky */
    max-width: 100%; /* clip overflow on this element */
    overflow: hidden;
  }
.fc-h-event.fc-event-selected:before {
    /* expand hit area */
    top: -10px;
    bottom: -10px;
  }
/* adjust border and border-radius (if there is any) for non-start/end */
.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-start),
.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-end) {
  border-top-left-radius: 0;
  border-bottom-left-radius: 0;
  border-left-width: 0;
}
.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-end),
.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-start) {
  border-top-right-radius: 0;
  border-bottom-right-radius: 0;
  border-right-width: 0;
}
/* resizers */
.fc-h-event:not(.fc-event-selected) .fc-event-resizer {
  top: 0;
  bottom: 0;
  width: 8px;
  width: var(--fc-event-resizer-thickness, 8px);
}
.fc-direction-ltr .fc-h-event:not(.fc-event-selected)
.fc-event-resizer-start,
.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end
{
  cursor: w-resize;
  left: -4px;
  left: calc(var(--fc-event-resizer-thickness, 8px) / -2);
}
.fc-direction-ltr .fc-h-event:not(.fc-event-selected)
.fc-event-resizer-end,
.fc-direction-rtl .fc-h-event:not(.fc-event-selected)
.fc-event-resizer-start {
  cursor: e-resize;
  right: -4px;
  right: calc(var(--fc-event-resizer-thickness, 8px) / -2);
}
/* resizers for TOUCH */
.fc-h-event.fc-event-selected .fc-event-resizer {
  top: 50%;
  margin-top: -4px;
  margin-top: calc(var(--fc-event-resizer-dot-total-width, 8px) / -2);
}
.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-start,
.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-end {
  left: -4px;
  left: calc(var(--fc-event-resizer-dot-total-width, 8px) / -2);
}
.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-end,
.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-start {
  right: -4px;
  right: calc(var(--fc-event-resizer-dot-total-width, 8px) / -2);
}


:root {
  --fc-daygrid-event-dot-width: 8px;
}
.fc .fc-popover {
    position: fixed;
    top: 0; /* for when not positioned yet */
    box-shadow: 0 2px 6px rgba(0,0,0,.15);
  }
.fc .fc-popover-header {
    display: flex;
    flex-direction: row;
    justify-content: space-between;
    align-items: center;
    padding: 3px 4px;
  }
.fc .fc-popover-title {
    margin: 0 2px;
  }
.fc .fc-popover-close {
    cursor: pointer;
    opacity: 0.65;
    font-size: 1.1em;
  }
.fc-theme-standard .fc-popover {
    border: 1px solid #ddd;
    border: 1px solid var(--fc-border-color, #ddd);
    background: #fff;
    background: var(--fc-page-bg-color, #fff);
  }
.fc-theme-standard .fc-popover-header {
    background: rgba(208, 208, 208, 0.3);
    background: var(--fc-neutral-bg-color, rgba(208, 208, 208, 0.3));
  }
/* help things clear margins of inner content */
.fc-daygrid-day-frame,
.fc-daygrid-day-events,
.fc-daygrid-event-harness { /* for event top/bottom margins */
}
.fc-daygrid-day-frame:before, .fc-daygrid-day-events:before,
.fc-daygrid-event-harness:before {
  content: "";
  clear: both;
  display: table; }
.fc-daygrid-day-frame:after, .fc-daygrid-day-events:after,
.fc-daygrid-event-harness:after {
  content: "";
  clear: both;
  display: table; }
.fc .fc-daygrid-body { /* a <div> that wraps the table */
    position: relative;
    z-index: 1; /* container inner z-index's because <tr>s
can't do it */
  }
.fc .fc-daygrid-day.fc-day-today {
      background-color: rgba(255, 220, 40, 0.15);
      background-color: var(--fc-today-bg-color, rgba(255, 220, 40, 0.15));
    }
.fc .fc-daygrid-day-frame {
    position: relative;
    min-height: 100%; /* seems to work better than `height` because sets
height after rows/cells naturally do it */
  }
.fc {

  /* cell top */

}
.fc .fc-daygrid-day-top {
    display: flex;
    flex-direction: row-reverse;
  }
.fc .fc-day-other .fc-daygrid-day-top {
    opacity: 0.3;
  }
.fc {

  /* day number (within cell top) */

}
.fc .fc-daygrid-day-number {
    position: relative;
    z-index: 4;
    padding: 4px;
  }
.fc {

  /* event container */

}
.fc .fc-daygrid-day-events {
    margin-top: 1px; /* needs to be margin, not padding, so that available
cell height can be computed */
  }
.fc {

  /* positioning for balanced vs natural */

}
.fc .fc-daygrid-body-balanced .fc-daygrid-day-events {
      position: absolute;
      left: 0;
      right: 0;
    }
.fc .fc-daygrid-body-unbalanced .fc-daygrid-day-events {
      position: relative; /* for containing abs positioned event harnesses
*/
      min-height: 2em; /* in addition to being a min-height during natural
height, equalizes the heights a little bit */
    }
.fc .fc-daygrid-body-natural { /* can coexist with -unbalanced */
  }
.fc .fc-daygrid-body-natural .fc-daygrid-day-events {
      margin-bottom: 1em;
    }
.fc {

  /* event harness */

}
.fc .fc-daygrid-event-harness {
    position: relative;
  }
.fc .fc-daygrid-event-harness-abs {
    position: absolute;
    top: 0; /* fallback coords for when cannot yet be computed */
    left: 0; /* */
    right: 0; /* */
  }
.fc .fc-daygrid-bg-harness {
    position: absolute;
    top: 0;
    bottom: 0;
  }
.fc {

  /* bg content */

}
.fc .fc-daygrid-day-bg .fc-non-business { z-index: 1 }
.fc .fc-daygrid-day-bg .fc-bg-event { z-index: 2 }
.fc .fc-daygrid-day-bg .fc-highlight { z-index: 3 }
.fc {

  /* events */

}
.fc .fc-daygrid-event {
    z-index: 6;
    margin-top: 1px;
  }
.fc .fc-daygrid-event.fc-event-mirror {
    z-index: 7;
  }
.fc {

  /* cell bottom (within day-events) */

}
.fc .fc-daygrid-day-bottom {
    font-size: .85em;
    margin: 2px 3px 0;
  }
.fc .fc-daygrid-more-link {
    position: relative;
    z-index: 4;
    cursor: pointer;
  }
.fc {

  /* week number (within frame) */

}
.fc .fc-daygrid-week-number {
    position: absolute;
    z-index: 5;
    top: 0;
    padding: 2px;
    min-width: 1.5em;
    text-align: center;
    background-color: rgba(208, 208, 208, 0.3);
    background-color: var(--fc-neutral-bg-color, rgba(208, 208, 208, 0.3));
    color: #808080;
    color: var(--fc-neutral-text-color, #808080);
  }
.fc {

  /* popover */

}
.fc .fc-more-popover {
    z-index: 8;
  }
.fc .fc-more-popover .fc-popover-body {
    min-width: 220px;
    padding: 10px;
  }
.fc-direction-ltr .fc-daygrid-event.fc-event-start,
.fc-direction-rtl .fc-daygrid-event.fc-event-end {
  margin-left: 2px;
}
.fc-direction-ltr .fc-daygrid-event.fc-event-end,
.fc-direction-rtl .fc-daygrid-event.fc-event-start {
  margin-right: 2px;
}
.fc-direction-ltr .fc-daygrid-week-number {
    left: 0;
    border-radius: 0 0 3px 0;
  }
.fc-direction-rtl .fc-daygrid-week-number {
    right: 0;
    border-radius: 0 0 0 3px;
  }
.fc-liquid-hack .fc-daygrid-day-frame {
    position: static; /* will cause inner absolute stuff to expand to
<td> */
  }
.fc-daygrid-event { /* make root-level, because will be dragged-and-dropped
outside of a component root */
  position: relative; /* for z-indexes assigned later */
  white-space: nowrap;
  border-radius: 3px; /* dot event needs this to when selected */
  font-size: .85em;
  font-size: var(--fc-small-font-size, .85em);
}
/* --- the rectangle ("block") style of event --- */
.fc-daygrid-block-event .fc-event-time {
    font-weight: bold;
  }
.fc-daygrid-block-event .fc-event-time,
  .fc-daygrid-block-event .fc-event-title {
    padding: 1px;
  }
/* --- the dot style of event --- */
.fc-daygrid-dot-event {
  display: flex;
  align-items: center;
  padding: 2px 0

}
.fc-daygrid-dot-event .fc-event-title {
    flex-grow: 1;
    flex-shrink: 1;
    min-width: 0; /* important for allowing to shrink all the way */
    overflow: hidden;
    font-weight: bold;
  }
.fc-daygrid-dot-event:hover,
  .fc-daygrid-dot-event.fc-event-mirror {
    background: rgba(0, 0, 0, 0.1);
  }
.fc-daygrid-dot-event.fc-event-selected:before {
    /* expand hit area */
    top: -10px;
    bottom: -10px;
  }
.fc-daygrid-event-dot { /* the actual dot */
  margin: 0 4px;
  box-sizing: content-box;
  width: 0;
  height: 0;
  border: 4px solid #3788d8;
  border: calc(var(--fc-daygrid-event-dot-width, 8px) / 2) solid
var(--fc-event-border-color, #3788d8);
  border-radius: 4px;
  border-radius: calc(var(--fc-daygrid-event-dot-width, 8px) / 2);
}
/* --- spacing between time and title --- */
.fc-direction-ltr .fc-daygrid-event .fc-event-time {
    margin-right: 3px;
  }
.fc-direction-rtl .fc-daygrid-event .fc-event-time {
    margin-left: 3px;
  }


/*
A VERTICAL event
*/

.fc-v-event { /* allowed to be top-level */
  display: block;
  border: 1px solid #3788d8;
  border: 1px solid var(--fc-event-border-color, #3788d8);
  background-color: #3788d8;
  background-color: var(--fc-event-bg-color, #3788d8)

}

.fc-v-event .fc-event-main {
    color: #fff;
    color: var(--fc-event-text-color, #fff);
    height: 100%;
  }

.fc-v-event .fc-event-main-frame {
    height: 100%;
    display: flex;
    flex-direction: column;
  }

.fc-v-event .fc-event-time {
    flex-grow: 0;
    flex-shrink: 0;
    max-height: 100%;
    overflow: hidden;
  }

.fc-v-event .fc-event-title-container { /* a container for the sticky
cushion */
    flex-grow: 1;
    flex-shrink: 1;
    min-height: 0; /* important for allowing to shrink all the way */
  }

.fc-v-event .fc-event-title { /* will have fc-sticky on it */
    top: 0;
    bottom: 0;
    max-height: 100%; /* clip overflow */
    overflow: hidden;
  }

.fc-v-event:not(.fc-event-start) {
    border-top-width: 0;
    border-top-left-radius: 0;
    border-top-right-radius: 0;
  }

.fc-v-event:not(.fc-event-end) {
    border-bottom-width: 0;
    border-bottom-left-radius: 0;
    border-bottom-right-radius: 0;
  }

.fc-v-event.fc-event-selected:before {
    /* expand hit area */
    left: -10px;
    right: -10px;
  }

.fc-v-event {

  /* resizer (mouse AND touch) */

}

.fc-v-event .fc-event-resizer-start {
    cursor: n-resize;
  }

.fc-v-event .fc-event-resizer-end {
    cursor: s-resize;
  }

.fc-v-event {

  /* resizer for MOUSE */

}

.fc-v-event:not(.fc-event-selected) .fc-event-resizer {
      height: 8px;
      height: var(--fc-event-resizer-thickness, 8px);
      left: 0;
      right: 0;
    }

.fc-v-event:not(.fc-event-selected) .fc-event-resizer-start {
      top: -4px;
      top: calc(var(--fc-event-resizer-thickness, 8px) / -2);
    }

.fc-v-event:not(.fc-event-selected) .fc-event-resizer-end {
      bottom: -4px;
      bottom: calc(var(--fc-event-resizer-thickness, 8px) / -2);
    }

.fc-v-event {

  /* resizer for TOUCH (when event is "selected") */

}

.fc-v-event.fc-event-selected .fc-event-resizer {
      left: 50%;
      margin-left: -4px;
      margin-left: calc(var(--fc-event-resizer-dot-total-width, 8px) / -2);
    }

.fc-v-event.fc-event-selected .fc-event-resizer-start {
      top: -4px;
      top: calc(var(--fc-event-resizer-dot-total-width, 8px) / -2);
    }

.fc-v-event.fc-event-selected .fc-event-resizer-end {
      bottom: -4px;
      bottom: calc(var(--fc-event-resizer-dot-total-width, 8px) / -2);
    }
.fc .fc-timegrid .fc-daygrid-body { /* the all-day daygrid within the
timegrid view */
    z-index: 2; /* put above the timegrid-body so that more-popover is
above everything. TODO: better solution */
  }
.fc .fc-timegrid-divider {
    padding: 0 0 2px; /* browsers get confused when you set height. use
padding instead */
  }
.fc .fc-timegrid-body {
    position: relative;
    z-index: 1; /* scope the z-indexes of slots and cols */
    min-height: 100%; /* fill height always, even when slat table
doesn't grow */
  }
.fc .fc-timegrid-axis-chunk { /* for advanced ScrollGrid */
    position: relative /* offset parent for now-indicator-container */

  }
.fc .fc-timegrid-axis-chunk > table {
      position: relative;
      z-index: 1; /* above the now-indicator-container */
    }
.fc .fc-timegrid-slots {
    position: relative;
    z-index: 1;
  }
.fc .fc-timegrid-slot { /* a <td> */
    height: 1.5em;
    border-bottom: 0 /* each cell owns its top border */
  }
.fc .fc-timegrid-slot:empty:before {
      content: '\00a0'; /* make sure there's at least an
empty space to create height for height syncing */
    }
.fc .fc-timegrid-slot-minor {
    border-top-style: dotted;
  }
.fc .fc-timegrid-slot-label-cushion {
    display: inline-block;
    white-space: nowrap;
  }
.fc .fc-timegrid-slot-label {
    vertical-align: middle; /* vertical align the slots */
  }
.fc {


  /* slots AND axis cells (top-left corner of view including the
"all-day" text) */

}
.fc .fc-timegrid-axis-cushion,
  .fc .fc-timegrid-slot-label-cushion {
    padding: 0 4px;
  }
.fc {


  /* axis cells (top-left corner of view including the "all-day"
text) */
  /* vertical align is more complicated, uses flexbox */

}
.fc .fc-timegrid-axis-frame-liquid {
    height: 100%; /* will need liquid-hack in FF */
  }
.fc .fc-timegrid-axis-frame {
    overflow: hidden;
    display: flex;
    align-items: center; /* vertical align */
    justify-content: flex-end; /* horizontal align. matches text-align
below */
  }
.fc .fc-timegrid-axis-cushion {
    max-width: 60px; /* limits the width of the "all-day" text */
    flex-shrink: 0; /* allows text to expand how it normally would,
regardless of constrained width */
  }
.fc-direction-ltr .fc-timegrid-slot-label-frame {
    text-align: right;
  }
.fc-direction-rtl .fc-timegrid-slot-label-frame {
    text-align: left;
  }
.fc-liquid-hack .fc-timegrid-axis-frame-liquid {
  height: auto;
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  }
.fc .fc-timegrid-col.fc-day-today {
      background-color: rgba(255, 220, 40, 0.15);
      background-color: var(--fc-today-bg-color, rgba(255, 220, 40, 0.15));
    }
.fc .fc-timegrid-col-frame {
    min-height: 100%; /* liquid-hack is below */
    position: relative;
  }
.fc-liquid-hack .fc-timegrid-col-frame {
  height: auto;
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  }
.fc-media-screen .fc-timegrid-cols {
    position: absolute; /* no z-index. children will decide and go above
slots */
    top: 0;
    left: 0;
    right: 0;
    bottom: 0
  }
.fc-media-screen .fc-timegrid-cols > table {
      height: 100%;
    }
.fc-media-screen .fc-timegrid-col-bg,
  .fc-media-screen .fc-timegrid-col-events,
  .fc-media-screen .fc-timegrid-now-indicator-container {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
  }
.fc-media-screen .fc-timegrid-event-harness {
    position: absolute; /* top/left/right/bottom will all be set by JS */
  }
.fc {

  /* bg */

}
.fc .fc-timegrid-col-bg {
    z-index: 2; /* TODO: kill */
  }
.fc .fc-timegrid-col-bg .fc-non-business { z-index: 1 }
.fc .fc-timegrid-col-bg .fc-bg-event { z-index: 2 }
.fc .fc-timegrid-col-bg .fc-highlight { z-index: 3 }
.fc .fc-timegrid-bg-harness {
    position: absolute; /* top/bottom will be set by JS */
    left: 0;
    right: 0;
  }
.fc {

  /* fg events */
  /* (the mirror segs are put into a separate container with same
classname, */
  /* and they must be after the normal seg container to appear at a higher
z-index) */

}
.fc .fc-timegrid-col-events {
    z-index: 3;
    /* child event segs have z-indexes that are scoped within this div */
  }
.fc {

  /* now indicator */

}
.fc .fc-timegrid-now-indicator-container {
    bottom: 0;
    overflow: hidden; /* don't let overflow of lines/arrows cause
unnecessary scrolling */
    /* z-index is set on the individual elements */
  }
.fc-direction-ltr .fc-timegrid-col-events {
    margin: 0 2.5% 0 2px;
  }
.fc-direction-rtl .fc-timegrid-col-events {
    margin: 0 2px 0 2.5%;
  }
.fc-timegrid-event-harness-inset .fc-timegrid-event,
.fc-timegrid-event.fc-event-mirror {
  box-shadow: 0px 0px 0px 1px #fff;
  box-shadow: 0px 0px 0px 1px var(--fc-page-bg-color, #fff);
}
.fc-timegrid-event { /* events need to be root */

  font-size: .85em;

  font-size: var(--fc-small-font-size, .85em);
  border-radius: 3px

}
.fc-timegrid-event .fc-event-main {
    padding: 1px 1px 0;
  }
.fc-timegrid-event .fc-event-time {
    white-space: nowrap;
    font-size: .85em;
    font-size: var(--fc-small-font-size, .85em);
    margin-bottom: 1px;
  }
.fc-timegrid-event-condensed .fc-event-main-frame {
    flex-direction: row;
    overflow: hidden;
  }
.fc-timegrid-event-condensed .fc-event-time:after {
    content: '\00a0-\00a0'; /* dash surrounded by non-breaking
spaces */
  }
.fc-timegrid-event-condensed .fc-event-title {
    font-size: .85em;
    font-size: var(--fc-small-font-size, .85em)
  }
.fc-media-screen .fc-timegrid-event {
    position: absolute; /* absolute WITHIN the harness */
    top: 0;
    bottom: 1px; /* stay away from bottom slot line */
    left: 0;
    right: 0;
  }
.fc {

  /* line */

}
.fc .fc-timegrid-now-indicator-line {
    position: absolute;
    z-index: 4;
    left: 0;
    right: 0;
    border-style: solid;
    border-color: red;
    border-color: var(--fc-now-indicator-color, red);
    border-width: 1px 0 0;
  }
.fc {

  /* arrow */

}
.fc .fc-timegrid-now-indicator-arrow {
    position: absolute;
    z-index: 4;
    margin-top: -5px; /* vertically center on top coordinate */
    border-style: solid;
    border-color: red;
    border-color: var(--fc-now-indicator-color, red);
  }
.fc-direction-ltr .fc-timegrid-now-indicator-arrow {
    left: 0;

    /* triangle pointing right. TODO: mixin */
    border-width: 5px 0 5px 6px;
    border-top-color: transparent;
    border-bottom-color: transparent;
  }
.fc-direction-rtl .fc-timegrid-now-indicator-arrow {
    right: 0;

    /* triangle pointing left. TODO: mixin */
    border-width: 5px 6px 5px 0;
    border-top-color: transparent;
    border-bottom-color: transparent;
  }


:root {
  --fc-list-event-dot-width: 10px;
  --fc-list-event-hover-bg-color: #f5f5f5;
}
.fc-theme-standard .fc-list {
    border: 1px solid #ddd;
    border: 1px solid var(--fc-border-color, #ddd);
  }
.fc {

  /* message when no events */

}
.fc .fc-list-empty {
    background-color: rgba(208, 208, 208, 0.3);
    background-color: var(--fc-neutral-bg-color, rgba(208, 208, 208, 0.3));
    height: 100%;
    display: flex;
    justify-content: center;
    align-items: center; /* vertically aligns fc-list-empty-inner */
  }
.fc .fc-list-empty-cushion {
    margin: 5em 0;
  }
.fc {

  /* table within the scroller */
  /*
----------------------------------------------------------------------------------------------------
*/

}
.fc .fc-list-table {
    width: 100%;
    border-style: hidden; /* kill outer border on theme */
  }
.fc .fc-list-table tr > * {
    border-left: 0;
    border-right: 0;
  }
.fc .fc-list-sticky .fc-list-day > * { /* the cells */
      position: -webkit-sticky;
      position: sticky;
      top: 0;
      background: #fff;
      background: var(--fc-page-bg-color, #fff); /* for when headers are
styled to be transparent and sticky */
    }
.fc .fc-list-table th {
    padding: 0; /* uses an inner-wrapper instead... */
  }
.fc .fc-list-table td,
  .fc .fc-list-day-cushion {
    padding: 8px 14px;
  }
.fc {


  /* date heading rows */
  /*
----------------------------------------------------------------------------------------------------
*/

}
.fc .fc-list-day-cushion:after {
  content: "";
  clear: both;
  display: table; /* clear floating */
    }
.fc-theme-standard .fc-list-day-cushion {
    background-color: rgba(208, 208, 208, 0.3);
    background-color: var(--fc-neutral-bg-color, rgba(208, 208, 208, 0.3));
  }
.fc-direction-ltr .fc-list-day-text,
.fc-direction-rtl .fc-list-day-side-text {
  float: left;
}
.fc-direction-ltr .fc-list-day-side-text,
.fc-direction-rtl .fc-list-day-text {
  float: right;
}
/* make the dot closer to the event title */
.fc-direction-ltr .fc-list-table .fc-list-event-graphic { padding-right: 0
}
.fc-direction-rtl .fc-list-table .fc-list-event-graphic { padding-left: 0 }
.fc .fc-list-event.fc-event-forced-url {
    cursor: pointer; /* whole row will seem clickable */
  }
.fc .fc-list-event:hover td {
    background-color: #f5f5f5;
    background-color: var(--fc-list-event-hover-bg-color, #f5f5f5);
  }
.fc {

  /* shrink certain cols */

}
.fc .fc-list-event-graphic,
  .fc .fc-list-event-time {
    white-space: nowrap;
    width: 1px;
  }
.fc .fc-list-event-dot {
    display: inline-block;
    box-sizing: content-box;
    width: 0;
    height: 0;
    border: 5px solid #3788d8;
    border: calc(var(--fc-list-event-dot-width, 10px) / 2) solid
var(--fc-event-border-color, #3788d8);
    border-radius: 5px;
    border-radius: calc(var(--fc-list-event-dot-width, 10px) / 2);
  }
.fc {

  /* reset <a> styling */

}
.fc .fc-list-event-title a {
    color: inherit;
    text-decoration: none;
  }
.fc {

  /* underline link when hovering over any part of row */

}
.fc .fc-list-event.fc-event-forced-url:hover a {
    text-decoration: underline;
  }



  .fc-theme-bootstrap a:not([href]) {
    color: inherit; /* natural color for navlinks */
  }

PK,�[u��q�O
�O
fullCalendar/main.jsnu�[���/*!
FullCalendar v5.5.1
Docs & License: https://fullcalendar.io/
(c) 2020 Adam Shaw
*/
var FullCalendar = (function (exports) {
    'use strict';

    /*!
*****************************************************************************
    Copyright (c) Microsoft Corporation.

    Permission to use, copy, modify, and/or distribute this software for
any
    purpose with or without fee is hereby granted.

    THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
WARRANTIES WITH
    REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY
    AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL,
DIRECT,
    INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
FROM
    LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
NEGLIGENCE OR
    OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
    PERFORMANCE OF THIS SOFTWARE.
   
*****************************************************************************
*/
    /* global Reflect, Promise */

    var extendStatics = function(d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b)
{ d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if
(Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };

    function __extends(d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype =
b.prototype, new __());
    }

    var __assign = function() {
        __assign = Object.assign || function __assign(t) {
            for (var s, i = 1, n = arguments.length; i < n; i++) {
                s = arguments[i];
                for (var p in s) if
(Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
            }
            return t;
        };
        return __assign.apply(this, arguments);
    };

    function __spreadArrays() {
        for (var s = 0, i = 0, il = arguments.length; i < il; i++) s +=
arguments[i].length;
        for (var r = Array(s), k = 0, i = 0; i < il; i++)
            for (var a = arguments[i], j = 0, jl = a.length; j < jl;
j++, k++)
                r[k] = a[j];
        return r;
    }

    var
n,u,i,t,o,r,f={},e=[],c=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function
s(n,l){for(var u in l)n[u]=l[u];return n}function a(n){var
l=n.parentNode;l&&l.removeChild(n);}function v(n,l,u){var
i,t,o,r=arguments,f={};for(o in
l)"key"==o?i=l[o]:"ref"==o?t=l[o]:f[o]=l[o];if(arguments.length>3)for(u=[u],o=3;o<arguments.length;o++)u.push(r[o]);if(null!=u&&(f.children=u),"function"==typeof
n&&null!=n.defaultProps)for(o in n.defaultProps)void
0===f[o]&&(f[o]=n.defaultProps[o]);return h(n,f,i,t,null)}function
h(l,u,i,t,o){var
r={type:l,props:u,key:i,ref:t,__k:null,__:null,__b:0,__e:null,__d:void
0,__c:null,__h:null,constructor:void 0,__v:null==o?++n.__v:o};return
null!=n.vnode&&n.vnode(r),r}function y(){return
{current:null}}function p(n){return n.children}function
d(n,l){this.props=n,this.context=l;}function _(n,l){if(null==l)return
n.__?_(n.__,n.__.__k.indexOf(n)+1):null;for(var
u;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e)return
u.__e;return "function"==typeof n.type?_(n):null}function
w(n){var
l,u;if(null!=(n=n.__)&&null!=n.__c){for(n.__e=n.__c.base=null,l=0;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e){n.__e=n.__c.base=u.__e;break}return
w(n)}}function
k(l){(!l.__d&&(l.__d=!0)&&u.push(l)&&!g.__r++||t!==n.debounceRendering)&&((t=n.debounceRendering)||i)(g);}function
g(){for(var n;g.__r=u.length;)n=u.sort(function(n,l){return
n.__v.__b-l.__v.__b}),u=[],n.some(function(n){var
l,u,i,t,o,r,f;n.__d&&(r=(o=(l=n).__v).__e,(f=l.__P)&&(u=[],(i=s({},o)).__v=o.__v+1,t=$(f,o,i,l.__n,void
0!==f.ownerSVGElement,null!=o.__h?[r]:null,u,null==r?_(o):r,o.__h),j(u,o),t!=r&&w(o)));});}function
m(n,l,u,i,t,o,r,c,s,v){var
y,d,w,k,g,m,b,A=i&&i.__k||e,P=A.length;for(s==f&&(s=null!=r?r[0]:P?_(i,0):null),u.__k=[],y=0;y<l.length;y++)if(null!=(k=u.__k[y]=null==(k=l[y])||"boolean"==typeof
k?null:"string"==typeof k||"number"==typeof
k?h(null,k,null,null,k):Array.isArray(k)?h(p,{children:k},null,null,null):null!=k.__e||null!=k.__c?h(k.type,k.props,k.key,null,k.__v):k)){if(k.__=u,k.__b=u.__b+1,null===(w=A[y])||w&&k.key==w.key&&k.type===w.type)A[y]=void
0;else
for(d=0;d<P;d++){if((w=A[d])&&k.key==w.key&&k.type===w.type){A[d]=void
0;break}w=null;}g=$(n,k,w=w||f,t,o,r,c,s,v),(d=k.ref)&&w.ref!=d&&(b||(b=[]),w.ref&&b.push(w.ref,null,k),b.push(d,k.__c||g,k)),null!=g?(null==m&&(m=g),s=x(n,k,w,A,r,g,s),v||"option"!=u.type?"function"==typeof
u.type&&(u.__d=s):n.value=""):s&&w.__e==s&&s.parentNode!=n&&(s=_(w));}if(u.__e=m,null!=r&&"function"!=typeof
u.type)for(y=r.length;y--;)null!=r[y]&&a(r[y]);for(y=P;y--;)null!=A[y]&&L(A[y],A[y]);if(b)for(y=0;y<b.length;y++)I(b[y],b[++y],b[++y]);}function
x(n,l,u,i,t,o,r){var f,e,c;if(void 0!==l.__d)f=l.__d,l.__d=void 0;else
if(t==u||o!=r||null==o.parentNode)n:if(null==r||r.parentNode!==n)n.appendChild(o),f=null;else
{for(e=r,c=0;(e=e.nextSibling)&&c<i.length;c+=2)if(e==o)break
n;n.insertBefore(o,r),f=r;}return void 0!==f?f:o.nextSibling}function
A(n,l,u,i,t){var o;for(o in
u)"children"===o||"key"===o||o in
l||C(n,o,null,u[o],i);for(o in l)t&&"function"!=typeof
l[o]||"children"===o||"key"===o||"value"===o||"checked"===o||u[o]===l[o]||C(n,o,l[o],u[o],i);}function
P(n,l,u){"-"===l[0]?n.setProperty(l,u):n[l]=null==u?"":"number"!=typeof
u||c.test(l)?u:u+"px";}function C(n,l,u,i,t){var
o,r,f;if(t&&"className"==l&&(l="class"),"style"===l)if("string"==typeof
u)n.style.cssText=u;else {if("string"==typeof
i&&(n.style.cssText=i=""),i)for(l in i)u&&l in
u||P(n.style,l,"");if(u)for(l in
u)i&&u[l]===i[l]||P(n.style,l,u[l]);}else
"o"===l[0]&&"n"===l[1]?(o=l!==(l=l.replace(/Capture$/,"")),(r=l.toLowerCase())in
n&&(l=r),l=l.slice(2),n.l||(n.l={}),n.l[l+o]=u,f=o?N:z,u?i||n.addEventListener(l,f,o):n.removeEventListener(l,f,o)):"list"!==l&&"tagName"!==l&&"form"!==l&&"type"!==l&&"size"!==l&&"download"!==l&&"href"!==l&&!t&&l
in n?n[l]=null==u?"":u:"function"!=typeof
u&&"dangerouslySetInnerHTML"!==l&&(l!==(l=l.replace(/xlink:?/,""))?null==u||!1===u?n.removeAttributeNS("http://www.w3.org/1999/xlink",l.toLowerCase()):n.setAttributeNS("http://www.w3.org/1999/xlink",l.toLowerCase(),u):null==u||!1===u&&!/^ar/.test(l)?n.removeAttribute(l):n.setAttribute(l,u));}function
z(l){this.l[l.type+!1](n.event?n.event(l):l);}function
N(l){this.l[l.type+!0](n.event?n.event(l):l);}function T(n,l,u){var
i,t;for(i=0;i<n.__k.length;i++)(t=n.__k[i])&&(t.__=n,t.__e&&("function"==typeof
t.type&&t.__k.length>1&&T(t,l,u),l=x(u,t,t,n.__k,null,t.__e,l),"function"==typeof
n.type&&(n.__d=l)));}function $(l,u,i,t,o,r,f,e,c){var
a,v,h,y,_,w,k,g,b,x,A,P=u.type;if(void 0!==u.constructor)return
null;null!=i.__h&&(c=i.__h,e=u.__e=i.__e,u.__h=null,r=[e]),(a=n.__b)&&a(u);try{n:if("function"==typeof
P){if(g=u.props,b=(a=P.contextType)&&t[a.__c],x=a?b?b.props.value:a.__:t,i.__c?k=(v=u.__c=i.__c).__=v.__E:("prototype"in
P&&P.prototype.render?u.__c=v=new P(g,x):(u.__c=v=new
d(g,x),v.constructor=P,v.render=M),b&&b.sub(v),v.props=g,v.state||(v.state={}),v.context=x,v.__n=t,h=v.__d=!0,v.__h=[]),null==v.__s&&(v.__s=v.state),null!=P.getDerivedStateFromProps&&(v.__s==v.state&&(v.__s=s({},v.__s)),s(v.__s,P.getDerivedStateFromProps(g,v.__s))),y=v.props,_=v.state,h)null==P.getDerivedStateFromProps&&null!=v.componentWillMount&&v.componentWillMount(),null!=v.componentDidMount&&v.__h.push(v.componentDidMount);else
{if(null==P.getDerivedStateFromProps&&g!==y&&null!=v.componentWillReceiveProps&&v.componentWillReceiveProps(g,x),!v.__e&&null!=v.shouldComponentUpdate&&!1===v.shouldComponentUpdate(g,v.__s,x)||u.__v===i.__v){v.props=g,v.state=v.__s,u.__v!==i.__v&&(v.__d=!1),v.__v=u,u.__e=i.__e,u.__k=i.__k,v.__h.length&&f.push(v),T(u,e,l);break
n}null!=v.componentWillUpdate&&v.componentWillUpdate(g,v.__s,x),null!=v.componentDidUpdate&&v.__h.push(function(){v.componentDidUpdate(y,_,w);});}v.context=x,v.props=g,v.state=v.__s,(a=n.__r)&&a(u),v.__d=!1,v.__v=u,v.__P=l,a=v.render(v.props,v.state,v.context),v.state=v.__s,null!=v.getChildContext&&(t=s(s({},t),v.getChildContext())),h||null==v.getSnapshotBeforeUpdate||(w=v.getSnapshotBeforeUpdate(y,_)),A=null!=a&&a.type==p&&null==a.key?a.props.children:a,m(l,Array.isArray(A)?A:[A],u,i,t,o,r,f,e,c),v.base=u.__e,u.__h=null,v.__h.length&&f.push(v),k&&(v.__E=v.__=null),v.__e=!1;}else
null==r&&u.__v===i.__v?(u.__k=i.__k,u.__e=i.__e):u.__e=H(i.__e,u,i,t,o,r,f,c);(a=n.diffed)&&a(u);}catch(l){u.__v=null,(c||null!=r)&&(u.__e=e,u.__h=!!c,r[r.indexOf(e)]=null),n.__e(l,u,i);}return
u.__e}function
j(l,u){n.__c&&n.__c(u,l),l.some(function(u){try{l=u.__h,u.__h=[],l.some(function(n){n.call(u);});}catch(l){n.__e(l,u.__v);}});}function
H(n,l,u,i,t,o,r,c){var
s,a,v,h,y,p=u.props,d=l.props;if(t="svg"===l.type||t,null!=o)for(s=0;s<o.length;s++)if(null!=(a=o[s])&&((null===l.type?3===a.nodeType:a.localName===l.type)||n==a)){n=a,o[s]=null;break}if(null==n){if(null===l.type)return
document.createTextNode(d);n=t?document.createElementNS("http://www.w3.org/2000/svg",l.type):document.createElement(l.type,d.is&&{is:d.is}),o=null,c=!1;}if(null===l.type)p===d||c&&n.data===d||(n.data=d);else
{if(null!=o&&(o=e.slice.call(n.childNodes)),v=(p=u.props||f).dangerouslySetInnerHTML,h=d.dangerouslySetInnerHTML,!c){if(null!=o)for(p={},y=0;y<n.attributes.length;y++)p[n.attributes[y].name]=n.attributes[y].value;(h||v)&&(h&&(v&&h.__html==v.__html||h.__html===n.innerHTML)||(n.innerHTML=h&&h.__html||""));}A(n,d,p,t,c),h?l.__k=[]:(s=l.props.children,m(n,Array.isArray(s)?s:[s],l,u,i,"foreignObject"!==l.type&&t,o,r,f,c)),c||("value"in
d&&void
0!==(s=d.value)&&(s!==n.value||"progress"===l.type&&!s)&&C(n,"value",s,p.value,!1),"checked"in
d&&void
0!==(s=d.checked)&&s!==n.checked&&C(n,"checked",s,p.checked,!1));}return
n}function I(l,u,i){try{"function"==typeof
l?l(u):l.current=u;}catch(l){n.__e(l,i);}}function L(l,u,i){var
t,o,r;if(n.unmount&&n.unmount(l),(t=l.ref)&&(t.current&&t.current!==l.__e||I(t,null,u)),i||"function"==typeof
l.type||(i=null!=(o=l.__e)),l.__e=l.__d=void
0,null!=(t=l.__c)){if(t.componentWillUnmount)try{t.componentWillUnmount();}catch(l){n.__e(l,u);}t.base=t.__P=null;}if(t=l.__k)for(r=0;r<t.length;r++)t[r]&&L(t[r],u,i);null!=o&&a(o);}function
M(n,l,u){return this.constructor(n,u)}function O(l,u,i){var
t,r,c;n.__&&n.__(l,u),r=(t=i===o)?null:i&&i.__k||u.__k,l=v(p,null,[l]),c=[],$(u,(t?u:i||u).__k=l,r||f,f,void
0!==u.ownerSVGElement,i&&!t?[i]:r?null:u.childNodes.length?e.slice.call(u.childNodes):null,c,i||f,t),j(c,l);}function
B(n,l){var u={__c:l="__cC"+r++,__:n,Consumer:function(n,l){return
n.children(l)},Provider:function(n,u,i){return
this.getChildContext||(u=[],(i={})[l]=this,this.getChildContext=function(){return
i},this.shouldComponentUpdate=function(n){this.props.value!==n.value&&u.some(k);},this.sub=function(n){u.push(n);var
l=n.componentWillUnmount;n.componentWillUnmount=function(){u.splice(u.indexOf(n),1),l&&l.call(n);};}),n.children}};return
u.Provider.__=u.Consumer.contextType=u}n={__e:function(n,l){for(var
u,i,t,o=l.__h;l=l.__;)if((u=l.__c)&&!u.__)try{if((i=u.constructor)&&null!=i.getDerivedStateFromError&&(u.setState(i.getDerivedStateFromError(n)),t=u.__d),null!=u.componentDidCatch&&(u.componentDidCatch(n),t=u.__d),t)return
l.__h=o,u.__E=u}catch(l){n=l;}throw
n},__v:0},d.prototype.setState=function(n,l){var
u;u=null!=this.__s&&this.__s!==this.state?this.__s:this.__s=s({},this.state),"function"==typeof
n&&(n=n(s({},u),this.props)),n&&s(u,n),null!=n&&this.__v&&(l&&this.__h.push(l),k(this));},d.prototype.forceUpdate=function(n){this.__v&&(this.__e=!0,n&&this.__h.push(n),k(this));},d.prototype.render=p,u=[],i="function"==typeof
Promise?Promise.prototype.then.bind(Promise.resolve()):setTimeout,g.__r=0,o=f,r=0;

    var globalObj = typeof globalThis !== 'undefined' ?
globalThis : window; // // TODO: streamline when killing IE11 support
    if (globalObj.FullCalendarVDom) {
        console.warn('FullCalendar VDOM already loaded');
    }
    else {
        globalObj.FullCalendarVDom = {
            Component: d,
            createElement: v,
            render: O,
            createRef: y,
            Fragment: p,
            createContext: createContext,
            flushToDom: flushToDom,
            unmountComponentAtNode: unmountComponentAtNode,
        };
    }
    // HACKS...
    // TODO: lock version
    // TODO: link gh issues
    function flushToDom() {
        var oldDebounceRendering = n.debounceRendering; // orig
        var callbackQ = [];
        function execCallbackSync(callback) {
            callbackQ.push(callback);
        }
        n.debounceRendering = execCallbackSync;
        O(v(FakeComponent, {}), document.createElement('div'));
        while (callbackQ.length) {
            callbackQ.shift()();
        }
        n.debounceRendering = oldDebounceRendering;
    }
    var FakeComponent = /** @class */ (function (_super) {
        __extends(FakeComponent, _super);
        function FakeComponent() {
            return _super !== null && _super.apply(this, arguments)
|| this;
        }
        FakeComponent.prototype.render = function () { return
v('div', {}); };
        FakeComponent.prototype.componentDidMount = function () {
this.setState({}); };
        return FakeComponent;
    }(d));
    function createContext(defaultValue) {
        var ContextType = B(defaultValue);
        var origProvider = ContextType.Provider;
        ContextType.Provider = function () {
            var _this = this;
            var isNew = !this.getChildContext;
            var children = origProvider.apply(this, arguments); //
eslint-disable-line prefer-rest-params
            if (isNew) {
                var subs_1 = [];
                this.shouldComponentUpdate = function (_props) {
                    if (_this.props.value !== _props.value) {
                        subs_1.forEach(function (c) {
                            c.context = _props.value;
                            c.forceUpdate();
                        });
                    }
                };
                this.sub = function (c) {
                    subs_1.push(c);
                    var old = c.componentWillUnmount;
                    c.componentWillUnmount = function () {
                        subs_1.splice(subs_1.indexOf(c), 1);
                        old && old.call(c);
                    };
                };
            }
            return children;
        };
        return ContextType;
    }
    function unmountComponentAtNode(node) {
        O(null, node);
    }

    // no public types yet. when there are, export from:
    // import {} from './api-type-deps'
    var EventSourceApi = /** @class */ (function () {
        function EventSourceApi(context, internalEventSource) {
            this.context = context;
            this.internalEventSource = internalEventSource;
        }
        EventSourceApi.prototype.remove = function () {
            this.context.dispatch({
                type: 'REMOVE_EVENT_SOURCE',
                sourceId: this.internalEventSource.sourceId,
            });
        };
        EventSourceApi.prototype.refetch = function () {
            this.context.dispatch({
                type: 'FETCH_EVENT_SOURCES',
                sourceIds: [this.internalEventSource.sourceId],
            });
        };
        Object.defineProperty(EventSourceApi.prototype, "id", {
            get: function () {
                return this.internalEventSource.publicId;
            },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(EventSourceApi.prototype, "url", {
            get: function () {
                return this.internalEventSource.meta.url;
            },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(EventSourceApi.prototype, "format",
{
            get: function () {
                return this.internalEventSource.meta.format; // TODO: bad.
not guaranteed
            },
            enumerable: false,
            configurable: true
        });
        return EventSourceApi;
    }());

    function removeElement(el) {
        if (el.parentNode) {
            el.parentNode.removeChild(el);
        }
    }
    // Querying
    //
----------------------------------------------------------------------------------------------------------------
    function elementClosest(el, selector) {
        if (el.closest) {
            return el.closest(selector);
            // really bad fallback for IE
            // from
https://developer.mozilla.org/en-US/docs/Web/API/Element/closest
        }
        if (!document.documentElement.contains(el)) {
            return null;
        }
        do {
            if (elementMatches(el, selector)) {
                return el;
            }
            el = (el.parentElement || el.parentNode);
        } while (el !== null && el.nodeType === 1);
        return null;
    }
    function elementMatches(el, selector) {
        var method = el.matches || el.matchesSelector ||
el.msMatchesSelector;
        return method.call(el, selector);
    }
    // accepts multiple subject els
    // returns a real array. good for methods like forEach
    // TODO: accept the document
    function findElements(container, selector) {
        var containers = container instanceof HTMLElement ? [container] :
container;
        var allMatches = [];
        for (var i = 0; i < containers.length; i += 1) {
            var matches = containers[i].querySelectorAll(selector);
            for (var j = 0; j < matches.length; j += 1) {
                allMatches.push(matches[j]);
            }
        }
        return allMatches;
    }
    // accepts multiple subject els
    // only queries direct child elements // TODO: rename to
findDirectChildren!
    function findDirectChildren(parent, selector) {
        var parents = parent instanceof HTMLElement ? [parent] : parent;
        var allMatches = [];
        for (var i = 0; i < parents.length; i += 1) {
            var childNodes = parents[i].children; // only ever elements
            for (var j = 0; j < childNodes.length; j += 1) {
                var childNode = childNodes[j];
                if (!selector || elementMatches(childNode, selector)) {
                    allMatches.push(childNode);
                }
            }
        }
        return allMatches;
    }
    // Style
    //
----------------------------------------------------------------------------------------------------------------
    var PIXEL_PROP_RE = /(top|left|right|bottom|width|height)$/i;
    function applyStyle(el, props) {
        for (var propName in props) {
            applyStyleProp(el, propName, props[propName]);
        }
    }
    function applyStyleProp(el, name, val) {
        if (val == null) {
            el.style[name] = '';
        }
        else if (typeof val === 'number' &&
PIXEL_PROP_RE.test(name)) {
            el.style[name] = val + "px";
        }
        else {
            el.style[name] = val;
        }
    }

    // Stops a mouse/touch event from doing it's native browser action
    function preventDefault(ev) {
        ev.preventDefault();
    }
    // Event Delegation
    //
----------------------------------------------------------------------------------------------------------------
    function buildDelegationHandler(selector, handler) {
        return function (ev) {
            var matchedChild = elementClosest(ev.target, selector);
            if (matchedChild) {
                handler.call(matchedChild, ev, matchedChild);
            }
        };
    }
    function listenBySelector(container, eventType, selector, handler) {
        var attachedHandler = buildDelegationHandler(selector, handler);
        container.addEventListener(eventType, attachedHandler);
        return function () {
            container.removeEventListener(eventType, attachedHandler);
        };
    }
    function listenToHoverBySelector(container, selector, onMouseEnter,
onMouseLeave) {
        var currentMatchedChild;
        return listenBySelector(container, 'mouseover', selector,
function (mouseOverEv, matchedChild) {
            if (matchedChild !== currentMatchedChild) {
                currentMatchedChild = matchedChild;
                onMouseEnter(mouseOverEv, matchedChild);
                var realOnMouseLeave_1 = function (mouseLeaveEv) {
                    currentMatchedChild = null;
                    onMouseLeave(mouseLeaveEv, matchedChild);
                   
matchedChild.removeEventListener('mouseleave',
realOnMouseLeave_1);
                };
                // listen to the next mouseleave, and then unattach
                matchedChild.addEventListener('mouseleave',
realOnMouseLeave_1);
            }
        });
    }
    // Animation
    //
----------------------------------------------------------------------------------------------------------------
    var transitionEventNames = [
        'webkitTransitionEnd',
        'otransitionend',
        'oTransitionEnd',
        'msTransitionEnd',
        'transitionend',
    ];
    // triggered only when the next single subsequent transition finishes
    function whenTransitionDone(el, callback) {
        var realCallback = function (ev) {
            callback(ev);
            transitionEventNames.forEach(function (eventName) {
                el.removeEventListener(eventName, realCallback);
            });
        };
        transitionEventNames.forEach(function (eventName) {
            el.addEventListener(eventName, realCallback); // cross-browser
way to determine when the transition finishes
        });
    }

    var guidNumber = 0;
    function guid() {
        guidNumber += 1;
        return String(guidNumber);
    }
    /* FullCalendar-specific DOM Utilities
   
----------------------------------------------------------------------------------------------------------------------*/
    // Make the mouse cursor express that an event is not allowed in the
current area
    function disableCursor() {
        document.body.classList.add('fc-not-allowed');
    }
    // Returns the mouse cursor to its original look
    function enableCursor() {
        document.body.classList.remove('fc-not-allowed');
    }
    /* Selection
   
----------------------------------------------------------------------------------------------------------------------*/
    function preventSelection(el) {
        el.classList.add('fc-unselectable');
        el.addEventListener('selectstart', preventDefault);
    }
    function allowSelection(el) {
        el.classList.remove('fc-unselectable');
        el.removeEventListener('selectstart', preventDefault);
    }
    /* Context Menu
   
----------------------------------------------------------------------------------------------------------------------*/
    function preventContextMenu(el) {
        el.addEventListener('contextmenu', preventDefault);
    }
    function allowContextMenu(el) {
        el.removeEventListener('contextmenu', preventDefault);
    }
    function parseFieldSpecs(input) {
        var specs = [];
        var tokens = [];
        var i;
        var token;
        if (typeof input === 'string') {
            tokens = input.split(/\s*,\s*/);
        }
        else if (typeof input === 'function') {
            tokens = [input];
        }
        else if (Array.isArray(input)) {
            tokens = input;
        }
        for (i = 0; i < tokens.length; i += 1) {
            token = tokens[i];
            if (typeof token === 'string') {
                specs.push(token.charAt(0) === '-' ?
                    { field: token.substring(1), order: -1 } :
                    { field: token, order: 1 });
            }
            else if (typeof token === 'function') {
                specs.push({ func: token });
            }
        }
        return specs;
    }
    function compareByFieldSpecs(obj0, obj1, fieldSpecs) {
        var i;
        var cmp;
        for (i = 0; i < fieldSpecs.length; i += 1) {
            cmp = compareByFieldSpec(obj0, obj1, fieldSpecs[i]);
            if (cmp) {
                return cmp;
            }
        }
        return 0;
    }
    function compareByFieldSpec(obj0, obj1, fieldSpec) {
        if (fieldSpec.func) {
            return fieldSpec.func(obj0, obj1);
        }
        return flexibleCompare(obj0[fieldSpec.field],
obj1[fieldSpec.field])
            * (fieldSpec.order || 1);
    }
    function flexibleCompare(a, b) {
        if (!a && !b) {
            return 0;
        }
        if (b == null) {
            return -1;
        }
        if (a == null) {
            return 1;
        }
        if (typeof a === 'string' || typeof b ===
'string') {
            return String(a).localeCompare(String(b));
        }
        return a - b;
    }
    /* String Utilities
   
----------------------------------------------------------------------------------------------------------------------*/
    function padStart(val, len) {
        var s = String(val);
        return '000'.substr(0, len - s.length) + s;
    }
    /* Number Utilities
   
----------------------------------------------------------------------------------------------------------------------*/
    function compareNumbers(a, b) {
        return a - b;
    }
    function isInt(n) {
        return n % 1 === 0;
    }
    /* FC-specific DOM dimension stuff
   
----------------------------------------------------------------------------------------------------------------------*/
    function computeSmallestCellWidth(cellEl) {
        var allWidthEl =
cellEl.querySelector('.fc-scrollgrid-shrink-frame');
        var contentWidthEl =
cellEl.querySelector('.fc-scrollgrid-shrink-cushion');
        if (!allWidthEl) {
            throw new Error('needs fc-scrollgrid-shrink-frame
className'); // TODO: use const
        }
        if (!contentWidthEl) {
            throw new Error('needs fc-scrollgrid-shrink-cushion
className');
        }
        return cellEl.getBoundingClientRect().width -
allWidthEl.getBoundingClientRect().width + // the cell padding+border
            contentWidthEl.getBoundingClientRect().width;
    }

    var DAY_IDS = ['sun', 'mon', 'tue',
'wed', 'thu', 'fri', 'sat'];
    // Adding
    function addWeeks(m, n) {
        var a = dateToUtcArray(m);
        a[2] += n * 7;
        return arrayToUtcDate(a);
    }
    function addDays(m, n) {
        var a = dateToUtcArray(m);
        a[2] += n;
        return arrayToUtcDate(a);
    }
    function addMs(m, n) {
        var a = dateToUtcArray(m);
        a[6] += n;
        return arrayToUtcDate(a);
    }
    // Diffing (all return floats)
    // TODO: why not use ranges?
    function diffWeeks(m0, m1) {
        return diffDays(m0, m1) / 7;
    }
    function diffDays(m0, m1) {
        return (m1.valueOf() - m0.valueOf()) / (1000 * 60 * 60 * 24);
    }
    function diffHours(m0, m1) {
        return (m1.valueOf() - m0.valueOf()) / (1000 * 60 * 60);
    }
    function diffMinutes(m0, m1) {
        return (m1.valueOf() - m0.valueOf()) / (1000 * 60);
    }
    function diffSeconds(m0, m1) {
        return (m1.valueOf() - m0.valueOf()) / 1000;
    }
    function diffDayAndTime(m0, m1) {
        var m0day = startOfDay(m0);
        var m1day = startOfDay(m1);
        return {
            years: 0,
            months: 0,
            days: Math.round(diffDays(m0day, m1day)),
            milliseconds: (m1.valueOf() - m1day.valueOf()) - (m0.valueOf()
- m0day.valueOf()),
        };
    }
    // Diffing Whole Units
    function diffWholeWeeks(m0, m1) {
        var d = diffWholeDays(m0, m1);
        if (d !== null && d % 7 === 0) {
            return d / 7;
        }
        return null;
    }
    function diffWholeDays(m0, m1) {
        if (timeAsMs(m0) === timeAsMs(m1)) {
            return Math.round(diffDays(m0, m1));
        }
        return null;
    }
    // Start-Of
    function startOfDay(m) {
        return arrayToUtcDate([
            m.getUTCFullYear(),
            m.getUTCMonth(),
            m.getUTCDate(),
        ]);
    }
    function startOfHour(m) {
        return arrayToUtcDate([
            m.getUTCFullYear(),
            m.getUTCMonth(),
            m.getUTCDate(),
            m.getUTCHours(),
        ]);
    }
    function startOfMinute(m) {
        return arrayToUtcDate([
            m.getUTCFullYear(),
            m.getUTCMonth(),
            m.getUTCDate(),
            m.getUTCHours(),
            m.getUTCMinutes(),
        ]);
    }
    function startOfSecond(m) {
        return arrayToUtcDate([
            m.getUTCFullYear(),
            m.getUTCMonth(),
            m.getUTCDate(),
            m.getUTCHours(),
            m.getUTCMinutes(),
            m.getUTCSeconds(),
        ]);
    }
    // Week Computation
    function weekOfYear(marker, dow, doy) {
        var y = marker.getUTCFullYear();
        var w = weekOfGivenYear(marker, y, dow, doy);
        if (w < 1) {
            return weekOfGivenYear(marker, y - 1, dow, doy);
        }
        var nextW = weekOfGivenYear(marker, y + 1, dow, doy);
        if (nextW >= 1) {
            return Math.min(w, nextW);
        }
        return w;
    }
    function weekOfGivenYear(marker, year, dow, doy) {
        var firstWeekStart = arrayToUtcDate([year, 0, 1 +
firstWeekOffset(year, dow, doy)]);
        var dayStart = startOfDay(marker);
        var days = Math.round(diffDays(firstWeekStart, dayStart));
        return Math.floor(days / 7) + 1; // zero-indexed
    }
    // start-of-first-week - start-of-year
    function firstWeekOffset(year, dow, doy) {
        // first-week day -- which january is always in the first week (4
for iso, 1 for other)
        var fwd = 7 + dow - doy;
        // first-week day local weekday -- which local weekday is fwd
        var fwdlw = (7 + arrayToUtcDate([year, 0, fwd]).getUTCDay() - dow)
% 7;
        return -fwdlw + fwd - 1;
    }
    // Array Conversion
    function dateToLocalArray(date) {
        return [
            date.getFullYear(),
            date.getMonth(),
            date.getDate(),
            date.getHours(),
            date.getMinutes(),
            date.getSeconds(),
            date.getMilliseconds(),
        ];
    }
    function arrayToLocalDate(a) {
        return new Date(a[0], a[1] || 0, a[2] == null ? 1 : a[2], // day of
month
        a[3] || 0, a[4] || 0, a[5] || 0);
    }
    function dateToUtcArray(date) {
        return [
            date.getUTCFullYear(),
            date.getUTCMonth(),
            date.getUTCDate(),
            date.getUTCHours(),
            date.getUTCMinutes(),
            date.getUTCSeconds(),
            date.getUTCMilliseconds(),
        ];
    }
    function arrayToUtcDate(a) {
        // according to web standards (and Safari), a month index is
required.
        // massage if only given a year.
        if (a.length === 1) {
            a = a.concat([0]);
        }
        return new Date(Date.UTC.apply(Date, a));
    }
    // Other Utils
    function isValidDate(m) {
        return !isNaN(m.valueOf());
    }
    function timeAsMs(m) {
        return m.getUTCHours() * 1000 * 60 * 60 +
            m.getUTCMinutes() * 1000 * 60 +
            m.getUTCSeconds() * 1000 +
            m.getUTCMilliseconds();
    }

    function createEventInstance(defId, range, forcedStartTzo,
forcedEndTzo) {
        return {
            instanceId: guid(),
            defId: defId,
            range: range,
            forcedStartTzo: forcedStartTzo == null ? null : forcedStartTzo,
            forcedEndTzo: forcedEndTzo == null ? null : forcedEndTzo,
        };
    }

    var hasOwnProperty = Object.prototype.hasOwnProperty;
    // Merges an array of objects into a single object.
    // The second argument allows for an array of property names who's
object values will be merged together.
    function mergeProps(propObjs, complexPropsMap) {
        var dest = {};
        if (complexPropsMap) {
            for (var name_1 in complexPropsMap) {
                var complexObjs = [];
                // collect the trailing object values, stopping when a
non-object is discovered
                for (var i = propObjs.length - 1; i >= 0; i -= 1) {
                    var val = propObjs[i][name_1];
                    if (typeof val === 'object' && val) {
// non-null object
                        complexObjs.unshift(val);
                    }
                    else if (val !== undefined) {
                        dest[name_1] = val; // if there were no objects,
this value will be used
                        break;
                    }
                }
                // if the trailing values were objects, use the merged
value
                if (complexObjs.length) {
                    dest[name_1] = mergeProps(complexObjs);
                }
            }
        }
        // copy values into the destination, going from last to first
        for (var i = propObjs.length - 1; i >= 0; i -= 1) {
            var props = propObjs[i];
            for (var name_2 in props) {
                if (!(name_2 in dest)) { // if already assigned by previous
props or complex props, don't reassign
                    dest[name_2] = props[name_2];
                }
            }
        }
        return dest;
    }
    function filterHash(hash, func) {
        var filtered = {};
        for (var key in hash) {
            if (func(hash[key], key)) {
                filtered[key] = hash[key];
            }
        }
        return filtered;
    }
    function mapHash(hash, func) {
        var newHash = {};
        for (var key in hash) {
            newHash[key] = func(hash[key], key);
        }
        return newHash;
    }
    function arrayToHash(a) {
        var hash = {};
        for (var _i = 0, a_1 = a; _i < a_1.length; _i++) {
            var item = a_1[_i];
            hash[item] = true;
        }
        return hash;
    }
    function buildHashFromArray(a, func) {
        var hash = {};
        for (var i = 0; i < a.length; i += 1) {
            var tuple = func(a[i], i);
            hash[tuple[0]] = tuple[1];
        }
        return hash;
    }
    function hashValuesToArray(obj) {
        var a = [];
        for (var key in obj) {
            a.push(obj[key]);
        }
        return a;
    }
    function isPropsEqual(obj0, obj1) {
        if (obj0 === obj1) {
            return true;
        }
        for (var key in obj0) {
            if (hasOwnProperty.call(obj0, key)) {
                if (!(key in obj1)) {
                    return false;
                }
            }
        }
        for (var key in obj1) {
            if (hasOwnProperty.call(obj1, key)) {
                if (obj0[key] !== obj1[key]) {
                    return false;
                }
            }
        }
        return true;
    }
    function getUnequalProps(obj0, obj1) {
        var keys = [];
        for (var key in obj0) {
            if (hasOwnProperty.call(obj0, key)) {
                if (!(key in obj1)) {
                    keys.push(key);
                }
            }
        }
        for (var key in obj1) {
            if (hasOwnProperty.call(obj1, key)) {
                if (obj0[key] !== obj1[key]) {
                    keys.push(key);
                }
            }
        }
        return keys;
    }
    function compareObjs(oldProps, newProps, equalityFuncs) {
        if (equalityFuncs === void 0) { equalityFuncs = {}; }
        if (oldProps === newProps) {
            return true;
        }
        for (var key in newProps) {
            if (key in oldProps && isObjValsEqual(oldProps[key],
newProps[key], equalityFuncs[key])) ;
            else {
                return false;
            }
        }
        // check for props that were omitted in the new
        for (var key in oldProps) {
            if (!(key in newProps)) {
                return false;
            }
        }
        return true;
    }
    /*
    assumed "true" equality for handler names like
"onReceiveSomething"
    */
    function isObjValsEqual(val0, val1, comparator) {
        if (val0 === val1 || comparator === true) {
            return true;
        }
        if (comparator) {
            return comparator(val0, val1);
        }
        return false;
    }
    function collectFromHash(hash, startIndex, endIndex, step) {
        if (startIndex === void 0) { startIndex = 0; }
        if (step === void 0) { step = 1; }
        var res = [];
        if (endIndex == null) {
            endIndex = Object.keys(hash).length;
        }
        for (var i = startIndex; i < endIndex; i += step) {
            var val = hash[i];
            if (val !== undefined) { // will disregard undefined for sparse
arrays
                res.push(val);
            }
        }
        return res;
    }

    function parseRecurring(refined, defaultAllDay, dateEnv,
recurringTypes) {
        for (var i = 0; i < recurringTypes.length; i += 1) {
            var parsed = recurringTypes[i].parse(refined, dateEnv);
            if (parsed) {
                var allDay = refined.allDay;
                if (allDay == null) {
                    allDay = defaultAllDay;
                    if (allDay == null) {
                        allDay = parsed.allDayGuess;
                        if (allDay == null) {
                            allDay = false;
                        }
                    }
                }
                return {
                    allDay: allDay,
                    duration: parsed.duration,
                    typeData: parsed.typeData,
                    typeId: i,
                };
            }
        }
        return null;
    }
    function expandRecurring(eventStore, framingRange, context) {
        var dateEnv = context.dateEnv, pluginHooks = context.pluginHooks,
options = context.options;
        var defs = eventStore.defs, instances = eventStore.instances;
        // remove existing recurring instances
        // TODO: bad. always expand events as a second step
        instances = filterHash(instances, function (instance) { return
!defs[instance.defId].recurringDef; });
        for (var defId in defs) {
            var def = defs[defId];
            if (def.recurringDef) {
                var duration = def.recurringDef.duration;
                if (!duration) {
                    duration = def.allDay ?
                        options.defaultAllDayEventDuration :
                        options.defaultTimedEventDuration;
                }
                var starts = expandRecurringRanges(def, duration,
framingRange, dateEnv, pluginHooks.recurringTypes);
                for (var _i = 0, starts_1 = starts; _i <
starts_1.length; _i++) {
                    var start = starts_1[_i];
                    var instance = createEventInstance(defId, {
                        start: start,
                        end: dateEnv.add(start, duration),
                    });
                    instances[instance.instanceId] = instance;
                }
            }
        }
        return { defs: defs, instances: instances };
    }
    /*
    Event MUST have a recurringDef
    */
    function expandRecurringRanges(eventDef, duration, framingRange,
dateEnv, recurringTypes) {
        var typeDef = recurringTypes[eventDef.recurringDef.typeId];
        var markers = typeDef.expand(eventDef.recurringDef.typeData, {
            start: dateEnv.subtract(framingRange.start, duration),
            end: framingRange.end,
        }, dateEnv);
        // the recurrence plugins don't guarantee that all-day events
are start-of-day, so we have to
        if (eventDef.allDay) {
            markers = markers.map(startOfDay);
        }
        return markers;
    }

    var INTERNAL_UNITS = ['years', 'months',
'days', 'milliseconds'];
    var PARSE_RE =
/^(-?)(?:(\d+)\.)?(\d+):(\d\d)(?::(\d\d)(?:\.(\d\d\d))?)?/;
    // Parsing and Creation
    function createDuration(input, unit) {
        var _a;
        if (typeof input === 'string') {
            return parseString(input);
        }
        if (typeof input === 'object' && input) { //
non-null object
            return parseObject(input);
        }
        if (typeof input === 'number') {
            return parseObject((_a = {}, _a[unit ||
'milliseconds'] = input, _a));
        }
        return null;
    }
    function parseString(s) {
        var m = PARSE_RE.exec(s);
        if (m) {
            var sign = m[1] ? -1 : 1;
            return {
                years: 0,
                months: 0,
                days: sign * (m[2] ? parseInt(m[2], 10) : 0),
                milliseconds: sign * ((m[3] ? parseInt(m[3], 10) : 0) * 60
* 60 * 1000 + // hours
                    (m[4] ? parseInt(m[4], 10) : 0) * 60 * 1000 + //
minutes
                    (m[5] ? parseInt(m[5], 10) : 0) * 1000 + // seconds
                    (m[6] ? parseInt(m[6], 10) : 0) // ms
                ),
            };
        }
        return null;
    }
    function parseObject(obj) {
        var duration = {
            years: obj.years || obj.year || 0,
            months: obj.months || obj.month || 0,
            days: obj.days || obj.day || 0,
            milliseconds: (obj.hours || obj.hour || 0) * 60 * 60 * 1000 +
// hours
                (obj.minutes || obj.minute || 0) * 60 * 1000 + // minutes
                (obj.seconds || obj.second || 0) * 1000 + // seconds
                (obj.milliseconds || obj.millisecond || obj.ms || 0),
        };
        var weeks = obj.weeks || obj.week;
        if (weeks) {
            duration.days += weeks * 7;
            duration.specifiedWeeks = true;
        }
        return duration;
    }
    // Equality
    function durationsEqual(d0, d1) {
        return d0.years === d1.years &&
            d0.months === d1.months &&
            d0.days === d1.days &&
            d0.milliseconds === d1.milliseconds;
    }
    function asCleanDays(dur) {
        if (!dur.years && !dur.months && !dur.milliseconds)
{
            return dur.days;
        }
        return 0;
    }
    // Simple Math
    function addDurations(d0, d1) {
        return {
            years: d0.years + d1.years,
            months: d0.months + d1.months,
            days: d0.days + d1.days,
            milliseconds: d0.milliseconds + d1.milliseconds,
        };
    }
    function subtractDurations(d1, d0) {
        return {
            years: d1.years - d0.years,
            months: d1.months - d0.months,
            days: d1.days - d0.days,
            milliseconds: d1.milliseconds - d0.milliseconds,
        };
    }
    function multiplyDuration(d, n) {
        return {
            years: d.years * n,
            months: d.months * n,
            days: d.days * n,
            milliseconds: d.milliseconds * n,
        };
    }
    // Conversions
    // "Rough" because they are based on average-case Gregorian
months/years
    function asRoughYears(dur) {
        return asRoughDays(dur) / 365;
    }
    function asRoughMonths(dur) {
        return asRoughDays(dur) / 30;
    }
    function asRoughDays(dur) {
        return asRoughMs(dur) / 864e5;
    }
    function asRoughMinutes(dur) {
        return asRoughMs(dur) / (1000 * 60);
    }
    function asRoughSeconds(dur) {
        return asRoughMs(dur) / 1000;
    }
    function asRoughMs(dur) {
        return dur.years * (365 * 864e5) +
            dur.months * (30 * 864e5) +
            dur.days * 864e5 +
            dur.milliseconds;
    }
    // Advanced Math
    function wholeDivideDurations(numerator, denominator) {
        var res = null;
        for (var i = 0; i < INTERNAL_UNITS.length; i += 1) {
            var unit = INTERNAL_UNITS[i];
            if (denominator[unit]) {
                var localRes = numerator[unit] / denominator[unit];
                if (!isInt(localRes) || (res !== null && res !==
localRes)) {
                    return null;
                }
                res = localRes;
            }
            else if (numerator[unit]) {
                // needs to divide by something but can't!
                return null;
            }
        }
        return res;
    }
    function greatestDurationDenominator(dur) {
        var ms = dur.milliseconds;
        if (ms) {
            if (ms % 1000 !== 0) {
                return { unit: 'millisecond', value: ms };
            }
            if (ms % (1000 * 60) !== 0) {
                return { unit: 'second', value: ms / 1000 };
            }
            if (ms % (1000 * 60 * 60) !== 0) {
                return { unit: 'minute', value: ms / (1000 * 60)
};
            }
            if (ms) {
                return { unit: 'hour', value: ms / (1000 * 60 *
60) };
            }
        }
        if (dur.days) {
            if (dur.specifiedWeeks && dur.days % 7 === 0) {
                return { unit: 'week', value: dur.days / 7 };
            }
            return { unit: 'day', value: dur.days };
        }
        if (dur.months) {
            return { unit: 'month', value: dur.months };
        }
        if (dur.years) {
            return { unit: 'year', value: dur.years };
        }
        return { unit: 'millisecond', value: 0 };
    }

    // timeZoneOffset is in minutes
    function buildIsoString(marker, timeZoneOffset, stripZeroTime) {
        if (stripZeroTime === void 0) { stripZeroTime = false; }
        var s = marker.toISOString();
        s = s.replace('.000', '');
        if (stripZeroTime) {
            s = s.replace('T00:00:00Z', '');
        }
        if (s.length > 10) { // time part wasn't stripped, can add
timezone info
            if (timeZoneOffset == null) {
                s = s.replace('Z', '');
            }
            else if (timeZoneOffset !== 0) {
                s = s.replace('Z',
formatTimeZoneOffset(timeZoneOffset, true));
            }
            // otherwise, its UTC-0 and we want to keep the Z
        }
        return s;
    }
    // formats the date, but with no time part
    // TODO: somehow merge with buildIsoString and stripZeroTime
    // TODO: rename. omit "string"
    function formatDayString(marker) {
        return marker.toISOString().replace(/T.*$/, '');
    }
    // TODO: use Date::toISOString and use everything after the T?
    function formatIsoTimeString(marker) {
        return padStart(marker.getUTCHours(), 2) + ':' +
            padStart(marker.getUTCMinutes(), 2) + ':' +
            padStart(marker.getUTCSeconds(), 2);
    }
    function formatTimeZoneOffset(minutes, doIso) {
        if (doIso === void 0) { doIso = false; }
        var sign = minutes < 0 ? '-' : '+';
        var abs = Math.abs(minutes);
        var hours = Math.floor(abs / 60);
        var mins = Math.round(abs % 60);
        if (doIso) {
            return sign + padStart(hours, 2) + ":" +
padStart(mins, 2);
        }
        return "GMT" + sign + hours + (mins ? ":" +
padStart(mins, 2) : '');
    }

    // TODO: new util arrayify?
    function removeExact(array, exactVal) {
        var removeCnt = 0;
        var i = 0;
        while (i < array.length) {
            if (array[i] === exactVal) {
                array.splice(i, 1);
                removeCnt += 1;
            }
            else {
                i += 1;
            }
        }
        return removeCnt;
    }
    function isArraysEqual(a0, a1, equalityFunc) {
        if (a0 === a1) {
            return true;
        }
        var len = a0.length;
        var i;
        if (len !== a1.length) { // not array? or not same length?
            return false;
        }
        for (i = 0; i < len; i += 1) {
            if (!(equalityFunc ? equalityFunc(a0[i], a1[i]) : a0[i] ===
a1[i])) {
                return false;
            }
        }
        return true;
    }

    function memoize(workerFunc, resEquality, teardownFunc) {
        var currentArgs;
        var currentRes;
        return function () {
            var newArgs = [];
            for (var _i = 0; _i < arguments.length; _i++) {
                newArgs[_i] = arguments[_i];
            }
            if (!currentArgs) {
                currentRes = workerFunc.apply(this, newArgs);
            }
            else if (!isArraysEqual(currentArgs, newArgs)) {
                if (teardownFunc) {
                    teardownFunc(currentRes);
                }
                var res = workerFunc.apply(this, newArgs);
                if (!resEquality || !resEquality(res, currentRes)) {
                    currentRes = res;
                }
            }
            currentArgs = newArgs;
            return currentRes;
        };
    }
    function memoizeObjArg(workerFunc, resEquality, teardownFunc) {
        var _this = this;
        var currentArg;
        var currentRes;
        return function (newArg) {
            if (!currentArg) {
                currentRes = workerFunc.call(_this, newArg);
            }
            else if (!isPropsEqual(currentArg, newArg)) {
                if (teardownFunc) {
                    teardownFunc(currentRes);
                }
                var res = workerFunc.call(_this, newArg);
                if (!resEquality || !resEquality(res, currentRes)) {
                    currentRes = res;
                }
            }
            currentArg = newArg;
            return currentRes;
        };
    }
    function memoizeArraylike(// used at all?
    workerFunc, resEquality, teardownFunc) {
        var _this = this;
        var currentArgSets = [];
        var currentResults = [];
        return function (newArgSets) {
            var currentLen = currentArgSets.length;
            var newLen = newArgSets.length;
            var i = 0;
            for (; i < currentLen; i += 1) {
                if (!newArgSets[i]) { // one of the old sets no longer
exists
                    if (teardownFunc) {
                        teardownFunc(currentResults[i]);
                    }
                }
                else if (!isArraysEqual(currentArgSets[i], newArgSets[i]))
{
                    if (teardownFunc) {
                        teardownFunc(currentResults[i]);
                    }
                    var res = workerFunc.apply(_this, newArgSets[i]);
                    if (!resEquality || !resEquality(res,
currentResults[i])) {
                        currentResults[i] = res;
                    }
                }
            }
            for (; i < newLen; i += 1) {
                currentResults[i] = workerFunc.apply(_this, newArgSets[i]);
            }
            currentArgSets = newArgSets;
            currentResults.splice(newLen); // remove excess
            return currentResults;
        };
    }
    function memoizeHashlike(// used?
    workerFunc, resEquality, teardownFunc) {
        var _this = this;
        var currentArgHash = {};
        var currentResHash = {};
        return function (newArgHash) {
            var newResHash = {};
            for (var key in newArgHash) {
                if (!currentResHash[key]) {
                    newResHash[key] = workerFunc.apply(_this,
newArgHash[key]);
                }
                else if (!isArraysEqual(currentArgHash[key],
newArgHash[key])) {
                    if (teardownFunc) {
                        teardownFunc(currentResHash[key]);
                    }
                    var res = workerFunc.apply(_this, newArgHash[key]);
                    newResHash[key] = (resEquality &&
resEquality(res, currentResHash[key]))
                        ? currentResHash[key]
                        : res;
                }
                else {
                    newResHash[key] = currentResHash[key];
                }
            }
            currentArgHash = newArgHash;
            currentResHash = newResHash;
            return newResHash;
        };
    }

    var EXTENDED_SETTINGS_AND_SEVERITIES = {
        week: 3,
        separator: 0,
        omitZeroMinute: 0,
        meridiem: 0,
        omitCommas: 0,
    };
    var STANDARD_DATE_PROP_SEVERITIES = {
        timeZoneName: 7,
        era: 6,
        year: 5,
        month: 4,
        day: 2,
        weekday: 2,
        hour: 1,
        minute: 1,
        second: 1,
    };
    var MERIDIEM_RE = /\s*([ap])\.?m\.?/i; // eats up leading spaces too
    var COMMA_RE = /,/g; // we need re for globalness
    var MULTI_SPACE_RE = /\s+/g;
    var LTR_RE = /\u200e/g; // control character
    var UTC_RE = /UTC|GMT/;
    var NativeFormatter = /** @class */ (function () {
        function NativeFormatter(formatSettings) {
            var standardDateProps = {};
            var extendedSettings = {};
            var severity = 0;
            for (var name_1 in formatSettings) {
                if (name_1 in EXTENDED_SETTINGS_AND_SEVERITIES) {
                    extendedSettings[name_1] = formatSettings[name_1];
                    severity =
Math.max(EXTENDED_SETTINGS_AND_SEVERITIES[name_1], severity);
                }
                else {
                    standardDateProps[name_1] = formatSettings[name_1];
                    if (name_1 in STANDARD_DATE_PROP_SEVERITIES) { // TODO:
what about hour12? no severity
                        severity =
Math.max(STANDARD_DATE_PROP_SEVERITIES[name_1], severity);
                    }
                }
            }
            this.standardDateProps = standardDateProps;
            this.extendedSettings = extendedSettings;
            this.severity = severity;
            this.buildFormattingFunc = memoize(buildFormattingFunc);
        }
        NativeFormatter.prototype.format = function (date, context) {
            return this.buildFormattingFunc(this.standardDateProps,
this.extendedSettings, context)(date);
        };
        NativeFormatter.prototype.formatRange = function (start, end,
context, betterDefaultSeparator) {
            var _a = this, standardDateProps = _a.standardDateProps,
extendedSettings = _a.extendedSettings;
            var diffSeverity = computeMarkerDiffSeverity(start.marker,
end.marker, context.calendarSystem);
            if (!diffSeverity) {
                return this.format(start, context);
            }
            var biggestUnitForPartial = diffSeverity;
            if (biggestUnitForPartial > 1 && // the two dates
are different in a way that's larger scale than time
                (standardDateProps.year === 'numeric' ||
standardDateProps.year === '2-digit') &&
                (standardDateProps.month === 'numeric' ||
standardDateProps.month === '2-digit') &&
                (standardDateProps.day === 'numeric' ||
standardDateProps.day === '2-digit')) {
                biggestUnitForPartial = 1; // make it look like the dates
are only different in terms of time
            }
            var full0 = this.format(start, context);
            var full1 = this.format(end, context);
            if (full0 === full1) {
                return full0;
            }
            var partialDateProps =
computePartialFormattingOptions(standardDateProps, biggestUnitForPartial);
            var partialFormattingFunc =
buildFormattingFunc(partialDateProps, extendedSettings, context);
            var partial0 = partialFormattingFunc(start);
            var partial1 = partialFormattingFunc(end);
            var insertion = findCommonInsertion(full0, partial0, full1,
partial1);
            var separator = extendedSettings.separator ||
betterDefaultSeparator || context.defaultSeparator || '';
            if (insertion) {
                return insertion.before + partial0 + separator + partial1 +
insertion.after;
            }
            return full0 + separator + full1;
        };
        NativeFormatter.prototype.getLargestUnit = function () {
            switch (this.severity) {
                case 7:
                case 6:
                case 5:
                    return 'year';
                case 4:
                    return 'month';
                case 3:
                    return 'week';
                case 2:
                    return 'day';
                default:
                    return 'time'; // really?
            }
        };
        return NativeFormatter;
    }());
    function buildFormattingFunc(standardDateProps, extendedSettings,
context) {
        var standardDatePropCnt = Object.keys(standardDateProps).length;
        if (standardDatePropCnt === 1 &&
standardDateProps.timeZoneName === 'short') {
            return function (date) { return
(formatTimeZoneOffset(date.timeZoneOffset)); };
        }
        if (standardDatePropCnt === 0 && extendedSettings.week) {
            return function (date) { return
(formatWeekNumber(context.computeWeekNumber(date.marker), context.weekText,
context.locale, extendedSettings.week)); };
        }
        return buildNativeFormattingFunc(standardDateProps,
extendedSettings, context);
    }
    function buildNativeFormattingFunc(standardDateProps, extendedSettings,
context) {
        standardDateProps = __assign({}, standardDateProps); // copy
        extendedSettings = __assign({}, extendedSettings); // copy
        sanitizeSettings(standardDateProps, extendedSettings);
        standardDateProps.timeZone = 'UTC'; // we leverage the
only guaranteed timeZone for our UTC markers
        var normalFormat = new Intl.DateTimeFormat(context.locale.codes,
standardDateProps);
        var zeroFormat; // needed?
        if (extendedSettings.omitZeroMinute) {
            var zeroProps = __assign({}, standardDateProps);
            delete zeroProps.minute; // seconds and ms were already
considered in sanitizeSettings
            zeroFormat = new Intl.DateTimeFormat(context.locale.codes,
zeroProps);
        }
        return function (date) {
            var marker = date.marker;
            var format;
            if (zeroFormat && !marker.getUTCMinutes()) {
                format = zeroFormat;
            }
            else {
                format = normalFormat;
            }
            var s = format.format(marker);
            return postProcess(s, date, standardDateProps,
extendedSettings, context);
        };
    }
    function sanitizeSettings(standardDateProps, extendedSettings) {
        // deal with a browser inconsistency where formatting the timezone
        // requires that the hour/minute be present.
        if (standardDateProps.timeZoneName) {
            if (!standardDateProps.hour) {
                standardDateProps.hour = '2-digit';
            }
            if (!standardDateProps.minute) {
                standardDateProps.minute = '2-digit';
            }
        }
        // only support short timezone names
        if (standardDateProps.timeZoneName === 'long') {
            standardDateProps.timeZoneName = 'short';
        }
        // if requesting to display seconds, MUST display minutes
        if (extendedSettings.omitZeroMinute &&
(standardDateProps.second || standardDateProps.millisecond)) {
            delete extendedSettings.omitZeroMinute;
        }
    }
    function postProcess(s, date, standardDateProps, extendedSettings,
context) {
        s = s.replace(LTR_RE, ''); // remove left-to-right
control chars. do first. good for other regexes
        if (standardDateProps.timeZoneName === 'short') {
            s = injectTzoStr(s, (context.timeZone === 'UTC' ||
date.timeZoneOffset == null) ?
                'UTC' : // important to normalize for IE, which
does "GMT"
                formatTimeZoneOffset(date.timeZoneOffset));
        }
        if (extendedSettings.omitCommas) {
            s = s.replace(COMMA_RE, '').trim();
        }
        if (extendedSettings.omitZeroMinute) {
            s = s.replace(':00', ''); // zeroFormat
doesn't always achieve this
        }
        // ^ do anything that might create adjacent spaces before this
point,
        // because MERIDIEM_RE likes to eat up loading spaces
        if (extendedSettings.meridiem === false) {
            s = s.replace(MERIDIEM_RE, '').trim();
        }
        else if (extendedSettings.meridiem === 'narrow') { // a/p
            s = s.replace(MERIDIEM_RE, function (m0, m1) { return
m1.toLocaleLowerCase(); });
        }
        else if (extendedSettings.meridiem === 'short') { //
am/pm
            s = s.replace(MERIDIEM_RE, function (m0, m1) { return
m1.toLocaleLowerCase() + "m"; });
        }
        else if (extendedSettings.meridiem === 'lowercase') { //
other meridiem transformers already converted to lowercase
            s = s.replace(MERIDIEM_RE, function (m0) { return
m0.toLocaleLowerCase(); });
        }
        s = s.replace(MULTI_SPACE_RE, ' ');
        s = s.trim();
        return s;
    }
    function injectTzoStr(s, tzoStr) {
        var replaced = false;
        s = s.replace(UTC_RE, function () {
            replaced = true;
            return tzoStr;
        });
        // IE11 doesn't include UTC/GMT in the original string, so
append to end
        if (!replaced) {
            s += " " + tzoStr;
        }
        return s;
    }
    function formatWeekNumber(num, weekText, locale, display) {
        var parts = [];
        if (display === 'narrow') {
            parts.push(weekText);
        }
        else if (display === 'short') {
            parts.push(weekText, ' ');
        }
        // otherwise, considered 'numeric'
        parts.push(locale.simpleNumberFormat.format(num));
        if (locale.options.direction === 'rtl') { // TODO: use
control characters instead?
            parts.reverse();
        }
        return parts.join('');
    }
    // Range Formatting Utils
    // 0 = exactly the same
    // 1 = different by time
    // and bigger
    function computeMarkerDiffSeverity(d0, d1, ca) {
        if (ca.getMarkerYear(d0) !== ca.getMarkerYear(d1)) {
            return 5;
        }
        if (ca.getMarkerMonth(d0) !== ca.getMarkerMonth(d1)) {
            return 4;
        }
        if (ca.getMarkerDay(d0) !== ca.getMarkerDay(d1)) {
            return 2;
        }
        if (timeAsMs(d0) !== timeAsMs(d1)) {
            return 1;
        }
        return 0;
    }
    function computePartialFormattingOptions(options, biggestUnit) {
        var partialOptions = {};
        for (var name_2 in options) {
            if (!(name_2 in STANDARD_DATE_PROP_SEVERITIES) || // not a date
part prop (like timeZone)
                STANDARD_DATE_PROP_SEVERITIES[name_2] <= biggestUnit) {
                partialOptions[name_2] = options[name_2];
            }
        }
        return partialOptions;
    }
    function findCommonInsertion(full0, partial0, full1, partial1) {
        var i0 = 0;
        while (i0 < full0.length) {
            var found0 = full0.indexOf(partial0, i0);
            if (found0 === -1) {
                break;
            }
            var before0 = full0.substr(0, found0);
            i0 = found0 + partial0.length;
            var after0 = full0.substr(i0);
            var i1 = 0;
            while (i1 < full1.length) {
                var found1 = full1.indexOf(partial1, i1);
                if (found1 === -1) {
                    break;
                }
                var before1 = full1.substr(0, found1);
                i1 = found1 + partial1.length;
                var after1 = full1.substr(i1);
                if (before0 === before1 && after0 === after1) {
                    return {
                        before: before0,
                        after: after0,
                    };
                }
            }
        }
        return null;
    }

    function expandZonedMarker(dateInfo, calendarSystem) {
        var a = calendarSystem.markerToArray(dateInfo.marker);
        return {
            marker: dateInfo.marker,
            timeZoneOffset: dateInfo.timeZoneOffset,
            array: a,
            year: a[0],
            month: a[1],
            day: a[2],
            hour: a[3],
            minute: a[4],
            second: a[5],
            millisecond: a[6],
        };
    }

    function createVerboseFormattingArg(start, end, context,
betterDefaultSeparator) {
        var startInfo = expandZonedMarker(start, context.calendarSystem);
        var endInfo = end ? expandZonedMarker(end, context.calendarSystem)
: null;
        return {
            date: startInfo,
            start: startInfo,
            end: endInfo,
            timeZone: context.timeZone,
            localeCodes: context.locale.codes,
            defaultSeparator: betterDefaultSeparator ||
context.defaultSeparator,
        };
    }

    /*
    TODO: fix the terminology of "formatter" vs "formatting
func"
    */
    /*
    At the time of instantiation, this object does not know which
cmd-formatting system it will use.
    It receives this at the time of formatting, as a setting.
    */
    var CmdFormatter = /** @class */ (function () {
        function CmdFormatter(cmdStr) {
            this.cmdStr = cmdStr;
        }
        CmdFormatter.prototype.format = function (date, context,
betterDefaultSeparator) {
            return context.cmdFormatter(this.cmdStr,
createVerboseFormattingArg(date, null, context, betterDefaultSeparator));
        };
        CmdFormatter.prototype.formatRange = function (start, end, context,
betterDefaultSeparator) {
            return context.cmdFormatter(this.cmdStr,
createVerboseFormattingArg(start, end, context, betterDefaultSeparator));
        };
        return CmdFormatter;
    }());

    var FuncFormatter = /** @class */ (function () {
        function FuncFormatter(func) {
            this.func = func;
        }
        FuncFormatter.prototype.format = function (date, context,
betterDefaultSeparator) {
            return this.func(createVerboseFormattingArg(date, null,
context, betterDefaultSeparator));
        };
        FuncFormatter.prototype.formatRange = function (start, end,
context, betterDefaultSeparator) {
            return this.func(createVerboseFormattingArg(start, end,
context, betterDefaultSeparator));
        };
        return FuncFormatter;
    }());

    function createFormatter(input) {
        if (typeof input === 'object' && input) { //
non-null object
            return new NativeFormatter(input);
        }
        if (typeof input === 'string') {
            return new CmdFormatter(input);
        }
        if (typeof input === 'function') {
            return new FuncFormatter(input);
        }
        return null;
    }

    // base options
    // ------------
    var BASE_OPTION_REFINERS = {
        navLinkDayClick: identity,
        navLinkWeekClick: identity,
        duration: createDuration,
        bootstrapFontAwesome: identity,
        buttonIcons: identity,
        customButtons: identity,
        defaultAllDayEventDuration: createDuration,
        defaultTimedEventDuration: createDuration,
        nextDayThreshold: createDuration,
        scrollTime: createDuration,
        slotMinTime: createDuration,
        slotMaxTime: createDuration,
        dayPopoverFormat: createFormatter,
        slotDuration: createDuration,
        snapDuration: createDuration,
        headerToolbar: identity,
        footerToolbar: identity,
        defaultRangeSeparator: String,
        titleRangeSeparator: String,
        forceEventDuration: Boolean,
        dayHeaders: Boolean,
        dayHeaderFormat: createFormatter,
        dayHeaderClassNames: identity,
        dayHeaderContent: identity,
        dayHeaderDidMount: identity,
        dayHeaderWillUnmount: identity,
        dayCellClassNames: identity,
        dayCellContent: identity,
        dayCellDidMount: identity,
        dayCellWillUnmount: identity,
        initialView: String,
        aspectRatio: Number,
        weekends: Boolean,
        weekNumberCalculation: identity,
        weekNumbers: Boolean,
        weekNumberClassNames: identity,
        weekNumberContent: identity,
        weekNumberDidMount: identity,
        weekNumberWillUnmount: identity,
        editable: Boolean,
        viewClassNames: identity,
        viewDidMount: identity,
        viewWillUnmount: identity,
        nowIndicator: Boolean,
        nowIndicatorClassNames: identity,
        nowIndicatorContent: identity,
        nowIndicatorDidMount: identity,
        nowIndicatorWillUnmount: identity,
        showNonCurrentDates: Boolean,
        lazyFetching: Boolean,
        startParam: String,
        endParam: String,
        timeZoneParam: String,
        timeZone: String,
        locales: identity,
        locale: identity,
        themeSystem: String,
        dragRevertDuration: Number,
        dragScroll: Boolean,
        allDayMaintainDuration: Boolean,
        unselectAuto: Boolean,
        dropAccept: identity,
        eventOrder: parseFieldSpecs,
        handleWindowResize: Boolean,
        windowResizeDelay: Number,
        longPressDelay: Number,
        eventDragMinDistance: Number,
        expandRows: Boolean,
        height: identity,
        contentHeight: identity,
        direction: String,
        weekNumberFormat: createFormatter,
        eventResizableFromStart: Boolean,
        displayEventTime: Boolean,
        displayEventEnd: Boolean,
        weekText: String,
        progressiveEventRendering: Boolean,
        businessHours: identity,
        initialDate: identity,
        now: identity,
        eventDataTransform: identity,
        stickyHeaderDates: identity,
        stickyFooterScrollbar: identity,
        viewHeight: identity,
        defaultAllDay: Boolean,
        eventSourceFailure: identity,
        eventSourceSuccess: identity,
        eventDisplay: String,
        eventStartEditable: Boolean,
        eventDurationEditable: Boolean,
        eventOverlap: identity,
        eventConstraint: identity,
        eventAllow: identity,
        eventBackgroundColor: String,
        eventBorderColor: String,
        eventTextColor: String,
        eventColor: String,
        eventClassNames: identity,
        eventContent: identity,
        eventDidMount: identity,
        eventWillUnmount: identity,
        selectConstraint: identity,
        selectOverlap: identity,
        selectAllow: identity,
        droppable: Boolean,
        unselectCancel: String,
        slotLabelFormat: identity,
        slotLaneClassNames: identity,
        slotLaneContent: identity,
        slotLaneDidMount: identity,
        slotLaneWillUnmount: identity,
        slotLabelClassNames: identity,
        slotLabelContent: identity,
        slotLabelDidMount: identity,
        slotLabelWillUnmount: identity,
        dayMaxEvents: identity,
        dayMaxEventRows: identity,
        dayMinWidth: Number,
        slotLabelInterval: createDuration,
        allDayText: String,
        allDayClassNames: identity,
        allDayContent: identity,
        allDayDidMount: identity,
        allDayWillUnmount: identity,
        slotMinWidth: Number,
        navLinks: Boolean,
        eventTimeFormat: createFormatter,
        rerenderDelay: Number,
        moreLinkText: identity,
        selectMinDistance: Number,
        selectable: Boolean,
        selectLongPressDelay: Number,
        eventLongPressDelay: Number,
        selectMirror: Boolean,
        eventMinHeight: Number,
        slotEventOverlap: Boolean,
        plugins: identity,
        firstDay: Number,
        dayCount: Number,
        dateAlignment: String,
        dateIncrement: createDuration,
        hiddenDays: identity,
        monthMode: Boolean,
        fixedWeekCount: Boolean,
        validRange: identity,
        visibleRange: identity,
        titleFormat: identity,
        // only used by list-view, but languages define the value, so we
need it in base options
        noEventsText: String,
    };
    // do NOT give a type here. need `typeof BASE_OPTION_DEFAULTS` to give
real results.
    // raw values.
    var BASE_OPTION_DEFAULTS = {
        eventDisplay: 'auto',
        defaultRangeSeparator: ' - ',
        titleRangeSeparator: ' \u2013 ',
        defaultTimedEventDuration: '01:00:00',
        defaultAllDayEventDuration: { day: 1 },
        forceEventDuration: false,
        nextDayThreshold: '00:00:00',
        dayHeaders: true,
        initialView: '',
        aspectRatio: 1.35,
        headerToolbar: {
            start: 'title',
            center: '',
            end: 'today prev,next',
        },
        weekends: true,
        weekNumbers: false,
        weekNumberCalculation: 'local',
        editable: false,
        nowIndicator: false,
        scrollTime: '06:00:00',
        slotMinTime: '00:00:00',
        slotMaxTime: '24:00:00',
        showNonCurrentDates: true,
        lazyFetching: true,
        startParam: 'start',
        endParam: 'end',
        timeZoneParam: 'timeZone',
        timeZone: 'local',
        locales: [],
        locale: '',
        themeSystem: 'standard',
        dragRevertDuration: 500,
        dragScroll: true,
        allDayMaintainDuration: false,
        unselectAuto: true,
        dropAccept: '*',
        eventOrder: 'start,-duration,allDay,title',
        dayPopoverFormat: { month: 'long', day:
'numeric', year: 'numeric' },
        handleWindowResize: true,
        windowResizeDelay: 100,
        longPressDelay: 1000,
        eventDragMinDistance: 5,
        expandRows: false,
        navLinks: false,
        selectable: false,
    };
    // calendar listeners
    // ------------------
    var CALENDAR_LISTENER_REFINERS = {
        datesSet: identity,
        eventsSet: identity,
        eventAdd: identity,
        eventChange: identity,
        eventRemove: identity,
        windowResize: identity,
        eventClick: identity,
        eventMouseEnter: identity,
        eventMouseLeave: identity,
        select: identity,
        unselect: identity,
        loading: identity,
        // internal
        _unmount: identity,
        _beforeprint: identity,
        _afterprint: identity,
        _noEventDrop: identity,
        _noEventResize: identity,
        _resize: identity,
        _scrollRequest: identity,
    };
    // calendar-specific options
    // -------------------------
    var CALENDAR_OPTION_REFINERS = {
        buttonText: identity,
        views: identity,
        plugins: identity,
        initialEvents: identity,
        events: identity,
        eventSources: identity,
    };
    var COMPLEX_OPTION_COMPARATORS = {
        headerToolbar: isBoolComplexEqual,
        footerToolbar: isBoolComplexEqual,
        buttonText: isBoolComplexEqual,
        buttonIcons: isBoolComplexEqual,
    };
    function isBoolComplexEqual(a, b) {
        if (typeof a === 'object' && typeof b ===
'object' && a && b) { // both non-null objects
            return isPropsEqual(a, b);
        }
        return a === b;
    }
    // view-specific options
    // ---------------------
    var VIEW_OPTION_REFINERS = {
        type: String,
        component: identity,
        buttonText: String,
        buttonTextKey: String,
        dateProfileGeneratorClass: identity,
        usesMinMaxTime: Boolean,
        classNames: identity,
        content: identity,
        didMount: identity,
        willUnmount: identity,
    };
    // util funcs
    //
----------------------------------------------------------------------------------------------------
    function mergeRawOptions(optionSets) {
        return mergeProps(optionSets, COMPLEX_OPTION_COMPARATORS);
    }
    function refineProps(input, refiners) {
        var refined = {};
        var extra = {};
        for (var propName in refiners) {
            if (propName in input) {
                refined[propName] = refiners[propName](input[propName]);
            }
        }
        for (var propName in input) {
            if (!(propName in refiners)) {
                extra[propName] = input[propName];
            }
        }
        return { refined: refined, extra: extra };
    }
    function identity(raw) {
        return raw;
    }

    function parseEvents(rawEvents, eventSource, context, allowOpenRange) {
        var eventStore = createEmptyEventStore();
        var eventRefiners = buildEventRefiners(context);
        for (var _i = 0, rawEvents_1 = rawEvents; _i <
rawEvents_1.length; _i++) {
            var rawEvent = rawEvents_1[_i];
            var tuple = parseEvent(rawEvent, eventSource, context,
allowOpenRange, eventRefiners);
            if (tuple) {
                eventTupleToStore(tuple, eventStore);
            }
        }
        return eventStore;
    }
    function eventTupleToStore(tuple, eventStore) {
        if (eventStore === void 0) { eventStore = createEmptyEventStore();
}
        eventStore.defs[tuple.def.defId] = tuple.def;
        if (tuple.instance) {
            eventStore.instances[tuple.instance.instanceId] =
tuple.instance;
        }
        return eventStore;
    }
    // retrieves events that have the same groupId as the instance
specified by `instanceId`
    // or they are the same as the instance.
    // why might instanceId not be in the store? an event from another
calendar?
    function getRelevantEvents(eventStore, instanceId) {
        var instance = eventStore.instances[instanceId];
        if (instance) {
            var def_1 = eventStore.defs[instance.defId];
            // get events/instances with same group
            var newStore = filterEventStoreDefs(eventStore, function
(lookDef) { return isEventDefsGrouped(def_1, lookDef); });
            // add the original
            // TODO: wish we could use eventTupleToStore or something like
it
            newStore.defs[def_1.defId] = def_1;
            newStore.instances[instance.instanceId] = instance;
            return newStore;
        }
        return createEmptyEventStore();
    }
    function isEventDefsGrouped(def0, def1) {
        return Boolean(def0.groupId && def0.groupId ===
def1.groupId);
    }
    function createEmptyEventStore() {
        return { defs: {}, instances: {} };
    }
    function mergeEventStores(store0, store1) {
        return {
            defs: __assign(__assign({}, store0.defs), store1.defs),
            instances: __assign(__assign({}, store0.instances),
store1.instances),
        };
    }
    function filterEventStoreDefs(eventStore, filterFunc) {
        var defs = filterHash(eventStore.defs, filterFunc);
        var instances = filterHash(eventStore.instances, function
(instance) { return (defs[instance.defId] // still exists?
        ); });
        return { defs: defs, instances: instances };
    }
    function excludeSubEventStore(master, sub) {
        var defs = master.defs, instances = master.instances;
        var filteredDefs = {};
        var filteredInstances = {};
        for (var defId in defs) {
            if (!sub.defs[defId]) { // not explicitly excluded
                filteredDefs[defId] = defs[defId];
            }
        }
        for (var instanceId in instances) {
            if (!sub.instances[instanceId] && // not explicitly
excluded
                filteredDefs[instances[instanceId].defId] // def
wasn't filtered away
            ) {
                filteredInstances[instanceId] = instances[instanceId];
            }
        }
        return {
            defs: filteredDefs,
            instances: filteredInstances,
        };
    }

    function normalizeConstraint(input, context) {
        if (Array.isArray(input)) {
            return parseEvents(input, null, context, true); //
allowOpenRange=true
        }
        if (typeof input === 'object' && input) { //
non-null object
            return parseEvents([input], null, context, true); //
allowOpenRange=true
        }
        if (input != null) {
            return String(input);
        }
        return null;
    }

    function parseClassNames(raw) {
        if (Array.isArray(raw)) {
            return raw;
        }
        if (typeof raw === 'string') {
            return raw.split(/\s+/);
        }
        return [];
    }

    // TODO: better called "EventSettings" or
"EventConfig"
    // TODO: move this file into structs
    // TODO: separate constraint/overlap/allow, because selection uses only
that, not other props
    var EVENT_UI_REFINERS = {
        display: String,
        editable: Boolean,
        startEditable: Boolean,
        durationEditable: Boolean,
        constraint: identity,
        overlap: identity,
        allow: identity,
        className: parseClassNames,
        classNames: parseClassNames,
        color: String,
        backgroundColor: String,
        borderColor: String,
        textColor: String,
    };
    var EMPTY_EVENT_UI = {
        display: null,
        startEditable: null,
        durationEditable: null,
        constraints: [],
        overlap: null,
        allows: [],
        backgroundColor: '',
        borderColor: '',
        textColor: '',
        classNames: [],
    };
    function createEventUi(refined, context) {
        var constraint = normalizeConstraint(refined.constraint, context);
        return {
            display: refined.display || null,
            startEditable: refined.startEditable != null ?
refined.startEditable : refined.editable,
            durationEditable: refined.durationEditable != null ?
refined.durationEditable : refined.editable,
            constraints: constraint != null ? [constraint] : [],
            overlap: refined.overlap != null ? refined.overlap : null,
            allows: refined.allow != null ? [refined.allow] : [],
            backgroundColor: refined.backgroundColor || refined.color ||
'',
            borderColor: refined.borderColor || refined.color ||
'',
            textColor: refined.textColor || '',
            classNames: (refined.className || []).concat(refined.classNames
|| []),
        };
    }
    // TODO: prevent against problems with <2 args!
    function combineEventUis(uis) {
        return uis.reduce(combineTwoEventUis, EMPTY_EVENT_UI);
    }
    function combineTwoEventUis(item0, item1) {
        return {
            display: item1.display != null ? item1.display : item0.display,
            startEditable: item1.startEditable != null ?
item1.startEditable : item0.startEditable,
            durationEditable: item1.durationEditable != null ?
item1.durationEditable : item0.durationEditable,
            constraints: item0.constraints.concat(item1.constraints),
            overlap: typeof item1.overlap === 'boolean' ?
item1.overlap : item0.overlap,
            allows: item0.allows.concat(item1.allows),
            backgroundColor: item1.backgroundColor ||
item0.backgroundColor,
            borderColor: item1.borderColor || item0.borderColor,
            textColor: item1.textColor || item0.textColor,
            classNames: item0.classNames.concat(item1.classNames),
        };
    }

    var EVENT_NON_DATE_REFINERS = {
        id: String,
        groupId: String,
        title: String,
        url: String,
    };
    var EVENT_DATE_REFINERS = {
        start: identity,
        end: identity,
        date: identity,
        allDay: Boolean,
    };
    var EVENT_REFINERS = __assign(__assign(__assign({},
EVENT_NON_DATE_REFINERS), EVENT_DATE_REFINERS), { extendedProps: identity
});
    function parseEvent(raw, eventSource, context, allowOpenRange,
refiners) {
        if (refiners === void 0) { refiners = buildEventRefiners(context);
}
        var _a = refineEventDef(raw, context, refiners), refined =
_a.refined, extra = _a.extra;
        var defaultAllDay = computeIsDefaultAllDay(eventSource, context);
        var recurringRes = parseRecurring(refined, defaultAllDay,
context.dateEnv, context.pluginHooks.recurringTypes);
        if (recurringRes) {
            var def = parseEventDef(refined, extra, eventSource ?
eventSource.sourceId : '', recurringRes.allDay,
Boolean(recurringRes.duration), context);
            def.recurringDef = {
                typeId: recurringRes.typeId,
                typeData: recurringRes.typeData,
                duration: recurringRes.duration,
            };
            return { def: def, instance: null };
        }
        var singleRes = parseSingle(refined, defaultAllDay, context,
allowOpenRange);
        if (singleRes) {
            var def = parseEventDef(refined, extra, eventSource ?
eventSource.sourceId : '', singleRes.allDay, singleRes.hasEnd,
context);
            var instance = createEventInstance(def.defId, singleRes.range,
singleRes.forcedStartTzo, singleRes.forcedEndTzo);
            return { def: def, instance: instance };
        }
        return null;
    }
    function refineEventDef(raw, context, refiners) {
        if (refiners === void 0) { refiners = buildEventRefiners(context);
}
        return refineProps(raw, refiners);
    }
    function buildEventRefiners(context) {
        return __assign(__assign(__assign({}, EVENT_UI_REFINERS),
EVENT_REFINERS), context.pluginHooks.eventRefiners);
    }
    /*
    Will NOT populate extendedProps with the leftover properties.
    Will NOT populate date-related props.
    */
    function parseEventDef(refined, extra, sourceId, allDay, hasEnd,
context) {
        var def = {
            title: refined.title || '',
            groupId: refined.groupId || '',
            publicId: refined.id || '',
            url: refined.url || '',
            recurringDef: null,
            defId: guid(),
            sourceId: sourceId,
            allDay: allDay,
            hasEnd: hasEnd,
            ui: createEventUi(refined, context),
            extendedProps: __assign(__assign({}, (refined.extendedProps ||
{})), extra),
        };
        for (var _i = 0, _a = context.pluginHooks.eventDefMemberAdders; _i
< _a.length; _i++) {
            var memberAdder = _a[_i];
            __assign(def, memberAdder(refined));
        }
        // help out EventApi from having user modify props
        Object.freeze(def.ui.classNames);
        Object.freeze(def.extendedProps);
        return def;
    }
    function parseSingle(refined, defaultAllDay, context, allowOpenRange) {
        var allDay = refined.allDay;
        var startMeta;
        var startMarker = null;
        var hasEnd = false;
        var endMeta;
        var endMarker = null;
        var startInput = refined.start != null ? refined.start :
refined.date;
        startMeta = context.dateEnv.createMarkerMeta(startInput);
        if (startMeta) {
            startMarker = startMeta.marker;
        }
        else if (!allowOpenRange) {
            return null;
        }
        if (refined.end != null) {
            endMeta = context.dateEnv.createMarkerMeta(refined.end);
        }
        if (allDay == null) {
            if (defaultAllDay != null) {
                allDay = defaultAllDay;
            }
            else {
                // fall back to the date props LAST
                allDay = (!startMeta || startMeta.isTimeUnspecified)
&&
                    (!endMeta || endMeta.isTimeUnspecified);
            }
        }
        if (allDay && startMarker) {
            startMarker = startOfDay(startMarker);
        }
        if (endMeta) {
            endMarker = endMeta.marker;
            if (allDay) {
                endMarker = startOfDay(endMarker);
            }
            if (startMarker && endMarker <= startMarker) {
                endMarker = null;
            }
        }
        if (endMarker) {
            hasEnd = true;
        }
        else if (!allowOpenRange) {
            hasEnd = context.options.forceEventDuration || false;
            endMarker = context.dateEnv.add(startMarker, allDay ?
                context.options.defaultAllDayEventDuration :
                context.options.defaultTimedEventDuration);
        }
        return {
            allDay: allDay,
            hasEnd: hasEnd,
            range: { start: startMarker, end: endMarker },
            forcedStartTzo: startMeta ? startMeta.forcedTzo : null,
            forcedEndTzo: endMeta ? endMeta.forcedTzo : null,
        };
    }
    function computeIsDefaultAllDay(eventSource, context) {
        var res = null;
        if (eventSource) {
            res = eventSource.defaultAllDay;
        }
        if (res == null) {
            res = context.options.defaultAllDay;
        }
        return res;
    }

    /* Date stuff that doesn't belong in datelib core
   
----------------------------------------------------------------------------------------------------------------------*/
    // given a timed range, computes an all-day range that has the same
exact duration,
    // but whose start time is aligned with the start of the day.
    function computeAlignedDayRange(timedRange) {
        var dayCnt = Math.floor(diffDays(timedRange.start, timedRange.end))
|| 1;
        var start = startOfDay(timedRange.start);
        var end = addDays(start, dayCnt);
        return { start: start, end: end };
    }
    // given a timed range, computes an all-day range based on how for the
end date bleeds into the next day
    // TODO: give nextDayThreshold a default arg
    function computeVisibleDayRange(timedRange, nextDayThreshold) {
        if (nextDayThreshold === void 0) { nextDayThreshold =
createDuration(0); }
        var startDay = null;
        var endDay = null;
        if (timedRange.end) {
            endDay = startOfDay(timedRange.end);
            var endTimeMS = timedRange.end.valueOf() - endDay.valueOf(); //
# of milliseconds into `endDay`
            // If the end time is actually inclusively part of the next day
and is equal to or
            // beyond the next day threshold, adjust the end to be the
exclusive end of `endDay`.
            // Otherwise, leaving it as inclusive will cause it to exclude
`endDay`.
            if (endTimeMS && endTimeMS >=
asRoughMs(nextDayThreshold)) {
                endDay = addDays(endDay, 1);
            }
        }
        if (timedRange.start) {
            startDay = startOfDay(timedRange.start); // the beginning of
the day the range starts
            // If end is within `startDay` but not past nextDayThreshold,
assign the default duration of one day.
            if (endDay && endDay <= startDay) {
                endDay = addDays(startDay, 1);
            }
        }
        return { start: startDay, end: endDay };
    }
    // spans from one day into another?
    function isMultiDayRange(range) {
        var visibleRange = computeVisibleDayRange(range);
        return diffDays(visibleRange.start, visibleRange.end) > 1;
    }
    function diffDates(date0, date1, dateEnv, largeUnit) {
        if (largeUnit === 'year') {
            return createDuration(dateEnv.diffWholeYears(date0, date1),
'year');
        }
        if (largeUnit === 'month') {
            return createDuration(dateEnv.diffWholeMonths(date0, date1),
'month');
        }
        return diffDayAndTime(date0, date1); // returns a duration
    }

    function parseRange(input, dateEnv) {
        var start = null;
        var end = null;
        if (input.start) {
            start = dateEnv.createMarker(input.start);
        }
        if (input.end) {
            end = dateEnv.createMarker(input.end);
        }
        if (!start && !end) {
            return null;
        }
        if (start && end && end < start) {
            return null;
        }
        return { start: start, end: end };
    }
    // SIDE-EFFECT: will mutate ranges.
    // Will return a new array result.
    function invertRanges(ranges, constraintRange) {
        var invertedRanges = [];
        var start = constraintRange.start; // the end of the previous
range. the start of the new range
        var i;
        var dateRange;
        // ranges need to be in order. required for our date-walking
algorithm
        ranges.sort(compareRanges);
        for (i = 0; i < ranges.length; i += 1) {
            dateRange = ranges[i];
            // add the span of time before the event (if there is any)
            if (dateRange.start > start) { // compare millisecond time
(skip any ambig logic)
                invertedRanges.push({ start: start, end: dateRange.start
});
            }
            if (dateRange.end > start) {
                start = dateRange.end;
            }
        }
        // add the span of time after the last event (if there is any)
        if (start < constraintRange.end) { // compare millisecond time
(skip any ambig logic)
            invertedRanges.push({ start: start, end: constraintRange.end
});
        }
        return invertedRanges;
    }
    function compareRanges(range0, range1) {
        return range0.start.valueOf() - range1.start.valueOf(); // earlier
ranges go first
    }
    function intersectRanges(range0, range1) {
        var start = range0.start, end = range0.end;
        var newRange = null;
        if (range1.start !== null) {
            if (start === null) {
                start = range1.start;
            }
            else {
                start = new Date(Math.max(start.valueOf(),
range1.start.valueOf()));
            }
        }
        if (range1.end != null) {
            if (end === null) {
                end = range1.end;
            }
            else {
                end = new Date(Math.min(end.valueOf(),
range1.end.valueOf()));
            }
        }
        if (start === null || end === null || start < end) {
            newRange = { start: start, end: end };
        }
        return newRange;
    }
    function rangesEqual(range0, range1) {
        return (range0.start === null ? null : range0.start.valueOf()) ===
(range1.start === null ? null : range1.start.valueOf()) &&
            (range0.end === null ? null : range0.end.valueOf()) ===
(range1.end === null ? null : range1.end.valueOf());
    }
    function rangesIntersect(range0, range1) {
        return (range0.end === null || range1.start === null || range0.end
> range1.start) &&
            (range0.start === null || range1.end === null || range0.start
< range1.end);
    }
    function rangeContainsRange(outerRange, innerRange) {
        return (outerRange.start === null || (innerRange.start !== null
&& innerRange.start >= outerRange.start)) &&
            (outerRange.end === null || (innerRange.end !== null &&
innerRange.end <= outerRange.end));
    }
    function rangeContainsMarker(range, date) {
        return (range.start === null || date >= range.start) &&
            (range.end === null || date < range.end);
    }
    // If the given date is not within the given range, move it inside.
    // (If it's past the end, make it one millisecond before the end).
    function constrainMarkerToRange(date, range) {
        if (range.start != null && date < range.start) {
            return range.start;
        }
        if (range.end != null && date >= range.end) {
            return new Date(range.end.valueOf() - 1);
        }
        return date;
    }

    /*
    Specifying nextDayThreshold signals that all-day ranges should be
sliced.
    */
    function sliceEventStore(eventStore, eventUiBases, framingRange,
nextDayThreshold) {
        var inverseBgByGroupId = {};
        var inverseBgByDefId = {};
        var defByGroupId = {};
        var bgRanges = [];
        var fgRanges = [];
        var eventUis = compileEventUis(eventStore.defs, eventUiBases);
        for (var defId in eventStore.defs) {
            var def = eventStore.defs[defId];
            var ui = eventUis[def.defId];
            if (ui.display === 'inverse-background') {
                if (def.groupId) {
                    inverseBgByGroupId[def.groupId] = [];
                    if (!defByGroupId[def.groupId]) {
                        defByGroupId[def.groupId] = def;
                    }
                }
                else {
                    inverseBgByDefId[defId] = [];
                }
            }
        }
        for (var instanceId in eventStore.instances) {
            var instance = eventStore.instances[instanceId];
            var def = eventStore.defs[instance.defId];
            var ui = eventUis[def.defId];
            var origRange = instance.range;
            var normalRange = (!def.allDay && nextDayThreshold) ?
                computeVisibleDayRange(origRange, nextDayThreshold) :
                origRange;
            var slicedRange = intersectRanges(normalRange, framingRange);
            if (slicedRange) {
                if (ui.display === 'inverse-background') {
                    if (def.groupId) {
                        inverseBgByGroupId[def.groupId].push(slicedRange);
                    }
                    else {
                        inverseBgByDefId[instance.defId].push(slicedRange);
                    }
                }
                else if (ui.display !== 'none') {
                    (ui.display === 'background' ? bgRanges :
fgRanges).push({
                        def: def,
                        ui: ui,
                        instance: instance,
                        range: slicedRange,
                        isStart: normalRange.start &&
normalRange.start.valueOf() === slicedRange.start.valueOf(),
                        isEnd: normalRange.end &&
normalRange.end.valueOf() === slicedRange.end.valueOf(),
                    });
                }
            }
        }
        for (var groupId in inverseBgByGroupId) { // BY GROUP
            var ranges = inverseBgByGroupId[groupId];
            var invertedRanges = invertRanges(ranges, framingRange);
            for (var _i = 0, invertedRanges_1 = invertedRanges; _i <
invertedRanges_1.length; _i++) {
                var invertedRange = invertedRanges_1[_i];
                var def = defByGroupId[groupId];
                var ui = eventUis[def.defId];
                bgRanges.push({
                    def: def,
                    ui: ui,
                    instance: null,
                    range: invertedRange,
                    isStart: false,
                    isEnd: false,
                });
            }
        }
        for (var defId in inverseBgByDefId) {
            var ranges = inverseBgByDefId[defId];
            var invertedRanges = invertRanges(ranges, framingRange);
            for (var _a = 0, invertedRanges_2 = invertedRanges; _a <
invertedRanges_2.length; _a++) {
                var invertedRange = invertedRanges_2[_a];
                bgRanges.push({
                    def: eventStore.defs[defId],
                    ui: eventUis[defId],
                    instance: null,
                    range: invertedRange,
                    isStart: false,
                    isEnd: false,
                });
            }
        }
        return { bg: bgRanges, fg: fgRanges };
    }
    function hasBgRendering(def) {
        return def.ui.display === 'background' || def.ui.display
=== 'inverse-background';
    }
    function setElSeg(el, seg) {
        el.fcSeg = seg;
    }
    function getElSeg(el) {
        return el.fcSeg ||
            el.parentNode.fcSeg || // for the harness
            null;
    }
    // event ui computation
    function compileEventUis(eventDefs, eventUiBases) {
        return mapHash(eventDefs, function (eventDef) { return
compileEventUi(eventDef, eventUiBases); });
    }
    function compileEventUi(eventDef, eventUiBases) {
        var uis = [];
        if (eventUiBases['']) {
            uis.push(eventUiBases['']);
        }
        if (eventUiBases[eventDef.defId]) {
            uis.push(eventUiBases[eventDef.defId]);
        }
        uis.push(eventDef.ui);
        return combineEventUis(uis);
    }
    function sortEventSegs(segs, eventOrderSpecs) {
        var objs = segs.map(buildSegCompareObj);
        objs.sort(function (obj0, obj1) { return compareByFieldSpecs(obj0,
obj1, eventOrderSpecs); });
        return objs.map(function (c) { return c._seg; });
    }
    // returns a object with all primitive props that can be compared
    function buildSegCompareObj(seg) {
        var eventRange = seg.eventRange;
        var eventDef = eventRange.def;
        var range = eventRange.instance ? eventRange.instance.range :
eventRange.range;
        var start = range.start ? range.start.valueOf() : 0; // TODO:
better support for open-range events
        var end = range.end ? range.end.valueOf() : 0; // "
        return __assign(__assign(__assign({}, eventDef.extendedProps),
eventDef), { id: eventDef.publicId, start: start,
            end: end, duration: end - start, allDay:
Number(eventDef.allDay), _seg: seg });
    }
    function computeSegDraggable(seg, context) {
        var pluginHooks = context.pluginHooks;
        var transformers = pluginHooks.isDraggableTransformers;
        var _a = seg.eventRange, def = _a.def, ui = _a.ui;
        var val = ui.startEditable;
        for (var _i = 0, transformers_1 = transformers; _i <
transformers_1.length; _i++) {
            var transformer = transformers_1[_i];
            val = transformer(val, def, ui, context);
        }
        return val;
    }
    function computeSegStartResizable(seg, context) {
        return seg.isStart && seg.eventRange.ui.durationEditable
&& context.options.eventResizableFromStart;
    }
    function computeSegEndResizable(seg, context) {
        return seg.isEnd && seg.eventRange.ui.durationEditable;
    }
    function buildSegTimeText(seg, timeFormat, context,
defaultDisplayEventTime, // defaults to true
    defaultDisplayEventEnd, // defaults to true
    startOverride, endOverride) {
        var dateEnv = context.dateEnv, options = context.options;
        var displayEventTime = options.displayEventTime, displayEventEnd =
options.displayEventEnd;
        var eventDef = seg.eventRange.def;
        var eventInstance = seg.eventRange.instance;
        if (displayEventTime == null) {
            displayEventTime = defaultDisplayEventTime !== false;
        }
        if (displayEventEnd == null) {
            displayEventEnd = defaultDisplayEventEnd !== false;
        }
        if (displayEventTime && !eventDef.allDay &&
(seg.isStart || seg.isEnd)) {
            var segStart = startOverride || (seg.isStart ?
eventInstance.range.start : (seg.start || seg.eventRange.range.start));
            var segEnd = endOverride || (seg.isEnd ?
eventInstance.range.end : (seg.end || seg.eventRange.range.end));
            if (displayEventEnd && eventDef.hasEnd) {
                return dateEnv.formatRange(segStart, segEnd, timeFormat, {
                    forcedStartTzo: startOverride ? null :
eventInstance.forcedStartTzo,
                    forcedEndTzo: endOverride ? null :
eventInstance.forcedEndTzo,
                });
            }
            return dateEnv.format(segStart, timeFormat, {
                forcedTzo: startOverride ? null :
eventInstance.forcedStartTzo,
            });
        }
        return '';
    }
    function getSegMeta(seg, todayRange, nowDate) {
        var segRange = seg.eventRange.range;
        return {
            isPast: segRange.end < (nowDate || todayRange.start),
            isFuture: segRange.start >= (nowDate || todayRange.end),
            isToday: todayRange && rangeContainsMarker(todayRange,
segRange.start),
        };
    }
    function getEventClassNames(props) {
        var classNames = ['fc-event'];
        if (props.isMirror) {
            classNames.push('fc-event-mirror');
        }
        if (props.isDraggable) {
            classNames.push('fc-event-draggable');
        }
        if (props.isStartResizable || props.isEndResizable) {
            classNames.push('fc-event-resizable');
        }
        if (props.isDragging) {
            classNames.push('fc-event-dragging');
        }
        if (props.isResizing) {
            classNames.push('fc-event-resizing');
        }
        if (props.isSelected) {
            classNames.push('fc-event-selected');
        }
        if (props.isStart) {
            classNames.push('fc-event-start');
        }
        if (props.isEnd) {
            classNames.push('fc-event-end');
        }
        if (props.isPast) {
            classNames.push('fc-event-past');
        }
        if (props.isToday) {
            classNames.push('fc-event-today');
        }
        if (props.isFuture) {
            classNames.push('fc-event-future');
        }
        return classNames;
    }
    function buildEventRangeKey(eventRange) {
        return eventRange.instance
            ? eventRange.instance.instanceId
            : eventRange.def.defId + ":" +
eventRange.range.start.toISOString();
        // inverse-background events don't have specific instances.
TODO: better solution
    }

    var STANDARD_PROPS = {
        start: identity,
        end: identity,
        allDay: Boolean,
    };
    function parseDateSpan(raw, dateEnv, defaultDuration) {
        var span = parseOpenDateSpan(raw, dateEnv);
        var range = span.range;
        if (!range.start) {
            return null;
        }
        if (!range.end) {
            if (defaultDuration == null) {
                return null;
            }
            range.end = dateEnv.add(range.start, defaultDuration);
        }
        return span;
    }
    /*
    TODO: somehow combine with parseRange?
    Will return null if the start/end props were present but parsed
invalidly.
    */
    function parseOpenDateSpan(raw, dateEnv) {
        var _a = refineProps(raw, STANDARD_PROPS), standardProps =
_a.refined, extra = _a.extra;
        var startMeta = standardProps.start ?
dateEnv.createMarkerMeta(standardProps.start) : null;
        var endMeta = standardProps.end ?
dateEnv.createMarkerMeta(standardProps.end) : null;
        var allDay = standardProps.allDay;
        if (allDay == null) {
            allDay = (startMeta && startMeta.isTimeUnspecified)
&&
                (!endMeta || endMeta.isTimeUnspecified);
        }
        return __assign({ range: {
                start: startMeta ? startMeta.marker : null,
                end: endMeta ? endMeta.marker : null,
            }, allDay: allDay }, extra);
    }
    function isDateSpansEqual(span0, span1) {
        return rangesEqual(span0.range, span1.range) &&
            span0.allDay === span1.allDay &&
            isSpanPropsEqual(span0, span1);
    }
    // the NON-DATE-RELATED props
    function isSpanPropsEqual(span0, span1) {
        for (var propName in span1) {
            if (propName !== 'range' && propName !==
'allDay') {
                if (span0[propName] !== span1[propName]) {
                    return false;
                }
            }
        }
        // are there any props that span0 has that span1 DOESN'T have?
        // both have range/allDay, so no need to special-case.
        for (var propName in span0) {
            if (!(propName in span1)) {
                return false;
            }
        }
        return true;
    }
    function buildDateSpanApi(span, dateEnv) {
        return __assign(__assign({}, buildRangeApi(span.range, dateEnv,
span.allDay)), { allDay: span.allDay });
    }
    function buildRangeApiWithTimeZone(range, dateEnv, omitTime) {
        return __assign(__assign({}, buildRangeApi(range, dateEnv,
omitTime)), { timeZone: dateEnv.timeZone });
    }
    function buildRangeApi(range, dateEnv, omitTime) {
        return {
            start: dateEnv.toDate(range.start),
            end: dateEnv.toDate(range.end),
            startStr: dateEnv.formatIso(range.start, { omitTime: omitTime
}),
            endStr: dateEnv.formatIso(range.end, { omitTime: omitTime }),
        };
    }
    function fabricateEventRange(dateSpan, eventUiBases, context) {
        var res = refineEventDef({ editable: false }, context);
        var def = parseEventDef(res.refined, res.extra, '', //
sourceId
        dateSpan.allDay, true, // hasEnd
        context);
        return {
            def: def,
            ui: compileEventUi(def, eventUiBases),
            instance: createEventInstance(def.defId, dateSpan.range),
            range: dateSpan.range,
            isStart: true,
            isEnd: true,
        };
    }

    function triggerDateSelect(selection, pev, context) {
        context.emitter.trigger('select', __assign(__assign({},
buildDateSpanApiWithContext(selection, context)), { jsEvent: pev ?
pev.origEvent : null, view: context.viewApi || context.calendarApi.view
}));
    }
    function triggerDateUnselect(pev, context) {
        context.emitter.trigger('unselect', {
            jsEvent: pev ? pev.origEvent : null,
            view: context.viewApi || context.calendarApi.view,
        });
    }
    function buildDateSpanApiWithContext(dateSpan, context) {
        var props = {};
        for (var _i = 0, _a = context.pluginHooks.dateSpanTransforms; _i
< _a.length; _i++) {
            var transform = _a[_i];
            __assign(props, transform(dateSpan, context));
        }
        __assign(props, buildDateSpanApi(dateSpan, context.dateEnv));
        return props;
    }
    // Given an event's allDay status and start date, return what its
fallback end date should be.
    // TODO: rename to computeDefaultEventEnd
    function getDefaultEventEnd(allDay, marker, context) {
        var dateEnv = context.dateEnv, options = context.options;
        var end = marker;
        if (allDay) {
            end = startOfDay(end);
            end = dateEnv.add(end, options.defaultAllDayEventDuration);
        }
        else {
            end = dateEnv.add(end, options.defaultTimedEventDuration);
        }
        return end;
    }

    // applies the mutation to ALL defs/instances within the event store
    function applyMutationToEventStore(eventStore, eventConfigBase,
mutation, context) {
        var eventConfigs = compileEventUis(eventStore.defs,
eventConfigBase);
        var dest = createEmptyEventStore();
        for (var defId in eventStore.defs) {
            var def = eventStore.defs[defId];
            dest.defs[defId] = applyMutationToEventDef(def,
eventConfigs[defId], mutation, context);
        }
        for (var instanceId in eventStore.instances) {
            var instance = eventStore.instances[instanceId];
            var def = dest.defs[instance.defId]; // important to grab the
newly modified def
            dest.instances[instanceId] =
applyMutationToEventInstance(instance, def, eventConfigs[instance.defId],
mutation, context);
        }
        return dest;
    }
    function applyMutationToEventDef(eventDef, eventConfig, mutation,
context) {
        var standardProps = mutation.standardProps || {};
        // if hasEnd has not been specified, guess a good value based on
deltas.
        // if duration will change, there's no way the default
duration will persist,
        // and thus, we need to mark the event as having a real end
        if (standardProps.hasEnd == null &&
            eventConfig.durationEditable &&
            (mutation.startDelta || mutation.endDelta)) {
            standardProps.hasEnd = true; // TODO: is this mutation okay?
        }
        var copy = __assign(__assign(__assign({}, eventDef),
standardProps), { ui: __assign(__assign({}, eventDef.ui), standardProps.ui)
});
        if (mutation.extendedProps) {
            copy.extendedProps = __assign(__assign({}, copy.extendedProps),
mutation.extendedProps);
        }
        for (var _i = 0, _a = context.pluginHooks.eventDefMutationAppliers;
_i < _a.length; _i++) {
            var applier = _a[_i];
            applier(copy, mutation, context);
        }
        if (!copy.hasEnd && context.options.forceEventDuration) {
            copy.hasEnd = true;
        }
        return copy;
    }
    function applyMutationToEventInstance(eventInstance, eventDef, // must
first be modified by applyMutationToEventDef
    eventConfig, mutation, context) {
        var dateEnv = context.dateEnv;
        var forceAllDay = mutation.standardProps &&
mutation.standardProps.allDay === true;
        var clearEnd = mutation.standardProps &&
mutation.standardProps.hasEnd === false;
        var copy = __assign({}, eventInstance);
        if (forceAllDay) {
            copy.range = computeAlignedDayRange(copy.range);
        }
        if (mutation.datesDelta && eventConfig.startEditable) {
            copy.range = {
                start: dateEnv.add(copy.range.start, mutation.datesDelta),
                end: dateEnv.add(copy.range.end, mutation.datesDelta),
            };
        }
        if (mutation.startDelta && eventConfig.durationEditable) {
            copy.range = {
                start: dateEnv.add(copy.range.start, mutation.startDelta),
                end: copy.range.end,
            };
        }
        if (mutation.endDelta && eventConfig.durationEditable) {
            copy.range = {
                start: copy.range.start,
                end: dateEnv.add(copy.range.end, mutation.endDelta),
            };
        }
        if (clearEnd) {
            copy.range = {
                start: copy.range.start,
                end: getDefaultEventEnd(eventDef.allDay, copy.range.start,
context),
            };
        }
        // in case event was all-day but the supplied deltas were not
        // better util for this?
        if (eventDef.allDay) {
            copy.range = {
                start: startOfDay(copy.range.start),
                end: startOfDay(copy.range.end),
            };
        }
        // handle invalid durations
        if (copy.range.end < copy.range.start) {
            copy.range.end = getDefaultEventEnd(eventDef.allDay,
copy.range.start, context);
        }
        return copy;
    }

    // no public types yet. when there are, export from:
    // import {} from './api-type-deps'
    var ViewApi = /** @class */ (function () {
        function ViewApi(type, getCurrentData, dateEnv) {
            this.type = type;
            this.getCurrentData = getCurrentData;
            this.dateEnv = dateEnv;
        }
        Object.defineProperty(ViewApi.prototype, "calendar", {
            get: function () {
                return this.getCurrentData().calendarApi;
            },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(ViewApi.prototype, "title", {
            get: function () {
                return this.getCurrentData().viewTitle;
            },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(ViewApi.prototype, "activeStart", {
            get: function () {
                return
this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.start);
            },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(ViewApi.prototype, "activeEnd", {
            get: function () {
                return
this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.end);
            },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(ViewApi.prototype, "currentStart",
{
            get: function () {
                return
this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.start);
            },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(ViewApi.prototype, "currentEnd", {
            get: function () {
                return
this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.end);
            },
            enumerable: false,
            configurable: true
        });
        ViewApi.prototype.getOption = function (name) {
            return this.getCurrentData().options[name]; // are the
view-specific options
        };
        return ViewApi;
    }());

    var EVENT_SOURCE_REFINERS = {
        id: String,
        defaultAllDay: Boolean,
        url: String,
        format: String,
        events: identity,
        eventDataTransform: identity,
        // for any network-related sources
        success: identity,
        failure: identity,
    };
    function parseEventSource(raw, context, refiners) {
        if (refiners === void 0) { refiners =
buildEventSourceRefiners(context); }
        var rawObj;
        if (typeof raw === 'string') {
            rawObj = { url: raw };
        }
        else if (typeof raw === 'function' || Array.isArray(raw))
{
            rawObj = { events: raw };
        }
        else if (typeof raw === 'object' && raw) { // not
null
            rawObj = raw;
        }
        if (rawObj) {
            var _a = refineProps(rawObj, refiners), refined = _a.refined,
extra = _a.extra;
            var metaRes = buildEventSourceMeta(refined, context);
            if (metaRes) {
                return {
                    _raw: raw,
                    isFetching: false,
                    latestFetchId: '',
                    fetchRange: null,
                    defaultAllDay: refined.defaultAllDay,
                    eventDataTransform: refined.eventDataTransform,
                    success: refined.success,
                    failure: refined.failure,
                    publicId: refined.id || '',
                    sourceId: guid(),
                    sourceDefId: metaRes.sourceDefId,
                    meta: metaRes.meta,
                    ui: createEventUi(refined, context),
                    extendedProps: extra,
                };
            }
        }
        return null;
    }
    function buildEventSourceRefiners(context) {
        return __assign(__assign(__assign({}, EVENT_UI_REFINERS),
EVENT_SOURCE_REFINERS), context.pluginHooks.eventSourceRefiners);
    }
    function buildEventSourceMeta(raw, context) {
        var defs = context.pluginHooks.eventSourceDefs;
        for (var i = defs.length - 1; i >= 0; i -= 1) { // later-added
plugins take precedence
            var def = defs[i];
            var meta = def.parseMeta(raw);
            if (meta) {
                return { sourceDefId: i, meta: meta };
            }
        }
        return null;
    }

    function reduceCurrentDate(currentDate, action) {
        switch (action.type) {
            case 'CHANGE_DATE':
                return action.dateMarker;
            default:
                return currentDate;
        }
    }
    function getInitialDate(options, dateEnv) {
        var initialDateInput = options.initialDate;
        // compute the initial ambig-timezone date
        if (initialDateInput != null) {
            return dateEnv.createMarker(initialDateInput);
        }
        return getNow(options.now, dateEnv); // getNow already returns
unzoned
    }
    function getNow(nowInput, dateEnv) {
        if (typeof nowInput === 'function') {
            nowInput = nowInput();
        }
        if (nowInput == null) {
            return dateEnv.createNowMarker();
        }
        return dateEnv.createMarker(nowInput);
    }

    var CalendarApi = /** @class */ (function () {
        function CalendarApi() {
        }
        CalendarApi.prototype.getCurrentData = function () {
            return this.currentDataManager.getCurrentData();
        };
        CalendarApi.prototype.dispatch = function (action) {
            return this.currentDataManager.dispatch(action);
        };
        Object.defineProperty(CalendarApi.prototype, "view", {
            get: function () { return this.getCurrentData().viewApi; } //
for public API
            ,
            enumerable: false,
            configurable: true
        });
        CalendarApi.prototype.batchRendering = function (callback) {
            callback();
        };
        CalendarApi.prototype.updateSize = function () {
            this.trigger('_resize', true);
        };
        // Options
        //
-----------------------------------------------------------------------------------------------------------------
        CalendarApi.prototype.setOption = function (name, val) {
            this.dispatch({
                type: 'SET_OPTION',
                optionName: name,
                rawOptionValue: val,
            });
        };
        CalendarApi.prototype.getOption = function (name) {
            return
this.currentDataManager.currentCalendarOptionsInput[name];
        };
        CalendarApi.prototype.getAvailableLocaleCodes = function () {
            return Object.keys(this.getCurrentData().availableRawLocales);
        };
        // Trigger
        //
-----------------------------------------------------------------------------------------------------------------
        CalendarApi.prototype.on = function (handlerName, handler) {
            var currentDataManager = this.currentDataManager;
            if
(currentDataManager.currentCalendarOptionsRefiners[handlerName]) {
                currentDataManager.emitter.on(handlerName, handler);
            }
            else {
                console.warn("Unknown listener name '" +
handlerName + "'");
            }
        };
        CalendarApi.prototype.off = function (handlerName, handler) {
            this.currentDataManager.emitter.off(handlerName, handler);
        };
        // not meant for public use
        CalendarApi.prototype.trigger = function (handlerName) {
            var _a;
            var args = [];
            for (var _i = 1; _i < arguments.length; _i++) {
                args[_i - 1] = arguments[_i];
            }
            (_a = this.currentDataManager.emitter).trigger.apply(_a,
__spreadArrays([handlerName], args));
        };
        // View
        //
-----------------------------------------------------------------------------------------------------------------
        CalendarApi.prototype.changeView = function (viewType, dateOrRange)
{
            var _this = this;
            this.batchRendering(function () {
                _this.unselect();
                if (dateOrRange) {
                    if (dateOrRange.start && dateOrRange.end) { //
a range
                        _this.dispatch({
                            type: 'CHANGE_VIEW_TYPE',
                            viewType: viewType,
                        });
                        _this.dispatch({
                            type: 'SET_OPTION',
                            optionName: 'visibleRange',
                            rawOptionValue: dateOrRange,
                        });
                    }
                    else {
                        var dateEnv = _this.getCurrentData().dateEnv;
                        _this.dispatch({
                            type: 'CHANGE_VIEW_TYPE',
                            viewType: viewType,
                            dateMarker: dateEnv.createMarker(dateOrRange),
                        });
                    }
                }
                else {
                    _this.dispatch({
                        type: 'CHANGE_VIEW_TYPE',
                        viewType: viewType,
                    });
                }
            });
        };
        // Forces navigation to a view for the given date.
        // `viewType` can be a specific view name or a generic one like
"week" or "day".
        // needs to change
        CalendarApi.prototype.zoomTo = function (dateMarker, viewType) {
            var state = this.getCurrentData();
            var spec;
            viewType = viewType || 'day'; // day is default zoom
            spec = state.viewSpecs[viewType] ||
this.getUnitViewSpec(viewType);
            this.unselect();
            if (spec) {
                this.dispatch({
                    type: 'CHANGE_VIEW_TYPE',
                    viewType: spec.type,
                    dateMarker: dateMarker,
                });
            }
            else {
                this.dispatch({
                    type: 'CHANGE_DATE',
                    dateMarker: dateMarker,
                });
            }
        };
        // Given a duration singular unit, like "week" or
"day", finds a matching view spec.
        // Preference is given to views that have corresponding buttons.
        CalendarApi.prototype.getUnitViewSpec = function (unit) {
            var _a = this.getCurrentData(), viewSpecs = _a.viewSpecs,
toolbarConfig = _a.toolbarConfig;
            var viewTypes = [].concat(toolbarConfig.viewsWithButtons);
            var i;
            var spec;
            for (var viewType in viewSpecs) {
                viewTypes.push(viewType);
            }
            for (i = 0; i < viewTypes.length; i += 1) {
                spec = viewSpecs[viewTypes[i]];
                if (spec) {
                    if (spec.singleUnit === unit) {
                        return spec;
                    }
                }
            }
            return null;
        };
        // Current Date
        //
-----------------------------------------------------------------------------------------------------------------
        CalendarApi.prototype.prev = function () {
            this.unselect();
            this.dispatch({ type: 'PREV' });
        };
        CalendarApi.prototype.next = function () {
            this.unselect();
            this.dispatch({ type: 'NEXT' });
        };
        CalendarApi.prototype.prevYear = function () {
            var state = this.getCurrentData();
            this.unselect();
            this.dispatch({
                type: 'CHANGE_DATE',
                dateMarker: state.dateEnv.addYears(state.currentDate, -1),
            });
        };
        CalendarApi.prototype.nextYear = function () {
            var state = this.getCurrentData();
            this.unselect();
            this.dispatch({
                type: 'CHANGE_DATE',
                dateMarker: state.dateEnv.addYears(state.currentDate, 1),
            });
        };
        CalendarApi.prototype.today = function () {
            var state = this.getCurrentData();
            this.unselect();
            this.dispatch({
                type: 'CHANGE_DATE',
                dateMarker: getNow(state.calendarOptions.now,
state.dateEnv),
            });
        };
        CalendarApi.prototype.gotoDate = function (zonedDateInput) {
            var state = this.getCurrentData();
            this.unselect();
            this.dispatch({
                type: 'CHANGE_DATE',
                dateMarker: state.dateEnv.createMarker(zonedDateInput),
            });
        };
        CalendarApi.prototype.incrementDate = function (deltaInput) {
            var state = this.getCurrentData();
            var delta = createDuration(deltaInput);
            if (delta) { // else, warn about invalid input?
                this.unselect();
                this.dispatch({
                    type: 'CHANGE_DATE',
                    dateMarker: state.dateEnv.add(state.currentDate,
delta),
                });
            }
        };
        // for external API
        CalendarApi.prototype.getDate = function () {
            var state = this.getCurrentData();
            return state.dateEnv.toDate(state.currentDate);
        };
        // Date Formatting Utils
        //
-----------------------------------------------------------------------------------------------------------------
        CalendarApi.prototype.formatDate = function (d, formatter) {
            var dateEnv = this.getCurrentData().dateEnv;
            return dateEnv.format(dateEnv.createMarker(d),
createFormatter(formatter));
        };
        // `settings` is for formatter AND isEndExclusive
        CalendarApi.prototype.formatRange = function (d0, d1, settings) {
            var dateEnv = this.getCurrentData().dateEnv;
            return dateEnv.formatRange(dateEnv.createMarker(d0),
dateEnv.createMarker(d1), createFormatter(settings), settings);
        };
        CalendarApi.prototype.formatIso = function (d, omitTime) {
            var dateEnv = this.getCurrentData().dateEnv;
            return dateEnv.formatIso(dateEnv.createMarker(d), { omitTime:
omitTime });
        };
        // Date Selection / Event Selection / DayClick
        //
-----------------------------------------------------------------------------------------------------------------
        // this public method receives start/end dates in any format, with
any timezone
        // NOTE: args were changed from v3
        CalendarApi.prototype.select = function (dateOrObj, endDate) {
            var selectionInput;
            if (endDate == null) {
                if (dateOrObj.start != null) {
                    selectionInput = dateOrObj;
                }
                else {
                    selectionInput = {
                        start: dateOrObj,
                        end: null,
                    };
                }
            }
            else {
                selectionInput = {
                    start: dateOrObj,
                    end: endDate,
                };
            }
            var state = this.getCurrentData();
            var selection = parseDateSpan(selectionInput, state.dateEnv,
createDuration({ days: 1 }));
            if (selection) { // throw parse error otherwise?
                this.dispatch({ type: 'SELECT_DATES', selection:
selection });
                triggerDateSelect(selection, null, state);
            }
        };
        // public method
        CalendarApi.prototype.unselect = function (pev) {
            var state = this.getCurrentData();
            if (state.dateSelection) {
                this.dispatch({ type: 'UNSELECT_DATES' });
                triggerDateUnselect(pev, state);
            }
        };
        // Public Events API
        //
-----------------------------------------------------------------------------------------------------------------
        CalendarApi.prototype.addEvent = function (eventInput, sourceInput)
{
            if (eventInput instanceof EventApi) {
                var def = eventInput._def;
                var instance = eventInput._instance;
                var currentData = this.getCurrentData();
                // not already present? don't want to add an old
snapshot
                if (!currentData.eventStore.defs[def.defId]) {
                    this.dispatch({
                        type: 'ADD_EVENTS',
                        eventStore: eventTupleToStore({ def: def, instance:
instance }),
                    });
                    this.triggerEventAdd(eventInput);
                }
                return eventInput;
            }
            var state = this.getCurrentData();
            var eventSource;
            if (sourceInput instanceof EventSourceApi) {
                eventSource = sourceInput.internalEventSource;
            }
            else if (typeof sourceInput === 'boolean') {
                if (sourceInput) { // true. part of the first event source
                    eventSource = hashValuesToArray(state.eventSources)[0];
                }
            }
            else if (sourceInput != null) { // an ID. accepts a number too
                var sourceApi = this.getEventSourceById(sourceInput); //
TODO: use an internal function
                if (!sourceApi) {
                    console.warn("Could not find an event source with
ID \"" + sourceInput + "\""); // TODO: test
                    return null;
                }
                eventSource = sourceApi.internalEventSource;
            }
            var tuple = parseEvent(eventInput, eventSource, state, false);
            if (tuple) {
                var newEventApi = new EventApi(state, tuple.def,
tuple.def.recurringDef ? null : tuple.instance);
                this.dispatch({
                    type: 'ADD_EVENTS',
                    eventStore: eventTupleToStore(tuple),
                });
                this.triggerEventAdd(newEventApi);
                return newEventApi;
            }
            return null;
        };
        CalendarApi.prototype.triggerEventAdd = function (eventApi) {
            var _this = this;
            var emitter = this.getCurrentData().emitter;
            emitter.trigger('eventAdd', {
                event: eventApi,
                relatedEvents: [],
                revert: function () {
                    _this.dispatch({
                        type: 'REMOVE_EVENTS',
                        eventStore: eventApiToStore(eventApi),
                    });
                },
            });
        };
        // TODO: optimize
        CalendarApi.prototype.getEventById = function (id) {
            var state = this.getCurrentData();
            var _a = state.eventStore, defs = _a.defs, instances =
_a.instances;
            id = String(id);
            for (var defId in defs) {
                var def = defs[defId];
                if (def.publicId === id) {
                    if (def.recurringDef) {
                        return new EventApi(state, def, null);
                    }
                    for (var instanceId in instances) {
                        var instance = instances[instanceId];
                        if (instance.defId === def.defId) {
                            return new EventApi(state, def, instance);
                        }
                    }
                }
            }
            return null;
        };
        CalendarApi.prototype.getEvents = function () {
            var currentData = this.getCurrentData();
            return buildEventApis(currentData.eventStore, currentData);
        };
        CalendarApi.prototype.removeAllEvents = function () {
            this.dispatch({ type: 'REMOVE_ALL_EVENTS' });
        };
        // Public Event Sources API
        //
-----------------------------------------------------------------------------------------------------------------
        CalendarApi.prototype.getEventSources = function () {
            var state = this.getCurrentData();
            var sourceHash = state.eventSources;
            var sourceApis = [];
            for (var internalId in sourceHash) {
                sourceApis.push(new EventSourceApi(state,
sourceHash[internalId]));
            }
            return sourceApis;
        };
        CalendarApi.prototype.getEventSourceById = function (id) {
            var state = this.getCurrentData();
            var sourceHash = state.eventSources;
            id = String(id);
            for (var sourceId in sourceHash) {
                if (sourceHash[sourceId].publicId === id) {
                    return new EventSourceApi(state, sourceHash[sourceId]);
                }
            }
            return null;
        };
        CalendarApi.prototype.addEventSource = function (sourceInput) {
            var state = this.getCurrentData();
            if (sourceInput instanceof EventSourceApi) {
                // not already present? don't want to add an old
snapshot
                if
(!state.eventSources[sourceInput.internalEventSource.sourceId]) {
                    this.dispatch({
                        type: 'ADD_EVENT_SOURCES',
                        sources: [sourceInput.internalEventSource],
                    });
                }
                return sourceInput;
            }
            var eventSource = parseEventSource(sourceInput, state);
            if (eventSource) { // TODO: error otherwise?
                this.dispatch({ type: 'ADD_EVENT_SOURCES',
sources: [eventSource] });
                return new EventSourceApi(state, eventSource);
            }
            return null;
        };
        CalendarApi.prototype.removeAllEventSources = function () {
            this.dispatch({ type: 'REMOVE_ALL_EVENT_SOURCES' });
        };
        CalendarApi.prototype.refetchEvents = function () {
            this.dispatch({ type: 'FETCH_EVENT_SOURCES' });
        };
        // Scroll
        //
-----------------------------------------------------------------------------------------------------------------
        CalendarApi.prototype.scrollToTime = function (timeInput) {
            var time = createDuration(timeInput);
            if (time) {
                this.trigger('_scrollRequest', { time: time });
            }
        };
        return CalendarApi;
    }());

    var EventApi = /** @class */ (function () {
        // instance will be null if expressing a recurring event that has
no current instances,
        // OR if trying to validate an incoming external event that has no
dates assigned
        function EventApi(context, def, instance) {
            this._context = context;
            this._def = def;
            this._instance = instance || null;
        }
        /*
        TODO: make event struct more responsible for this
        */
        EventApi.prototype.setProp = function (name, val) {
            var _a, _b;
            if (name in EVENT_DATE_REFINERS) {
                console.warn('Could not set date-related prop
\'name\'. Use one of the date-related methods instead.');
            }
            else if (name in EVENT_NON_DATE_REFINERS) {
                val = EVENT_NON_DATE_REFINERS[name](val);
                this.mutate({
                    standardProps: (_a = {}, _a[name] = val, _a),
                });
            }
            else if (name in EVENT_UI_REFINERS) {
                var ui = EVENT_UI_REFINERS[name](val);
                if (name === 'color') {
                    ui = { backgroundColor: val, borderColor: val };
                }
                else if (name === 'editable') {
                    ui = { startEditable: val, durationEditable: val };
                }
                else {
                    ui = (_b = {}, _b[name] = val, _b);
                }
                this.mutate({
                    standardProps: { ui: ui },
                });
            }
            else {
                console.warn("Could not set prop '" + name +
"'. Use setExtendedProp instead.");
            }
        };
        EventApi.prototype.setExtendedProp = function (name, val) {
            var _a;
            this.mutate({
                extendedProps: (_a = {}, _a[name] = val, _a),
            });
        };
        EventApi.prototype.setStart = function (startInput, options) {
            if (options === void 0) { options = {}; }
            var dateEnv = this._context.dateEnv;
            var start = dateEnv.createMarker(startInput);
            if (start && this._instance) { // TODO: warning if
parsed bad
                var instanceRange = this._instance.range;
                var startDelta = diffDates(instanceRange.start, start,
dateEnv, options.granularity); // what if parsed bad!?
                if (options.maintainDuration) {
                    this.mutate({ datesDelta: startDelta });
                }
                else {
                    this.mutate({ startDelta: startDelta });
                }
            }
        };
        EventApi.prototype.setEnd = function (endInput, options) {
            if (options === void 0) { options = {}; }
            var dateEnv = this._context.dateEnv;
            var end;
            if (endInput != null) {
                end = dateEnv.createMarker(endInput);
                if (!end) {
                    return; // TODO: warning if parsed bad
                }
            }
            if (this._instance) {
                if (end) {
                    var endDelta = diffDates(this._instance.range.end, end,
dateEnv, options.granularity);
                    this.mutate({ endDelta: endDelta });
                }
                else {
                    this.mutate({ standardProps: { hasEnd: false } });
                }
            }
        };
        EventApi.prototype.setDates = function (startInput, endInput,
options) {
            if (options === void 0) { options = {}; }
            var dateEnv = this._context.dateEnv;
            var standardProps = { allDay: options.allDay };
            var start = dateEnv.createMarker(startInput);
            var end;
            if (!start) {
                return; // TODO: warning if parsed bad
            }
            if (endInput != null) {
                end = dateEnv.createMarker(endInput);
                if (!end) { // TODO: warning if parsed bad
                    return;
                }
            }
            if (this._instance) {
                var instanceRange = this._instance.range;
                // when computing the diff for an event being converted to
all-day,
                // compute diff off of the all-day values the way
event-mutation does.
                if (options.allDay === true) {
                    instanceRange = computeAlignedDayRange(instanceRange);
                }
                var startDelta = diffDates(instanceRange.start, start,
dateEnv, options.granularity);
                if (end) {
                    var endDelta = diffDates(instanceRange.end, end,
dateEnv, options.granularity);
                    if (durationsEqual(startDelta, endDelta)) {
                        this.mutate({ datesDelta: startDelta,
standardProps: standardProps });
                    }
                    else {
                        this.mutate({ startDelta: startDelta, endDelta:
endDelta, standardProps: standardProps });
                    }
                }
                else { // means "clear the end"
                    standardProps.hasEnd = false;
                    this.mutate({ datesDelta: startDelta, standardProps:
standardProps });
                }
            }
        };
        EventApi.prototype.moveStart = function (deltaInput) {
            var delta = createDuration(deltaInput);
            if (delta) { // TODO: warning if parsed bad
                this.mutate({ startDelta: delta });
            }
        };
        EventApi.prototype.moveEnd = function (deltaInput) {
            var delta = createDuration(deltaInput);
            if (delta) { // TODO: warning if parsed bad
                this.mutate({ endDelta: delta });
            }
        };
        EventApi.prototype.moveDates = function (deltaInput) {
            var delta = createDuration(deltaInput);
            if (delta) { // TODO: warning if parsed bad
                this.mutate({ datesDelta: delta });
            }
        };
        EventApi.prototype.setAllDay = function (allDay, options) {
            if (options === void 0) { options = {}; }
            var standardProps = { allDay: allDay };
            var maintainDuration = options.maintainDuration;
            if (maintainDuration == null) {
                maintainDuration =
this._context.options.allDayMaintainDuration;
            }
            if (this._def.allDay !== allDay) {
                standardProps.hasEnd = maintainDuration;
            }
            this.mutate({ standardProps: standardProps });
        };
        EventApi.prototype.formatRange = function (formatInput) {
            var dateEnv = this._context.dateEnv;
            var instance = this._instance;
            var formatter = createFormatter(formatInput);
            if (this._def.hasEnd) {
                return dateEnv.formatRange(instance.range.start,
instance.range.end, formatter, {
                    forcedStartTzo: instance.forcedStartTzo,
                    forcedEndTzo: instance.forcedEndTzo,
                });
            }
            return dateEnv.format(instance.range.start, formatter, {
                forcedTzo: instance.forcedStartTzo,
            });
        };
        EventApi.prototype.mutate = function (mutation) {
            var instance = this._instance;
            if (instance) {
                var def = this._def;
                var context_1 = this._context;
                var eventStore_1 = context_1.getCurrentData().eventStore;
                var relevantEvents = getRelevantEvents(eventStore_1,
instance.instanceId);
                var eventConfigBase = {
                    '': {
                        display: '',
                        startEditable: true,
                        durationEditable: true,
                        constraints: [],
                        overlap: null,
                        allows: [],
                        backgroundColor: '',
                        borderColor: '',
                        textColor: '',
                        classNames: [],
                    },
                };
                relevantEvents = applyMutationToEventStore(relevantEvents,
eventConfigBase, mutation, context_1);
                var oldEvent = new EventApi(context_1, def, instance); //
snapshot
                this._def = relevantEvents.defs[def.defId];
                this._instance =
relevantEvents.instances[instance.instanceId];
                context_1.dispatch({
                    type: 'MERGE_EVENTS',
                    eventStore: relevantEvents,
                });
                context_1.emitter.trigger('eventChange', {
                    oldEvent: oldEvent,
                    event: this,
                    relatedEvents: buildEventApis(relevantEvents,
context_1, instance),
                    revert: function () {
                        context_1.dispatch({
                            type: 'RESET_EVENTS',
                            eventStore: eventStore_1,
                        });
                    },
                });
            }
        };
        EventApi.prototype.remove = function () {
            var context = this._context;
            var asStore = eventApiToStore(this);
            context.dispatch({
                type: 'REMOVE_EVENTS',
                eventStore: asStore,
            });
            context.emitter.trigger('eventRemove', {
                event: this,
                relatedEvents: [],
                revert: function () {
                    context.dispatch({
                        type: 'MERGE_EVENTS',
                        eventStore: asStore,
                    });
                },
            });
        };
        Object.defineProperty(EventApi.prototype, "source", {
            get: function () {
                var sourceId = this._def.sourceId;
                if (sourceId) {
                    return new EventSourceApi(this._context,
this._context.getCurrentData().eventSources[sourceId]);
                }
                return null;
            },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(EventApi.prototype, "start", {
            get: function () {
                return this._instance ?
                   
this._context.dateEnv.toDate(this._instance.range.start) :
                    null;
            },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(EventApi.prototype, "end", {
            get: function () {
                return (this._instance && this._def.hasEnd) ?
                    this._context.dateEnv.toDate(this._instance.range.end)
:
                    null;
            },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(EventApi.prototype, "startStr", {
            get: function () {
                var instance = this._instance;
                if (instance) {
                    return
this._context.dateEnv.formatIso(instance.range.start, {
                        omitTime: this._def.allDay,
                        forcedTzo: instance.forcedStartTzo,
                    });
                }
                return '';
            },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(EventApi.prototype, "endStr", {
            get: function () {
                var instance = this._instance;
                if (instance && this._def.hasEnd) {
                    return
this._context.dateEnv.formatIso(instance.range.end, {
                        omitTime: this._def.allDay,
                        forcedTzo: instance.forcedEndTzo,
                    });
                }
                return '';
            },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(EventApi.prototype, "id", {
            // computable props that all access the def
            // TODO: find a TypeScript-compatible way to do this at scale
            get: function () { return this._def.publicId; },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(EventApi.prototype, "groupId", {
            get: function () { return this._def.groupId; },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(EventApi.prototype, "allDay", {
            get: function () { return this._def.allDay; },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(EventApi.prototype, "title", {
            get: function () { return this._def.title; },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(EventApi.prototype, "url", {
            get: function () { return this._def.url; },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(EventApi.prototype, "display", {
            get: function () { return this._def.ui.display ||
'auto'; } // bad. just normalize the type earlier
            ,
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(EventApi.prototype,
"startEditable", {
            get: function () { return this._def.ui.startEditable; },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(EventApi.prototype,
"durationEditable", {
            get: function () { return this._def.ui.durationEditable; },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(EventApi.prototype, "constraint", {
            get: function () { return this._def.ui.constraints[0] || null;
},
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(EventApi.prototype, "overlap", {
            get: function () { return this._def.ui.overlap; },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(EventApi.prototype, "allow", {
            get: function () { return this._def.ui.allows[0] || null; },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(EventApi.prototype,
"backgroundColor", {
            get: function () { return this._def.ui.backgroundColor; },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(EventApi.prototype, "borderColor",
{
            get: function () { return this._def.ui.borderColor; },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(EventApi.prototype, "textColor", {
            get: function () { return this._def.ui.textColor; },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(EventApi.prototype, "classNames", {
            // NOTE: user can't modify these because Object.freeze was
called in event-def parsing
            get: function () { return this._def.ui.classNames; },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(EventApi.prototype,
"extendedProps", {
            get: function () { return this._def.extendedProps; },
            enumerable: false,
            configurable: true
        });
        EventApi.prototype.toPlainObject = function (settings) {
            if (settings === void 0) { settings = {}; }
            var def = this._def;
            var ui = def.ui;
            var _a = this, startStr = _a.startStr, endStr = _a.endStr;
            var res = {};
            if (def.title) {
                res.title = def.title;
            }
            if (startStr) {
                res.start = startStr;
            }
            if (endStr) {
                res.end = endStr;
            }
            if (def.publicId) {
                res.id = def.publicId;
            }
            if (def.groupId) {
                res.groupId = def.groupId;
            }
            if (def.url) {
                res.url = def.url;
            }
            if (ui.display && ui.display !== 'auto') {
                res.display = ui.display;
            }
            // TODO: what about recurring-event properties???
            // TODO: include
startEditable/durationEditable/constraint/overlap/allow
            if (settings.collapseColor && ui.backgroundColor
&& ui.backgroundColor === ui.borderColor) {
                res.color = ui.backgroundColor;
            }
            else {
                if (ui.backgroundColor) {
                    res.backgroundColor = ui.backgroundColor;
                }
                if (ui.borderColor) {
                    res.borderColor = ui.borderColor;
                }
            }
            if (ui.textColor) {
                res.textColor = ui.textColor;
            }
            if (ui.classNames.length) {
                res.classNames = ui.classNames;
            }
            if (Object.keys(def.extendedProps).length) {
                if (settings.collapseExtendedProps) {
                    __assign(res, def.extendedProps);
                }
                else {
                    res.extendedProps = def.extendedProps;
                }
            }
            return res;
        };
        EventApi.prototype.toJSON = function () {
            return this.toPlainObject();
        };
        return EventApi;
    }());
    function eventApiToStore(eventApi) {
        var _a, _b;
        var def = eventApi._def;
        var instance = eventApi._instance;
        return {
            defs: (_a = {}, _a[def.defId] = def, _a),
            instances: instance
                ? (_b = {}, _b[instance.instanceId] = instance, _b) : {},
        };
    }
    function buildEventApis(eventStore, context, excludeInstance) {
        var defs = eventStore.defs, instances = eventStore.instances;
        var eventApis = [];
        var excludeInstanceId = excludeInstance ?
excludeInstance.instanceId : '';
        for (var id in instances) {
            var instance = instances[id];
            var def = defs[instance.defId];
            if (instance.instanceId !== excludeInstanceId) {
                eventApis.push(new EventApi(context, def, instance));
            }
        }
        return eventApis;
    }

    var calendarSystemClassMap = {};
    function registerCalendarSystem(name, theClass) {
        calendarSystemClassMap[name] = theClass;
    }
    function createCalendarSystem(name) {
        return new calendarSystemClassMap[name]();
    }
    var GregorianCalendarSystem = /** @class */ (function () {
        function GregorianCalendarSystem() {
        }
        GregorianCalendarSystem.prototype.getMarkerYear = function (d) {
            return d.getUTCFullYear();
        };
        GregorianCalendarSystem.prototype.getMarkerMonth = function (d) {
            return d.getUTCMonth();
        };
        GregorianCalendarSystem.prototype.getMarkerDay = function (d) {
            return d.getUTCDate();
        };
        GregorianCalendarSystem.prototype.arrayToMarker = function (arr) {
            return arrayToUtcDate(arr);
        };
        GregorianCalendarSystem.prototype.markerToArray = function (marker)
{
            return dateToUtcArray(marker);
        };
        return GregorianCalendarSystem;
    }());
    registerCalendarSystem('gregory', GregorianCalendarSystem);

    var ISO_RE = /^\s*(\d{4})(-?(\d{2})(-?(\d{2})([T
](\d{2}):?(\d{2})(:?(\d{2})(\.(\d+))?)?(Z|(([-+])(\d{2})(:?(\d{2}))?))?)?)?)?$/;
    function parse(str) {
        var m = ISO_RE.exec(str);
        if (m) {
            var marker = new Date(Date.UTC(Number(m[1]), m[3] ?
Number(m[3]) - 1 : 0, Number(m[5] || 1), Number(m[7] || 0), Number(m[8] ||
0), Number(m[10] || 0), m[12] ? Number("0." + m[12]) * 1000 :
0));
            if (isValidDate(marker)) {
                var timeZoneOffset = null;
                if (m[13]) {
                    timeZoneOffset = (m[15] === '-' ? -1 : 1) *
(Number(m[16] || 0) * 60 +
                        Number(m[18] || 0));
                }
                return {
                    marker: marker,
                    isTimeUnspecified: !m[6],
                    timeZoneOffset: timeZoneOffset,
                };
            }
        }
        return null;
    }

    var DateEnv = /** @class */ (function () {
        function DateEnv(settings) {
            var timeZone = this.timeZone = settings.timeZone;
            var isNamedTimeZone = timeZone !== 'local' &&
timeZone !== 'UTC';
            if (settings.namedTimeZoneImpl && isNamedTimeZone) {
                this.namedTimeZoneImpl = new
settings.namedTimeZoneImpl(timeZone);
            }
            this.canComputeOffset = Boolean(!isNamedTimeZone ||
this.namedTimeZoneImpl);
            this.calendarSystem =
createCalendarSystem(settings.calendarSystem);
            this.locale = settings.locale;
            this.weekDow = settings.locale.week.dow;
            this.weekDoy = settings.locale.week.doy;
            if (settings.weekNumberCalculation === 'ISO') {
                this.weekDow = 1;
                this.weekDoy = 4;
            }
            if (typeof settings.firstDay === 'number') {
                this.weekDow = settings.firstDay;
            }
            if (typeof settings.weekNumberCalculation ===
'function') {
                this.weekNumberFunc = settings.weekNumberCalculation;
            }
            this.weekText = settings.weekText != null ? settings.weekText :
settings.locale.options.weekText;
            this.cmdFormatter = settings.cmdFormatter;
            this.defaultSeparator = settings.defaultSeparator;
        }
        // Creating / Parsing
        DateEnv.prototype.createMarker = function (input) {
            var meta = this.createMarkerMeta(input);
            if (meta === null) {
                return null;
            }
            return meta.marker;
        };
        DateEnv.prototype.createNowMarker = function () {
            if (this.canComputeOffset) {
                return this.timestampToMarker(new Date().valueOf());
            }
            // if we can't compute the current date val for a
timezone,
            // better to give the current local date vals than UTC
            return arrayToUtcDate(dateToLocalArray(new Date()));
        };
        DateEnv.prototype.createMarkerMeta = function (input) {
            if (typeof input === 'string') {
                return this.parse(input);
            }
            var marker = null;
            if (typeof input === 'number') {
                marker = this.timestampToMarker(input);
            }
            else if (input instanceof Date) {
                input = input.valueOf();
                if (!isNaN(input)) {
                    marker = this.timestampToMarker(input);
                }
            }
            else if (Array.isArray(input)) {
                marker = arrayToUtcDate(input);
            }
            if (marker === null || !isValidDate(marker)) {
                return null;
            }
            return { marker: marker, isTimeUnspecified: false, forcedTzo:
null };
        };
        DateEnv.prototype.parse = function (s) {
            var parts = parse(s);
            if (parts === null) {
                return null;
            }
            var marker = parts.marker;
            var forcedTzo = null;
            if (parts.timeZoneOffset !== null) {
                if (this.canComputeOffset) {
                    marker = this.timestampToMarker(marker.valueOf() -
parts.timeZoneOffset * 60 * 1000);
                }
                else {
                    forcedTzo = parts.timeZoneOffset;
                }
            }
            return { marker: marker, isTimeUnspecified:
parts.isTimeUnspecified, forcedTzo: forcedTzo };
        };
        // Accessors
        DateEnv.prototype.getYear = function (marker) {
            return this.calendarSystem.getMarkerYear(marker);
        };
        DateEnv.prototype.getMonth = function (marker) {
            return this.calendarSystem.getMarkerMonth(marker);
        };
        // Adding / Subtracting
        DateEnv.prototype.add = function (marker, dur) {
            var a = this.calendarSystem.markerToArray(marker);
            a[0] += dur.years;
            a[1] += dur.months;
            a[2] += dur.days;
            a[6] += dur.milliseconds;
            return this.calendarSystem.arrayToMarker(a);
        };
        DateEnv.prototype.subtract = function (marker, dur) {
            var a = this.calendarSystem.markerToArray(marker);
            a[0] -= dur.years;
            a[1] -= dur.months;
            a[2] -= dur.days;
            a[6] -= dur.milliseconds;
            return this.calendarSystem.arrayToMarker(a);
        };
        DateEnv.prototype.addYears = function (marker, n) {
            var a = this.calendarSystem.markerToArray(marker);
            a[0] += n;
            return this.calendarSystem.arrayToMarker(a);
        };
        DateEnv.prototype.addMonths = function (marker, n) {
            var a = this.calendarSystem.markerToArray(marker);
            a[1] += n;
            return this.calendarSystem.arrayToMarker(a);
        };
        // Diffing Whole Units
        DateEnv.prototype.diffWholeYears = function (m0, m1) {
            var calendarSystem = this.calendarSystem;
            if (timeAsMs(m0) === timeAsMs(m1) &&
                calendarSystem.getMarkerDay(m0) ===
calendarSystem.getMarkerDay(m1) &&
                calendarSystem.getMarkerMonth(m0) ===
calendarSystem.getMarkerMonth(m1)) {
                return calendarSystem.getMarkerYear(m1) -
calendarSystem.getMarkerYear(m0);
            }
            return null;
        };
        DateEnv.prototype.diffWholeMonths = function (m0, m1) {
            var calendarSystem = this.calendarSystem;
            if (timeAsMs(m0) === timeAsMs(m1) &&
                calendarSystem.getMarkerDay(m0) ===
calendarSystem.getMarkerDay(m1)) {
                return (calendarSystem.getMarkerMonth(m1) -
calendarSystem.getMarkerMonth(m0)) +
                    (calendarSystem.getMarkerYear(m1) -
calendarSystem.getMarkerYear(m0)) * 12;
            }
            return null;
        };
        // Range / Duration
        DateEnv.prototype.greatestWholeUnit = function (m0, m1) {
            var n = this.diffWholeYears(m0, m1);
            if (n !== null) {
                return { unit: 'year', value: n };
            }
            n = this.diffWholeMonths(m0, m1);
            if (n !== null) {
                return { unit: 'month', value: n };
            }
            n = diffWholeWeeks(m0, m1);
            if (n !== null) {
                return { unit: 'week', value: n };
            }
            n = diffWholeDays(m0, m1);
            if (n !== null) {
                return { unit: 'day', value: n };
            }
            n = diffHours(m0, m1);
            if (isInt(n)) {
                return { unit: 'hour', value: n };
            }
            n = diffMinutes(m0, m1);
            if (isInt(n)) {
                return { unit: 'minute', value: n };
            }
            n = diffSeconds(m0, m1);
            if (isInt(n)) {
                return { unit: 'second', value: n };
            }
            return { unit: 'millisecond', value: m1.valueOf() -
m0.valueOf() };
        };
        DateEnv.prototype.countDurationsBetween = function (m0, m1, d) {
            // TODO: can use greatestWholeUnit
            var diff;
            if (d.years) {
                diff = this.diffWholeYears(m0, m1);
                if (diff !== null) {
                    return diff / asRoughYears(d);
                }
            }
            if (d.months) {
                diff = this.diffWholeMonths(m0, m1);
                if (diff !== null) {
                    return diff / asRoughMonths(d);
                }
            }
            if (d.days) {
                diff = diffWholeDays(m0, m1);
                if (diff !== null) {
                    return diff / asRoughDays(d);
                }
            }
            return (m1.valueOf() - m0.valueOf()) / asRoughMs(d);
        };
        // Start-Of
        // these DON'T return zoned-dates. only UTC start-of dates
        DateEnv.prototype.startOf = function (m, unit) {
            if (unit === 'year') {
                return this.startOfYear(m);
            }
            if (unit === 'month') {
                return this.startOfMonth(m);
            }
            if (unit === 'week') {
                return this.startOfWeek(m);
            }
            if (unit === 'day') {
                return startOfDay(m);
            }
            if (unit === 'hour') {
                return startOfHour(m);
            }
            if (unit === 'minute') {
                return startOfMinute(m);
            }
            if (unit === 'second') {
                return startOfSecond(m);
            }
            return null;
        };
        DateEnv.prototype.startOfYear = function (m) {
            return this.calendarSystem.arrayToMarker([
                this.calendarSystem.getMarkerYear(m),
            ]);
        };
        DateEnv.prototype.startOfMonth = function (m) {
            return this.calendarSystem.arrayToMarker([
                this.calendarSystem.getMarkerYear(m),
                this.calendarSystem.getMarkerMonth(m),
            ]);
        };
        DateEnv.prototype.startOfWeek = function (m) {
            return this.calendarSystem.arrayToMarker([
                this.calendarSystem.getMarkerYear(m),
                this.calendarSystem.getMarkerMonth(m),
                m.getUTCDate() - ((m.getUTCDay() - this.weekDow + 7) % 7),
            ]);
        };
        // Week Number
        DateEnv.prototype.computeWeekNumber = function (marker) {
            if (this.weekNumberFunc) {
                return this.weekNumberFunc(this.toDate(marker));
            }
            return weekOfYear(marker, this.weekDow, this.weekDoy);
        };
        // TODO: choke on timeZoneName: long
        DateEnv.prototype.format = function (marker, formatter,
dateOptions) {
            if (dateOptions === void 0) { dateOptions = {}; }
            return formatter.format({
                marker: marker,
                timeZoneOffset: dateOptions.forcedTzo != null ?
                    dateOptions.forcedTzo :
                    this.offsetForMarker(marker),
            }, this);
        };
        DateEnv.prototype.formatRange = function (start, end, formatter,
dateOptions) {
            if (dateOptions === void 0) { dateOptions = {}; }
            if (dateOptions.isEndExclusive) {
                end = addMs(end, -1);
            }
            return formatter.formatRange({
                marker: start,
                timeZoneOffset: dateOptions.forcedStartTzo != null ?
                    dateOptions.forcedStartTzo :
                    this.offsetForMarker(start),
            }, {
                marker: end,
                timeZoneOffset: dateOptions.forcedEndTzo != null ?
                    dateOptions.forcedEndTzo :
                    this.offsetForMarker(end),
            }, this, dateOptions.defaultSeparator);
        };
        /*
        DUMB: the omitTime arg is dumb. if we omit the time, we want to
omit the timezone offset. and if we do that,
        might as well use buildIsoString or some other util directly
        */
        DateEnv.prototype.formatIso = function (marker, extraOptions) {
            if (extraOptions === void 0) { extraOptions = {}; }
            var timeZoneOffset = null;
            if (!extraOptions.omitTimeZoneOffset) {
                if (extraOptions.forcedTzo != null) {
                    timeZoneOffset = extraOptions.forcedTzo;
                }
                else {
                    timeZoneOffset = this.offsetForMarker(marker);
                }
            }
            return buildIsoString(marker, timeZoneOffset,
extraOptions.omitTime);
        };
        // TimeZone
        DateEnv.prototype.timestampToMarker = function (ms) {
            if (this.timeZone === 'local') {
                return arrayToUtcDate(dateToLocalArray(new Date(ms)));
            }
            if (this.timeZone === 'UTC' ||
!this.namedTimeZoneImpl) {
                return new Date(ms);
            }
            return
arrayToUtcDate(this.namedTimeZoneImpl.timestampToArray(ms));
        };
        DateEnv.prototype.offsetForMarker = function (m) {
            if (this.timeZone === 'local') {
                return
-arrayToLocalDate(dateToUtcArray(m)).getTimezoneOffset(); // convert
"inverse" offset to "normal" offset
            }
            if (this.timeZone === 'UTC') {
                return 0;
            }
            if (this.namedTimeZoneImpl) {
                return
this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m));
            }
            return null;
        };
        // Conversion
        DateEnv.prototype.toDate = function (m, forcedTzo) {
            if (this.timeZone === 'local') {
                return arrayToLocalDate(dateToUtcArray(m));
            }
            if (this.timeZone === 'UTC') {
                return new Date(m.valueOf()); // make sure it's a copy
            }
            if (!this.namedTimeZoneImpl) {
                return new Date(m.valueOf() - (forcedTzo || 0));
            }
            return new Date(m.valueOf() -
                this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m)) *
1000 * 60);
        };
        return DateEnv;
    }());

    var globalLocales = [];

    var RAW_EN_LOCALE = {
        code: 'en',
        week: {
            dow: 0,
            doy: 4,
        },
        direction: 'ltr',
        buttonText: {
            prev: 'prev',
            next: 'next',
            prevYear: 'prev year',
            nextYear: 'next year',
            year: 'year',
            today: 'today',
            month: 'month',
            week: 'week',
            day: 'day',
            list: 'list',
        },
        weekText: 'W',
        allDayText: 'all-day',
        moreLinkText: 'more',
        noEventsText: 'No events to display',
    };
    function organizeRawLocales(explicitRawLocales) {
        var defaultCode = explicitRawLocales.length > 0 ?
explicitRawLocales[0].code : 'en';
        var allRawLocales = globalLocales.concat(explicitRawLocales);
        var rawLocaleMap = {
            en: RAW_EN_LOCALE,
        };
        for (var _i = 0, allRawLocales_1 = allRawLocales; _i <
allRawLocales_1.length; _i++) {
            var rawLocale = allRawLocales_1[_i];
            rawLocaleMap[rawLocale.code] = rawLocale;
        }
        return {
            map: rawLocaleMap,
            defaultCode: defaultCode,
        };
    }
    function buildLocale(inputSingular, available) {
        if (typeof inputSingular === 'object' &&
!Array.isArray(inputSingular)) {
            return parseLocale(inputSingular.code, [inputSingular.code],
inputSingular);
        }
        return queryLocale(inputSingular, available);
    }
    function queryLocale(codeArg, available) {
        var codes = [].concat(codeArg || []); // will convert to array
        var raw = queryRawLocale(codes, available) || RAW_EN_LOCALE;
        return parseLocale(codeArg, codes, raw);
    }
    function queryRawLocale(codes, available) {
        for (var i = 0; i < codes.length; i += 1) {
            var parts = codes[i].toLocaleLowerCase().split('-');
            for (var j = parts.length; j > 0; j -= 1) {
                var simpleId = parts.slice(0, j).join('-');
                if (available[simpleId]) {
                    return available[simpleId];
                }
            }
        }
        return null;
    }
    function parseLocale(codeArg, codes, raw) {
        var merged = mergeProps([RAW_EN_LOCALE, raw],
['buttonText']);
        delete merged.code; // don't want this part of the options
        var week = merged.week;
        delete merged.week;
        return {
            codeArg: codeArg,
            codes: codes,
            week: week,
            simpleNumberFormat: new Intl.NumberFormat(codeArg),
            options: merged,
        };
    }

    function formatDate(dateInput, options) {
        if (options === void 0) { options = {}; }
        var dateEnv = buildDateEnv(options);
        var formatter = createFormatter(options);
        var dateMeta = dateEnv.createMarkerMeta(dateInput);
        if (!dateMeta) { // TODO: warning?
            return '';
        }
        return dateEnv.format(dateMeta.marker, formatter, {
            forcedTzo: dateMeta.forcedTzo,
        });
    }
    function formatRange(startInput, endInput, options) {
        var dateEnv = buildDateEnv(typeof options === 'object'
&& options ? options : {}); // pass in if non-null object
        var formatter = createFormatter(options);
        var startMeta = dateEnv.createMarkerMeta(startInput);
        var endMeta = dateEnv.createMarkerMeta(endInput);
        if (!startMeta || !endMeta) { // TODO: warning?
            return '';
        }
        return dateEnv.formatRange(startMeta.marker, endMeta.marker,
formatter, {
            forcedStartTzo: startMeta.forcedTzo,
            forcedEndTzo: endMeta.forcedTzo,
            isEndExclusive: options.isEndExclusive,
            defaultSeparator: BASE_OPTION_DEFAULTS.defaultRangeSeparator,
        });
    }
    // TODO: more DRY and optimized
    function buildDateEnv(settings) {
        var locale = buildLocale(settings.locale || 'en',
organizeRawLocales([]).map); // TODO: don't hardcode 'en'
everywhere
        return new DateEnv(__assign(__assign({ timeZone:
BASE_OPTION_DEFAULTS.timeZone, calendarSystem: 'gregory' },
settings), { locale: locale }));
    }

    var DEF_DEFAULTS = {
        startTime: '09:00',
        endTime: '17:00',
        daysOfWeek: [1, 2, 3, 4, 5],
        display: 'inverse-background',
        classNames: 'fc-non-business',
        groupId: '_businessHours',
    };
    /*
    TODO: pass around as EventDefHash!!!
    */
    function parseBusinessHours(input, context) {
        return parseEvents(refineInputs(input), null, context);
    }
    function refineInputs(input) {
        var rawDefs;
        if (input === true) {
            rawDefs = [{}]; // will get DEF_DEFAULTS verbatim
        }
        else if (Array.isArray(input)) {
            // if specifying an array, every sub-definition NEEDS a
day-of-week
            rawDefs = input.filter(function (rawDef) { return
rawDef.daysOfWeek; });
        }
        else if (typeof input === 'object' && input) { //
non-null object
            rawDefs = [input];
        }
        else { // is probably false
            rawDefs = [];
        }
        rawDefs = rawDefs.map(function (rawDef) { return
(__assign(__assign({}, DEF_DEFAULTS), rawDef)); });
        return rawDefs;
    }

    function pointInsideRect(point, rect) {
        return point.left >= rect.left &&
            point.left < rect.right &&
            point.top >= rect.top &&
            point.top < rect.bottom;
    }
    // Returns a new rectangle that is the intersection of the two
rectangles. If they don't intersect, returns false
    function intersectRects(rect1, rect2) {
        var res = {
            left: Math.max(rect1.left, rect2.left),
            right: Math.min(rect1.right, rect2.right),
            top: Math.max(rect1.top, rect2.top),
            bottom: Math.min(rect1.bottom, rect2.bottom),
        };
        if (res.left < res.right && res.top < res.bottom) {
            return res;
        }
        return false;
    }
    function translateRect(rect, deltaX, deltaY) {
        return {
            left: rect.left + deltaX,
            right: rect.right + deltaX,
            top: rect.top + deltaY,
            bottom: rect.bottom + deltaY,
        };
    }
    // Returns a new point that will have been moved to reside within the
given rectangle
    function constrainPoint(point, rect) {
        return {
            left: Math.min(Math.max(point.left, rect.left), rect.right),
            top: Math.min(Math.max(point.top, rect.top), rect.bottom),
        };
    }
    // Returns a point that is the center of the given rectangle
    function getRectCenter(rect) {
        return {
            left: (rect.left + rect.right) / 2,
            top: (rect.top + rect.bottom) / 2,
        };
    }
    // Subtracts point2's coordinates from point1's coordinates,
returning a delta
    function diffPoints(point1, point2) {
        return {
            left: point1.left - point2.left,
            top: point1.top - point2.top,
        };
    }

    var canVGrowWithinCell;
    function getCanVGrowWithinCell() {
        if (canVGrowWithinCell == null) {
            canVGrowWithinCell = computeCanVGrowWithinCell();
        }
        return canVGrowWithinCell;
    }
    function computeCanVGrowWithinCell() {
        // for SSR, because this function is call immediately at top-level
        // TODO: just make this logic execute top-level, immediately,
instead of doing lazily
        if (typeof document === 'undefined') {
            return true;
        }
        var el = document.createElement('div');
        el.style.position = 'absolute';
        el.style.top = '0px';
        el.style.left = '0px';
        el.innerHTML =
'<table><tr><td><div></div></td></tr></table>';
        el.querySelector('table').style.height =
'100px';
        el.querySelector('div').style.height = '100%';
        document.body.appendChild(el);
        var div = el.querySelector('div');
        var possible = div.offsetHeight > 0;
        document.body.removeChild(el);
        return possible;
    }

    var EMPTY_EVENT_STORE = createEmptyEventStore(); // for purecomponents.
TODO: keep elsewhere
    var Splitter = /** @class */ (function () {
        function Splitter() {
            this.getKeysForEventDefs = memoize(this._getKeysForEventDefs);
            this.splitDateSelection = memoize(this._splitDateSpan);
            this.splitEventStore = memoize(this._splitEventStore);
            this.splitIndividualUi = memoize(this._splitIndividualUi);
            this.splitEventDrag = memoize(this._splitInteraction);
            this.splitEventResize = memoize(this._splitInteraction);
            this.eventUiBuilders = {}; // TODO: typescript protection
        }
        Splitter.prototype.splitProps = function (props) {
            var _this = this;
            var keyInfos = this.getKeyInfo(props);
            var defKeys = this.getKeysForEventDefs(props.eventStore);
            var dateSelections =
this.splitDateSelection(props.dateSelection);
            var individualUi = this.splitIndividualUi(props.eventUiBases,
defKeys); // the individual *bases*
            var eventStores = this.splitEventStore(props.eventStore,
defKeys);
            var eventDrags = this.splitEventDrag(props.eventDrag);
            var eventResizes = this.splitEventResize(props.eventResize);
            var splitProps = {};
            this.eventUiBuilders = mapHash(keyInfos, function (info, key) {
return _this.eventUiBuilders[key] || memoize(buildEventUiForKey); });
            for (var key in keyInfos) {
                var keyInfo = keyInfos[key];
                var eventStore = eventStores[key] || EMPTY_EVENT_STORE;
                var buildEventUi = this.eventUiBuilders[key];
                splitProps[key] = {
                    businessHours: keyInfo.businessHours ||
props.businessHours,
                    dateSelection: dateSelections[key] || null,
                    eventStore: eventStore,
                    eventUiBases:
buildEventUi(props.eventUiBases[''], keyInfo.ui,
individualUi[key]),
                    eventSelection:
eventStore.instances[props.eventSelection] ? props.eventSelection :
'',
                    eventDrag: eventDrags[key] || null,
                    eventResize: eventResizes[key] || null,
                };
            }
            return splitProps;
        };
        Splitter.prototype._splitDateSpan = function (dateSpan) {
            var dateSpans = {};
            if (dateSpan) {
                var keys = this.getKeysForDateSpan(dateSpan);
                for (var _i = 0, keys_1 = keys; _i < keys_1.length;
_i++) {
                    var key = keys_1[_i];
                    dateSpans[key] = dateSpan;
                }
            }
            return dateSpans;
        };
        Splitter.prototype._getKeysForEventDefs = function (eventStore) {
            var _this = this;
            return mapHash(eventStore.defs, function (eventDef) { return
_this.getKeysForEventDef(eventDef); });
        };
        Splitter.prototype._splitEventStore = function (eventStore,
defKeys) {
            var defs = eventStore.defs, instances = eventStore.instances;
            var splitStores = {};
            for (var defId in defs) {
                for (var _i = 0, _a = defKeys[defId]; _i < _a.length;
_i++) {
                    var key = _a[_i];
                    if (!splitStores[key]) {
                        splitStores[key] = createEmptyEventStore();
                    }
                    splitStores[key].defs[defId] = defs[defId];
                }
            }
            for (var instanceId in instances) {
                var instance = instances[instanceId];
                for (var _b = 0, _c = defKeys[instance.defId]; _b <
_c.length; _b++) {
                    var key = _c[_b];
                    if (splitStores[key]) { // must have already been
created
                        splitStores[key].instances[instanceId] = instance;
                    }
                }
            }
            return splitStores;
        };
        Splitter.prototype._splitIndividualUi = function (eventUiBases,
defKeys) {
            var splitHashes = {};
            for (var defId in eventUiBases) {
                if (defId) { // not the '' key
                    for (var _i = 0, _a = defKeys[defId]; _i <
_a.length; _i++) {
                        var key = _a[_i];
                        if (!splitHashes[key]) {
                            splitHashes[key] = {};
                        }
                        splitHashes[key][defId] = eventUiBases[defId];
                    }
                }
            }
            return splitHashes;
        };
        Splitter.prototype._splitInteraction = function (interaction) {
            var splitStates = {};
            if (interaction) {
                var affectedStores_1 =
this._splitEventStore(interaction.affectedEvents,
this._getKeysForEventDefs(interaction.affectedEvents));
                // can't rely on defKeys because event data is mutated
                var mutatedKeysByDefId =
this._getKeysForEventDefs(interaction.mutatedEvents);
                var mutatedStores_1 =
this._splitEventStore(interaction.mutatedEvents, mutatedKeysByDefId);
                var populate = function (key) {
                    if (!splitStates[key]) {
                        splitStates[key] = {
                            affectedEvents: affectedStores_1[key] ||
EMPTY_EVENT_STORE,
                            mutatedEvents: mutatedStores_1[key] ||
EMPTY_EVENT_STORE,
                            isEvent: interaction.isEvent,
                        };
                    }
                };
                for (var key in affectedStores_1) {
                    populate(key);
                }
                for (var key in mutatedStores_1) {
                    populate(key);
                }
            }
            return splitStates;
        };
        return Splitter;
    }());
    function buildEventUiForKey(allUi, eventUiForKey, individualUi) {
        var baseParts = [];
        if (allUi) {
            baseParts.push(allUi);
        }
        if (eventUiForKey) {
            baseParts.push(eventUiForKey);
        }
        var stuff = {
            '': combineEventUis(baseParts),
        };
        if (individualUi) {
            __assign(stuff, individualUi);
        }
        return stuff;
    }

    function getDateMeta(date, todayRange, nowDate, dateProfile) {
        return {
            dow: date.getUTCDay(),
            isDisabled: Boolean(dateProfile &&
!rangeContainsMarker(dateProfile.activeRange, date)),
            isOther: Boolean(dateProfile &&
!rangeContainsMarker(dateProfile.currentRange, date)),
            isToday: Boolean(todayRange &&
rangeContainsMarker(todayRange, date)),
            isPast: Boolean(nowDate ? (date < nowDate) : todayRange ?
(date < todayRange.start) : false),
            isFuture: Boolean(nowDate ? (date > nowDate) : todayRange ?
(date >= todayRange.end) : false),
        };
    }
    function getDayClassNames(meta, theme) {
        var classNames = [
            'fc-day',
            "fc-day-" + DAY_IDS[meta.dow],
        ];
        if (meta.isDisabled) {
            classNames.push('fc-day-disabled');
        }
        else {
            if (meta.isToday) {
                classNames.push('fc-day-today');
                classNames.push(theme.getClass('today'));
            }
            if (meta.isPast) {
                classNames.push('fc-day-past');
            }
            if (meta.isFuture) {
                classNames.push('fc-day-future');
            }
            if (meta.isOther) {
                classNames.push('fc-day-other');
            }
        }
        return classNames;
    }
    function getSlotClassNames(meta, theme) {
        var classNames = [
            'fc-slot',
            "fc-slot-" + DAY_IDS[meta.dow],
        ];
        if (meta.isDisabled) {
            classNames.push('fc-slot-disabled');
        }
        else {
            if (meta.isToday) {
                classNames.push('fc-slot-today');
                classNames.push(theme.getClass('today'));
            }
            if (meta.isPast) {
                classNames.push('fc-slot-past');
            }
            if (meta.isFuture) {
                classNames.push('fc-slot-future');
            }
        }
        return classNames;
    }

    function buildNavLinkData(date, type) {
        if (type === void 0) { type = 'day'; }
        return JSON.stringify({
            date: formatDayString(date),
            type: type,
        });
    }

    var _isRtlScrollbarOnLeft = null;
    function getIsRtlScrollbarOnLeft() {
        if (_isRtlScrollbarOnLeft === null) {
            _isRtlScrollbarOnLeft = computeIsRtlScrollbarOnLeft();
        }
        return _isRtlScrollbarOnLeft;
    }
    function computeIsRtlScrollbarOnLeft() {
        var outerEl = document.createElement('div');
        applyStyle(outerEl, {
            position: 'absolute',
            top: -1000,
            left: 0,
            border: 0,
            padding: 0,
            overflow: 'scroll',
            direction: 'rtl',
        });
        outerEl.innerHTML = '<div></div>';
        document.body.appendChild(outerEl);
        var innerEl = outerEl.firstChild;
        var res = innerEl.getBoundingClientRect().left >
outerEl.getBoundingClientRect().left;
        removeElement(outerEl);
        return res;
    }

    var _scrollbarWidths;
    function getScrollbarWidths() {
        if (!_scrollbarWidths) {
            _scrollbarWidths = computeScrollbarWidths();
        }
        return _scrollbarWidths;
    }
    function computeScrollbarWidths() {
        var el = document.createElement('div');
        el.style.overflow = 'scroll';
        el.style.position = 'absolute';
        el.style.top = '-9999px';
        el.style.left = '-9999px';
        document.body.appendChild(el);
        var res = computeScrollbarWidthsForEl(el);
        document.body.removeChild(el);
        return res;
    }
    // WARNING: will include border
    function computeScrollbarWidthsForEl(el) {
        return {
            x: el.offsetHeight - el.clientHeight,
            y: el.offsetWidth - el.clientWidth,
        };
    }

    function computeEdges(el, getPadding) {
        if (getPadding === void 0) { getPadding = false; }
        var computedStyle = window.getComputedStyle(el);
        var borderLeft = parseInt(computedStyle.borderLeftWidth, 10) || 0;
        var borderRight = parseInt(computedStyle.borderRightWidth, 10) ||
0;
        var borderTop = parseInt(computedStyle.borderTopWidth, 10) || 0;
        var borderBottom = parseInt(computedStyle.borderBottomWidth, 10) ||
0;
        var badScrollbarWidths = computeScrollbarWidthsForEl(el); //
includes border!
        var scrollbarLeftRight = badScrollbarWidths.y - borderLeft -
borderRight;
        var scrollbarBottom = badScrollbarWidths.x - borderTop -
borderBottom;
        var res = {
            borderLeft: borderLeft,
            borderRight: borderRight,
            borderTop: borderTop,
            borderBottom: borderBottom,
            scrollbarBottom: scrollbarBottom,
            scrollbarLeft: 0,
            scrollbarRight: 0,
        };
        if (getIsRtlScrollbarOnLeft() && computedStyle.direction
=== 'rtl') { // is the scrollbar on the left side?
            res.scrollbarLeft = scrollbarLeftRight;
        }
        else {
            res.scrollbarRight = scrollbarLeftRight;
        }
        if (getPadding) {
            res.paddingLeft = parseInt(computedStyle.paddingLeft, 10) || 0;
            res.paddingRight = parseInt(computedStyle.paddingRight, 10) ||
0;
            res.paddingTop = parseInt(computedStyle.paddingTop, 10) || 0;
            res.paddingBottom = parseInt(computedStyle.paddingBottom, 10)
|| 0;
        }
        return res;
    }
    function computeInnerRect(el, goWithinPadding, doFromWindowViewport) {
        if (goWithinPadding === void 0) { goWithinPadding = false; }
        var outerRect = doFromWindowViewport ? el.getBoundingClientRect() :
computeRect(el);
        var edges = computeEdges(el, goWithinPadding);
        var res = {
            left: outerRect.left + edges.borderLeft + edges.scrollbarLeft,
            right: outerRect.right - edges.borderRight -
edges.scrollbarRight,
            top: outerRect.top + edges.borderTop,
            bottom: outerRect.bottom - edges.borderBottom -
edges.scrollbarBottom,
        };
        if (goWithinPadding) {
            res.left += edges.paddingLeft;
            res.right -= edges.paddingRight;
            res.top += edges.paddingTop;
            res.bottom -= edges.paddingBottom;
        }
        return res;
    }
    function computeRect(el) {
        var rect = el.getBoundingClientRect();
        return {
            left: rect.left + window.pageXOffset,
            top: rect.top + window.pageYOffset,
            right: rect.right + window.pageXOffset,
            bottom: rect.bottom + window.pageYOffset,
        };
    }
    function computeHeightAndMargins(el) {
        return el.getBoundingClientRect().height + computeVMargins(el);
    }
    function computeVMargins(el) {
        var computed = window.getComputedStyle(el);
        return parseInt(computed.marginTop, 10) +
            parseInt(computed.marginBottom, 10);
    }
    // does not return window
    function getClippingParents(el) {
        var parents = [];
        while (el instanceof HTMLElement) { // will stop when gets to
document or null
            var computedStyle = window.getComputedStyle(el);
            if (computedStyle.position === 'fixed') {
                break;
            }
            if ((/(auto|scroll)/).test(computedStyle.overflow +
computedStyle.overflowY + computedStyle.overflowX)) {
                parents.push(el);
            }
            el = el.parentNode;
        }
        return parents;
    }

    // given a function that resolves a result asynchronously.
    // the function can either call passed-in success and failure
callbacks,
    // or it can return a promise.
    // if you need to pass additional params to func, bind them first.
    function unpromisify(func, success, failure) {
        // guard against success/failure callbacks being called more than
once
        // and guard against a promise AND callback being used together.
        var isResolved = false;
        var wrappedSuccess = function () {
            if (!isResolved) {
                isResolved = true;
                success.apply(this, arguments); // eslint-disable-line
prefer-rest-params
            }
        };
        var wrappedFailure = function () {
            if (!isResolved) {
                isResolved = true;
                if (failure) {
                    failure.apply(this, arguments); // eslint-disable-line
prefer-rest-params
                }
            }
        };
        var res = func(wrappedSuccess, wrappedFailure);
        if (res && typeof res.then === 'function') {
            res.then(wrappedSuccess, wrappedFailure);
        }
    }

    var Emitter = /** @class */ (function () {
        function Emitter() {
            this.handlers = {};
            this.thisContext = null;
        }
        Emitter.prototype.setThisContext = function (thisContext) {
            this.thisContext = thisContext;
        };
        Emitter.prototype.setOptions = function (options) {
            this.options = options;
        };
        Emitter.prototype.on = function (type, handler) {
            addToHash(this.handlers, type, handler);
        };
        Emitter.prototype.off = function (type, handler) {
            removeFromHash(this.handlers, type, handler);
        };
        Emitter.prototype.trigger = function (type) {
            var args = [];
            for (var _i = 1; _i < arguments.length; _i++) {
                args[_i - 1] = arguments[_i];
            }
            var attachedHandlers = this.handlers[type] || [];
            var optionHandler = this.options && this.options[type];
            var handlers = [].concat(optionHandler || [],
attachedHandlers);
            for (var _a = 0, handlers_1 = handlers; _a <
handlers_1.length; _a++) {
                var handler = handlers_1[_a];
                handler.apply(this.thisContext, args);
            }
        };
        Emitter.prototype.hasHandlers = function (type) {
            return (this.handlers[type] &&
this.handlers[type].length) ||
                (this.options && this.options[type]);
        };
        return Emitter;
    }());
    function addToHash(hash, type, handler) {
        (hash[type] || (hash[type] = []))
            .push(handler);
    }
    function removeFromHash(hash, type, handler) {
        if (handler) {
            if (hash[type]) {
                hash[type] = hash[type].filter(function (func) { return
func !== handler; });
            }
        }
        else {
            delete hash[type]; // remove all handler funcs for this type
        }
    }

    /*
    Records offset information for a set of elements, relative to an origin
element.
    Can record the left/right OR the top/bottom OR both.
    Provides methods for querying the cache by position.
    */
    var PositionCache = /** @class */ (function () {
        function PositionCache(originEl, els, isHorizontal, isVertical) {
            this.els = els;
            var originClientRect = this.originClientRect =
originEl.getBoundingClientRect(); // relative to viewport top-left
            if (isHorizontal) {
                this.buildElHorizontals(originClientRect.left);
            }
            if (isVertical) {
                this.buildElVerticals(originClientRect.top);
            }
        }
        // Populates the left/right internal coordinate arrays
        PositionCache.prototype.buildElHorizontals = function
(originClientLeft) {
            var lefts = [];
            var rights = [];
            for (var _i = 0, _a = this.els; _i < _a.length; _i++) {
                var el = _a[_i];
                var rect = el.getBoundingClientRect();
                lefts.push(rect.left - originClientLeft);
                rights.push(rect.right - originClientLeft);
            }
            this.lefts = lefts;
            this.rights = rights;
        };
        // Populates the top/bottom internal coordinate arrays
        PositionCache.prototype.buildElVerticals = function
(originClientTop) {
            var tops = [];
            var bottoms = [];
            for (var _i = 0, _a = this.els; _i < _a.length; _i++) {
                var el = _a[_i];
                var rect = el.getBoundingClientRect();
                tops.push(rect.top - originClientTop);
                bottoms.push(rect.bottom - originClientTop);
            }
            this.tops = tops;
            this.bottoms = bottoms;
        };
        // Given a left offset (from document left), returns the index of
the el that it horizontally intersects.
        // If no intersection is made, returns undefined.
        PositionCache.prototype.leftToIndex = function (leftPosition) {
            var _a = this, lefts = _a.lefts, rights = _a.rights;
            var len = lefts.length;
            var i;
            for (i = 0; i < len; i += 1) {
                if (leftPosition >= lefts[i] && leftPosition
< rights[i]) {
                    return i;
                }
            }
            return undefined; // TODO: better
        };
        // Given a top offset (from document top), returns the index of the
el that it vertically intersects.
        // If no intersection is made, returns undefined.
        PositionCache.prototype.topToIndex = function (topPosition) {
            var _a = this, tops = _a.tops, bottoms = _a.bottoms;
            var len = tops.length;
            var i;
            for (i = 0; i < len; i += 1) {
                if (topPosition >= tops[i] && topPosition <
bottoms[i]) {
                    return i;
                }
            }
            return undefined; // TODO: better
        };
        // Gets the width of the element at the given index
        PositionCache.prototype.getWidth = function (leftIndex) {
            return this.rights[leftIndex] - this.lefts[leftIndex];
        };
        // Gets the height of the element at the given index
        PositionCache.prototype.getHeight = function (topIndex) {
            return this.bottoms[topIndex] - this.tops[topIndex];
        };
        return PositionCache;
    }());

    /* eslint max-classes-per-file: "off" */
    /*
    An object for getting/setting scroll-related information for an
element.
    Internally, this is done very differently for window versus DOM
element,
    so this object serves as a common interface.
    */
    var ScrollController = /** @class */ (function () {
        function ScrollController() {
        }
        ScrollController.prototype.getMaxScrollTop = function () {
            return this.getScrollHeight() - this.getClientHeight();
        };
        ScrollController.prototype.getMaxScrollLeft = function () {
            return this.getScrollWidth() - this.getClientWidth();
        };
        ScrollController.prototype.canScrollVertically = function () {
            return this.getMaxScrollTop() > 0;
        };
        ScrollController.prototype.canScrollHorizontally = function () {
            return this.getMaxScrollLeft() > 0;
        };
        ScrollController.prototype.canScrollUp = function () {
            return this.getScrollTop() > 0;
        };
        ScrollController.prototype.canScrollDown = function () {
            return this.getScrollTop() < this.getMaxScrollTop();
        };
        ScrollController.prototype.canScrollLeft = function () {
            return this.getScrollLeft() > 0;
        };
        ScrollController.prototype.canScrollRight = function () {
            return this.getScrollLeft() < this.getMaxScrollLeft();
        };
        return ScrollController;
    }());
    var ElementScrollController = /** @class */ (function (_super) {
        __extends(ElementScrollController, _super);
        function ElementScrollController(el) {
            var _this = _super.call(this) || this;
            _this.el = el;
            return _this;
        }
        ElementScrollController.prototype.getScrollTop = function () {
            return this.el.scrollTop;
        };
        ElementScrollController.prototype.getScrollLeft = function () {
            return this.el.scrollLeft;
        };
        ElementScrollController.prototype.setScrollTop = function (top) {
            this.el.scrollTop = top;
        };
        ElementScrollController.prototype.setScrollLeft = function (left) {
            this.el.scrollLeft = left;
        };
        ElementScrollController.prototype.getScrollWidth = function () {
            return this.el.scrollWidth;
        };
        ElementScrollController.prototype.getScrollHeight = function () {
            return this.el.scrollHeight;
        };
        ElementScrollController.prototype.getClientHeight = function () {
            return this.el.clientHeight;
        };
        ElementScrollController.prototype.getClientWidth = function () {
            return this.el.clientWidth;
        };
        return ElementScrollController;
    }(ScrollController));
    var WindowScrollController = /** @class */ (function (_super) {
        __extends(WindowScrollController, _super);
        function WindowScrollController() {
            return _super !== null && _super.apply(this, arguments)
|| this;
        }
        WindowScrollController.prototype.getScrollTop = function () {
            return window.pageYOffset;
        };
        WindowScrollController.prototype.getScrollLeft = function () {
            return window.pageXOffset;
        };
        WindowScrollController.prototype.setScrollTop = function (n) {
            window.scroll(window.pageXOffset, n);
        };
        WindowScrollController.prototype.setScrollLeft = function (n) {
            window.scroll(n, window.pageYOffset);
        };
        WindowScrollController.prototype.getScrollWidth = function () {
            return document.documentElement.scrollWidth;
        };
        WindowScrollController.prototype.getScrollHeight = function () {
            return document.documentElement.scrollHeight;
        };
        WindowScrollController.prototype.getClientHeight = function () {
            return document.documentElement.clientHeight;
        };
        WindowScrollController.prototype.getClientWidth = function () {
            return document.documentElement.clientWidth;
        };
        return WindowScrollController;
    }(ScrollController));

    var Theme = /** @class */ (function () {
        function Theme(calendarOptions) {
            if (this.iconOverrideOption) {
               
this.setIconOverride(calendarOptions[this.iconOverrideOption]);
            }
        }
        Theme.prototype.setIconOverride = function (iconOverrideHash) {
            var iconClassesCopy;
            var buttonName;
            if (typeof iconOverrideHash === 'object' &&
iconOverrideHash) { // non-null object
                iconClassesCopy = __assign({}, this.iconClasses);
                for (buttonName in iconOverrideHash) {
                    iconClassesCopy[buttonName] =
this.applyIconOverridePrefix(iconOverrideHash[buttonName]);
                }
                this.iconClasses = iconClassesCopy;
            }
            else if (iconOverrideHash === false) {
                this.iconClasses = {};
            }
        };
        Theme.prototype.applyIconOverridePrefix = function (className) {
            var prefix = this.iconOverridePrefix;
            if (prefix && className.indexOf(prefix) !== 0) { // if
not already present
                className = prefix + className;
            }
            return className;
        };
        Theme.prototype.getClass = function (key) {
            return this.classes[key] || '';
        };
        Theme.prototype.getIconClass = function (buttonName, isRtl) {
            var className;
            if (isRtl && this.rtlIconClasses) {
                className = this.rtlIconClasses[buttonName] ||
this.iconClasses[buttonName];
            }
            else {
                className = this.iconClasses[buttonName];
            }
            if (className) {
                return this.baseIconClass + " " + className;
            }
            return '';
        };
        Theme.prototype.getCustomButtonIconClass = function
(customButtonProps) {
            var className;
            if (this.iconOverrideCustomButtonOption) {
                className =
customButtonProps[this.iconOverrideCustomButtonOption];
                if (className) {
                    return this.baseIconClass + " " +
this.applyIconOverridePrefix(className);
                }
            }
            return '';
        };
        return Theme;
    }());
    Theme.prototype.classes = {};
    Theme.prototype.iconClasses = {};
    Theme.prototype.baseIconClass = '';
    Theme.prototype.iconOverridePrefix = '';

    /// <reference types="@fullcalendar/core-preact" />
    if (typeof FullCalendarVDom === 'undefined') {
        throw new Error('Please import the top-level fullcalendar lib
before attempting to import a plugin.');
    }
    var Component = FullCalendarVDom.Component;
    var createElement = FullCalendarVDom.createElement;
    var render = FullCalendarVDom.render;
    var createRef = FullCalendarVDom.createRef;
    var Fragment = FullCalendarVDom.Fragment;
    var createContext$1 = FullCalendarVDom.createContext;
    var flushToDom$1 = FullCalendarVDom.flushToDom;
    var unmountComponentAtNode$1 = FullCalendarVDom.unmountComponentAtNode;

    var ScrollResponder = /** @class */ (function () {
        function ScrollResponder(execFunc, emitter, scrollTime) {
            var _this = this;
            this.execFunc = execFunc;
            this.emitter = emitter;
            this.scrollTime = scrollTime;
            this.handleScrollRequest = function (request) {
                _this.queuedRequest = __assign({}, _this.queuedRequest ||
{}, request);
                _this.drain();
            };
            emitter.on('_scrollRequest',
this.handleScrollRequest);
            this.fireInitialScroll();
        }
        ScrollResponder.prototype.detach = function () {
            this.emitter.off('_scrollRequest',
this.handleScrollRequest);
        };
        ScrollResponder.prototype.update = function (isDatesNew) {
            if (isDatesNew) {
                this.fireInitialScroll(); // will drain
            }
            else {
                this.drain();
            }
        };
        ScrollResponder.prototype.fireInitialScroll = function () {
            this.handleScrollRequest({
                time: this.scrollTime,
            });
        };
        ScrollResponder.prototype.drain = function () {
            if (this.queuedRequest &&
this.execFunc(this.queuedRequest)) {
                this.queuedRequest = null;
            }
        };
        return ScrollResponder;
    }());

    var ViewContextType = createContext$1({}); // for Components
    function buildViewContext(viewSpec, viewApi, viewOptions,
dateProfileGenerator, dateEnv, theme, pluginHooks, dispatch,
getCurrentData, emitter, calendarApi, registerInteractiveComponent,
unregisterInteractiveComponent) {
        return {
            dateEnv: dateEnv,
            options: viewOptions,
            pluginHooks: pluginHooks,
            emitter: emitter,
            dispatch: dispatch,
            getCurrentData: getCurrentData,
            calendarApi: calendarApi,
            viewSpec: viewSpec,
            viewApi: viewApi,
            dateProfileGenerator: dateProfileGenerator,
            theme: theme,
            isRtl: viewOptions.direction === 'rtl',
            addResizeHandler: function (handler) {
                emitter.on('_resize', handler);
            },
            removeResizeHandler: function (handler) {
                emitter.off('_resize', handler);
            },
            createScrollResponder: function (execFunc) {
                return new ScrollResponder(execFunc, emitter,
createDuration(viewOptions.scrollTime));
            },
            registerInteractiveComponent: registerInteractiveComponent,
            unregisterInteractiveComponent: unregisterInteractiveComponent,
        };
    }

    /* eslint max-classes-per-file: off */
    var PureComponent = /** @class */ (function (_super) {
        __extends(PureComponent, _super);
        function PureComponent() {
            return _super !== null && _super.apply(this, arguments)
|| this;
        }
        PureComponent.prototype.shouldComponentUpdate = function
(nextProps, nextState) {
            if (this.debug) {
                // eslint-disable-next-line no-console
                console.log(getUnequalProps(nextProps, this.props),
getUnequalProps(nextState, this.state));
            }
            return !compareObjs(this.props, nextProps, this.propEquality)
||
                !compareObjs(this.state, nextState, this.stateEquality);
        };
        PureComponent.addPropsEquality = addPropsEquality;
        PureComponent.addStateEquality = addStateEquality;
        PureComponent.contextType = ViewContextType;
        return PureComponent;
    }(Component));
    PureComponent.prototype.propEquality = {};
    PureComponent.prototype.stateEquality = {};
    var BaseComponent = /** @class */ (function (_super) {
        __extends(BaseComponent, _super);
        function BaseComponent() {
            return _super !== null && _super.apply(this, arguments)
|| this;
        }
        BaseComponent.contextType = ViewContextType;
        return BaseComponent;
    }(PureComponent));
    function addPropsEquality(propEquality) {
        var hash = Object.create(this.prototype.propEquality);
        __assign(hash, propEquality);
        this.prototype.propEquality = hash;
    }
    function addStateEquality(stateEquality) {
        var hash = Object.create(this.prototype.stateEquality);
        __assign(hash, stateEquality);
        this.prototype.stateEquality = hash;
    }
    // use other one
    function setRef(ref, current) {
        if (typeof ref === 'function') {
            ref(current);
        }
        else if (ref) {
            // see https://github.com/facebook/react/issues/13029
            ref.current = current;
        }
    }

    function reduceEventStore(eventStore, action, eventSources,
dateProfile, context) {
        switch (action.type) {
            case 'RECEIVE_EVENTS': // raw
                return receiveRawEvents(eventStore,
eventSources[action.sourceId], action.fetchId, action.fetchRange,
action.rawEvents, context);
            case 'ADD_EVENTS': // already parsed, but not
expanded
                return addEvent(eventStore, action.eventStore, // new ones
                dateProfile ? dateProfile.activeRange : null, context);
            case 'RESET_EVENTS':
                return action.eventStore;
            case 'MERGE_EVENTS': // already parsed and expanded
                return mergeEventStores(eventStore, action.eventStore);
            case 'PREV': // TODO: how do we track all actions
that affect dateProfile :(
            case 'NEXT':
            case 'CHANGE_DATE':
            case 'CHANGE_VIEW_TYPE':
                if (dateProfile) {
                    return expandRecurring(eventStore,
dateProfile.activeRange, context);
                }
                return eventStore;
            case 'REMOVE_EVENTS':
                return excludeSubEventStore(eventStore, action.eventStore);
            case 'REMOVE_EVENT_SOURCE':
                return excludeEventsBySourceId(eventStore,
action.sourceId);
            case 'REMOVE_ALL_EVENT_SOURCES':
                return filterEventStoreDefs(eventStore, function (eventDef)
{ return (!eventDef.sourceId // only keep events with no source id
                ); });
            case 'REMOVE_ALL_EVENTS':
                return createEmptyEventStore();
            default:
                return eventStore;
        }
    }
    function receiveRawEvents(eventStore, eventSource, fetchId, fetchRange,
rawEvents, context) {
        if (eventSource && // not already removed
            fetchId === eventSource.latestFetchId // TODO: wish this logic
was always in event-sources
        ) {
            var subset = parseEvents(transformRawEvents(rawEvents,
eventSource, context), eventSource, context);
            if (fetchRange) {
                subset = expandRecurring(subset, fetchRange, context);
            }
            return mergeEventStores(excludeEventsBySourceId(eventStore,
eventSource.sourceId), subset);
        }
        return eventStore;
    }
    function transformRawEvents(rawEvents, eventSource, context) {
        var calEachTransform = context.options.eventDataTransform;
        var sourceEachTransform = eventSource ?
eventSource.eventDataTransform : null;
        if (sourceEachTransform) {
            rawEvents = transformEachRawEvent(rawEvents,
sourceEachTransform);
        }
        if (calEachTransform) {
            rawEvents = transformEachRawEvent(rawEvents, calEachTransform);
        }
        return rawEvents;
    }
    function transformEachRawEvent(rawEvents, func) {
        var refinedEvents;
        if (!func) {
            refinedEvents = rawEvents;
        }
        else {
            refinedEvents = [];
            for (var _i = 0, rawEvents_1 = rawEvents; _i <
rawEvents_1.length; _i++) {
                var rawEvent = rawEvents_1[_i];
                var refinedEvent = func(rawEvent);
                if (refinedEvent) {
                    refinedEvents.push(refinedEvent);
                }
                else if (refinedEvent == null) {
                    refinedEvents.push(rawEvent);
                } // if a different falsy value, do nothing
            }
        }
        return refinedEvents;
    }
    function addEvent(eventStore, subset, expandRange, context) {
        if (expandRange) {
            subset = expandRecurring(subset, expandRange, context);
        }
        return mergeEventStores(eventStore, subset);
    }
    function rezoneEventStoreDates(eventStore, oldDateEnv, newDateEnv) {
        var defs = eventStore.defs;
        var instances = mapHash(eventStore.instances, function (instance) {
            var def = defs[instance.defId];
            if (def.allDay || def.recurringDef) {
                return instance; // isn't dependent on timezone
            }
            return __assign(__assign({}, instance), { range: {
                    start:
newDateEnv.createMarker(oldDateEnv.toDate(instance.range.start,
instance.forcedStartTzo)),
                    end:
newDateEnv.createMarker(oldDateEnv.toDate(instance.range.end,
instance.forcedEndTzo)),
                }, forcedStartTzo: newDateEnv.canComputeOffset ? null :
instance.forcedStartTzo, forcedEndTzo: newDateEnv.canComputeOffset ? null :
instance.forcedEndTzo });
        });
        return { defs: defs, instances: instances };
    }
    function excludeEventsBySourceId(eventStore, sourceId) {
        return filterEventStoreDefs(eventStore, function (eventDef) {
return eventDef.sourceId !== sourceId; });
    }
    // QUESTION: why not just return instances? do a general
object-property-exclusion util
    function excludeInstances(eventStore, removals) {
        return {
            defs: eventStore.defs,
            instances: filterHash(eventStore.instances, function (instance)
{ return !removals[instance.instanceId]; }),
        };
    }

    // high-level segmenting-aware tester functions
    //
------------------------------------------------------------------------------------------------------------------------
    function isInteractionValid(interaction, context) {
        return isNewPropsValid({ eventDrag: interaction }, context); //
HACK: the eventDrag props is used for ALL interactions
    }
    function isDateSelectionValid(dateSelection, context) {
        return isNewPropsValid({ dateSelection: dateSelection }, context);
    }
    function isNewPropsValid(newProps, context) {
        var calendarState = context.getCurrentData();
        var props = __assign({ businessHours: calendarState.businessHours,
dateSelection: '', eventStore: calendarState.eventStore,
eventUiBases: calendarState.eventUiBases, eventSelection: '',
eventDrag: null, eventResize: null }, newProps);
        return (context.pluginHooks.isPropsValid || isPropsValid)(props,
context);
    }
    function isPropsValid(state, context, dateSpanMeta, filterConfig) {
        if (dateSpanMeta === void 0) { dateSpanMeta = {}; }
        if (state.eventDrag && !isInteractionPropsValid(state,
context, dateSpanMeta, filterConfig)) {
            return false;
        }
        if (state.dateSelection &&
!isDateSelectionPropsValid(state, context, dateSpanMeta, filterConfig)) {
            return false;
        }
        return true;
    }
    // Moving Event Validation
    //
------------------------------------------------------------------------------------------------------------------------
    function isInteractionPropsValid(state, context, dateSpanMeta,
filterConfig) {
        var currentState = context.getCurrentData();
        var interaction = state.eventDrag; // HACK: the eventDrag props is
used for ALL interactions
        var subjectEventStore = interaction.mutatedEvents;
        var subjectDefs = subjectEventStore.defs;
        var subjectInstances = subjectEventStore.instances;
        var subjectConfigs = compileEventUis(subjectDefs,
interaction.isEvent ?
            state.eventUiBases :
            { '': currentState.selectionConfig });
        if (filterConfig) {
            subjectConfigs = mapHash(subjectConfigs, filterConfig);
        }
        // exclude the subject events. TODO: exclude defs too?
        var otherEventStore = excludeInstances(state.eventStore,
interaction.affectedEvents.instances);
        var otherDefs = otherEventStore.defs;
        var otherInstances = otherEventStore.instances;
        var otherConfigs = compileEventUis(otherDefs, state.eventUiBases);
        for (var subjectInstanceId in subjectInstances) {
            var subjectInstance = subjectInstances[subjectInstanceId];
            var subjectRange = subjectInstance.range;
            var subjectConfig = subjectConfigs[subjectInstance.defId];
            var subjectDef = subjectDefs[subjectInstance.defId];
            // constraint
            if (!allConstraintsPass(subjectConfig.constraints,
subjectRange, otherEventStore, state.businessHours, context)) {
                return false;
            }
            // overlap
            var eventOverlap = context.options.eventOverlap;
            var eventOverlapFunc = typeof eventOverlap ===
'function' ? eventOverlap : null;
            for (var otherInstanceId in otherInstances) {
                var otherInstance = otherInstances[otherInstanceId];
                // intersect! evaluate
                if (rangesIntersect(subjectRange, otherInstance.range)) {
                    var otherOverlap =
otherConfigs[otherInstance.defId].overlap;
                    // consider the other event's overlap. only do
this if the subject event is a "real" event
                    if (otherOverlap === false &&
interaction.isEvent) {
                        return false;
                    }
                    if (subjectConfig.overlap === false) {
                        return false;
                    }
                    if (eventOverlapFunc && !eventOverlapFunc(new
EventApi(context, otherDefs[otherInstance.defId], otherInstance), // still
event
                    new EventApi(context, subjectDef, subjectInstance))) {
                        return false;
                    }
                }
            }
            // allow (a function)
            var calendarEventStore = currentState.eventStore; // need
global-to-calendar, not local to component (splittable)state
            for (var _i = 0, _a = subjectConfig.allows; _i < _a.length;
_i++) {
                var subjectAllow = _a[_i];
                var subjectDateSpan = __assign(__assign({}, dateSpanMeta),
{ range: subjectInstance.range, allDay: subjectDef.allDay });
                var origDef = calendarEventStore.defs[subjectDef.defId];
                var origInstance =
calendarEventStore.instances[subjectInstanceId];
                var eventApi = void 0;
                if (origDef) { // was previously in the calendar
                    eventApi = new EventApi(context, origDef,
origInstance);
                }
                else { // was an external event
                    eventApi = new EventApi(context, subjectDef); // no
instance, because had no dates
                }
                if
(!subjectAllow(buildDateSpanApiWithContext(subjectDateSpan, context),
eventApi)) {
                    return false;
                }
            }
        }
        return true;
    }
    // Date Selection Validation
    //
------------------------------------------------------------------------------------------------------------------------
    function isDateSelectionPropsValid(state, context, dateSpanMeta,
filterConfig) {
        var relevantEventStore = state.eventStore;
        var relevantDefs = relevantEventStore.defs;
        var relevantInstances = relevantEventStore.instances;
        var selection = state.dateSelection;
        var selectionRange = selection.range;
        var selectionConfig = context.getCurrentData().selectionConfig;
        if (filterConfig) {
            selectionConfig = filterConfig(selectionConfig);
        }
        // constraint
        if (!allConstraintsPass(selectionConfig.constraints,
selectionRange, relevantEventStore, state.businessHours, context)) {
            return false;
        }
        // overlap
        var selectOverlap = context.options.selectOverlap;
        var selectOverlapFunc = typeof selectOverlap ===
'function' ? selectOverlap : null;
        for (var relevantInstanceId in relevantInstances) {
            var relevantInstance = relevantInstances[relevantInstanceId];
            // intersect! evaluate
            if (rangesIntersect(selectionRange, relevantInstance.range)) {
                if (selectionConfig.overlap === false) {
                    return false;
                }
                if (selectOverlapFunc && !selectOverlapFunc(new
EventApi(context, relevantDefs[relevantInstance.defId], relevantInstance),
null)) {
                    return false;
                }
            }
        }
        // allow (a function)
        for (var _i = 0, _a = selectionConfig.allows; _i < _a.length;
_i++) {
            var selectionAllow = _a[_i];
            var fullDateSpan = __assign(__assign({}, dateSpanMeta),
selection);
            if (!selectionAllow(buildDateSpanApiWithContext(fullDateSpan,
context), null)) {
                return false;
            }
        }
        return true;
    }
    // Constraint Utils
    //
------------------------------------------------------------------------------------------------------------------------
    function allConstraintsPass(constraints, subjectRange, otherEventStore,
businessHoursUnexpanded, context) {
        for (var _i = 0, constraints_1 = constraints; _i <
constraints_1.length; _i++) {
            var constraint = constraints_1[_i];
            if (!anyRangesContainRange(constraintToRanges(constraint,
subjectRange, otherEventStore, businessHoursUnexpanded, context),
subjectRange)) {
                return false;
            }
        }
        return true;
    }
    function constraintToRanges(constraint, subjectRange, // for expanding
a recurring constraint, or expanding business hours
    otherEventStore, // for if constraint is an even group ID
    businessHoursUnexpanded, // for if constraint is
'businessHours'
    context) {
        if (constraint === 'businessHours') {
            return
eventStoreToRanges(expandRecurring(businessHoursUnexpanded, subjectRange,
context));
        }
        if (typeof constraint === 'string') { // an group ID
            return eventStoreToRanges(filterEventStoreDefs(otherEventStore,
function (eventDef) { return eventDef.groupId === constraint; }));
        }
        if (typeof constraint === 'object' && constraint)
{ // non-null object
            return eventStoreToRanges(expandRecurring(constraint,
subjectRange, context));
        }
        return []; // if it's false
    }
    // TODO: move to event-store file?
    function eventStoreToRanges(eventStore) {
        var instances = eventStore.instances;
        var ranges = [];
        for (var instanceId in instances) {
            ranges.push(instances[instanceId].range);
        }
        return ranges;
    }
    // TODO: move to geom file?
    function anyRangesContainRange(outerRanges, innerRange) {
        for (var _i = 0, outerRanges_1 = outerRanges; _i <
outerRanges_1.length; _i++) {
            var outerRange = outerRanges_1[_i];
            if (rangeContainsRange(outerRange, innerRange)) {
                return true;
            }
        }
        return false;
    }

    /*
    an INTERACTABLE date component

    PURPOSES:
    - hook up to fg, fill, and mirror renderers
    - interface for dragging and hits
    */
    var DateComponent = /** @class */ (function (_super) {
        __extends(DateComponent, _super);
        function DateComponent() {
            var _this = _super !== null && _super.apply(this,
arguments) || this;
            _this.uid = guid();
            return _this;
        }
        // Hit System
        //
-----------------------------------------------------------------------------------------------------------------
        DateComponent.prototype.prepareHits = function () {
        };
        DateComponent.prototype.queryHit = function (positionLeft,
positionTop, elWidth, elHeight) {
            return null; // this should be abstract
        };
        // Validation
        //
-----------------------------------------------------------------------------------------------------------------
        DateComponent.prototype.isInteractionValid = function (interaction)
{
            var dateProfile = this.props.dateProfile; // HACK
            var instances = interaction.mutatedEvents.instances;
            if (dateProfile) { // HACK for MorePopover
                for (var instanceId in instances) {
                    if (!rangeContainsRange(dateProfile.validRange,
instances[instanceId].range)) {
                        return false;
                    }
                }
            }
            return isInteractionValid(interaction, this.context);
        };
        DateComponent.prototype.isDateSelectionValid = function (selection)
{
            var dateProfile = this.props.dateProfile; // HACK
            if (dateProfile && // HACK for MorePopover
                !rangeContainsRange(dateProfile.validRange,
selection.range)) {
                return false;
            }
            return isDateSelectionValid(selection, this.context);
        };
        // Pointer Interaction Utils
        //
-----------------------------------------------------------------------------------------------------------------
        DateComponent.prototype.isValidSegDownEl = function (el) {
            return !this.props.eventDrag && // HACK
                !this.props.eventResize && // HACK
                !elementClosest(el, '.fc-event-mirror');
        };
        DateComponent.prototype.isValidDateDownEl = function (el) {
            return !elementClosest(el,
'.fc-event:not(.fc-bg-event)') &&
                !elementClosest(el, '.fc-daygrid-more-link')
&& // a "more.." link
                !elementClosest(el, 'a[data-navlink]') &&
// a clickable nav link
                !elementClosest(el, '.fc-popover'); // hack
        };
        return DateComponent;
    }(BaseComponent));

    // TODO: easier way to add new hooks? need to update a million things
    function createPlugin(input) {
        return {
            id: guid(),
            deps: input.deps || [],
            reducers: input.reducers || [],
            isLoadingFuncs: input.isLoadingFuncs || [],
            contextInit: [].concat(input.contextInit || []),
            eventRefiners: input.eventRefiners || {},
            eventDefMemberAdders: input.eventDefMemberAdders || [],
            eventSourceRefiners: input.eventSourceRefiners || {},
            isDraggableTransformers: input.isDraggableTransformers || [],
            eventDragMutationMassagers: input.eventDragMutationMassagers ||
[],
            eventDefMutationAppliers: input.eventDefMutationAppliers || [],
            dateSelectionTransformers: input.dateSelectionTransformers ||
[],
            datePointTransforms: input.datePointTransforms || [],
            dateSpanTransforms: input.dateSpanTransforms || [],
            views: input.views || {},
            viewPropsTransformers: input.viewPropsTransformers || [],
            isPropsValid: input.isPropsValid || null,
            externalDefTransforms: input.externalDefTransforms || [],
            eventResizeJoinTransforms: input.eventResizeJoinTransforms ||
[],
            viewContainerAppends: input.viewContainerAppends || [],
            eventDropTransformers: input.eventDropTransformers || [],
            componentInteractions: input.componentInteractions || [],
            calendarInteractions: input.calendarInteractions || [],
            themeClasses: input.themeClasses || {},
            eventSourceDefs: input.eventSourceDefs || [],
            cmdFormatter: input.cmdFormatter,
            recurringTypes: input.recurringTypes || [],
            namedTimeZonedImpl: input.namedTimeZonedImpl,
            initialView: input.initialView || '',
            elementDraggingImpl: input.elementDraggingImpl,
            optionChangeHandlers: input.optionChangeHandlers || {},
            scrollGridImpl: input.scrollGridImpl || null,
            contentTypeHandlers: input.contentTypeHandlers || {},
            listenerRefiners: input.listenerRefiners || {},
            optionRefiners: input.optionRefiners || {},
            propSetHandlers: input.propSetHandlers || {},
        };
    }
    function buildPluginHooks(pluginDefs, globalDefs) {
        var isAdded = {};
        var hooks = {
            reducers: [],
            isLoadingFuncs: [],
            contextInit: [],
            eventRefiners: {},
            eventDefMemberAdders: [],
            eventSourceRefiners: {},
            isDraggableTransformers: [],
            eventDragMutationMassagers: [],
            eventDefMutationAppliers: [],
            dateSelectionTransformers: [],
            datePointTransforms: [],
            dateSpanTransforms: [],
            views: {},
            viewPropsTransformers: [],
            isPropsValid: null,
            externalDefTransforms: [],
            eventResizeJoinTransforms: [],
            viewContainerAppends: [],
            eventDropTransformers: [],
            componentInteractions: [],
            calendarInteractions: [],
            themeClasses: {},
            eventSourceDefs: [],
            cmdFormatter: null,
            recurringTypes: [],
            namedTimeZonedImpl: null,
            initialView: '',
            elementDraggingImpl: null,
            optionChangeHandlers: {},
            scrollGridImpl: null,
            contentTypeHandlers: {},
            listenerRefiners: {},
            optionRefiners: {},
            propSetHandlers: {},
        };
        function addDefs(defs) {
            for (var _i = 0, defs_1 = defs; _i < defs_1.length; _i++) {
                var def = defs_1[_i];
                if (!isAdded[def.id]) {
                    isAdded[def.id] = true;
                    addDefs(def.deps);
                    hooks = combineHooks(hooks, def);
                }
            }
        }
        if (pluginDefs) {
            addDefs(pluginDefs);
        }
        addDefs(globalDefs);
        return hooks;
    }
    function buildBuildPluginHooks() {
        var currentOverrideDefs = [];
        var currentGlobalDefs = [];
        var currentHooks;
        return function (overrideDefs, globalDefs) {
            if (!currentHooks || !isArraysEqual(overrideDefs,
currentOverrideDefs) || !isArraysEqual(globalDefs, currentGlobalDefs)) {
                currentHooks = buildPluginHooks(overrideDefs, globalDefs);
            }
            currentOverrideDefs = overrideDefs;
            currentGlobalDefs = globalDefs;
            return currentHooks;
        };
    }
    function combineHooks(hooks0, hooks1) {
        return {
            reducers: hooks0.reducers.concat(hooks1.reducers),
            isLoadingFuncs:
hooks0.isLoadingFuncs.concat(hooks1.isLoadingFuncs),
            contextInit: hooks0.contextInit.concat(hooks1.contextInit),
            eventRefiners: __assign(__assign({}, hooks0.eventRefiners),
hooks1.eventRefiners),
            eventDefMemberAdders:
hooks0.eventDefMemberAdders.concat(hooks1.eventDefMemberAdders),
            eventSourceRefiners: __assign(__assign({},
hooks0.eventSourceRefiners), hooks1.eventSourceRefiners),
            isDraggableTransformers:
hooks0.isDraggableTransformers.concat(hooks1.isDraggableTransformers),
            eventDragMutationMassagers:
hooks0.eventDragMutationMassagers.concat(hooks1.eventDragMutationMassagers),
            eventDefMutationAppliers:
hooks0.eventDefMutationAppliers.concat(hooks1.eventDefMutationAppliers),
            dateSelectionTransformers:
hooks0.dateSelectionTransformers.concat(hooks1.dateSelectionTransformers),
            datePointTransforms:
hooks0.datePointTransforms.concat(hooks1.datePointTransforms),
            dateSpanTransforms:
hooks0.dateSpanTransforms.concat(hooks1.dateSpanTransforms),
            views: __assign(__assign({}, hooks0.views), hooks1.views),
            viewPropsTransformers:
hooks0.viewPropsTransformers.concat(hooks1.viewPropsTransformers),
            isPropsValid: hooks1.isPropsValid || hooks0.isPropsValid,
            externalDefTransforms:
hooks0.externalDefTransforms.concat(hooks1.externalDefTransforms),
            eventResizeJoinTransforms:
hooks0.eventResizeJoinTransforms.concat(hooks1.eventResizeJoinTransforms),
            viewContainerAppends:
hooks0.viewContainerAppends.concat(hooks1.viewContainerAppends),
            eventDropTransformers:
hooks0.eventDropTransformers.concat(hooks1.eventDropTransformers),
            calendarInteractions:
hooks0.calendarInteractions.concat(hooks1.calendarInteractions),
            componentInteractions:
hooks0.componentInteractions.concat(hooks1.componentInteractions),
            themeClasses: __assign(__assign({}, hooks0.themeClasses),
hooks1.themeClasses),
            eventSourceDefs:
hooks0.eventSourceDefs.concat(hooks1.eventSourceDefs),
            cmdFormatter: hooks1.cmdFormatter || hooks0.cmdFormatter,
            recurringTypes:
hooks0.recurringTypes.concat(hooks1.recurringTypes),
            namedTimeZonedImpl: hooks1.namedTimeZonedImpl ||
hooks0.namedTimeZonedImpl,
            initialView: hooks0.initialView || hooks1.initialView,
            elementDraggingImpl: hooks0.elementDraggingImpl ||
hooks1.elementDraggingImpl,
            optionChangeHandlers: __assign(__assign({},
hooks0.optionChangeHandlers), hooks1.optionChangeHandlers),
            scrollGridImpl: hooks1.scrollGridImpl || hooks0.scrollGridImpl,
            contentTypeHandlers: __assign(__assign({},
hooks0.contentTypeHandlers), hooks1.contentTypeHandlers),
            listenerRefiners: __assign(__assign({},
hooks0.listenerRefiners), hooks1.listenerRefiners),
            optionRefiners: __assign(__assign({}, hooks0.optionRefiners),
hooks1.optionRefiners),
            propSetHandlers: __assign(__assign({}, hooks0.propSetHandlers),
hooks1.propSetHandlers),
        };
    }

    var StandardTheme = /** @class */ (function (_super) {
        __extends(StandardTheme, _super);
        function StandardTheme() {
            return _super !== null && _super.apply(this, arguments)
|| this;
        }
        return StandardTheme;
    }(Theme));
    StandardTheme.prototype.classes = {
        root: 'fc-theme-standard',
        tableCellShaded: 'fc-cell-shaded',
        buttonGroup: 'fc-button-group',
        button: 'fc-button fc-button-primary',
        buttonActive: 'fc-button-active',
    };
    StandardTheme.prototype.baseIconClass = 'fc-icon';
    StandardTheme.prototype.iconClasses = {
        close: 'fc-icon-x',
        prev: 'fc-icon-chevron-left',
        next: 'fc-icon-chevron-right',
        prevYear: 'fc-icon-chevrons-left',
        nextYear: 'fc-icon-chevrons-right',
    };
    StandardTheme.prototype.rtlIconClasses = {
        prev: 'fc-icon-chevron-right',
        next: 'fc-icon-chevron-left',
        prevYear: 'fc-icon-chevrons-right',
        nextYear: 'fc-icon-chevrons-left',
    };
    StandardTheme.prototype.iconOverrideOption = 'buttonIcons';
// TODO: make TS-friendly
    StandardTheme.prototype.iconOverrideCustomButtonOption =
'icon';
    StandardTheme.prototype.iconOverridePrefix = 'fc-icon-';

    function compileViewDefs(defaultConfigs, overrideConfigs) {
        var hash = {};
        var viewType;
        for (viewType in defaultConfigs) {
            ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs);
        }
        for (viewType in overrideConfigs) {
            ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs);
        }
        return hash;
    }
    function ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs)
{
        if (hash[viewType]) {
            return hash[viewType];
        }
        var viewDef = buildViewDef(viewType, hash, defaultConfigs,
overrideConfigs);
        if (viewDef) {
            hash[viewType] = viewDef;
        }
        return viewDef;
    }
    function buildViewDef(viewType, hash, defaultConfigs, overrideConfigs)
{
        var defaultConfig = defaultConfigs[viewType];
        var overrideConfig = overrideConfigs[viewType];
        var queryProp = function (name) { return ((defaultConfig &&
defaultConfig[name] !== null) ? defaultConfig[name] :
            ((overrideConfig && overrideConfig[name] !== null) ?
overrideConfig[name] : null)); };
        var theComponent = queryProp('component');
        var superType = queryProp('superType');
        var superDef = null;
        if (superType) {
            if (superType === viewType) {
                throw new Error('Can\'t have a custom view type
that references itself');
            }
            superDef = ensureViewDef(superType, hash, defaultConfigs,
overrideConfigs);
        }
        if (!theComponent && superDef) {
            theComponent = superDef.component;
        }
        if (!theComponent) {
            return null; // don't throw a warning, might be settings
for a single-unit view
        }
        return {
            type: viewType,
            component: theComponent,
            defaults: __assign(__assign({}, (superDef ? superDef.defaults :
{})), (defaultConfig ? defaultConfig.rawOptions : {})),
            overrides: __assign(__assign({}, (superDef ? superDef.overrides
: {})), (overrideConfig ? overrideConfig.rawOptions : {})),
        };
    }

    /* eslint max-classes-per-file: off */
    // NOTE: in JSX, you should always use this class with
<HookProps> arg. otherwise, will default to any???
    var RenderHook = /** @class */ (function (_super) {
        __extends(RenderHook, _super);
        function RenderHook() {
            var _this = _super !== null && _super.apply(this,
arguments) || this;
            _this.rootElRef = createRef();
            _this.handleRootEl = function (el) {
                setRef(_this.rootElRef, el);
                if (_this.props.elRef) {
                    setRef(_this.props.elRef, el);
                }
            };
            return _this;
        }
        RenderHook.prototype.render = function () {
            var _this = this;
            var props = this.props;
            var hookProps = props.hookProps;
            return (createElement(MountHook, { hookProps: hookProps,
didMount: props.didMount, willUnmount: props.willUnmount, elRef:
this.handleRootEl }, function (rootElRef) { return
(createElement(ContentHook, { hookProps: hookProps, content: props.content,
defaultContent: props.defaultContent, backupElRef: _this.rootElRef },
function (innerElRef, innerContent) { return props.children(rootElRef,
normalizeClassNames(props.classNames, hookProps), innerElRef,
innerContent); })); }));
        };
        return RenderHook;
    }(BaseComponent));
    // TODO: rename to be about function, not default. use in above type
    // for forcing rerender of components that use the ContentHook
    var CustomContentRenderContext = createContext$1(0);
    function ContentHook(props) {
        return (createElement(CustomContentRenderContext.Consumer, null,
function (renderId) { return (createElement(ContentHookInner, __assign({
renderId: renderId }, props))); }));
    }
    var ContentHookInner = /** @class */ (function (_super) {
        __extends(ContentHookInner, _super);
        function ContentHookInner() {
            var _this = _super !== null && _super.apply(this,
arguments) || this;
            _this.innerElRef = createRef();
            return _this;
        }
        ContentHookInner.prototype.render = function () {
            return this.props.children(this.innerElRef,
this.renderInnerContent());
        };
        ContentHookInner.prototype.componentDidMount = function () {
            this.updateCustomContent();
        };
        ContentHookInner.prototype.componentDidUpdate = function () {
            this.updateCustomContent();
        };
        ContentHookInner.prototype.componentWillUnmount = function () {
            if (this.customContentInfo &&
this.customContentInfo.destroy) {
                this.customContentInfo.destroy();
            }
        };
        ContentHookInner.prototype.renderInnerContent = function () {
            var contentTypeHandlers =
this.context.pluginHooks.contentTypeHandlers;
            var _a = this, props = _a.props, customContentInfo =
_a.customContentInfo;
            var rawVal = props.content;
            var innerContent = normalizeContent(rawVal, props.hookProps);
            var innerContentVDom = null;
            if (innerContent === undefined) { // use the default
                innerContent = normalizeContent(props.defaultContent,
props.hookProps);
            }
            if (innerContent !== undefined) { // we allow custom content
handlers to return nothing
                if (customContentInfo) {
                    customContentInfo.contentVal =
innerContent[customContentInfo.contentKey];
                }
                else if (typeof innerContent === 'object') {
                    // look for a prop that would indicate a custom content
handler is needed
                    for (var contentKey in contentTypeHandlers) {
                        if (innerContent[contentKey] !== undefined) {
                            var stuff = contentTypeHandlers[contentKey]();
                            customContentInfo = this.customContentInfo =
__assign({ contentKey: contentKey, contentVal: innerContent[contentKey] },
stuff);
                            break;
                        }
                    }
                }
                if (customContentInfo) {
                    innerContentVDom = []; // signal that something was
specified
                }
                else {
                    innerContentVDom = innerContent; // assume a [p]react
vdom node. use it
                }
            }
            return innerContentVDom;
        };
        ContentHookInner.prototype.updateCustomContent = function () {
            if (this.customContentInfo) {
                this.customContentInfo.render(this.innerElRef.current ||
this.props.backupElRef.current, // the element to render into
                this.customContentInfo.contentVal);
            }
        };
        return ContentHookInner;
    }(BaseComponent));
    var MountHook = /** @class */ (function (_super) {
        __extends(MountHook, _super);
        function MountHook() {
            var _this = _super !== null && _super.apply(this,
arguments) || this;
            _this.handleRootEl = function (rootEl) {
                _this.rootEl = rootEl;
                if (_this.props.elRef) {
                    setRef(_this.props.elRef, rootEl);
                }
            };
            return _this;
        }
        MountHook.prototype.render = function () {
            return this.props.children(this.handleRootEl);
        };
        MountHook.prototype.componentDidMount = function () {
            var callback = this.props.didMount;
            if (callback) {
                callback(__assign(__assign({}, this.props.hookProps), { el:
this.rootEl }));
            }
        };
        MountHook.prototype.componentWillUnmount = function () {
            var callback = this.props.willUnmount;
            if (callback) {
                callback(__assign(__assign({}, this.props.hookProps), { el:
this.rootEl }));
            }
        };
        return MountHook;
    }(BaseComponent));
    function buildClassNameNormalizer() {
        var currentGenerator;
        var currentHookProps;
        var currentClassNames = [];
        return function (generator, hookProps) {
            if (!currentHookProps || !isPropsEqual(currentHookProps,
hookProps) || generator !== currentGenerator) {
                currentGenerator = generator;
                currentHookProps = hookProps;
                currentClassNames = normalizeClassNames(generator,
hookProps);
            }
            return currentClassNames;
        };
    }
    function normalizeClassNames(classNames, hookProps) {
        if (typeof classNames === 'function') {
            classNames = classNames(hookProps);
        }
        return parseClassNames(classNames);
    }
    function normalizeContent(input, hookProps) {
        if (typeof input === 'function') {
            return input(hookProps, createElement); // give the function
the vdom-creation func
        }
        return input;
    }

    var ViewRoot = /** @class */ (function (_super) {
        __extends(ViewRoot, _super);
        function ViewRoot() {
            var _this = _super !== null && _super.apply(this,
arguments) || this;
            _this.normalizeClassNames = buildClassNameNormalizer();
            return _this;
        }
        ViewRoot.prototype.render = function () {
            var _a = this, props = _a.props, context = _a.context;
            var options = context.options;
            var hookProps = { view: context.viewApi };
            var customClassNames =
this.normalizeClassNames(options.viewClassNames, hookProps);
            return (createElement(MountHook, { hookProps: hookProps,
didMount: options.viewDidMount, willUnmount: options.viewWillUnmount,
elRef: props.elRef }, function (rootElRef) { return
props.children(rootElRef, ["fc-" + props.viewSpec.type +
"-view", 'fc-view'].concat(customClassNames)); }));
        };
        return ViewRoot;
    }(BaseComponent));

    function parseViewConfigs(inputs) {
        return mapHash(inputs, parseViewConfig);
    }
    function parseViewConfig(input) {
        var rawOptions = typeof input === 'function' ?
            { component: input } :
            input;
        var component = rawOptions.component;
        if (rawOptions.content) {
            component = createViewHookComponent(rawOptions);
            // TODO: remove content/classNames/didMount/etc from options?
        }
        return {
            superType: rawOptions.type,
            component: component,
            rawOptions: rawOptions,
        };
    }
    function createViewHookComponent(options) {
        return function (viewProps) { return
(createElement(ViewContextType.Consumer, null, function (context) { return
(createElement(ViewRoot, { viewSpec: context.viewSpec }, function
(viewElRef, viewClassNames) {
            var hookProps = __assign(__assign({}, viewProps), {
nextDayThreshold: context.options.nextDayThreshold });
            return (createElement(RenderHook, { hookProps: hookProps,
classNames: options.classNames, content: options.content, didMount:
options.didMount, willUnmount: options.willUnmount, elRef: viewElRef },
function (rootElRef, customClassNames, innerElRef, innerContent) { return
(createElement("div", { className:
viewClassNames.concat(customClassNames).join(' '), ref: rootElRef
}, innerContent)); }));
        })); })); };
    }

    function buildViewSpecs(defaultInputs, optionOverrides,
dynamicOptionOverrides, localeDefaults) {
        var defaultConfigs = parseViewConfigs(defaultInputs);
        var overrideConfigs = parseViewConfigs(optionOverrides.views);
        var viewDefs = compileViewDefs(defaultConfigs, overrideConfigs);
        return mapHash(viewDefs, function (viewDef) { return
buildViewSpec(viewDef, overrideConfigs, optionOverrides,
dynamicOptionOverrides, localeDefaults); });
    }
    function buildViewSpec(viewDef, overrideConfigs, optionOverrides,
dynamicOptionOverrides, localeDefaults) {
        var durationInput = viewDef.overrides.duration ||
            viewDef.defaults.duration ||
            dynamicOptionOverrides.duration ||
            optionOverrides.duration;
        var duration = null;
        var durationUnit = '';
        var singleUnit = '';
        var singleUnitOverrides = {};
        if (durationInput) {
            duration = createDurationCached(durationInput);
            if (duration) { // valid?
                var denom = greatestDurationDenominator(duration);
                durationUnit = denom.unit;
                if (denom.value === 1) {
                    singleUnit = durationUnit;
                    singleUnitOverrides = overrideConfigs[durationUnit] ?
overrideConfigs[durationUnit].rawOptions : {};
                }
            }
        }
        var queryButtonText = function (optionsSubset) {
            var buttonTextMap = optionsSubset.buttonText || {};
            var buttonTextKey = viewDef.defaults.buttonTextKey;
            if (buttonTextKey != null &&
buttonTextMap[buttonTextKey] != null) {
                return buttonTextMap[buttonTextKey];
            }
            if (buttonTextMap[viewDef.type] != null) {
                return buttonTextMap[viewDef.type];
            }
            if (buttonTextMap[singleUnit] != null) {
                return buttonTextMap[singleUnit];
            }
            return null;
        };
        return {
            type: viewDef.type,
            component: viewDef.component,
            duration: duration,
            durationUnit: durationUnit,
            singleUnit: singleUnit,
            optionDefaults: viewDef.defaults,
            optionOverrides: __assign(__assign({}, singleUnitOverrides),
viewDef.overrides),
            buttonTextOverride: queryButtonText(dynamicOptionOverrides) ||
                queryButtonText(optionOverrides) || //
constructor-specified buttonText lookup hash takes precedence
                viewDef.overrides.buttonText,
            buttonTextDefault: queryButtonText(localeDefaults) ||
                viewDef.defaults.buttonText ||
                queryButtonText(BASE_OPTION_DEFAULTS) ||
                viewDef.type,
        };
    }
    // hack to get memoization working
    var durationInputMap = {};
    function createDurationCached(durationInput) {
        var json = JSON.stringify(durationInput);
        var res = durationInputMap[json];
        if (res === undefined) {
            res = createDuration(durationInput);
            durationInputMap[json] = res;
        }
        return res;
    }

    var DateProfileGenerator = /** @class */ (function () {
        function DateProfileGenerator(props) {
            this.props = props;
            this.nowDate = getNow(props.nowInput, props.dateEnv);
            this.initHiddenDays();
        }
        /* Date Range Computation
       
------------------------------------------------------------------------------------------------------------------*/
        // Builds a structure with info about what the dates/ranges will be
for the "prev" view.
        DateProfileGenerator.prototype.buildPrev = function
(currentDateProfile, currentDate, forceToValid) {
            var dateEnv = this.props.dateEnv;
            var prevDate = dateEnv.subtract(dateEnv.startOf(currentDate,
currentDateProfile.currentRangeUnit), // important for start-of-month
            currentDateProfile.dateIncrement);
            return this.build(prevDate, -1, forceToValid);
        };
        // Builds a structure with info about what the dates/ranges will be
for the "next" view.
        DateProfileGenerator.prototype.buildNext = function
(currentDateProfile, currentDate, forceToValid) {
            var dateEnv = this.props.dateEnv;
            var nextDate = dateEnv.add(dateEnv.startOf(currentDate,
currentDateProfile.currentRangeUnit), // important for start-of-month
            currentDateProfile.dateIncrement);
            return this.build(nextDate, 1, forceToValid);
        };
        // Builds a structure holding dates/ranges for rendering around the
given date.
        // Optional direction param indicates whether the date is being
incremented/decremented
        // from its previous value. decremented = -1, incremented = 1
(default).
        DateProfileGenerator.prototype.build = function (currentDate,
direction, forceToValid) {
            if (forceToValid === void 0) { forceToValid = true; }
            var props = this.props;
            var validRange;
            var currentInfo;
            var isRangeAllDay;
            var renderRange;
            var activeRange;
            var isValid;
            validRange = this.buildValidRange();
            validRange = this.trimHiddenDays(validRange);
            if (forceToValid) {
                currentDate = constrainMarkerToRange(currentDate,
validRange);
            }
            currentInfo = this.buildCurrentRangeInfo(currentDate,
direction);
            isRangeAllDay =
/^(year|month|week|day)$/.test(currentInfo.unit);
            renderRange =
this.buildRenderRange(this.trimHiddenDays(currentInfo.range),
currentInfo.unit, isRangeAllDay);
            renderRange = this.trimHiddenDays(renderRange);
            activeRange = renderRange;
            if (!props.showNonCurrentDates) {
                activeRange = intersectRanges(activeRange,
currentInfo.range);
            }
            activeRange = this.adjustActiveRange(activeRange);
            activeRange = intersectRanges(activeRange, validRange); //
might return null
            // it's invalid if the originally requested date is not
contained,
            // or if the range is completely outside of the valid range.
            isValid = rangesIntersect(currentInfo.range, validRange);
            return {
                // constraint for where prev/next operations can go and
where events can be dragged/resized to.
                // an object with optional start and end properties.
                validRange: validRange,
                // range the view is formally responsible for.
                // for example, a month view might have 1st-31st, excluding
padded dates
                currentRange: currentInfo.range,
                // name of largest unit being displayed, like
"month" or "week"
                currentRangeUnit: currentInfo.unit,
                isRangeAllDay: isRangeAllDay,
                // dates that display events and accept drag-n-drop
                // will be `null` if no dates accept events
                activeRange: activeRange,
                // date range with a rendered skeleton
                // includes not-active days that need some sort of DOM
                renderRange: renderRange,
                // Duration object that denotes the first visible time of
any given day
                slotMinTime: props.slotMinTime,
                // Duration object that denotes the exclusive visible end
time of any given day
                slotMaxTime: props.slotMaxTime,
                isValid: isValid,
                // how far the current date will move for a prev/next
operation
                dateIncrement:
this.buildDateIncrement(currentInfo.duration),
            };
        };
        // Builds an object with optional start/end properties.
        // Indicates the minimum/maximum dates to display.
        // not responsible for trimming hidden days.
        DateProfileGenerator.prototype.buildValidRange = function () {
            var input = this.props.validRangeInput;
            var simpleInput = typeof input === 'function'
                ? input.call(this.props.calendarApi, this.nowDate)
                : input;
            return this.refineRange(simpleInput) ||
                { start: null, end: null }; // completely open-ended
        };
        // Builds a structure with info about the "current"
range, the range that is
        // highlighted as being the current month for example.
        // See build() for a description of `direction`.
        // Guaranteed to have `range` and `unit` properties. `duration` is
optional.
        DateProfileGenerator.prototype.buildCurrentRangeInfo = function
(date, direction) {
            var props = this.props;
            var duration = null;
            var unit = null;
            var range = null;
            var dayCount;
            if (props.duration) {
                duration = props.duration;
                unit = props.durationUnit;
                range = this.buildRangeFromDuration(date, direction,
duration, unit);
            }
            else if ((dayCount = this.props.dayCount)) {
                unit = 'day';
                range = this.buildRangeFromDayCount(date, direction,
dayCount);
            }
            else if ((range = this.buildCustomVisibleRange(date))) {
                unit = props.dateEnv.greatestWholeUnit(range.start,
range.end).unit;
            }
            else {
                duration = this.getFallbackDuration();
                unit = greatestDurationDenominator(duration).unit;
                range = this.buildRangeFromDuration(date, direction,
duration, unit);
            }
            return { duration: duration, unit: unit, range: range };
        };
        DateProfileGenerator.prototype.getFallbackDuration = function () {
            return createDuration({ day: 1 });
        };
        // Returns a new activeRange to have time values (un-ambiguate)
        // slotMinTime or slotMaxTime causes the range to expand.
        DateProfileGenerator.prototype.adjustActiveRange = function (range)
{
            var _a = this.props, dateEnv = _a.dateEnv, usesMinMaxTime =
_a.usesMinMaxTime, slotMinTime = _a.slotMinTime, slotMaxTime =
_a.slotMaxTime;
            var start = range.start, end = range.end;
            if (usesMinMaxTime) {
                // expand active range if slotMinTime is negative (why not
when positive?)
                if (asRoughDays(slotMinTime) < 0) {
                    start = startOfDay(start); // necessary?
                    start = dateEnv.add(start, slotMinTime);
                }
                // expand active range if slotMaxTime is beyond one day
(why not when negative?)
                if (asRoughDays(slotMaxTime) > 1) {
                    end = startOfDay(end); // necessary?
                    end = addDays(end, -1);
                    end = dateEnv.add(end, slotMaxTime);
                }
            }
            return { start: start, end: end };
        };
        // Builds the "current" range when it is specified as an
explicit duration.
        // `unit` is the already-computed greatestDurationDenominator unit
of duration.
        DateProfileGenerator.prototype.buildRangeFromDuration = function
(date, direction, duration, unit) {
            var _a = this.props, dateEnv = _a.dateEnv, dateAlignment =
_a.dateAlignment;
            var start;
            var end;
            var res;
            // compute what the alignment should be
            if (!dateAlignment) {
                var dateIncrement = this.props.dateIncrement;
                if (dateIncrement) {
                    // use the smaller of the two units
                    if (asRoughMs(dateIncrement) < asRoughMs(duration))
{
                        dateAlignment =
greatestDurationDenominator(dateIncrement).unit;
                    }
                    else {
                        dateAlignment = unit;
                    }
                }
                else {
                    dateAlignment = unit;
                }
            }
            // if the view displays a single day or smaller
            if (asRoughDays(duration) <= 1) {
                if (this.isHiddenDay(start)) {
                    start = this.skipHiddenDays(start, direction);
                    start = startOfDay(start);
                }
            }
            function computeRes() {
                start = dateEnv.startOf(date, dateAlignment);
                end = dateEnv.add(start, duration);
                res = { start: start, end: end };
            }
            computeRes();
            // if range is completely enveloped by hidden days, go past the
hidden days
            if (!this.trimHiddenDays(res)) {
                date = this.skipHiddenDays(date, direction);
                computeRes();
            }
            return res;
        };
        // Builds the "current" range when a dayCount is
specified.
        DateProfileGenerator.prototype.buildRangeFromDayCount = function
(date, direction, dayCount) {
            var _a = this.props, dateEnv = _a.dateEnv, dateAlignment =
_a.dateAlignment;
            var runningCount = 0;
            var start = date;
            var end;
            if (dateAlignment) {
                start = dateEnv.startOf(start, dateAlignment);
            }
            start = startOfDay(start);
            start = this.skipHiddenDays(start, direction);
            end = start;
            do {
                end = addDays(end, 1);
                if (!this.isHiddenDay(end)) {
                    runningCount += 1;
                }
            } while (runningCount < dayCount);
            return { start: start, end: end };
        };
        // Builds a normalized range object for the "visible"
range,
        // which is a way to define the currentRange and activeRange at the
same time.
        DateProfileGenerator.prototype.buildCustomVisibleRange = function
(date) {
            var props = this.props;
            var input = props.visibleRangeInput;
            var simpleInput = typeof input === 'function'
                ? input.call(props.calendarApi, props.dateEnv.toDate(date))
                : input;
            var range = this.refineRange(simpleInput);
            if (range && (range.start == null || range.end ==
null)) {
                return null;
            }
            return range;
        };
        // Computes the range that will represent the element/cells for
*rendering*,
        // but which may have voided days/times.
        // not responsible for trimming hidden days.
        DateProfileGenerator.prototype.buildRenderRange = function
(currentRange, currentRangeUnit, isRangeAllDay) {
            return currentRange;
        };
        // Compute the duration value that should be added/substracted to
the current date
        // when a prev/next operation happens.
        DateProfileGenerator.prototype.buildDateIncrement = function
(fallback) {
            var dateIncrement = this.props.dateIncrement;
            var customAlignment;
            if (dateIncrement) {
                return dateIncrement;
            }
            if ((customAlignment = this.props.dateAlignment)) {
                return createDuration(1, customAlignment);
            }
            if (fallback) {
                return fallback;
            }
            return createDuration({ days: 1 });
        };
        DateProfileGenerator.prototype.refineRange = function (rangeInput)
{
            if (rangeInput) {
                var range = parseRange(rangeInput, this.props.dateEnv);
                if (range) {
                    range = computeVisibleDayRange(range);
                }
                return range;
            }
            return null;
        };
        /* Hidden Days
       
------------------------------------------------------------------------------------------------------------------*/
        // Initializes internal variables related to calculating hidden
days-of-week
        DateProfileGenerator.prototype.initHiddenDays = function () {
            var hiddenDays = this.props.hiddenDays || []; // array of
day-of-week indices that are hidden
            var isHiddenDayHash = []; // is the day-of-week hidden? (hash
with day-of-week-index -> bool)
            var dayCnt = 0;
            var i;
            if (this.props.weekends === false) {
                hiddenDays.push(0, 6); // 0=sunday, 6=saturday
            }
            for (i = 0; i < 7; i += 1) {
                if (!(isHiddenDayHash[i] = hiddenDays.indexOf(i) !== -1)) {
                    dayCnt += 1;
                }
            }
            if (!dayCnt) {
                throw new Error('invalid hiddenDays'); // all
days were hidden? bad.
            }
            this.isHiddenDayHash = isHiddenDayHash;
        };
        // Remove days from the beginning and end of the range that are
computed as hidden.
        // If the whole range is trimmed off, returns null
        DateProfileGenerator.prototype.trimHiddenDays = function (range) {
            var start = range.start, end = range.end;
            if (start) {
                start = this.skipHiddenDays(start);
            }
            if (end) {
                end = this.skipHiddenDays(end, -1, true);
            }
            if (start == null || end == null || start < end) {
                return { start: start, end: end };
            }
            return null;
        };
        // Is the current day hidden?
        // `day` is a day-of-week index (0-6), or a Date (used for UTC)
        DateProfileGenerator.prototype.isHiddenDay = function (day) {
            if (day instanceof Date) {
                day = day.getUTCDay();
            }
            return this.isHiddenDayHash[day];
        };
        // Incrementing the current day until it is no longer a hidden day,
returning a copy.
        // DOES NOT CONSIDER validRange!
        // If the initial value of `date` is not a hidden day, don't
do anything.
        // Pass `isExclusive` as `true` if you are dealing with an end
date.
        // `inc` defaults to `1` (increment one day forward each time)
        DateProfileGenerator.prototype.skipHiddenDays = function (date,
inc, isExclusive) {
            if (inc === void 0) { inc = 1; }
            if (isExclusive === void 0) { isExclusive = false; }
            while (this.isHiddenDayHash[(date.getUTCDay() + (isExclusive ?
inc : 0) + 7) % 7]) {
                date = addDays(date, inc);
            }
            return date;
        };
        return DateProfileGenerator;
    }());

    function reduceViewType(viewType, action) {
        switch (action.type) {
            case 'CHANGE_VIEW_TYPE':
                viewType = action.viewType;
        }
        return viewType;
    }

    function reduceDynamicOptionOverrides(dynamicOptionOverrides, action) {
        var _a;
        switch (action.type) {
            case 'SET_OPTION':
                return __assign(__assign({}, dynamicOptionOverrides), (_a =
{}, _a[action.optionName] = action.rawOptionValue, _a));
            default:
                return dynamicOptionOverrides;
        }
    }

    function reduceDateProfile(currentDateProfile, action, currentDate,
dateProfileGenerator) {
        var dp;
        switch (action.type) {
            case 'CHANGE_VIEW_TYPE':
                return dateProfileGenerator.build(action.dateMarker ||
currentDate);
            case 'CHANGE_DATE':
                if (!currentDateProfile.activeRange ||
                    !rangeContainsMarker(currentDateProfile.currentRange,
action.dateMarker) // don't move if date already in view
                ) {
                    return dateProfileGenerator.build(action.dateMarker);
                }
                break;
            case 'PREV':
                dp = dateProfileGenerator.buildPrev(currentDateProfile,
currentDate);
                if (dp.isValid) {
                    return dp;
                }
                break;
            case 'NEXT':
                dp = dateProfileGenerator.buildNext(currentDateProfile,
currentDate);
                if (dp.isValid) {
                    return dp;
                }
                break;
        }
        return currentDateProfile;
    }

    function initEventSources(calendarOptions, dateProfile, context) {
        var activeRange = dateProfile ? dateProfile.activeRange : null;
        return addSources({}, parseInitialSources(calendarOptions,
context), activeRange, context);
    }
    function reduceEventSources(eventSources, action, dateProfile, context)
{
        var activeRange = dateProfile ? dateProfile.activeRange : null; //
need this check?
        switch (action.type) {
            case 'ADD_EVENT_SOURCES': // already parsed
                return addSources(eventSources, action.sources,
activeRange, context);
            case 'REMOVE_EVENT_SOURCE':
                return removeSource(eventSources, action.sourceId);
            case 'PREV': // TODO: how do we track all actions
that affect dateProfile :(
            case 'NEXT':
            case 'CHANGE_DATE':
            case 'CHANGE_VIEW_TYPE':
                if (dateProfile) {
                    return fetchDirtySources(eventSources, activeRange,
context);
                }
                return eventSources;
            case 'FETCH_EVENT_SOURCES':
                return fetchSourcesByIds(eventSources, action.sourceIds ?
// why no type?
                    arrayToHash(action.sourceIds) :
                    excludeStaticSources(eventSources, context),
activeRange, context);
            case 'RECEIVE_EVENTS':
            case 'RECEIVE_EVENT_ERROR':
                return receiveResponse(eventSources, action.sourceId,
action.fetchId, action.fetchRange);
            case 'REMOVE_ALL_EVENT_SOURCES':
                return {};
            default:
                return eventSources;
        }
    }
    function reduceEventSourcesNewTimeZone(eventSources, dateProfile,
context) {
        var activeRange = dateProfile ? dateProfile.activeRange : null; //
need this check?
        return fetchSourcesByIds(eventSources,
excludeStaticSources(eventSources, context), activeRange, context);
    }
    function computeEventSourcesLoading(eventSources) {
        for (var sourceId in eventSources) {
            if (eventSources[sourceId].isFetching) {
                return true;
            }
        }
        return false;
    }
    function addSources(eventSourceHash, sources, fetchRange, context) {
        var hash = {};
        for (var _i = 0, sources_1 = sources; _i < sources_1.length;
_i++) {
            var source = sources_1[_i];
            hash[source.sourceId] = source;
        }
        if (fetchRange) {
            hash = fetchDirtySources(hash, fetchRange, context);
        }
        return __assign(__assign({}, eventSourceHash), hash);
    }
    function removeSource(eventSourceHash, sourceId) {
        return filterHash(eventSourceHash, function (eventSource) { return
eventSource.sourceId !== sourceId; });
    }
    function fetchDirtySources(sourceHash, fetchRange, context) {
        return fetchSourcesByIds(sourceHash, filterHash(sourceHash,
function (eventSource) { return isSourceDirty(eventSource, fetchRange,
context); }), fetchRange, context);
    }
    function isSourceDirty(eventSource, fetchRange, context) {
        if (!doesSourceNeedRange(eventSource, context)) {
            return !eventSource.latestFetchId;
        }
        return !context.options.lazyFetching ||
            !eventSource.fetchRange ||
            eventSource.isFetching || // always cancel outdated in-progress
fetches
            fetchRange.start < eventSource.fetchRange.start ||
            fetchRange.end > eventSource.fetchRange.end;
    }
    function fetchSourcesByIds(prevSources, sourceIdHash, fetchRange,
context) {
        var nextSources = {};
        for (var sourceId in prevSources) {
            var source = prevSources[sourceId];
            if (sourceIdHash[sourceId]) {
                nextSources[sourceId] = fetchSource(source, fetchRange,
context);
            }
            else {
                nextSources[sourceId] = source;
            }
        }
        return nextSources;
    }
    function fetchSource(eventSource, fetchRange, context) {
        var options = context.options, calendarApi = context.calendarApi;
        var sourceDef =
context.pluginHooks.eventSourceDefs[eventSource.sourceDefId];
        var fetchId = guid();
        sourceDef.fetch({
            eventSource: eventSource,
            range: fetchRange,
            context: context,
        }, function (res) {
            var rawEvents = res.rawEvents;
            if (options.eventSourceSuccess) {
                rawEvents = options.eventSourceSuccess.call(calendarApi,
rawEvents, res.xhr) || rawEvents;
            }
            if (eventSource.success) {
                rawEvents = eventSource.success.call(calendarApi,
rawEvents, res.xhr) || rawEvents;
            }
            context.dispatch({
                type: 'RECEIVE_EVENTS',
                sourceId: eventSource.sourceId,
                fetchId: fetchId,
                fetchRange: fetchRange,
                rawEvents: rawEvents,
            });
        }, function (error) {
            console.warn(error.message, error);
            if (options.eventSourceFailure) {
                options.eventSourceFailure.call(calendarApi, error);
            }
            if (eventSource.failure) {
                eventSource.failure(error);
            }
            context.dispatch({
                type: 'RECEIVE_EVENT_ERROR',
                sourceId: eventSource.sourceId,
                fetchId: fetchId,
                fetchRange: fetchRange,
                error: error,
            });
        });
        return __assign(__assign({}, eventSource), { isFetching: true,
latestFetchId: fetchId });
    }
    function receiveResponse(sourceHash, sourceId, fetchId, fetchRange) {
        var _a;
        var eventSource = sourceHash[sourceId];
        if (eventSource && // not already removed
            fetchId === eventSource.latestFetchId) {
            return __assign(__assign({}, sourceHash), (_a = {},
_a[sourceId] = __assign(__assign({}, eventSource), { isFetching: false,
fetchRange: fetchRange }), _a));
        }
        return sourceHash;
    }
    function excludeStaticSources(eventSources, context) {
        return filterHash(eventSources, function (eventSource) { return
doesSourceNeedRange(eventSource, context); });
    }
    function parseInitialSources(rawOptions, context) {
        var refiners = buildEventSourceRefiners(context);
        var rawSources = [].concat(rawOptions.eventSources || []);
        var sources = []; // parsed
        if (rawOptions.initialEvents) {
            rawSources.unshift(rawOptions.initialEvents);
        }
        if (rawOptions.events) {
            rawSources.unshift(rawOptions.events);
        }
        for (var _i = 0, rawSources_1 = rawSources; _i <
rawSources_1.length; _i++) {
            var rawSource = rawSources_1[_i];
            var source = parseEventSource(rawSource, context, refiners);
            if (source) {
                sources.push(source);
            }
        }
        return sources;
    }
    function doesSourceNeedRange(eventSource, context) {
        var defs = context.pluginHooks.eventSourceDefs;
        return !defs[eventSource.sourceDefId].ignoreRange;
    }

    function reduceDateSelection(currentSelection, action) {
        switch (action.type) {
            case 'UNSELECT_DATES':
                return null;
            case 'SELECT_DATES':
                return action.selection;
            default:
                return currentSelection;
        }
    }

    function reduceSelectedEvent(currentInstanceId, action) {
        switch (action.type) {
            case 'UNSELECT_EVENT':
                return '';
            case 'SELECT_EVENT':
                return action.eventInstanceId;
            default:
                return currentInstanceId;
        }
    }

    function reduceEventDrag(currentDrag, action) {
        var newDrag;
        switch (action.type) {
            case 'UNSET_EVENT_DRAG':
                return null;
            case 'SET_EVENT_DRAG':
                newDrag = action.state;
                return {
                    affectedEvents: newDrag.affectedEvents,
                    mutatedEvents: newDrag.mutatedEvents,
                    isEvent: newDrag.isEvent,
                };
            default:
                return currentDrag;
        }
    }

    function reduceEventResize(currentResize, action) {
        var newResize;
        switch (action.type) {
            case 'UNSET_EVENT_RESIZE':
                return null;
            case 'SET_EVENT_RESIZE':
                newResize = action.state;
                return {
                    affectedEvents: newResize.affectedEvents,
                    mutatedEvents: newResize.mutatedEvents,
                    isEvent: newResize.isEvent,
                };
            default:
                return currentResize;
        }
    }

    function parseToolbars(calendarOptions, calendarOptionOverrides, theme,
viewSpecs, calendarApi) {
        var viewsWithButtons = [];
        var headerToolbar = calendarOptions.headerToolbar ?
parseToolbar(calendarOptions.headerToolbar, calendarOptions,
calendarOptionOverrides, theme, viewSpecs, calendarApi, viewsWithButtons) :
null;
        var footerToolbar = calendarOptions.footerToolbar ?
parseToolbar(calendarOptions.footerToolbar, calendarOptions,
calendarOptionOverrides, theme, viewSpecs, calendarApi, viewsWithButtons) :
null;
        return { headerToolbar: headerToolbar, footerToolbar:
footerToolbar, viewsWithButtons: viewsWithButtons };
    }
    function parseToolbar(sectionStrHash, calendarOptions,
calendarOptionOverrides, theme, viewSpecs, calendarApi, viewsWithButtons) {
        return mapHash(sectionStrHash, function (sectionStr) { return
parseSection(sectionStr, calendarOptions, calendarOptionOverrides, theme,
viewSpecs, calendarApi, viewsWithButtons); });
    }
    /*
    BAD: querying icons and text here. should be done at render time
    */
    function parseSection(sectionStr, calendarOptions,
calendarOptionOverrides, theme, viewSpecs, calendarApi, viewsWithButtons) {
        var isRtl = calendarOptions.direction === 'rtl';
        var calendarCustomButtons = calendarOptions.customButtons || {};
        var calendarButtonTextOverrides =
calendarOptionOverrides.buttonText || {};
        var calendarButtonText = calendarOptions.buttonText || {};
        var sectionSubstrs = sectionStr ? sectionStr.split(' ') :
[];
        return sectionSubstrs.map(function (buttonGroupStr) { return
(buttonGroupStr.split(',').map(function (buttonName) {
            if (buttonName === 'title') {
                return { buttonName: buttonName };
            }
            var customButtonProps;
            var viewSpec;
            var buttonClick;
            var buttonIcon; // only one of these will be set
            var buttonText; // "
            if ((customButtonProps = calendarCustomButtons[buttonName])) {
                buttonClick = function (ev) {
                    if (customButtonProps.click) {
                        customButtonProps.click.call(ev.target, ev,
ev.target);
                    }
                };
                (buttonIcon =
theme.getCustomButtonIconClass(customButtonProps)) ||
                    (buttonIcon = theme.getIconClass(buttonName, isRtl)) ||
                    (buttonText = customButtonProps.text);
            }
            else if ((viewSpec = viewSpecs[buttonName])) {
                viewsWithButtons.push(buttonName);
                buttonClick = function () {
                    calendarApi.changeView(buttonName);
                };
                (buttonText = viewSpec.buttonTextOverride) ||
                    (buttonIcon = theme.getIconClass(buttonName, isRtl)) ||
                    (buttonText = viewSpec.buttonTextDefault);
            }
            else if (calendarApi[buttonName]) { // a calendarApi method
                buttonClick = function () {
                    calendarApi[buttonName]();
                };
                (buttonText = calendarButtonTextOverrides[buttonName]) ||
                    (buttonIcon = theme.getIconClass(buttonName, isRtl)) ||
                    (buttonText = calendarButtonText[buttonName]);
                //            ^ everything else is considered default
            }
            return { buttonName: buttonName, buttonClick: buttonClick,
buttonIcon: buttonIcon, buttonText: buttonText };
        })); });
    }

    var eventSourceDef = {
        ignoreRange: true,
        parseMeta: function (refined) {
            if (Array.isArray(refined.events)) {
                return refined.events;
            }
            return null;
        },
        fetch: function (arg, success) {
            success({
                rawEvents: arg.eventSource.meta,
            });
        },
    };
    var arrayEventSourcePlugin = createPlugin({
        eventSourceDefs: [eventSourceDef],
    });

    var eventSourceDef$1 = {
        parseMeta: function (refined) {
            if (typeof refined.events === 'function') {
                return refined.events;
            }
            return null;
        },
        fetch: function (arg, success, failure) {
            var dateEnv = arg.context.dateEnv;
            var func = arg.eventSource.meta;
            unpromisify(func.bind(null,
buildRangeApiWithTimeZone(arg.range, dateEnv)), function (rawEvents) {
                success({ rawEvents: rawEvents }); // needs an object
response
            }, failure);
        },
    };
    var funcEventSourcePlugin = createPlugin({
        eventSourceDefs: [eventSourceDef$1],
    });

    function requestJson(method, url, params, successCallback,
failureCallback) {
        method = method.toUpperCase();
        var body = null;
        if (method === 'GET') {
            url = injectQueryStringParams(url, params);
        }
        else {
            body = encodeParams(params);
        }
        var xhr = new XMLHttpRequest();
        xhr.open(method, url, true);
        if (method !== 'GET') {
            xhr.setRequestHeader('Content-Type',
'application/x-www-form-urlencoded');
        }
        xhr.onload = function () {
            if (xhr.status >= 200 && xhr.status < 400) {
                var parsed = false;
                var res = void 0;
                try {
                    res = JSON.parse(xhr.responseText);
                    parsed = true;
                }
                catch (err) {
                    // will handle parsed=false
                }
                if (parsed) {
                    successCallback(res, xhr);
                }
                else {
                    failureCallback('Failure parsing JSON', xhr);
                }
            }
            else {
                failureCallback('Request failed', xhr);
            }
        };
        xhr.onerror = function () {
            failureCallback('Request failed', xhr);
        };
        xhr.send(body);
    }
    function injectQueryStringParams(url, params) {
        return url +
            (url.indexOf('?') === -1 ? '?' :
'&') +
            encodeParams(params);
    }
    function encodeParams(params) {
        var parts = [];
        for (var key in params) {
            parts.push(encodeURIComponent(key) + "=" +
encodeURIComponent(params[key]));
        }
        return parts.join('&');
    }

    var JSON_FEED_EVENT_SOURCE_REFINERS = {
        method: String,
        extraParams: identity,
        startParam: String,
        endParam: String,
        timeZoneParam: String,
    };

    var eventSourceDef$2 = {
        parseMeta: function (refined) {
            if (refined.url && (refined.format === 'json'
|| !refined.format)) {
                return {
                    url: refined.url,
                    format: 'json',
                    method: (refined.method ||
'GET').toUpperCase(),
                    extraParams: refined.extraParams,
                    startParam: refined.startParam,
                    endParam: refined.endParam,
                    timeZoneParam: refined.timeZoneParam,
                };
            }
            return null;
        },
        fetch: function (arg, success, failure) {
            var meta = arg.eventSource.meta;
            var requestParams = buildRequestParams(meta, arg.range,
arg.context);
            requestJson(meta.method, meta.url, requestParams, function
(rawEvents, xhr) {
                success({ rawEvents: rawEvents, xhr: xhr });
            }, function (errorMessage, xhr) {
                failure({ message: errorMessage, xhr: xhr });
            });
        },
    };
    var jsonFeedEventSourcePlugin = createPlugin({
        eventSourceRefiners: JSON_FEED_EVENT_SOURCE_REFINERS,
        eventSourceDefs: [eventSourceDef$2],
    });
    function buildRequestParams(meta, range, context) {
        var dateEnv = context.dateEnv, options = context.options;
        var startParam;
        var endParam;
        var timeZoneParam;
        var customRequestParams;
        var params = {};
        startParam = meta.startParam;
        if (startParam == null) {
            startParam = options.startParam;
        }
        endParam = meta.endParam;
        if (endParam == null) {
            endParam = options.endParam;
        }
        timeZoneParam = meta.timeZoneParam;
        if (timeZoneParam == null) {
            timeZoneParam = options.timeZoneParam;
        }
        // retrieve any outbound GET/POST data from the options
        if (typeof meta.extraParams === 'function') {
            // supplied as a function that returns a key/value object
            customRequestParams = meta.extraParams();
        }
        else {
            // probably supplied as a straight key/value object
            customRequestParams = meta.extraParams || {};
        }
        __assign(params, customRequestParams);
        params[startParam] = dateEnv.formatIso(range.start);
        params[endParam] = dateEnv.formatIso(range.end);
        if (dateEnv.timeZone !== 'local') {
            params[timeZoneParam] = dateEnv.timeZone;
        }
        return params;
    }

    var SIMPLE_RECURRING_REFINERS = {
        daysOfWeek: identity,
        startTime: createDuration,
        endTime: createDuration,
        duration: createDuration,
        startRecur: identity,
        endRecur: identity,
    };

    var recurring = {
        parse: function (refined, dateEnv) {
            if (refined.daysOfWeek || refined.startTime || refined.endTime
|| refined.startRecur || refined.endRecur) {
                var recurringData = {
                    daysOfWeek: refined.daysOfWeek || null,
                    startTime: refined.startTime || null,
                    endTime: refined.endTime || null,
                    startRecur: refined.startRecur ?
dateEnv.createMarker(refined.startRecur) : null,
                    endRecur: refined.endRecur ?
dateEnv.createMarker(refined.endRecur) : null,
                };
                var duration = void 0;
                if (refined.duration) {
                    duration = refined.duration;
                }
                if (!duration && refined.startTime &&
refined.endTime) {
                    duration = subtractDurations(refined.endTime,
refined.startTime);
                }
                return {
                    allDayGuess: Boolean(!refined.startTime &&
!refined.endTime),
                    duration: duration,
                    typeData: recurringData,
                };
            }
            return null;
        },
        expand: function (typeData, framingRange, dateEnv) {
            var clippedFramingRange = intersectRanges(framingRange, {
start: typeData.startRecur, end: typeData.endRecur });
            if (clippedFramingRange) {
                return expandRanges(typeData.daysOfWeek,
typeData.startTime, clippedFramingRange, dateEnv);
            }
            return [];
        },
    };
    var simpleRecurringEventsPlugin = createPlugin({
        recurringTypes: [recurring],
        eventRefiners: SIMPLE_RECURRING_REFINERS,
    });
    function expandRanges(daysOfWeek, startTime, framingRange, dateEnv) {
        var dowHash = daysOfWeek ? arrayToHash(daysOfWeek) : null;
        var dayMarker = startOfDay(framingRange.start);
        var endMarker = framingRange.end;
        var instanceStarts = [];
        while (dayMarker < endMarker) {
            var instanceStart 
            // if everyday, or this particular day-of-week
            = void 0;
            // if everyday, or this particular day-of-week
            if (!dowHash || dowHash[dayMarker.getUTCDay()]) {
                if (startTime) {
                    instanceStart = dateEnv.add(dayMarker, startTime);
                }
                else {
                    instanceStart = dayMarker;
                }
                instanceStarts.push(instanceStart);
            }
            dayMarker = addDays(dayMarker, 1);
        }
        return instanceStarts;
    }

    var changeHandlerPlugin = createPlugin({
        optionChangeHandlers: {
            events: function (events, context) {
                handleEventSources([events], context);
            },
            eventSources: handleEventSources,
        },
    });
    /*
    BUG: if `event` was supplied, all previously-given `eventSources` will
be wiped out
    */
    function handleEventSources(inputs, context) {
        var unfoundSources =
hashValuesToArray(context.getCurrentData().eventSources);
        var newInputs = [];
        for (var _i = 0, inputs_1 = inputs; _i < inputs_1.length; _i++)
{
            var input = inputs_1[_i];
            var inputFound = false;
            for (var i = 0; i < unfoundSources.length; i += 1) {
                if (unfoundSources[i]._raw === input) {
                    unfoundSources.splice(i, 1); // delete
                    inputFound = true;
                    break;
                }
            }
            if (!inputFound) {
                newInputs.push(input);
            }
        }
        for (var _a = 0, unfoundSources_1 = unfoundSources; _a <
unfoundSources_1.length; _a++) {
            var unfoundSource = unfoundSources_1[_a];
            context.dispatch({
                type: 'REMOVE_EVENT_SOURCE',
                sourceId: unfoundSource.sourceId,
            });
        }
        for (var _b = 0, newInputs_1 = newInputs; _b <
newInputs_1.length; _b++) {
            var newInput = newInputs_1[_b];
            context.calendarApi.addEventSource(newInput);
        }
    }

    function handleDateProfile(dateProfile, context) {
        context.emitter.trigger('datesSet', __assign(__assign({},
buildRangeApiWithTimeZone(dateProfile.activeRange, context.dateEnv)), {
view: context.viewApi }));
    }

    function handleEventStore(eventStore, context) {
        var emitter = context.emitter;
        if (emitter.hasHandlers('eventsSet')) {
            emitter.trigger('eventsSet',
buildEventApis(eventStore, context));
        }
    }

    /*
    this array is exposed on the root namespace so that UMD plugins can add
to it.
    see the rollup-bundles script.
    */
    var globalPlugins = [
        arrayEventSourcePlugin,
        funcEventSourcePlugin,
        jsonFeedEventSourcePlugin,
        simpleRecurringEventsPlugin,
        changeHandlerPlugin,
        createPlugin({
            isLoadingFuncs: [
                function (state) { return
computeEventSourcesLoading(state.eventSources); },
            ],
            contentTypeHandlers: {
                html: function () { return ({ render: injectHtml }); },
                domNodes: function () { return ({ render: injectDomNodes
}); },
            },
            propSetHandlers: {
                dateProfile: handleDateProfile,
                eventStore: handleEventStore,
            },
        }),
    ];
    function injectHtml(el, html) {
        el.innerHTML = html;
    }
    function injectDomNodes(el, domNodes) {
        var oldNodes = Array.prototype.slice.call(el.childNodes); // TODO:
use array util
        var newNodes = Array.prototype.slice.call(domNodes); // TODO: use
array util
        if (!isArraysEqual(oldNodes, newNodes)) {
            for (var _i = 0, newNodes_1 = newNodes; _i <
newNodes_1.length; _i++) {
                var newNode = newNodes_1[_i];
                el.appendChild(newNode);
            }
            oldNodes.forEach(removeElement);
        }
    }

    var DelayedRunner = /** @class */ (function () {
        function DelayedRunner(drainedOption) {
            this.drainedOption = drainedOption;
            this.isRunning = false;
            this.isDirty = false;
            this.pauseDepths = {};
            this.timeoutId = 0;
        }
        DelayedRunner.prototype.request = function (delay) {
            this.isDirty = true;
            if (!this.isPaused()) {
                this.clearTimeout();
                if (delay == null) {
                    this.tryDrain();
                }
                else {
                    this.timeoutId = setTimeout(// NOT OPTIMAL! TODO: look
at debounce
                    this.tryDrain.bind(this), delay);
                }
            }
        };
        DelayedRunner.prototype.pause = function (scope) {
            if (scope === void 0) { scope = ''; }
            var pauseDepths = this.pauseDepths;
            pauseDepths[scope] = (pauseDepths[scope] || 0) + 1;
            this.clearTimeout();
        };
        DelayedRunner.prototype.resume = function (scope, force) {
            if (scope === void 0) { scope = ''; }
            var pauseDepths = this.pauseDepths;
            if (scope in pauseDepths) {
                if (force) {
                    delete pauseDepths[scope];
                }
                else {
                    pauseDepths[scope] -= 1;
                    var depth = pauseDepths[scope];
                    if (depth <= 0) {
                        delete pauseDepths[scope];
                    }
                }
                this.tryDrain();
            }
        };
        DelayedRunner.prototype.isPaused = function () {
            return Object.keys(this.pauseDepths).length;
        };
        DelayedRunner.prototype.tryDrain = function () {
            if (!this.isRunning && !this.isPaused()) {
                this.isRunning = true;
                while (this.isDirty) {
                    this.isDirty = false;
                    this.drained(); // might set isDirty to true again
                }
                this.isRunning = false;
            }
        };
        DelayedRunner.prototype.clear = function () {
            this.clearTimeout();
            this.isDirty = false;
            this.pauseDepths = {};
        };
        DelayedRunner.prototype.clearTimeout = function () {
            if (this.timeoutId) {
                clearTimeout(this.timeoutId);
                this.timeoutId = 0;
            }
        };
        DelayedRunner.prototype.drained = function () {
            if (this.drainedOption) {
                this.drainedOption();
            }
        };
        return DelayedRunner;
    }());

    var TaskRunner = /** @class */ (function () {
        function TaskRunner(runTaskOption, drainedOption) {
            this.runTaskOption = runTaskOption;
            this.drainedOption = drainedOption;
            this.queue = [];
            this.delayedRunner = new DelayedRunner(this.drain.bind(this));
        }
        TaskRunner.prototype.request = function (task, delay) {
            this.queue.push(task);
            this.delayedRunner.request(delay);
        };
        TaskRunner.prototype.pause = function (scope) {
            this.delayedRunner.pause(scope);
        };
        TaskRunner.prototype.resume = function (scope, force) {
            this.delayedRunner.resume(scope, force);
        };
        TaskRunner.prototype.drain = function () {
            var queue = this.queue;
            while (queue.length) {
                var completedTasks = [];
                var task = void 0;
                while ((task = queue.shift())) {
                    this.runTask(task);
                    completedTasks.push(task);
                }
                this.drained(completedTasks);
            } // keep going, in case new tasks were added in the drained
handler
        };
        TaskRunner.prototype.runTask = function (task) {
            if (this.runTaskOption) {
                this.runTaskOption(task);
            }
        };
        TaskRunner.prototype.drained = function (completedTasks) {
            if (this.drainedOption) {
                this.drainedOption(completedTasks);
            }
        };
        return TaskRunner;
    }());

    // Computes what the title at the top of the calendarApi should be for
this view
    function buildTitle(dateProfile, viewOptions, dateEnv) {
        var range;
        // for views that span a large unit of time, show the proper
interval, ignoring stray days before and after
        if (/^(year|month)$/.test(dateProfile.currentRangeUnit)) {
            range = dateProfile.currentRange;
        }
        else { // for day units or smaller, use the actual day range
            range = dateProfile.activeRange;
        }
        return dateEnv.formatRange(range.start, range.end,
createFormatter(viewOptions.titleFormat || buildTitleFormat(dateProfile)),
{
            isEndExclusive: dateProfile.isRangeAllDay,
            defaultSeparator: viewOptions.titleRangeSeparator,
        });
    }
    // Generates the format string that should be used to generate the
title for the current date range.
    // Attempts to compute the most appropriate format if not explicitly
specified with `titleFormat`.
    function buildTitleFormat(dateProfile) {
        var currentRangeUnit = dateProfile.currentRangeUnit;
        if (currentRangeUnit === 'year') {
            return { year: 'numeric' };
        }
        if (currentRangeUnit === 'month') {
            return { year: 'numeric', month: 'long' };
// like "September 2014"
        }
        var days = diffWholeDays(dateProfile.currentRange.start,
dateProfile.currentRange.end);
        if (days !== null && days > 1) {
            // multi-day range. shorter, like "Sep 9 - 10 2014"
            return { year: 'numeric', month: 'short',
day: 'numeric' };
        }
        // one day. longer, like "September 9 2014"
        return { year: 'numeric', month: 'long', day:
'numeric' };
    }

    // in future refactor, do the redux-style function(state=initial) for
initial-state
    // also, whatever is happening in constructor, have it happen in action
queue too
    var CalendarDataManager = /** @class */ (function () {
        function CalendarDataManager(props) {
            var _this = this;
            this.computeOptionsData = memoize(this._computeOptionsData);
            this.computeCurrentViewData =
memoize(this._computeCurrentViewData);
            this.organizeRawLocales = memoize(organizeRawLocales);
            this.buildLocale = memoize(buildLocale);
            this.buildPluginHooks = buildBuildPluginHooks();
            this.buildDateEnv = memoize(buildDateEnv$1);
            this.buildTheme = memoize(buildTheme);
            this.parseToolbars = memoize(parseToolbars);
            this.buildViewSpecs = memoize(buildViewSpecs);
            this.buildDateProfileGenerator =
memoizeObjArg(buildDateProfileGenerator);
            this.buildViewApi = memoize(buildViewApi);
            this.buildViewUiProps = memoizeObjArg(buildViewUiProps);
            this.buildEventUiBySource = memoize(buildEventUiBySource,
isPropsEqual);
            this.buildEventUiBases = memoize(buildEventUiBases);
            this.parseContextBusinessHours =
memoizeObjArg(parseContextBusinessHours);
            this.buildTitle = memoize(buildTitle);
            this.emitter = new Emitter();
            this.actionRunner = new
TaskRunner(this._handleAction.bind(this), this.updateData.bind(this));
            this.currentCalendarOptionsInput = {};
            this.currentCalendarOptionsRefined = {};
            this.currentViewOptionsInput = {};
            this.currentViewOptionsRefined = {};
            this.currentCalendarOptionsRefiners = {};
            this.getCurrentData = function () { return _this.data; };
            this.dispatch = function (action) {
                _this.actionRunner.request(action); // protects against
recursive calls to _handleAction
            };
            this.props = props;
            this.actionRunner.pause();
            var dynamicOptionOverrides = {};
            var optionsData =
this.computeOptionsData(props.optionOverrides, dynamicOptionOverrides,
props.calendarApi);
            var currentViewType = optionsData.calendarOptions.initialView
|| optionsData.pluginHooks.initialView;
            var currentViewData =
this.computeCurrentViewData(currentViewType, optionsData,
props.optionOverrides, dynamicOptionOverrides);
            // wire things up
            // TODO: not DRY
            props.calendarApi.currentDataManager = this;
            this.emitter.setThisContext(props.calendarApi);
            this.emitter.setOptions(currentViewData.options);
            var currentDate = getInitialDate(optionsData.calendarOptions,
optionsData.dateEnv);
            var dateProfile =
currentViewData.dateProfileGenerator.build(currentDate);
            if (!rangeContainsMarker(dateProfile.activeRange, currentDate))
{
                currentDate = dateProfile.currentRange.start;
            }
            var calendarContext = {
                dateEnv: optionsData.dateEnv,
                options: optionsData.calendarOptions,
                pluginHooks: optionsData.pluginHooks,
                calendarApi: props.calendarApi,
                dispatch: this.dispatch,
                emitter: this.emitter,
                getCurrentData: this.getCurrentData,
            };
            // needs to be after setThisContext
            for (var _i = 0, _a = optionsData.pluginHooks.contextInit; _i
< _a.length; _i++) {
                var callback = _a[_i];
                callback(calendarContext);
            }
            // NOT DRY
            var eventSources =
initEventSources(optionsData.calendarOptions, dateProfile,
calendarContext);
            var initialState = {
                dynamicOptionOverrides: dynamicOptionOverrides,
                currentViewType: currentViewType,
                currentDate: currentDate,
                dateProfile: dateProfile,
                businessHours:
this.parseContextBusinessHours(calendarContext),
                eventSources: eventSources,
                eventUiBases: {},
                eventStore: createEmptyEventStore(),
                renderableEventStore: createEmptyEventStore(),
                dateSelection: null,
                eventSelection: '',
                eventDrag: null,
                eventResize: null,
                selectionConfig:
this.buildViewUiProps(calendarContext).selectionConfig,
            };
            var contextAndState = __assign(__assign({}, calendarContext),
initialState);
            for (var _b = 0, _c = optionsData.pluginHooks.reducers; _b <
_c.length; _b++) {
                var reducer = _c[_b];
                __assign(initialState, reducer(null, null,
contextAndState));
            }
            if (computeIsLoading(initialState, calendarContext)) {
                this.emitter.trigger('loading', true); // NOT DRY
            }
            this.state = initialState;
            this.updateData();
            this.actionRunner.resume();
        }
        CalendarDataManager.prototype.resetOptions = function
(optionOverrides, append) {
            var props = this.props;
            props.optionOverrides = append
                ? __assign(__assign({}, props.optionOverrides),
optionOverrides) : optionOverrides;
            this.actionRunner.request({
                type: 'NOTHING',
            });
        };
        CalendarDataManager.prototype._handleAction = function (action) {
            var _a = this, props = _a.props, state = _a.state, emitter =
_a.emitter;
            var dynamicOptionOverrides =
reduceDynamicOptionOverrides(state.dynamicOptionOverrides, action);
            var optionsData =
this.computeOptionsData(props.optionOverrides, dynamicOptionOverrides,
props.calendarApi);
            var currentViewType = reduceViewType(state.currentViewType,
action);
            var currentViewData =
this.computeCurrentViewData(currentViewType, optionsData,
props.optionOverrides, dynamicOptionOverrides);
            // wire things up
            // TODO: not DRY
            props.calendarApi.currentDataManager = this;
            emitter.setThisContext(props.calendarApi);
            emitter.setOptions(currentViewData.options);
            var calendarContext = {
                dateEnv: optionsData.dateEnv,
                options: optionsData.calendarOptions,
                pluginHooks: optionsData.pluginHooks,
                calendarApi: props.calendarApi,
                dispatch: this.dispatch,
                emitter: emitter,
                getCurrentData: this.getCurrentData,
            };
            var currentDate = state.currentDate, dateProfile =
state.dateProfile;
            if (this.data && this.data.dateProfileGenerator !==
currentViewData.dateProfileGenerator) { // hack
                dateProfile =
currentViewData.dateProfileGenerator.build(currentDate);
            }
            currentDate = reduceCurrentDate(currentDate, action);
            dateProfile = reduceDateProfile(dateProfile, action,
currentDate, currentViewData.dateProfileGenerator);
            if (!rangeContainsMarker(dateProfile.currentRange,
currentDate)) {
                currentDate = dateProfile.currentRange.start;
            }
            var eventSources = reduceEventSources(state.eventSources,
action, dateProfile, calendarContext);
            var eventStore = reduceEventStore(state.eventStore, action,
eventSources, dateProfile, calendarContext);
            var isEventsLoading = computeEventSourcesLoading(eventSources);
// BAD. also called in this func in computeIsLoading
            var renderableEventStore = (isEventsLoading &&
!currentViewData.options.progressiveEventRendering) ?
                (state.renderableEventStore || eventStore) : // try from
previous state
                eventStore;
            var _b = this.buildViewUiProps(calendarContext),
eventUiSingleBase = _b.eventUiSingleBase, selectionConfig =
_b.selectionConfig; // will memoize obj
            var eventUiBySource = this.buildEventUiBySource(eventSources);
            var eventUiBases =
this.buildEventUiBases(renderableEventStore.defs, eventUiSingleBase,
eventUiBySource);
            var newState = {
                dynamicOptionOverrides: dynamicOptionOverrides,
                currentViewType: currentViewType,
                currentDate: currentDate,
                dateProfile: dateProfile,
                eventSources: eventSources,
                eventStore: eventStore,
                renderableEventStore: renderableEventStore,
                selectionConfig: selectionConfig,
                eventUiBases: eventUiBases,
                businessHours:
this.parseContextBusinessHours(calendarContext),
                dateSelection: reduceDateSelection(state.dateSelection,
action),
                eventSelection: reduceSelectedEvent(state.eventSelection,
action),
                eventDrag: reduceEventDrag(state.eventDrag, action),
                eventResize: reduceEventResize(state.eventResize, action),
            };
            var contextAndState = __assign(__assign({}, calendarContext),
newState);
            for (var _i = 0, _c = optionsData.pluginHooks.reducers; _i <
_c.length; _i++) {
                var reducer = _c[_i];
                __assign(newState, reducer(state, action,
contextAndState)); // give the OLD state, for old value
            }
            var wasLoading = computeIsLoading(state, calendarContext);
            var isLoading = computeIsLoading(newState, calendarContext);
            // TODO: use propSetHandlers in plugin system
            if (!wasLoading && isLoading) {
                emitter.trigger('loading', true);
            }
            else if (wasLoading && !isLoading) {
                emitter.trigger('loading', false);
            }
            this.state = newState;
            if (props.onAction) {
                props.onAction(action);
            }
        };
        CalendarDataManager.prototype.updateData = function () {
            var _a = this, props = _a.props, state = _a.state;
            var oldData = this.data;
            var optionsData =
this.computeOptionsData(props.optionOverrides,
state.dynamicOptionOverrides, props.calendarApi);
            var currentViewData =
this.computeCurrentViewData(state.currentViewType, optionsData,
props.optionOverrides, state.dynamicOptionOverrides);
            var data = this.data = __assign(__assign(__assign({ viewTitle:
this.buildTitle(state.dateProfile, currentViewData.options,
optionsData.dateEnv), calendarApi: props.calendarApi, dispatch:
this.dispatch, emitter: this.emitter, getCurrentData: this.getCurrentData
}, optionsData), currentViewData), state);
            var changeHandlers =
optionsData.pluginHooks.optionChangeHandlers;
            var oldCalendarOptions = oldData &&
oldData.calendarOptions;
            var newCalendarOptions = optionsData.calendarOptions;
            if (oldCalendarOptions && oldCalendarOptions !==
newCalendarOptions) {
                if (oldCalendarOptions.timeZone !==
newCalendarOptions.timeZone) {
                    // hack
                    state.eventSources = data.eventSources =
reduceEventSourcesNewTimeZone(data.eventSources, state.dateProfile, data);
                    state.eventStore = data.eventStore =
rezoneEventStoreDates(data.eventStore, oldData.dateEnv, data.dateEnv);
                }
                for (var optionName in changeHandlers) {
                    if (oldCalendarOptions[optionName] !==
newCalendarOptions[optionName]) {
                       
changeHandlers[optionName](newCalendarOptions[optionName], data);
                    }
                }
            }
            if (props.onData) {
                props.onData(data);
            }
        };
        CalendarDataManager.prototype._computeOptionsData = function
(optionOverrides, dynamicOptionOverrides, calendarApi) {
            // TODO: blacklist options that are handled by
optionChangeHandlers
            var _a = this.processRawCalendarOptions(optionOverrides,
dynamicOptionOverrides), refinedOptions = _a.refinedOptions, pluginHooks =
_a.pluginHooks, localeDefaults = _a.localeDefaults, availableLocaleData =
_a.availableLocaleData, extra = _a.extra;
            warnUnknownOptions(extra);
            var dateEnv = this.buildDateEnv(refinedOptions.timeZone,
refinedOptions.locale, refinedOptions.weekNumberCalculation,
refinedOptions.firstDay, refinedOptions.weekText, pluginHooks,
availableLocaleData, refinedOptions.defaultRangeSeparator);
            var viewSpecs = this.buildViewSpecs(pluginHooks.views,
optionOverrides, dynamicOptionOverrides, localeDefaults);
            var theme = this.buildTheme(refinedOptions, pluginHooks);
            var toolbarConfig = this.parseToolbars(refinedOptions,
optionOverrides, theme, viewSpecs, calendarApi);
            return {
                calendarOptions: refinedOptions,
                pluginHooks: pluginHooks,
                dateEnv: dateEnv,
                viewSpecs: viewSpecs,
                theme: theme,
                toolbarConfig: toolbarConfig,
                localeDefaults: localeDefaults,
                availableRawLocales: availableLocaleData.map,
            };
        };
        // always called from behind a memoizer
        CalendarDataManager.prototype.processRawCalendarOptions = function
(optionOverrides, dynamicOptionOverrides) {
            var _a = mergeRawOptions([
                BASE_OPTION_DEFAULTS,
                optionOverrides,
                dynamicOptionOverrides,
            ]), locales = _a.locales, locale = _a.locale;
            var availableLocaleData = this.organizeRawLocales(locales);
            var availableRawLocales = availableLocaleData.map;
            var localeDefaults = this.buildLocale(locale ||
availableLocaleData.defaultCode, availableRawLocales).options;
            var pluginHooks = this.buildPluginHooks(optionOverrides.plugins
|| [], globalPlugins);
            var refiners = this.currentCalendarOptionsRefiners =
__assign(__assign(__assign(__assign(__assign({}, BASE_OPTION_REFINERS),
CALENDAR_LISTENER_REFINERS), CALENDAR_OPTION_REFINERS),
pluginHooks.listenerRefiners), pluginHooks.optionRefiners);
            var extra = {};
            var raw = mergeRawOptions([
                BASE_OPTION_DEFAULTS,
                localeDefaults,
                optionOverrides,
                dynamicOptionOverrides,
            ]);
            var refined = {};
            var currentRaw = this.currentCalendarOptionsInput;
            var currentRefined = this.currentCalendarOptionsRefined;
            var anyChanges = false;
            for (var optionName in raw) {
                if (optionName !== 'plugins') { // because
plugins is special-cased
                    if (raw[optionName] === currentRaw[optionName] ||
                        (COMPLEX_OPTION_COMPARATORS[optionName] &&
                            (optionName in currentRaw) &&
                           
COMPLEX_OPTION_COMPARATORS[optionName](currentRaw[optionName],
raw[optionName]))) {
                        refined[optionName] = currentRefined[optionName];
                    }
                    else if (refiners[optionName]) {
                        refined[optionName] =
refiners[optionName](raw[optionName]);
                        anyChanges = true;
                    }
                    else {
                        extra[optionName] = currentRaw[optionName];
                    }
                }
            }
            if (anyChanges) {
                this.currentCalendarOptionsInput = raw;
                this.currentCalendarOptionsRefined = refined;
            }
            return {
                rawOptions: this.currentCalendarOptionsInput,
                refinedOptions: this.currentCalendarOptionsRefined,
                pluginHooks: pluginHooks,
                availableLocaleData: availableLocaleData,
                localeDefaults: localeDefaults,
                extra: extra,
            };
        };
        CalendarDataManager.prototype._computeCurrentViewData = function
(viewType, optionsData, optionOverrides, dynamicOptionOverrides) {
            var viewSpec = optionsData.viewSpecs[viewType];
            if (!viewSpec) {
                throw new Error("viewType \"" + viewType +
"\" is not available. Please make sure you've loaded all
neccessary plugins");
            }
            var _a = this.processRawViewOptions(viewSpec,
optionsData.pluginHooks, optionsData.localeDefaults, optionOverrides,
dynamicOptionOverrides), refinedOptions = _a.refinedOptions, extra =
_a.extra;
            warnUnknownOptions(extra);
            var dateProfileGenerator = this.buildDateProfileGenerator({
                dateProfileGeneratorClass:
viewSpec.optionDefaults.dateProfileGeneratorClass,
                duration: viewSpec.duration,
                durationUnit: viewSpec.durationUnit,
                usesMinMaxTime: viewSpec.optionDefaults.usesMinMaxTime,
                dateEnv: optionsData.dateEnv,
                calendarApi: this.props.calendarApi,
                slotMinTime: refinedOptions.slotMinTime,
                slotMaxTime: refinedOptions.slotMaxTime,
                showNonCurrentDates: refinedOptions.showNonCurrentDates,
                dayCount: refinedOptions.dayCount,
                dateAlignment: refinedOptions.dateAlignment,
                dateIncrement: refinedOptions.dateIncrement,
                hiddenDays: refinedOptions.hiddenDays,
                weekends: refinedOptions.weekends,
                nowInput: refinedOptions.now,
                validRangeInput: refinedOptions.validRange,
                visibleRangeInput: refinedOptions.visibleRange,
                monthMode: refinedOptions.monthMode,
                fixedWeekCount: refinedOptions.fixedWeekCount,
            });
            var viewApi = this.buildViewApi(viewType, this.getCurrentData,
optionsData.dateEnv);
            return { viewSpec: viewSpec, options: refinedOptions,
dateProfileGenerator: dateProfileGenerator, viewApi: viewApi };
        };
        CalendarDataManager.prototype.processRawViewOptions = function
(viewSpec, pluginHooks, localeDefaults, optionOverrides,
dynamicOptionOverrides) {
            var raw = mergeRawOptions([
                BASE_OPTION_DEFAULTS,
                viewSpec.optionDefaults,
                localeDefaults,
                optionOverrides,
                viewSpec.optionOverrides,
                dynamicOptionOverrides,
            ]);
            var refiners =
__assign(__assign(__assign(__assign(__assign(__assign({},
BASE_OPTION_REFINERS), CALENDAR_LISTENER_REFINERS),
CALENDAR_OPTION_REFINERS), VIEW_OPTION_REFINERS),
pluginHooks.listenerRefiners), pluginHooks.optionRefiners);
            var refined = {};
            var currentRaw = this.currentViewOptionsInput;
            var currentRefined = this.currentViewOptionsRefined;
            var anyChanges = false;
            var extra = {};
            for (var optionName in raw) {
                if (raw[optionName] === currentRaw[optionName]) {
                    refined[optionName] = currentRefined[optionName];
                }
                else {
                    if (raw[optionName] ===
this.currentCalendarOptionsInput[optionName]) {
                        if (optionName in
this.currentCalendarOptionsRefined) { // might be an "extra" prop
                            refined[optionName] =
this.currentCalendarOptionsRefined[optionName];
                        }
                    }
                    else if (refiners[optionName]) {
                        refined[optionName] =
refiners[optionName](raw[optionName]);
                    }
                    else {
                        extra[optionName] = raw[optionName];
                    }
                    anyChanges = true;
                }
            }
            if (anyChanges) {
                this.currentViewOptionsInput = raw;
                this.currentViewOptionsRefined = refined;
            }
            return {
                rawOptions: this.currentViewOptionsInput,
                refinedOptions: this.currentViewOptionsRefined,
                extra: extra,
            };
        };
        return CalendarDataManager;
    }());
    function buildDateEnv$1(timeZone, explicitLocale,
weekNumberCalculation, firstDay, weekText, pluginHooks,
availableLocaleData, defaultSeparator) {
        var locale = buildLocale(explicitLocale ||
availableLocaleData.defaultCode, availableLocaleData.map);
        return new DateEnv({
            calendarSystem: 'gregory',
            timeZone: timeZone,
            namedTimeZoneImpl: pluginHooks.namedTimeZonedImpl,
            locale: locale,
            weekNumberCalculation: weekNumberCalculation,
            firstDay: firstDay,
            weekText: weekText,
            cmdFormatter: pluginHooks.cmdFormatter,
            defaultSeparator: defaultSeparator,
        });
    }
    function buildTheme(options, pluginHooks) {
        var ThemeClass = pluginHooks.themeClasses[options.themeSystem] ||
StandardTheme;
        return new ThemeClass(options);
    }
    function buildDateProfileGenerator(props) {
        var DateProfileGeneratorClass = props.dateProfileGeneratorClass ||
DateProfileGenerator;
        return new DateProfileGeneratorClass(props);
    }
    function buildViewApi(type, getCurrentData, dateEnv) {
        return new ViewApi(type, getCurrentData, dateEnv);
    }
    function buildEventUiBySource(eventSources) {
        return mapHash(eventSources, function (eventSource) { return
eventSource.ui; });
    }
    function buildEventUiBases(eventDefs, eventUiSingleBase,
eventUiBySource) {
        var eventUiBases = { '': eventUiSingleBase };
        for (var defId in eventDefs) {
            var def = eventDefs[defId];
            if (def.sourceId && eventUiBySource[def.sourceId]) {
                eventUiBases[defId] = eventUiBySource[def.sourceId];
            }
        }
        return eventUiBases;
    }
    function buildViewUiProps(calendarContext) {
        var options = calendarContext.options;
        return {
            eventUiSingleBase: createEventUi({
                display: options.eventDisplay,
                editable: options.editable,
                startEditable: options.eventStartEditable,
                durationEditable: options.eventDurationEditable,
                constraint: options.eventConstraint,
                overlap: typeof options.eventOverlap ===
'boolean' ? options.eventOverlap : undefined,
                allow: options.eventAllow,
                backgroundColor: options.eventBackgroundColor,
                borderColor: options.eventBorderColor,
                textColor: options.eventTextColor,
                color: options.eventColor,
            }, calendarContext),
            selectionConfig: createEventUi({
                constraint: options.selectConstraint,
                overlap: typeof options.selectOverlap ===
'boolean' ? options.selectOverlap : undefined,
                allow: options.selectAllow,
            }, calendarContext),
        };
    }
    function computeIsLoading(state, context) {
        for (var _i = 0, _a = context.pluginHooks.isLoadingFuncs; _i <
_a.length; _i++) {
            var isLoadingFunc = _a[_i];
            if (isLoadingFunc(state)) {
                return true;
            }
        }
        return false;
    }
    function parseContextBusinessHours(calendarContext) {
        return parseBusinessHours(calendarContext.options.businessHours,
calendarContext);
    }
    function warnUnknownOptions(options, viewName) {
        for (var optionName in options) {
            console.warn("Unknown option '" + optionName +
"'" +
                (viewName ? " for view '" + viewName +
"'" : ''));
        }
    }

    // TODO: move this to react plugin?
    var CalendarDataProvider = /** @class */ (function (_super) {
        __extends(CalendarDataProvider, _super);
        function CalendarDataProvider(props) {
            var _this = _super.call(this, props) || this;
            _this.handleData = function (data) {
                if (!_this.dataManager) { // still within initial run,
before assignment in constructor
                    // eslint-disable-next-line
react/no-direct-mutation-state
                    _this.state = data; // can't use setState yet
                }
                else {
                    _this.setState(data);
                }
            };
            _this.dataManager = new CalendarDataManager({
                optionOverrides: props.optionOverrides,
                calendarApi: props.calendarApi,
                onData: _this.handleData,
            });
            return _this;
        }
        CalendarDataProvider.prototype.render = function () {
            return this.props.children(this.state);
        };
        CalendarDataProvider.prototype.componentDidUpdate = function
(prevProps) {
            var newOptionOverrides = this.props.optionOverrides;
            if (newOptionOverrides !== prevProps.optionOverrides) { //
prevent recursive handleData
                this.dataManager.resetOptions(newOptionOverrides);
            }
        };
        return CalendarDataProvider;
    }(Component));

    // HELPERS
    /*
    if nextDayThreshold is specified, slicing is done in an all-day
fashion.
    you can get nextDayThreshold from context.nextDayThreshold
    */
    function sliceEvents(props, allDay) {
        return sliceEventStore(props.eventStore, props.eventUiBases,
props.dateProfile.activeRange, allDay ? props.nextDayThreshold : null).fg;
    }

    var NamedTimeZoneImpl = /** @class */ (function () {
        function NamedTimeZoneImpl(timeZoneName) {
            this.timeZoneName = timeZoneName;
        }
        return NamedTimeZoneImpl;
    }());

    var Interaction = /** @class */ (function () {
        function Interaction(settings) {
            this.component = settings.component;
        }
        Interaction.prototype.destroy = function () {
        };
        return Interaction;
    }());
    function parseInteractionSettings(component, input) {
        return {
            component: component,
            el: input.el,
            useEventCenter: input.useEventCenter != null ?
input.useEventCenter : true,
        };
    }
    function interactionSettingsToStore(settings) {
        var _a;
        return _a = {},
            _a[settings.component.uid] = settings,
            _a;
    }
    // global state
    var interactionSettingsStore = {};

    /*
    An abstraction for a dragging interaction originating on an event.
    Does higher-level things than PointerDragger, such as possibly:
    - a "mirror" that moves with the pointer
    - a minimum number of pixels or other criteria for a true drag to begin

    subclasses must emit:
    - pointerdown
    - dragstart
    - dragmove
    - pointerup
    - dragend
    */
    var ElementDragging = /** @class */ (function () {
        function ElementDragging(el, selector) {
            this.emitter = new Emitter();
        }
        ElementDragging.prototype.destroy = function () {
        };
        ElementDragging.prototype.setMirrorIsVisible = function (bool) {
            // optional if subclass doesn't want to support a mirror
        };
        ElementDragging.prototype.setMirrorNeedsRevert = function (bool) {
            // optional if subclass doesn't want to support a mirror
        };
        ElementDragging.prototype.setAutoScrollEnabled = function (bool) {
            // optional
        };
        return ElementDragging;
    }());

    // TODO: get rid of this in favor of options system,
    // tho it's really easy to access this globally rather than pass
thru options.
    var config = {};

    /*
    Information about what will happen when an external element is
dragged-and-dropped
    onto a calendar. Contains information for creating an event.
    */
    var DRAG_META_REFINERS = {
        startTime: createDuration,
        duration: createDuration,
        create: Boolean,
        sourceId: String,
    };
    function parseDragMeta(raw) {
        var _a = refineProps(raw, DRAG_META_REFINERS), refined =
_a.refined, extra = _a.extra;
        return {
            startTime: refined.startTime || null,
            duration: refined.duration || null,
            create: refined.create != null ? refined.create : true,
            sourceId: refined.sourceId,
            leftoverProps: extra,
        };
    }

    var ToolbarSection = /** @class */ (function (_super) {
        __extends(ToolbarSection, _super);
        function ToolbarSection() {
            return _super !== null && _super.apply(this, arguments)
|| this;
        }
        ToolbarSection.prototype.render = function () {
            var _this = this;
            var children = this.props.widgetGroups.map(function
(widgetGroup) { return _this.renderWidgetGroup(widgetGroup); });
            return createElement.apply(void 0,
__spreadArrays(['div', { className: 'fc-toolbar-chunk'
}], children));
        };
        ToolbarSection.prototype.renderWidgetGroup = function (widgetGroup)
{
            var props = this.props;
            var theme = this.context.theme;
            var children = [];
            var isOnlyButtons = true;
            for (var _i = 0, widgetGroup_1 = widgetGroup; _i <
widgetGroup_1.length; _i++) {
                var widget = widgetGroup_1[_i];
                var buttonName = widget.buttonName, buttonClick =
widget.buttonClick, buttonText = widget.buttonText, buttonIcon =
widget.buttonIcon;
                if (buttonName === 'title') {
                    isOnlyButtons = false;
                    children.push(createElement("h2", {
className: "fc-toolbar-title" }, props.title));
                }
                else {
                    var ariaAttrs = buttonIcon ? { 'aria-label':
buttonName } : {};
                    var buttonClasses = ["fc-" + buttonName +
"-button", theme.getClass('button')];
                    if (buttonName === props.activeButton) {
                       
buttonClasses.push(theme.getClass('buttonActive'));
                    }
                    var isDisabled = (!props.isTodayEnabled &&
buttonName === 'today') ||
                        (!props.isPrevEnabled && buttonName ===
'prev') ||
                        (!props.isNextEnabled && buttonName ===
'next');
                    children.push(createElement("button",
__assign({ disabled: isDisabled, className: buttonClasses.join('
'), onClick: buttonClick, type: "button" }, ariaAttrs),
buttonText || (buttonIcon ? createElement("span", { className:
buttonIcon }) : '')));
                }
            }
            if (children.length > 1) {
                var groupClassName = (isOnlyButtons &&
theme.getClass('buttonGroup')) || '';
                return createElement.apply(void 0,
__spreadArrays(['div', { className: groupClassName }],
children));
            }
            return children[0];
        };
        return ToolbarSection;
    }(BaseComponent));

    var Toolbar = /** @class */ (function (_super) {
        __extends(Toolbar, _super);
        function Toolbar() {
            return _super !== null && _super.apply(this, arguments)
|| this;
        }
        Toolbar.prototype.render = function () {
            var _a = this.props, model = _a.model, extraClassName =
_a.extraClassName;
            var forceLtr = false;
            var startContent;
            var endContent;
            var centerContent = model.center;
            if (model.left) {
                forceLtr = true;
                startContent = model.left;
            }
            else {
                startContent = model.start;
            }
            if (model.right) {
                forceLtr = true;
                endContent = model.right;
            }
            else {
                endContent = model.end;
            }
            var classNames = [
                extraClassName || '',
                'fc-toolbar',
                forceLtr ? 'fc-toolbar-ltr' : '',
            ];
            return (createElement("div", { className:
classNames.join(' ') },
                this.renderSection('start', startContent || []),
                this.renderSection('center', centerContent ||
[]),
                this.renderSection('end', endContent || [])));
        };
        Toolbar.prototype.renderSection = function (key, widgetGroups) {
            var props = this.props;
            return (createElement(ToolbarSection, { key: key, widgetGroups:
widgetGroups, title: props.title, activeButton: props.activeButton,
isTodayEnabled: props.isTodayEnabled, isPrevEnabled: props.isPrevEnabled,
isNextEnabled: props.isNextEnabled }));
        };
        return Toolbar;
    }(BaseComponent));

    // TODO: do function component?
    var ViewContainer = /** @class */ (function (_super) {
        __extends(ViewContainer, _super);
        function ViewContainer() {
            var _this = _super !== null && _super.apply(this,
arguments) || this;
            _this.state = {
                availableWidth: null,
            };
            _this.handleEl = function (el) {
                _this.el = el;
                setRef(_this.props.elRef, el);
                _this.updateAvailableWidth();
            };
            _this.handleResize = function () {
                _this.updateAvailableWidth();
            };
            return _this;
        }
        ViewContainer.prototype.render = function () {
            var _a = this, props = _a.props, state = _a.state;
            var aspectRatio = props.aspectRatio;
            var classNames = [
                'fc-view-harness',
                (aspectRatio || props.liquid || props.height)
                    ? 'fc-view-harness-active' // harness
controls the height
                    : 'fc-view-harness-passive',
            ];
            var height = '';
            var paddingBottom = '';
            if (aspectRatio) {
                if (state.availableWidth !== null) {
                    height = state.availableWidth / aspectRatio;
                }
                else {
                    // while waiting to know availableWidth, we can't
set height to *zero*
                    // because will cause lots of unnecessary scrollbars
within scrollgrid.
                    // BETTER: don't start rendering ANYTHING yet
until we know container width
                    // NOTE: why not always use paddingBottom? Causes
height oscillation (issue 5606)
                    paddingBottom = (1 / aspectRatio) * 100 +
"%";
                }
            }
            else {
                height = props.height || '';
            }
            return (createElement("div", { ref: this.handleEl,
onClick: props.onClick, className: classNames.join(' '), style: {
height: height, paddingBottom: paddingBottom } }, props.children));
        };
        ViewContainer.prototype.componentDidMount = function () {
            this.context.addResizeHandler(this.handleResize);
        };
        ViewContainer.prototype.componentWillUnmount = function () {
            this.context.removeResizeHandler(this.handleResize);
        };
        ViewContainer.prototype.updateAvailableWidth = function () {
            if (this.el && // needed. but why?
                this.props.aspectRatio // aspectRatio is the only height
setting that needs availableWidth
            ) {
                this.setState({ availableWidth: this.el.offsetWidth });
            }
        };
        return ViewContainer;
    }(BaseComponent));

    /*
    Detects when the user clicks on an event within a DateComponent
    */
    var EventClicking = /** @class */ (function (_super) {
        __extends(EventClicking, _super);
        function EventClicking(settings) {
            var _this = _super.call(this, settings) || this;
            _this.handleSegClick = function (ev, segEl) {
                var component = _this.component;
                var context = component.context;
                var seg = getElSeg(segEl);
                if (seg && // might be the <div> surrounding
the more link
                    component.isValidSegDownEl(ev.target)) {
                    // our way to simulate a link click for elements that
can't be <a> tags
                    // grab before trigger fired in case trigger trashes
DOM thru rerendering
                    var hasUrlContainer = elementClosest(ev.target,
'.fc-event-forced-url');
                    var url = hasUrlContainer ?
hasUrlContainer.querySelector('a[href]').href : '';
                    context.emitter.trigger('eventClick', {
                        el: segEl,
                        event: new EventApi(component.context,
seg.eventRange.def, seg.eventRange.instance),
                        jsEvent: ev,
                        view: context.viewApi,
                    });
                    if (url && !ev.defaultPrevented) {
                        window.location.href = url;
                    }
                }
            };
            _this.destroy = listenBySelector(settings.el,
'click', '.fc-event', // on both fg and bg events
            _this.handleSegClick);
            return _this;
        }
        return EventClicking;
    }(Interaction));

    /*
    Triggers events and adds/removes core classNames when the user's
pointer
    enters/leaves event-elements of a component.
    */
    var EventHovering = /** @class */ (function (_super) {
        __extends(EventHovering, _super);
        function EventHovering(settings) {
            var _this = _super.call(this, settings) || this;
            // for simulating an eventMouseLeave when the event el is
destroyed while mouse is over it
            _this.handleEventElRemove = function (el) {
                if (el === _this.currentSegEl) {
                    _this.handleSegLeave(null, _this.currentSegEl);
                }
            };
            _this.handleSegEnter = function (ev, segEl) {
                if (getElSeg(segEl)) { // TODO: better way to make sure not
hovering over more+ link or its wrapper
                    _this.currentSegEl = segEl;
                    _this.triggerEvent('eventMouseEnter', ev,
segEl);
                }
            };
            _this.handleSegLeave = function (ev, segEl) {
                if (_this.currentSegEl) {
                    _this.currentSegEl = null;
                    _this.triggerEvent('eventMouseLeave', ev,
segEl);
                }
            };
            _this.removeHoverListeners =
listenToHoverBySelector(settings.el, '.fc-event', // on both fg
and bg events
            _this.handleSegEnter, _this.handleSegLeave);
            return _this;
        }
        EventHovering.prototype.destroy = function () {
            this.removeHoverListeners();
        };
        EventHovering.prototype.triggerEvent = function (publicEvName, ev,
segEl) {
            var component = this.component;
            var context = component.context;
            var seg = getElSeg(segEl);
            if (!ev || component.isValidSegDownEl(ev.target)) {
                context.emitter.trigger(publicEvName, {
                    el: segEl,
                    event: new EventApi(context, seg.eventRange.def,
seg.eventRange.instance),
                    jsEvent: ev,
                    view: context.viewApi,
                });
            }
        };
        return EventHovering;
    }(Interaction));

    var CalendarContent = /** @class */ (function (_super) {
        __extends(CalendarContent, _super);
        function CalendarContent() {
            var _this = _super !== null && _super.apply(this,
arguments) || this;
            _this.buildViewContext = memoize(buildViewContext);
            _this.buildViewPropTransformers =
memoize(buildViewPropTransformers);
            _this.buildToolbarProps = memoize(buildToolbarProps);
            _this.handleNavLinkClick =
buildDelegationHandler('a[data-navlink]',
_this._handleNavLinkClick.bind(_this));
            _this.headerRef = createRef();
            _this.footerRef = createRef();
            _this.interactionsStore = {};
            // Component Registration
            //
-----------------------------------------------------------------------------------------------------------------
            _this.registerInteractiveComponent = function (component,
settingsInput) {
                var settings = parseInteractionSettings(component,
settingsInput);
                var DEFAULT_INTERACTIONS = [
                    EventClicking,
                    EventHovering,
                ];
                var interactionClasses =
DEFAULT_INTERACTIONS.concat(_this.props.pluginHooks.componentInteractions);
                var interactions = interactionClasses.map(function
(TheInteractionClass) { return new TheInteractionClass(settings); });
                _this.interactionsStore[component.uid] = interactions;
                interactionSettingsStore[component.uid] = settings;
            };
            _this.unregisterInteractiveComponent = function (component) {
                for (var _i = 0, _a =
_this.interactionsStore[component.uid]; _i < _a.length; _i++) {
                    var listener = _a[_i];
                    listener.destroy();
                }
                delete _this.interactionsStore[component.uid];
                delete interactionSettingsStore[component.uid];
            };
            // Resizing
            //
-----------------------------------------------------------------------------------------------------------------
            _this.resizeRunner = new DelayedRunner(function () {
                _this.props.emitter.trigger('_resize', true); //
should window resizes be considered "forced" ?
                _this.props.emitter.trigger('windowResize', {
view: _this.props.viewApi });
            });
            _this.handleWindowResize = function (ev) {
                var options = _this.props.options;
                if (options.handleWindowResize &&
                    ev.target === window // avoid jqui events
                ) {
                    _this.resizeRunner.request(options.windowResizeDelay);
                }
            };
            return _this;
        }
        /*
        renders INSIDE of an outer div
        */
        CalendarContent.prototype.render = function () {
            var props = this.props;
            var toolbarConfig = props.toolbarConfig, options =
props.options;
            var toolbarProps = this.buildToolbarProps(props.viewSpec,
props.dateProfile, props.dateProfileGenerator, props.currentDate,
getNow(props.options.now, props.dateEnv), // TODO: use NowTimer????
            props.viewTitle);
            var viewVGrow = false;
            var viewHeight = '';
            var viewAspectRatio;
            if (props.isHeightAuto || props.forPrint) {
                viewHeight = '';
            }
            else if (options.height != null) {
                viewVGrow = true;
            }
            else if (options.contentHeight != null) {
                viewHeight = options.contentHeight;
            }
            else {
                viewAspectRatio = Math.max(options.aspectRatio, 0.5); //
prevent from getting too tall
            }
            var viewContext = this.buildViewContext(props.viewSpec,
props.viewApi, props.options, props.dateProfileGenerator, props.dateEnv,
props.theme, props.pluginHooks, props.dispatch, props.getCurrentData,
props.emitter, props.calendarApi, this.registerInteractiveComponent,
this.unregisterInteractiveComponent);
            return (createElement(ViewContextType.Provider, { value:
viewContext },
                toolbarConfig.headerToolbar &&
(createElement(Toolbar, __assign({ ref: this.headerRef, extraClassName:
"fc-header-toolbar", model: toolbarConfig.headerToolbar },
toolbarProps))),
                createElement(ViewContainer, { liquid: viewVGrow, height:
viewHeight, aspectRatio: viewAspectRatio, onClick: this.handleNavLinkClick
},
                    this.renderView(props),
                    this.buildAppendContent()),
                toolbarConfig.footerToolbar &&
(createElement(Toolbar, __assign({ ref: this.footerRef, extraClassName:
"fc-footer-toolbar", model: toolbarConfig.footerToolbar },
toolbarProps)))));
        };
        CalendarContent.prototype.componentDidMount = function () {
            var props = this.props;
            this.calendarInteractions =
props.pluginHooks.calendarInteractions
                .map(function (CalendarInteractionClass) { return new
CalendarInteractionClass(props); });
            window.addEventListener('resize',
this.handleWindowResize);
            var propSetHandlers = props.pluginHooks.propSetHandlers;
            for (var propName in propSetHandlers) {
                propSetHandlers[propName](props[propName], props);
            }
        };
        CalendarContent.prototype.componentDidUpdate = function (prevProps)
{
            var props = this.props;
            var propSetHandlers = props.pluginHooks.propSetHandlers;
            for (var propName in propSetHandlers) {
                if (props[propName] !== prevProps[propName]) {
                    propSetHandlers[propName](props[propName], props);
                }
            }
        };
        CalendarContent.prototype.componentWillUnmount = function () {
            window.removeEventListener('resize',
this.handleWindowResize);
            this.resizeRunner.clear();
            for (var _i = 0, _a = this.calendarInteractions; _i <
_a.length; _i++) {
                var interaction = _a[_i];
                interaction.destroy();
            }
            this.props.emitter.trigger('_unmount');
        };
        CalendarContent.prototype._handleNavLinkClick = function (ev,
anchorEl) {
            var _a = this.props, dateEnv = _a.dateEnv, options =
_a.options, calendarApi = _a.calendarApi;
            var navLinkOptions =
anchorEl.getAttribute('data-navlink');
            navLinkOptions = navLinkOptions ? JSON.parse(navLinkOptions) :
{};
            var dateMarker = dateEnv.createMarker(navLinkOptions.date);
            var viewType = navLinkOptions.type;
            var customAction = viewType === 'day' ?
options.navLinkDayClick :
                viewType === 'week' ? options.navLinkWeekClick :
null;
            if (typeof customAction === 'function') {
                customAction.call(calendarApi, dateEnv.toDate(dateMarker),
ev);
            }
            else {
                if (typeof customAction === 'string') {
                    viewType = customAction;
                }
                calendarApi.zoomTo(dateMarker, viewType);
            }
        };
        CalendarContent.prototype.buildAppendContent = function () {
            var props = this.props;
            var children =
props.pluginHooks.viewContainerAppends.map(function (buildAppendContent) {
return buildAppendContent(props); });
            return createElement.apply(void 0, __spreadArrays([Fragment,
{}], children));
        };
        CalendarContent.prototype.renderView = function (props) {
            var pluginHooks = props.pluginHooks;
            var viewSpec = props.viewSpec;
            var viewProps = {
                dateProfile: props.dateProfile,
                businessHours: props.businessHours,
                eventStore: props.renderableEventStore,
                eventUiBases: props.eventUiBases,
                dateSelection: props.dateSelection,
                eventSelection: props.eventSelection,
                eventDrag: props.eventDrag,
                eventResize: props.eventResize,
                isHeightAuto: props.isHeightAuto,
                forPrint: props.forPrint,
            };
            var transformers =
this.buildViewPropTransformers(pluginHooks.viewPropsTransformers);
            for (var _i = 0, transformers_1 = transformers; _i <
transformers_1.length; _i++) {
                var transformer = transformers_1[_i];
                __assign(viewProps, transformer.transform(viewProps,
props));
            }
            var ViewComponent = viewSpec.component;
            return (createElement(ViewComponent, __assign({}, viewProps)));
        };
        return CalendarContent;
    }(PureComponent));
    function buildToolbarProps(viewSpec, dateProfile, dateProfileGenerator,
currentDate, now, title) {
        // don't force any date-profiles to valid date profiles (the
`false`) so that we can tell if it's invalid
        var todayInfo = dateProfileGenerator.build(now, undefined, false);
// TODO: need `undefined` or else INFINITE LOOP for some reason
        var prevInfo = dateProfileGenerator.buildPrev(dateProfile,
currentDate, false);
        var nextInfo = dateProfileGenerator.buildNext(dateProfile,
currentDate, false);
        return {
            title: title,
            activeButton: viewSpec.type,
            isTodayEnabled: todayInfo.isValid &&
!rangeContainsMarker(dateProfile.currentRange, now),
            isPrevEnabled: prevInfo.isValid,
            isNextEnabled: nextInfo.isValid,
        };
    }
    // Plugin
    //
-----------------------------------------------------------------------------------------------------------------
    function buildViewPropTransformers(theClasses) {
        return theClasses.map(function (TheClass) { return new TheClass();
});
    }

    var CalendarRoot = /** @class */ (function (_super) {
        __extends(CalendarRoot, _super);
        function CalendarRoot() {
            var _this = _super !== null && _super.apply(this,
arguments) || this;
            _this.state = {
                forPrint: false,
            };
            _this.handleBeforePrint = function () {
                _this.setState({ forPrint: true });
            };
            _this.handleAfterPrint = function () {
                _this.setState({ forPrint: false });
            };
            return _this;
        }
        CalendarRoot.prototype.render = function () {
            var props = this.props;
            var options = props.options;
            var forPrint = this.state.forPrint;
            var isHeightAuto = forPrint || options.height ===
'auto' || options.contentHeight === 'auto';
            var height = (!isHeightAuto && options.height != null)
? options.height : '';
            var classNames = [
                'fc',
                forPrint ? 'fc-media-print' :
'fc-media-screen',
                "fc-direction-" + options.direction,
                props.theme.getClass('root'),
            ];
            if (!getCanVGrowWithinCell()) {
                classNames.push('fc-liquid-hack');
            }
            return props.children(classNames, height, isHeightAuto,
forPrint);
        };
        CalendarRoot.prototype.componentDidMount = function () {
            var emitter = this.props.emitter;
            emitter.on('_beforeprint', this.handleBeforePrint);
            emitter.on('_afterprint', this.handleAfterPrint);
        };
        CalendarRoot.prototype.componentWillUnmount = function () {
            var emitter = this.props.emitter;
            emitter.off('_beforeprint', this.handleBeforePrint);
            emitter.off('_afterprint', this.handleAfterPrint);
        };
        return CalendarRoot;
    }(BaseComponent));

    // Computes a default column header formatting string if `colFormat` is
not explicitly defined
    function computeFallbackHeaderFormat(datesRepDistinctDays, dayCnt) {
        // if more than one week row, or if there are a lot of columns with
not much space,
        // put just the day numbers will be in each cell
        if (!datesRepDistinctDays || dayCnt > 10) {
            return createFormatter({ weekday: 'short' }); //
"Sat"
        }
        if (dayCnt > 1) {
            return createFormatter({ weekday: 'short', month:
'numeric', day: 'numeric', omitCommas: true }); //
"Sat 11/12"
        }
        return createFormatter({ weekday: 'long' }); //
"Saturday"
    }

    var CLASS_NAME = 'fc-col-header-cell'; // do the cushion too?
no
    function renderInner(hookProps) {
        return hookProps.text;
    }

    var TableDateCell = /** @class */ (function (_super) {
        __extends(TableDateCell, _super);
        function TableDateCell() {
            return _super !== null && _super.apply(this, arguments)
|| this;
        }
        TableDateCell.prototype.render = function () {
            var _a = this.context, dateEnv = _a.dateEnv, options =
_a.options, theme = _a.theme, viewApi = _a.viewApi;
            var props = this.props;
            var date = props.date, dateProfile = props.dateProfile;
            var dayMeta = getDateMeta(date, props.todayRange, null,
dateProfile);
            var classNames = [CLASS_NAME].concat(getDayClassNames(dayMeta,
theme));
            var text = dateEnv.format(date, props.dayHeaderFormat);
            // if colCnt is 1, we are already in a day-view and don't
need a navlink
            var navLinkAttrs = (options.navLinks &&
!dayMeta.isDisabled && props.colCnt > 1)
                ? { 'data-navlink': buildNavLinkData(date),
tabIndex: 0 }
                : {};
            var hookProps = __assign(__assign(__assign({ date:
dateEnv.toDate(date), view: viewApi }, props.extraHookProps), { text: text
}), dayMeta);
            return (createElement(RenderHook, { hookProps: hookProps,
classNames: options.dayHeaderClassNames, content: options.dayHeaderContent,
defaultContent: renderInner, didMount: options.dayHeaderDidMount,
willUnmount: options.dayHeaderWillUnmount }, function (rootElRef,
customClassNames, innerElRef, innerContent) { return
(createElement("th", __assign({ ref: rootElRef, className:
classNames.concat(customClassNames).join(' '),
"data-date": !dayMeta.isDisabled ? formatDayString(date) :
undefined, colSpan: props.colSpan }, props.extraDataAttrs),
                createElement("div", { className:
"fc-scrollgrid-sync-inner" }, !dayMeta.isDisabled &&
(createElement("a", __assign({ ref: innerElRef, className: [
                        'fc-col-header-cell-cushion',
                        props.isSticky ? 'fc-sticky' :
'',
                    ].join(' ') }, navLinkAttrs),
innerContent))))); }));
        };
        return TableDateCell;
    }(BaseComponent));

    var TableDowCell = /** @class */ (function (_super) {
        __extends(TableDowCell, _super);
        function TableDowCell() {
            return _super !== null && _super.apply(this, arguments)
|| this;
        }
        TableDowCell.prototype.render = function () {
            var props = this.props;
            var _a = this.context, dateEnv = _a.dateEnv, theme = _a.theme,
viewApi = _a.viewApi, options = _a.options;
            var date = addDays(new Date(259200000), props.dow); // start
with Sun, 04 Jan 1970 00:00:00 GMT
            var dateMeta = {
                dow: props.dow,
                isDisabled: false,
                isFuture: false,
                isPast: false,
                isToday: false,
                isOther: false,
            };
            var classNames = [CLASS_NAME].concat(getDayClassNames(dateMeta,
theme), props.extraClassNames || []);
            var text = dateEnv.format(date, props.dayHeaderFormat);
            var hookProps = __assign(__assign(__assign(__assign({ // TODO:
make this public?
                date: date }, dateMeta), { view: viewApi }),
props.extraHookProps), { text: text });
            return (createElement(RenderHook, { hookProps: hookProps,
classNames: options.dayHeaderClassNames, content: options.dayHeaderContent,
defaultContent: renderInner, didMount: options.dayHeaderDidMount,
willUnmount: options.dayHeaderWillUnmount }, function (rootElRef,
customClassNames, innerElRef, innerContent) { return
(createElement("th", __assign({ ref: rootElRef, className:
classNames.concat(customClassNames).join(' '), colSpan:
props.colSpan }, props.extraDataAttrs),
                createElement("div", { className:
"fc-scrollgrid-sync-inner" },
                    createElement("a", { className: [
                            'fc-col-header-cell-cushion',
                            props.isSticky ? 'fc-sticky' :
'',
                        ].join(' '), ref: innerElRef },
innerContent)))); }));
        };
        return TableDowCell;
    }(BaseComponent));

    var NowTimer = /** @class */ (function (_super) {
        __extends(NowTimer, _super);
        function NowTimer(props, context) {
            var _this = _super.call(this, props, context) || this;
            _this.initialNowDate = getNow(context.options.now,
context.dateEnv);
            _this.initialNowQueriedMs = new Date().valueOf();
            _this.state = _this.computeTiming().currentState;
            return _this;
        }
        NowTimer.prototype.render = function () {
            var _a = this, props = _a.props, state = _a.state;
            return props.children(state.nowDate, state.todayRange);
        };
        NowTimer.prototype.componentDidMount = function () {
            this.setTimeout();
        };
        NowTimer.prototype.componentDidUpdate = function (prevProps) {
            if (prevProps.unit !== this.props.unit) {
                this.clearTimeout();
                this.setTimeout();
            }
        };
        NowTimer.prototype.componentWillUnmount = function () {
            this.clearTimeout();
        };
        NowTimer.prototype.computeTiming = function () {
            var _a = this, props = _a.props, context = _a.context;
            var unroundedNow = addMs(this.initialNowDate, new
Date().valueOf() - this.initialNowQueriedMs);
            var currentUnitStart = context.dateEnv.startOf(unroundedNow,
props.unit);
            var nextUnitStart = context.dateEnv.add(currentUnitStart,
createDuration(1, props.unit));
            var waitMs = nextUnitStart.valueOf() - unroundedNow.valueOf();
            // there is a max setTimeout ms value
(https://stackoverflow.com/a/3468650/96342)
            // ensure no longer than a day
            waitMs = Math.min(1000 * 60 * 60 * 24, waitMs);
            return {
                currentState: { nowDate: currentUnitStart, todayRange:
buildDayRange(currentUnitStart) },
                nextState: { nowDate: nextUnitStart, todayRange:
buildDayRange(nextUnitStart) },
                waitMs: waitMs,
            };
        };
        NowTimer.prototype.setTimeout = function () {
            var _this = this;
            var _a = this.computeTiming(), nextState = _a.nextState, waitMs
= _a.waitMs;
            this.timeoutId = setTimeout(function () {
                _this.setState(nextState, function () {
                    _this.setTimeout();
                });
            }, waitMs);
        };
        NowTimer.prototype.clearTimeout = function () {
            if (this.timeoutId) {
                clearTimeout(this.timeoutId);
            }
        };
        NowTimer.contextType = ViewContextType;
        return NowTimer;
    }(Component));
    function buildDayRange(date) {
        var start = startOfDay(date);
        var end = addDays(start, 1);
        return { start: start, end: end };
    }

    var DayHeader = /** @class */ (function (_super) {
        __extends(DayHeader, _super);
        function DayHeader() {
            var _this = _super !== null && _super.apply(this,
arguments) || this;
            _this.createDayHeaderFormatter =
memoize(createDayHeaderFormatter);
            return _this;
        }
        DayHeader.prototype.render = function () {
            var context = this.context;
            var _a = this.props, dates = _a.dates, dateProfile =
_a.dateProfile, datesRepDistinctDays = _a.datesRepDistinctDays, renderIntro
= _a.renderIntro;
            var dayHeaderFormat =
this.createDayHeaderFormatter(context.options.dayHeaderFormat,
datesRepDistinctDays, dates.length);
            return (createElement(NowTimer, { unit: "day" },
function (nowDate, todayRange) { return (createElement("tr",
null,
                renderIntro && renderIntro('day'),
                dates.map(function (date) { return (datesRepDistinctDays ?
(createElement(TableDateCell, { key: date.toISOString(), date: date,
dateProfile: dateProfile, todayRange: todayRange, colCnt: dates.length,
dayHeaderFormat: dayHeaderFormat })) : (createElement(TableDowCell, { key:
date.getUTCDay(), dow: date.getUTCDay(), dayHeaderFormat: dayHeaderFormat
}))); }))); }));
        };
        return DayHeader;
    }(BaseComponent));
    function createDayHeaderFormatter(explicitFormat, datesRepDistinctDays,
dateCnt) {
        return explicitFormat ||
computeFallbackHeaderFormat(datesRepDistinctDays, dateCnt);
    }

    var DaySeriesModel = /** @class */ (function () {
        function DaySeriesModel(range, dateProfileGenerator) {
            var date = range.start;
            var end = range.end;
            var indices = [];
            var dates = [];
            var dayIndex = -1;
            while (date < end) { // loop each day from start to end
                if (dateProfileGenerator.isHiddenDay(date)) {
                    indices.push(dayIndex + 0.5); // mark that it's
between indices
                }
                else {
                    dayIndex += 1;
                    indices.push(dayIndex);
                    dates.push(date);
                }
                date = addDays(date, 1);
            }
            this.dates = dates;
            this.indices = indices;
            this.cnt = dates.length;
        }
        DaySeriesModel.prototype.sliceRange = function (range) {
            var firstIndex = this.getDateDayIndex(range.start); //
inclusive first index
            var lastIndex = this.getDateDayIndex(addDays(range.end, -1));
// inclusive last index
            var clippedFirstIndex = Math.max(0, firstIndex);
            var clippedLastIndex = Math.min(this.cnt - 1, lastIndex);
            // deal with in-between indices
            clippedFirstIndex = Math.ceil(clippedFirstIndex); // in-between
starts round to next cell
            clippedLastIndex = Math.floor(clippedLastIndex); // in-between
ends round to prev cell
            if (clippedFirstIndex <= clippedLastIndex) {
                return {
                    firstIndex: clippedFirstIndex,
                    lastIndex: clippedLastIndex,
                    isStart: firstIndex === clippedFirstIndex,
                    isEnd: lastIndex === clippedLastIndex,
                };
            }
            return null;
        };
        // Given a date, returns its chronolocial cell-index from the first
cell of the grid.
        // If the date lies between cells (because of hiddenDays), returns
a floating-point value between offsets.
        // If before the first offset, returns a negative number.
        // If after the last offset, returns an offset past the last cell
offset.
        // Only works for *start* dates of cells. Will not work for
exclusive end dates for cells.
        DaySeriesModel.prototype.getDateDayIndex = function (date) {
            var indices = this.indices;
            var dayOffset = Math.floor(diffDays(this.dates[0], date));
            if (dayOffset < 0) {
                return indices[0] - 1;
            }
            if (dayOffset >= indices.length) {
                return indices[indices.length - 1] + 1;
            }
            return indices[dayOffset];
        };
        return DaySeriesModel;
    }());

    var DayTableModel = /** @class */ (function () {
        function DayTableModel(daySeries, breakOnWeeks) {
            var dates = daySeries.dates;
            var daysPerRow;
            var firstDay;
            var rowCnt;
            if (breakOnWeeks) {
                // count columns until the day-of-week repeats
                firstDay = dates[0].getUTCDay();
                for (daysPerRow = 1; daysPerRow < dates.length;
daysPerRow += 1) {
                    if (dates[daysPerRow].getUTCDay() === firstDay) {
                        break;
                    }
                }
                rowCnt = Math.ceil(dates.length / daysPerRow);
            }
            else {
                rowCnt = 1;
                daysPerRow = dates.length;
            }
            this.rowCnt = rowCnt;
            this.colCnt = daysPerRow;
            this.daySeries = daySeries;
            this.cells = this.buildCells();
            this.headerDates = this.buildHeaderDates();
        }
        DayTableModel.prototype.buildCells = function () {
            var rows = [];
            for (var row = 0; row < this.rowCnt; row += 1) {
                var cells = [];
                for (var col = 0; col < this.colCnt; col += 1) {
                    cells.push(this.buildCell(row, col));
                }
                rows.push(cells);
            }
            return rows;
        };
        DayTableModel.prototype.buildCell = function (row, col) {
            var date = this.daySeries.dates[row * this.colCnt + col];
            return {
                key: date.toISOString(),
                date: date,
            };
        };
        DayTableModel.prototype.buildHeaderDates = function () {
            var dates = [];
            for (var col = 0; col < this.colCnt; col += 1) {
                dates.push(this.cells[0][col].date);
            }
            return dates;
        };
        DayTableModel.prototype.sliceRange = function (range) {
            var colCnt = this.colCnt;
            var seriesSeg = this.daySeries.sliceRange(range);
            var segs = [];
            if (seriesSeg) {
                var firstIndex = seriesSeg.firstIndex, lastIndex =
seriesSeg.lastIndex;
                var index = firstIndex;
                while (index <= lastIndex) {
                    var row = Math.floor(index / colCnt);
                    var nextIndex = Math.min((row + 1) * colCnt, lastIndex
+ 1);
                    segs.push({
                        row: row,
                        firstCol: index % colCnt,
                        lastCol: (nextIndex - 1) % colCnt,
                        isStart: seriesSeg.isStart && index ===
firstIndex,
                        isEnd: seriesSeg.isEnd && (nextIndex - 1)
=== lastIndex,
                    });
                    index = nextIndex;
                }
            }
            return segs;
        };
        return DayTableModel;
    }());

    var Slicer = /** @class */ (function () {
        function Slicer() {
            this.sliceBusinessHours = memoize(this._sliceBusinessHours);
            this.sliceDateSelection = memoize(this._sliceDateSpan);
            this.sliceEventStore = memoize(this._sliceEventStore);
            this.sliceEventDrag = memoize(this._sliceInteraction);
            this.sliceEventResize = memoize(this._sliceInteraction);
            this.forceDayIfListItem = false; // hack
        }
        Slicer.prototype.sliceProps = function (props, dateProfile,
nextDayThreshold, context) {
            var extraArgs = [];
            for (var _i = 4; _i < arguments.length; _i++) {
                extraArgs[_i - 4] = arguments[_i];
            }
            var eventUiBases = props.eventUiBases;
            var eventSegs = this.sliceEventStore.apply(this,
__spreadArrays([props.eventStore, eventUiBases, dateProfile,
nextDayThreshold], extraArgs));
            return {
                dateSelectionSegs: this.sliceDateSelection.apply(this,
__spreadArrays([props.dateSelection, eventUiBases, context], extraArgs)),
                businessHourSegs: this.sliceBusinessHours.apply(this,
__spreadArrays([props.businessHours, dateProfile, nextDayThreshold,
context], extraArgs)),
                fgEventSegs: eventSegs.fg,
                bgEventSegs: eventSegs.bg,
                eventDrag: this.sliceEventDrag.apply(this,
__spreadArrays([props.eventDrag, eventUiBases, dateProfile,
nextDayThreshold], extraArgs)),
                eventResize: this.sliceEventResize.apply(this,
__spreadArrays([props.eventResize, eventUiBases, dateProfile,
nextDayThreshold], extraArgs)),
                eventSelection: props.eventSelection,
            }; // TODO: give interactionSegs?
        };
        Slicer.prototype.sliceNowDate = function (// does not memoize
        date, context) {
            var extraArgs = [];
            for (var _i = 2; _i < arguments.length; _i++) {
                extraArgs[_i - 2] = arguments[_i];
            }
            return this._sliceDateSpan.apply(this, __spreadArrays([{ range:
{ start: date, end: addMs(date, 1) }, allDay: false },
                {},
                context], extraArgs));
        };
        Slicer.prototype._sliceBusinessHours = function (businessHours,
dateProfile, nextDayThreshold, context) {
            var extraArgs = [];
            for (var _i = 4; _i < arguments.length; _i++) {
                extraArgs[_i - 4] = arguments[_i];
            }
            if (!businessHours) {
                return [];
            }
            return this._sliceEventStore.apply(this,
__spreadArrays([expandRecurring(businessHours,
computeActiveRange(dateProfile, Boolean(nextDayThreshold)), context),
                {},
                dateProfile,
                nextDayThreshold], extraArgs)).bg;
        };
        Slicer.prototype._sliceEventStore = function (eventStore,
eventUiBases, dateProfile, nextDayThreshold) {
            var extraArgs = [];
            for (var _i = 4; _i < arguments.length; _i++) {
                extraArgs[_i - 4] = arguments[_i];
            }
            if (eventStore) {
                var rangeRes = sliceEventStore(eventStore, eventUiBases,
computeActiveRange(dateProfile, Boolean(nextDayThreshold)),
nextDayThreshold);
                return {
                    bg: this.sliceEventRanges(rangeRes.bg, extraArgs),
                    fg: this.sliceEventRanges(rangeRes.fg, extraArgs),
                };
            }
            return { bg: [], fg: [] };
        };
        Slicer.prototype._sliceInteraction = function (interaction,
eventUiBases, dateProfile, nextDayThreshold) {
            var extraArgs = [];
            for (var _i = 4; _i < arguments.length; _i++) {
                extraArgs[_i - 4] = arguments[_i];
            }
            if (!interaction) {
                return null;
            }
            var rangeRes = sliceEventStore(interaction.mutatedEvents,
eventUiBases, computeActiveRange(dateProfile, Boolean(nextDayThreshold)),
nextDayThreshold);
            return {
                segs: this.sliceEventRanges(rangeRes.fg, extraArgs),
                affectedInstances: interaction.affectedEvents.instances,
                isEvent: interaction.isEvent,
            };
        };
        Slicer.prototype._sliceDateSpan = function (dateSpan, eventUiBases,
context) {
            var extraArgs = [];
            for (var _i = 3; _i < arguments.length; _i++) {
                extraArgs[_i - 3] = arguments[_i];
            }
            if (!dateSpan) {
                return [];
            }
            var eventRange = fabricateEventRange(dateSpan, eventUiBases,
context);
            var segs = this.sliceRange.apply(this,
__spreadArrays([dateSpan.range], extraArgs));
            for (var _a = 0, segs_1 = segs; _a < segs_1.length; _a++) {
                var seg = segs_1[_a];
                seg.eventRange = eventRange;
            }
            return segs;
        };
        /*
        "complete" seg means it has component and eventRange
        */
        Slicer.prototype.sliceEventRanges = function (eventRanges,
extraArgs) {
            var segs = [];
            for (var _i = 0, eventRanges_1 = eventRanges; _i <
eventRanges_1.length; _i++) {
                var eventRange = eventRanges_1[_i];
                segs.push.apply(segs, this.sliceEventRange(eventRange,
extraArgs));
            }
            return segs;
        };
        /*
        "complete" seg means it has component and eventRange
        */
        Slicer.prototype.sliceEventRange = function (eventRange, extraArgs)
{
            var dateRange = eventRange.range;
            // hack to make multi-day events that are being force-displayed
as list-items to take up only one day
            if (this.forceDayIfListItem && eventRange.ui.display
=== 'list-item') {
                dateRange = {
                    start: dateRange.start,
                    end: addDays(dateRange.start, 1),
                };
            }
            var segs = this.sliceRange.apply(this,
__spreadArrays([dateRange], extraArgs));
            for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {
                var seg = segs_2[_i];
                seg.eventRange = eventRange;
                seg.isStart = eventRange.isStart && seg.isStart;
                seg.isEnd = eventRange.isEnd && seg.isEnd;
            }
            return segs;
        };
        return Slicer;
    }());
    /*
    for incorporating slotMinTime/slotMaxTime if appropriate
    TODO: should be part of DateProfile!
    TimelineDateProfile already does this btw
    */
    function computeActiveRange(dateProfile, isComponentAllDay) {
        var range = dateProfile.activeRange;
        if (isComponentAllDay) {
            return range;
        }
        return {
            start: addMs(range.start,
dateProfile.slotMinTime.milliseconds),
            end: addMs(range.end, dateProfile.slotMaxTime.milliseconds -
864e5),
        };
    }

    var VISIBLE_HIDDEN_RE = /^(visible|hidden)$/;
    var Scroller = /** @class */ (function (_super) {
        __extends(Scroller, _super);
        function Scroller() {
            var _this = _super !== null && _super.apply(this,
arguments) || this;
            _this.handleEl = function (el) {
                _this.el = el;
                setRef(_this.props.elRef, el);
            };
            return _this;
        }
        Scroller.prototype.render = function () {
            var props = this.props;
            var liquid = props.liquid, liquidIsAbsolute =
props.liquidIsAbsolute;
            var isAbsolute = liquid && liquidIsAbsolute;
            var className = ['fc-scroller'];
            if (liquid) {
                if (liquidIsAbsolute) {
                   
className.push('fc-scroller-liquid-absolute');
                }
                else {
                    className.push('fc-scroller-liquid');
                }
            }
            return (createElement("div", { ref: this.handleEl,
className: className.join(' '), style: {
                    overflowX: props.overflowX,
                    overflowY: props.overflowY,
                    left: (isAbsolute && -(props.overcomeLeft ||
0)) || '',
                    right: (isAbsolute && -(props.overcomeRight ||
0)) || '',
                    bottom: (isAbsolute && -(props.overcomeBottom
|| 0)) || '',
                    marginLeft: (!isAbsolute &&
-(props.overcomeLeft || 0)) || '',
                    marginRight: (!isAbsolute &&
-(props.overcomeRight || 0)) || '',
                    marginBottom: (!isAbsolute &&
-(props.overcomeBottom || 0)) || '',
                    maxHeight: props.maxHeight || '',
                } }, props.children));
        };
        Scroller.prototype.needsXScrolling = function () {
            if (VISIBLE_HIDDEN_RE.test(this.props.overflowX)) {
                return false;
            }
            // testing scrollWidth>clientWidth is unreliable
cross-browser when pixel heights aren't integers.
            // much more reliable to see if children are taller than the
scroller, even tho doesn't account for
            // inner-child margins and absolute positioning
            var el = this.el;
            var realClientWidth = this.el.getBoundingClientRect().width -
this.getYScrollbarWidth();
            var children = el.children;
            for (var i = 0; i < children.length; i += 1) {
                var childEl = children[i];
                if (childEl.getBoundingClientRect().width >
realClientWidth) {
                    return true;
                }
            }
            return false;
        };
        Scroller.prototype.needsYScrolling = function () {
            if (VISIBLE_HIDDEN_RE.test(this.props.overflowY)) {
                return false;
            }
            // testing scrollHeight>clientHeight is unreliable
cross-browser when pixel heights aren't integers.
            // much more reliable to see if children are taller than the
scroller, even tho doesn't account for
            // inner-child margins and absolute positioning
            var el = this.el;
            var realClientHeight = this.el.getBoundingClientRect().height -
this.getXScrollbarWidth();
            var children = el.children;
            for (var i = 0; i < children.length; i += 1) {
                var childEl = children[i];
                if (childEl.getBoundingClientRect().height >
realClientHeight) {
                    return true;
                }
            }
            return false;
        };
        Scroller.prototype.getXScrollbarWidth = function () {
            if (VISIBLE_HIDDEN_RE.test(this.props.overflowX)) {
                return 0;
            }
            return this.el.offsetHeight - this.el.clientHeight; // only
works because we guarantee no borders. TODO: add to CSS with important?
        };
        Scroller.prototype.getYScrollbarWidth = function () {
            if (VISIBLE_HIDDEN_RE.test(this.props.overflowY)) {
                return 0;
            }
            return this.el.offsetWidth - this.el.clientWidth; // only works
because we guarantee no borders. TODO: add to CSS with important?
        };
        return Scroller;
    }(BaseComponent));

    /*
    TODO: somehow infer OtherArgs from masterCallback?
    TODO: infer RefType from masterCallback if provided
    */
    var RefMap = /** @class */ (function () {
        function RefMap(masterCallback) {
            var _this = this;
            this.masterCallback = masterCallback;
            this.currentMap = {};
            this.depths = {};
            this.callbackMap = {};
            this.handleValue = function (val, key) {
                var _a = _this, depths = _a.depths, currentMap =
_a.currentMap;
                var removed = false;
                var added = false;
                if (val !== null) {
                    // for bug... ACTUALLY: can probably do away with this
now that callers don't share numeric indices anymore
                    removed = (key in currentMap);
                    currentMap[key] = val;
                    depths[key] = (depths[key] || 0) + 1;
                    added = true;
                }
                else {
                    depths[key] -= 1;
                    if (!depths[key]) {
                        delete currentMap[key];
                        delete _this.callbackMap[key];
                        removed = true;
                    }
                }
                if (_this.masterCallback) {
                    if (removed) {
                        _this.masterCallback(null, String(key));
                    }
                    if (added) {
                        _this.masterCallback(val, String(key));
                    }
                }
            };
        }
        RefMap.prototype.createRef = function (key) {
            var _this = this;
            var refCallback = this.callbackMap[key];
            if (!refCallback) {
                refCallback = this.callbackMap[key] = function (val) {
                    _this.handleValue(val, String(key));
                };
            }
            return refCallback;
        };
        // TODO: check callers that don't care about order. should use
getAll instead
        // NOTE: this method has become less valuable now that we are
encouraged to map order by some other index
        // TODO: provide ONE array-export function, buildArray, which fails
on non-numeric indexes. caller can manipulate and "collect"
        RefMap.prototype.collect = function (startIndex, endIndex, step) {
            return collectFromHash(this.currentMap, startIndex, endIndex,
step);
        };
        RefMap.prototype.getAll = function () {
            return hashValuesToArray(this.currentMap);
        };
        return RefMap;
    }());

    function computeShrinkWidth(chunkEls) {
        var shrinkCells = findElements(chunkEls,
'.fc-scrollgrid-shrink');
        var largestWidth = 0;
        for (var _i = 0, shrinkCells_1 = shrinkCells; _i <
shrinkCells_1.length; _i++) {
            var shrinkCell = shrinkCells_1[_i];
            largestWidth = Math.max(largestWidth,
computeSmallestCellWidth(shrinkCell));
        }
        return Math.ceil(largestWidth); // <table> elements work best
with integers. round up to ensure contents fits
    }
    function getSectionHasLiquidHeight(props, sectionConfig) {
        return props.liquid && sectionConfig.liquid; // does the
section do liquid-height? (need to have whole scrollgrid liquid-height as
well)
    }
    function getAllowYScrolling(props, sectionConfig) {
        return sectionConfig.maxHeight != null || // if its possible for
the height to max out, we might need scrollbars
            getSectionHasLiquidHeight(props, sectionConfig); // if the
section is liquid height, it might condense enough to require scrollbars
    }
    // TODO: ONLY use `arg`. force out internal function to use same API
    function renderChunkContent(sectionConfig, chunkConfig, arg) {
        var expandRows = arg.expandRows;
        var content = typeof chunkConfig.content === 'function' ?
            chunkConfig.content(arg) :
            createElement('table', {
                className: [
                    chunkConfig.tableClassName,
                    sectionConfig.syncRowHeights ?
'fc-scrollgrid-sync-table' : '',
                ].join(' '),
                style: {
                    minWidth: arg.tableMinWidth,
                    width: arg.clientWidth,
                    height: expandRows ? arg.clientHeight : '',
                },
            }, arg.tableColGroupNode, createElement('tbody', {},
typeof chunkConfig.rowContent === 'function' ?
chunkConfig.rowContent(arg) : chunkConfig.rowContent));
        return content;
    }
    function isColPropsEqual(cols0, cols1) {
        return isArraysEqual(cols0, cols1, isPropsEqual);
    }
    function renderMicroColGroup(cols, shrinkWidth) {
        var colNodes = [];
        /*
        for ColProps with spans, it would have been great to make a single
<col span="">
        HOWEVER, Chrome was getting messing up distributing the width to
<td>/<th> elements with colspans.
        SOLUTION: making individual <col> elements makes Chrome
behave.
        */
        for (var _i = 0, cols_1 = cols; _i < cols_1.length; _i++) {
            var colProps = cols_1[_i];
            var span = colProps.span || 1;
            for (var i = 0; i < span; i += 1) {
                colNodes.push(createElement("col", { style: {
                        width: colProps.width === 'shrink' ?
sanitizeShrinkWidth(shrinkWidth) : (colProps.width || ''),
                        minWidth: colProps.minWidth || '',
                    } }));
            }
        }
        return createElement.apply(void 0,
__spreadArrays(['colgroup', {}], colNodes));
    }
    function sanitizeShrinkWidth(shrinkWidth) {
        /* why 4? if we do 0, it will kill any border, which are needed for
computeSmallestCellWidth
        4 accounts for 2 2-pixel borders. TODO: better solution? */
        return shrinkWidth == null ? 4 : shrinkWidth;
    }
    function hasShrinkWidth(cols) {
        for (var _i = 0, cols_2 = cols; _i < cols_2.length; _i++) {
            var col = cols_2[_i];
            if (col.width === 'shrink') {
                return true;
            }
        }
        return false;
    }
    function getScrollGridClassNames(liquid, context) {
        var classNames = [
            'fc-scrollgrid',
            context.theme.getClass('table'),
        ];
        if (liquid) {
            classNames.push('fc-scrollgrid-liquid');
        }
        return classNames;
    }
    function getSectionClassNames(sectionConfig, wholeTableVGrow) {
        var classNames = [
            'fc-scrollgrid-section',
            "fc-scrollgrid-section-" + sectionConfig.type,
            sectionConfig.className,
        ];
        if (wholeTableVGrow && sectionConfig.liquid &&
sectionConfig.maxHeight == null) {
            classNames.push('fc-scrollgrid-section-liquid');
        }
        if (sectionConfig.isSticky) {
            classNames.push('fc-scrollgrid-section-sticky');
        }
        return classNames;
    }
    function renderScrollShim(arg) {
        return (createElement("div", { className:
"fc-scrollgrid-sticky-shim", style: {
                width: arg.clientWidth,
                minWidth: arg.tableMinWidth,
            } }));
    }
    function getStickyHeaderDates(options) {
        var stickyHeaderDates = options.stickyHeaderDates;
        if (stickyHeaderDates == null || stickyHeaderDates ===
'auto') {
            stickyHeaderDates = options.height === 'auto' ||
options.viewHeight === 'auto';
        }
        return stickyHeaderDates;
    }
    function getStickyFooterScrollbar(options) {
        var stickyFooterScrollbar = options.stickyFooterScrollbar;
        if (stickyFooterScrollbar == null || stickyFooterScrollbar ===
'auto') {
            stickyFooterScrollbar = options.height === 'auto' ||
options.viewHeight === 'auto';
        }
        return stickyFooterScrollbar;
    }

    var SimpleScrollGrid = /** @class */ (function (_super) {
        __extends(SimpleScrollGrid, _super);
        function SimpleScrollGrid() {
            var _this = _super !== null && _super.apply(this,
arguments) || this;
            _this.processCols = memoize(function (a) { return a; },
isColPropsEqual); // so we get same `cols` props every time
            // yucky to memoize VNodes, but much more efficient for
consumers
            _this.renderMicroColGroup = memoize(renderMicroColGroup);
            _this.scrollerRefs = new RefMap();
            _this.scrollerElRefs = new
RefMap(_this._handleScrollerEl.bind(_this));
            _this.state = {
                shrinkWidth: null,
                forceYScrollbars: false,
                scrollerClientWidths: {},
                scrollerClientHeights: {},
            };
            // TODO: can do a really simple print-view. dont need to join
rows
            _this.handleSizing = function () {
                _this.setState(__assign({ shrinkWidth:
_this.computeShrinkWidth() }, _this.computeScrollerDims()));
            };
            return _this;
        }
        SimpleScrollGrid.prototype.render = function () {
            var _a = this, props = _a.props, state = _a.state, context =
_a.context;
            var sectionConfigs = props.sections || [];
            var cols = this.processCols(props.cols);
            var microColGroupNode = this.renderMicroColGroup(cols,
state.shrinkWidth);
            var classNames = getScrollGridClassNames(props.liquid,
context);
            // TODO: make DRY
            var configCnt = sectionConfigs.length;
            var configI = 0;
            var currentConfig;
            var headSectionNodes = [];
            var bodySectionNodes = [];
            var footSectionNodes = [];
            while (configI < configCnt && (currentConfig =
sectionConfigs[configI]).type === 'header') {
                headSectionNodes.push(this.renderSection(currentConfig,
microColGroupNode));
                configI += 1;
            }
            while (configI < configCnt && (currentConfig =
sectionConfigs[configI]).type === 'body') {
                bodySectionNodes.push(this.renderSection(currentConfig,
microColGroupNode));
                configI += 1;
            }
            while (configI < configCnt && (currentConfig =
sectionConfigs[configI]).type === 'footer') {
                footSectionNodes.push(this.renderSection(currentConfig,
microColGroupNode));
                configI += 1;
            }
            // firefox bug: when setting height on table and there is a
thead or tfoot,
            // the necessary height:100% on the liquid-height body section
forces the *whole* table to be taller. (bug #5524)
            // use getCanVGrowWithinCell as a way to detect table-stupid
firefox.
            // if so, use a simpler dom structure, jam everything into a
lone tbody.
            var isBuggy = !getCanVGrowWithinCell();
            return createElement('table', {
                className: classNames.join(' '),
                style: { height: props.height },
            }, Boolean(!isBuggy && headSectionNodes.length)
&& createElement.apply(void 0, __spreadArrays(['thead',
{}], headSectionNodes)), Boolean(!isBuggy &&
bodySectionNodes.length) && createElement.apply(void 0,
__spreadArrays(['tbody', {}], bodySectionNodes)),
Boolean(!isBuggy && footSectionNodes.length) &&
createElement.apply(void 0, __spreadArrays(['tfoot', {}],
footSectionNodes)), isBuggy && createElement.apply(void 0,
__spreadArrays(['tbody', {}], headSectionNodes, bodySectionNodes,
footSectionNodes)));
        };
        SimpleScrollGrid.prototype.renderSection = function (sectionConfig,
microColGroupNode) {
            if ('outerContent' in sectionConfig) {
                return (createElement(Fragment, { key: sectionConfig.key },
sectionConfig.outerContent));
            }
            return (createElement("tr", { key: sectionConfig.key,
className: getSectionClassNames(sectionConfig,
this.props.liquid).join(' ') }, this.renderChunkTd(sectionConfig,
microColGroupNode, sectionConfig.chunk)));
        };
        SimpleScrollGrid.prototype.renderChunkTd = function (sectionConfig,
microColGroupNode, chunkConfig) {
            if ('outerContent' in chunkConfig) {
                return chunkConfig.outerContent;
            }
            var props = this.props;
            var _a = this.state, forceYScrollbars = _a.forceYScrollbars,
scrollerClientWidths = _a.scrollerClientWidths, scrollerClientHeights =
_a.scrollerClientHeights;
            var needsYScrolling = getAllowYScrolling(props, sectionConfig);
// TODO: do lazily. do in section config?
            var isLiquid = getSectionHasLiquidHeight(props, sectionConfig);
            // for `!props.liquid` - is WHOLE scrollgrid natural height?
            // TODO: do same thing in advanced scrollgrid? prolly not b/c
always has horizontal scrollbars
            var overflowY = !props.liquid ? 'visible' :
                forceYScrollbars ? 'scroll' :
                    !needsYScrolling ? 'hidden' :
                        'auto';
            var sectionKey = sectionConfig.key;
            var content = renderChunkContent(sectionConfig, chunkConfig, {
                tableColGroupNode: microColGroupNode,
                tableMinWidth: '',
                clientWidth: scrollerClientWidths[sectionKey] !== undefined
? scrollerClientWidths[sectionKey] : null,
                clientHeight: scrollerClientHeights[sectionKey] !==
undefined ? scrollerClientHeights[sectionKey] : null,
                expandRows: sectionConfig.expandRows,
                syncRowHeights: false,
                rowSyncHeights: [],
                reportRowHeightChange: function () { },
            });
            return (createElement("td", { ref: chunkConfig.elRef
},
                createElement("div", { className:
"fc-scroller-harness" + (isLiquid ? '
fc-scroller-harness-liquid' : '') },
                    createElement(Scroller, { ref:
this.scrollerRefs.createRef(sectionKey), elRef:
this.scrollerElRefs.createRef(sectionKey), overflowY: overflowY, overflowX:
!props.liquid ? 'visible' : 'hidden' /* natural height?
*/, maxHeight: sectionConfig.maxHeight, liquid: isLiquid, liquidIsAbsolute
// because its within a harness
                        : true }, content))));
        };
        SimpleScrollGrid.prototype._handleScrollerEl = function
(scrollerEl, key) {
            var section = getSectionByKey(this.props.sections, key);
            if (section) {
                setRef(section.chunk.scrollerElRef, scrollerEl);
            }
        };
        SimpleScrollGrid.prototype.componentDidMount = function () {
            this.handleSizing();
            this.context.addResizeHandler(this.handleSizing);
        };
        SimpleScrollGrid.prototype.componentDidUpdate = function () {
            // TODO: need better solution when state contains non-sizing
things
            this.handleSizing();
        };
        SimpleScrollGrid.prototype.componentWillUnmount = function () {
            this.context.removeResizeHandler(this.handleSizing);
        };
        SimpleScrollGrid.prototype.computeShrinkWidth = function () {
            return hasShrinkWidth(this.props.cols)
                ? computeShrinkWidth(this.scrollerElRefs.getAll())
                : 0;
        };
        SimpleScrollGrid.prototype.computeScrollerDims = function () {
            var scrollbarWidth = getScrollbarWidths();
            var _a = this, scrollerRefs = _a.scrollerRefs, scrollerElRefs =
_a.scrollerElRefs;
            var forceYScrollbars = false;
            var scrollerClientWidths = {};
            var scrollerClientHeights = {};
            for (var sectionKey in scrollerRefs.currentMap) {
                var scroller = scrollerRefs.currentMap[sectionKey];
                if (scroller && scroller.needsYScrolling()) {
                    forceYScrollbars = true;
                    break;
                }
            }
            for (var _i = 0, _b = this.props.sections; _i < _b.length;
_i++) {
                var section = _b[_i];
                var sectionKey = section.key;
                var scrollerEl = scrollerElRefs.currentMap[sectionKey];
                if (scrollerEl) {
                    var harnessEl = scrollerEl.parentNode; // TODO: weird
way to get this. need harness b/c doesn't include table borders
                    scrollerClientWidths[sectionKey] =
Math.floor(harnessEl.getBoundingClientRect().width - (forceYScrollbars
                        ? scrollbarWidth.y // use global because scroller
might not have scrollbars yet but will need them in future
                        : 0));
                    scrollerClientHeights[sectionKey] =
Math.floor(harnessEl.getBoundingClientRect().height);
                }
            }
            return { forceYScrollbars: forceYScrollbars,
scrollerClientWidths: scrollerClientWidths, scrollerClientHeights:
scrollerClientHeights };
        };
        return SimpleScrollGrid;
    }(BaseComponent));
    SimpleScrollGrid.addStateEquality({
        scrollerClientWidths: isPropsEqual,
        scrollerClientHeights: isPropsEqual,
    });
    function getSectionByKey(sections, key) {
        for (var _i = 0, sections_1 = sections; _i < sections_1.length;
_i++) {
            var section = sections_1[_i];
            if (section.key === key) {
                return section;
            }
        }
        return null;
    }

    var EventRoot = /** @class */ (function (_super) {
        __extends(EventRoot, _super);
        function EventRoot() {
            var _this = _super !== null && _super.apply(this,
arguments) || this;
            _this.elRef = createRef();
            return _this;
        }
        EventRoot.prototype.render = function () {
            var _a = this, props = _a.props, context = _a.context;
            var options = context.options;
            var seg = props.seg;
            var eventRange = seg.eventRange;
            var ui = eventRange.ui;
            var hookProps = {
                event: new EventApi(context, eventRange.def,
eventRange.instance),
                view: context.viewApi,
                timeText: props.timeText,
                textColor: ui.textColor,
                backgroundColor: ui.backgroundColor,
                borderColor: ui.borderColor,
                isDraggable: !props.disableDragging &&
computeSegDraggable(seg, context),
                isStartResizable: !props.disableResizing &&
computeSegStartResizable(seg, context),
                isEndResizable: !props.disableResizing &&
computeSegEndResizable(seg),
                isMirror: Boolean(props.isDragging || props.isResizing ||
props.isDateSelecting),
                isStart: Boolean(seg.isStart),
                isEnd: Boolean(seg.isEnd),
                isPast: Boolean(props.isPast),
                isFuture: Boolean(props.isFuture),
                isToday: Boolean(props.isToday),
                isSelected: Boolean(props.isSelected),
                isDragging: Boolean(props.isDragging),
                isResizing: Boolean(props.isResizing),
            };
            var standardClassNames =
getEventClassNames(hookProps).concat(ui.classNames);
            return (createElement(RenderHook, { hookProps: hookProps,
classNames: options.eventClassNames, content: options.eventContent,
defaultContent: props.defaultContent, didMount: options.eventDidMount,
willUnmount: options.eventWillUnmount, elRef: this.elRef }, function
(rootElRef, customClassNames, innerElRef, innerContent) { return
props.children(rootElRef, standardClassNames.concat(customClassNames),
innerElRef, innerContent, hookProps); }));
        };
        EventRoot.prototype.componentDidMount = function () {
            setElSeg(this.elRef.current, this.props.seg);
        };
        /*
        need to re-assign seg to the element if seg changes, even if the
element is the same
        */
        EventRoot.prototype.componentDidUpdate = function (prevProps) {
            var seg = this.props.seg;
            if (seg !== prevProps.seg) {
                setElSeg(this.elRef.current, seg);
            }
        };
        return EventRoot;
    }(BaseComponent));

    // should not be a purecomponent
    var StandardEvent = /** @class */ (function (_super) {
        __extends(StandardEvent, _super);
        function StandardEvent() {
            return _super !== null && _super.apply(this, arguments)
|| this;
        }
        StandardEvent.prototype.render = function () {
            var _a = this, props = _a.props, context = _a.context;
            var seg = props.seg;
            var timeFormat = context.options.eventTimeFormat ||
props.defaultTimeFormat;
            var timeText = buildSegTimeText(seg, timeFormat, context,
props.defaultDisplayEventTime, props.defaultDisplayEventEnd);
            return (createElement(EventRoot, { seg: seg, timeText:
timeText, disableDragging: props.disableDragging, disableResizing:
props.disableResizing, defaultContent: props.defaultContent ||
renderInnerContent, isDragging: props.isDragging, isResizing:
props.isResizing, isDateSelecting: props.isDateSelecting, isSelected:
props.isSelected, isPast: props.isPast, isFuture: props.isFuture, isToday:
props.isToday }, function (rootElRef, classNames, innerElRef, innerContent,
hookProps) { return (createElement("a", __assign({ className:
props.extraClassNames.concat(classNames).join(' '), style: {
                    borderColor: hookProps.borderColor,
                    backgroundColor: hookProps.backgroundColor,
                }, ref: rootElRef }, getSegAnchorAttrs(seg)),
                createElement("div", { className:
"fc-event-main", ref: innerElRef, style: { color:
hookProps.textColor } }, innerContent),
                hookProps.isStartResizable &&
                    createElement("div", { className:
"fc-event-resizer fc-event-resizer-start" }),
                hookProps.isEndResizable &&
                    createElement("div", { className:
"fc-event-resizer fc-event-resizer-end" }))); }));
        };
        return StandardEvent;
    }(BaseComponent));
    function renderInnerContent(innerProps) {
        return (createElement("div", { className:
"fc-event-main-frame" },
            innerProps.timeText && (createElement("div",
{ className: "fc-event-time" }, innerProps.timeText)),
            createElement("div", { className:
"fc-event-title-container" },
                createElement("div", { className:
"fc-event-title fc-sticky" }, innerProps.event.title ||
createElement(Fragment, null, "\u00A0")))));
    }
    function getSegAnchorAttrs(seg) {
        var url = seg.eventRange.def.url;
        return url ? { href: url } : {};
    }

    var NowIndicatorRoot = function (props) { return
(createElement(ViewContextType.Consumer, null, function (context) {
        var options = context.options;
        var hookProps = {
            isAxis: props.isAxis,
            date: context.dateEnv.toDate(props.date),
            view: context.viewApi,
        };
        return (createElement(RenderHook, { hookProps: hookProps,
classNames: options.nowIndicatorClassNames, content:
options.nowIndicatorContent, didMount: options.nowIndicatorDidMount,
willUnmount: options.nowIndicatorWillUnmount }, props.children));
    })); };

    var DAY_NUM_FORMAT = createFormatter({ day: 'numeric' });
    var DayCellContent = /** @class */ (function (_super) {
        __extends(DayCellContent, _super);
        function DayCellContent() {
            return _super !== null && _super.apply(this, arguments)
|| this;
        }
        DayCellContent.prototype.render = function () {
            var _a = this, props = _a.props, context = _a.context;
            var options = context.options;
            var hookProps = refineDayCellHookProps({
                date: props.date,
                dateProfile: props.dateProfile,
                todayRange: props.todayRange,
                showDayNumber: props.showDayNumber,
                extraProps: props.extraHookProps,
                viewApi: context.viewApi,
                dateEnv: context.dateEnv,
            });
            return (createElement(ContentHook, { hookProps: hookProps,
content: options.dayCellContent, defaultContent: props.defaultContent },
props.children));
        };
        return DayCellContent;
    }(BaseComponent));
    function refineDayCellHookProps(raw) {
        var date = raw.date, dateEnv = raw.dateEnv;
        var dayMeta = getDateMeta(date, raw.todayRange, null,
raw.dateProfile);
        return __assign(__assign(__assign({ date: dateEnv.toDate(date),
view: raw.viewApi }, dayMeta), { dayNumberText: raw.showDayNumber ?
dateEnv.format(date, DAY_NUM_FORMAT) : '' }), raw.extraProps);
    }

    var DayCellRoot = /** @class */ (function (_super) {
        __extends(DayCellRoot, _super);
        function DayCellRoot() {
            var _this = _super !== null && _super.apply(this,
arguments) || this;
            _this.refineHookProps = memoizeObjArg(refineDayCellHookProps);
            _this.normalizeClassNames = buildClassNameNormalizer();
            return _this;
        }
        DayCellRoot.prototype.render = function () {
            var _a = this, props = _a.props, context = _a.context;
            var options = context.options;
            var hookProps = this.refineHookProps({
                date: props.date,
                dateProfile: props.dateProfile,
                todayRange: props.todayRange,
                showDayNumber: props.showDayNumber,
                extraProps: props.extraHookProps,
                viewApi: context.viewApi,
                dateEnv: context.dateEnv,
            });
            var classNames = getDayClassNames(hookProps,
context.theme).concat(hookProps.isDisabled
                ? [] // don't use custom classNames if disabled
                : this.normalizeClassNames(options.dayCellClassNames,
hookProps));
            var dataAttrs = hookProps.isDisabled ? {} : {
                'data-date': formatDayString(props.date),
            };
            return (createElement(MountHook, { hookProps: hookProps,
didMount: options.dayCellDidMount, willUnmount: options.dayCellWillUnmount,
elRef: props.elRef }, function (rootElRef) { return
props.children(rootElRef, classNames, dataAttrs, hookProps.isDisabled);
}));
        };
        return DayCellRoot;
    }(BaseComponent));

    function renderFill(fillType) {
        return (createElement("div", { className: "fc-"
+ fillType }));
    }
    var BgEvent = function (props) { return (createElement(EventRoot, {
defaultContent: renderInnerContent$1, seg: props.seg /* uselesss i think
*/, timeText: "", disableDragging: true, disableResizing: true,
isDragging: false, isResizing: false, isDateSelecting: false, isSelected:
false, isPast: props.isPast, isFuture: props.isFuture, isToday:
props.isToday }, function (rootElRef, classNames, innerElRef, innerContent,
hookProps) { return (createElement("div", { ref: rootElRef,
className: ['fc-bg-event'].concat(classNames).join('
'), style: {
            backgroundColor: hookProps.backgroundColor,
        } }, innerContent)); })); };
    function renderInnerContent$1(props) {
        var title = props.event.title;
        return title && (createElement("div", {
className: "fc-event-title" }, props.event.title));
    }

    var WeekNumberRoot = function (props) { return
(createElement(ViewContextType.Consumer, null, function (context) {
        var dateEnv = context.dateEnv, options = context.options;
        var date = props.date;
        var format = options.weekNumberFormat || props.defaultFormat;
        var num = dateEnv.computeWeekNumber(date); // TODO: somehow use for
formatting as well?
        var text = dateEnv.format(date, format);
        var hookProps = { num: num, text: text, date: date };
        return (createElement(RenderHook, { hookProps: hookProps,
classNames: options.weekNumberClassNames, content:
options.weekNumberContent, defaultContent: renderInner$1, didMount:
options.weekNumberDidMount, willUnmount: options.weekNumberWillUnmount },
props.children));
    })); };
    function renderInner$1(innerProps) {
        return innerProps.text;
    }

    // exports
    //
--------------------------------------------------------------------------------------------------
    var version = '5.5.1'; // important to type it, so .d.ts has
generic string

    var Calendar = /** @class */ (function (_super) {
        __extends(Calendar, _super);
        function Calendar(el, optionOverrides) {
            if (optionOverrides === void 0) { optionOverrides = {}; }
            var _this = _super.call(this) || this;
            _this.isRendering = false;
            _this.isRendered = false;
            _this.currentClassNames = [];
            _this.customContentRenderId = 0; // will affect custom
generated classNames?
            _this.handleAction = function (action) {
                // actions we know we want to render immediately
                switch (action.type) {
                    case 'SET_EVENT_DRAG':
                    case 'SET_EVENT_RESIZE':
                        _this.renderRunner.tryDrain();
                }
            };
            _this.handleData = function (data) {
                _this.currentData = data;
               
_this.renderRunner.request(data.calendarOptions.rerenderDelay);
            };
            _this.handleRenderRequest = function () {
                if (_this.isRendering) {
                    _this.isRendered = true;
                    var currentData_1 = _this.currentData;
                    render(createElement(CalendarRoot, { options:
currentData_1.calendarOptions, theme: currentData_1.theme, emitter:
currentData_1.emitter }, function (classNames, height, isHeightAuto,
forPrint) {
                        _this.setClassNames(classNames);
                        _this.setHeight(height);
                        return
(createElement(CustomContentRenderContext.Provider, { value:
_this.customContentRenderId },
                            createElement(CalendarContent, __assign({
isHeightAuto: isHeightAuto, forPrint: forPrint }, currentData_1))));
                    }), _this.el);
                }
                else if (_this.isRendered) {
                    _this.isRendered = false;
                    unmountComponentAtNode$1(_this.el);
                    _this.setClassNames([]);
                    _this.setHeight('');
                }
                flushToDom$1();
            };
            _this.el = el;
            _this.renderRunner = new
DelayedRunner(_this.handleRenderRequest);
            new CalendarDataManager({
                optionOverrides: optionOverrides,
                calendarApi: _this,
                onAction: _this.handleAction,
                onData: _this.handleData,
            });
            return _this;
        }
        Object.defineProperty(Calendar.prototype, "view", {
            get: function () { return this.currentData.viewApi; } // for
public API
            ,
            enumerable: false,
            configurable: true
        });
        Calendar.prototype.render = function () {
            var wasRendering = this.isRendering;
            if (!wasRendering) {
                this.isRendering = true;
            }
            else {
                this.customContentRenderId += 1;
            }
            this.renderRunner.request();
            if (wasRendering) {
                this.updateSize();
            }
        };
        Calendar.prototype.destroy = function () {
            if (this.isRendering) {
                this.isRendering = false;
                this.renderRunner.request();
            }
        };
        Calendar.prototype.updateSize = function () {
            _super.prototype.updateSize.call(this);
            flushToDom$1();
        };
        Calendar.prototype.batchRendering = function (func) {
            this.renderRunner.pause('batchRendering');
            func();
            this.renderRunner.resume('batchRendering');
        };
        Calendar.prototype.pauseRendering = function () {
            this.renderRunner.pause('pauseRendering');
        };
        Calendar.prototype.resumeRendering = function () {
            this.renderRunner.resume('pauseRendering', true);
        };
        Calendar.prototype.resetOptions = function (optionOverrides,
append) {
            this.currentDataManager.resetOptions(optionOverrides, append);
        };
        Calendar.prototype.setClassNames = function (classNames) {
            if (!isArraysEqual(classNames, this.currentClassNames)) {
                var classList = this.el.classList;
                for (var _i = 0, _a = this.currentClassNames; _i <
_a.length; _i++) {
                    var className = _a[_i];
                    classList.remove(className);
                }
                for (var _b = 0, classNames_1 = classNames; _b <
classNames_1.length; _b++) {
                    var className = classNames_1[_b];
                    classList.add(className);
                }
                this.currentClassNames = classNames;
            }
        };
        Calendar.prototype.setHeight = function (height) {
            applyStyleProp(this.el, 'height', height);
        };
        return Calendar;
    }(CalendarApi));

    config.touchMouseIgnoreWait = 500;
    var ignoreMouseDepth = 0;
    var listenerCnt = 0;
    var isWindowTouchMoveCancelled = false;
    /*
    Uses a "pointer" abstraction, which monitors UI events for
both mouse and touch.
    Tracks when the pointer "drags" on a certain element, meaning
down+move+up.

    Also, tracks if there was touch-scrolling.
    Also, can prevent touch-scrolling from happening.
    Also, can fire pointermove events when scrolling happens underneath,
even when no real pointer movement.

    emits:
    - pointerdown
    - pointermove
    - pointerup
    */
    var PointerDragging = /** @class */ (function () {
        function PointerDragging(containerEl) {
            var _this = this;
            this.subjectEl = null;
            // options that can be directly assigned by caller
            this.selector = ''; // will cause subjectEl in all
emitted events to be this element
            this.handleSelector = '';
            this.shouldIgnoreMove = false;
            this.shouldWatchScroll = true; // for simulating pointermove on
scroll
            // internal states
            this.isDragging = false;
            this.isTouchDragging = false;
            this.wasTouchScroll = false;
            // Mouse
            //
----------------------------------------------------------------------------------------------------
            this.handleMouseDown = function (ev) {
                if (!_this.shouldIgnoreMouse() &&
                    isPrimaryMouseButton(ev) &&
                    _this.tryStart(ev)) {
                    var pev = _this.createEventFromMouse(ev, true);
                    _this.emitter.trigger('pointerdown', pev);
                    _this.initScrollWatch(pev);
                    if (!_this.shouldIgnoreMove) {
                        document.addEventListener('mousemove',
_this.handleMouseMove);
                    }
                    document.addEventListener('mouseup',
_this.handleMouseUp);
                }
            };
            this.handleMouseMove = function (ev) {
                var pev = _this.createEventFromMouse(ev);
                _this.recordCoords(pev);
                _this.emitter.trigger('pointermove', pev);
            };
            this.handleMouseUp = function (ev) {
                document.removeEventListener('mousemove',
_this.handleMouseMove);
                document.removeEventListener('mouseup',
_this.handleMouseUp);
                _this.emitter.trigger('pointerup',
_this.createEventFromMouse(ev));
                _this.cleanup(); // call last so that pointerup has access
to props
            };
            // Touch
            //
----------------------------------------------------------------------------------------------------
            this.handleTouchStart = function (ev) {
                if (_this.tryStart(ev)) {
                    _this.isTouchDragging = true;
                    var pev = _this.createEventFromTouch(ev, true);
                    _this.emitter.trigger('pointerdown', pev);
                    _this.initScrollWatch(pev);
                    // unlike mouse, need to attach to target, not document
                    // https://stackoverflow.com/a/45760014
                    var targetEl = ev.target;
                    if (!_this.shouldIgnoreMove) {
                        targetEl.addEventListener('touchmove',
_this.handleTouchMove);
                    }
                    targetEl.addEventListener('touchend',
_this.handleTouchEnd);
                    targetEl.addEventListener('touchcancel',
_this.handleTouchEnd); // treat it as a touch end
                    // attach a handler to get called when ANY scroll
action happens on the page.
                    // this was impossible to do with normal on/off because
'scroll' doesn't bubble.
                    // http://stackoverflow.com/a/32954565/96342
                    window.addEventListener('scroll',
_this.handleTouchScroll, true);
                }
            };
            this.handleTouchMove = function (ev) {
                var pev = _this.createEventFromTouch(ev);
                _this.recordCoords(pev);
                _this.emitter.trigger('pointermove', pev);
            };
            this.handleTouchEnd = function (ev) {
                if (_this.isDragging) { // done to guard against touchend
followed by touchcancel
                    var targetEl = ev.target;
                    targetEl.removeEventListener('touchmove',
_this.handleTouchMove);
                    targetEl.removeEventListener('touchend',
_this.handleTouchEnd);
                    targetEl.removeEventListener('touchcancel',
_this.handleTouchEnd);
                    window.removeEventListener('scroll',
_this.handleTouchScroll, true); // useCaptured=true
                    _this.emitter.trigger('pointerup',
_this.createEventFromTouch(ev));
                    _this.cleanup(); // call last so that pointerup has
access to props
                    _this.isTouchDragging = false;
                    startIgnoringMouse();
                }
            };
            this.handleTouchScroll = function () {
                _this.wasTouchScroll = true;
            };
            this.handleScroll = function (ev) {
                if (!_this.shouldIgnoreMove) {
                    var pageX = (window.pageXOffset - _this.prevScrollX) +
_this.prevPageX;
                    var pageY = (window.pageYOffset - _this.prevScrollY) +
_this.prevPageY;
                    _this.emitter.trigger('pointermove', {
                        origEvent: ev,
                        isTouch: _this.isTouchDragging,
                        subjectEl: _this.subjectEl,
                        pageX: pageX,
                        pageY: pageY,
                        deltaX: pageX - _this.origPageX,
                        deltaY: pageY - _this.origPageY,
                    });
                }
            };
            this.containerEl = containerEl;
            this.emitter = new Emitter();
            containerEl.addEventListener('mousedown',
this.handleMouseDown);
            containerEl.addEventListener('touchstart',
this.handleTouchStart, { passive: true });
            listenerCreated();
        }
        PointerDragging.prototype.destroy = function () {
            this.containerEl.removeEventListener('mousedown',
this.handleMouseDown);
            this.containerEl.removeEventListener('touchstart',
this.handleTouchStart, { passive: true });
            listenerDestroyed();
        };
        PointerDragging.prototype.tryStart = function (ev) {
            var subjectEl = this.querySubjectEl(ev);
            var downEl = ev.target;
            if (subjectEl &&
                (!this.handleSelector || elementClosest(downEl,
this.handleSelector))) {
                this.subjectEl = subjectEl;
                this.isDragging = true; // do this first so
cancelTouchScroll will work
                this.wasTouchScroll = false;
                return true;
            }
            return false;
        };
        PointerDragging.prototype.cleanup = function () {
            isWindowTouchMoveCancelled = false;
            this.isDragging = false;
            this.subjectEl = null;
            // keep wasTouchScroll around for later access
            this.destroyScrollWatch();
        };
        PointerDragging.prototype.querySubjectEl = function (ev) {
            if (this.selector) {
                return elementClosest(ev.target, this.selector);
            }
            return this.containerEl;
        };
        PointerDragging.prototype.shouldIgnoreMouse = function () {
            return ignoreMouseDepth || this.isTouchDragging;
        };
        // can be called by user of this class, to cancel touch-based
scrolling for the current drag
        PointerDragging.prototype.cancelTouchScroll = function () {
            if (this.isDragging) {
                isWindowTouchMoveCancelled = true;
            }
        };
        // Scrolling that simulates pointermoves
        //
----------------------------------------------------------------------------------------------------
        PointerDragging.prototype.initScrollWatch = function (ev) {
            if (this.shouldWatchScroll) {
                this.recordCoords(ev);
                window.addEventListener('scroll',
this.handleScroll, true); // useCapture=true
            }
        };
        PointerDragging.prototype.recordCoords = function (ev) {
            if (this.shouldWatchScroll) {
                this.prevPageX = ev.pageX;
                this.prevPageY = ev.pageY;
                this.prevScrollX = window.pageXOffset;
                this.prevScrollY = window.pageYOffset;
            }
        };
        PointerDragging.prototype.destroyScrollWatch = function () {
            if (this.shouldWatchScroll) {
                window.removeEventListener('scroll',
this.handleScroll, true); // useCaptured=true
            }
        };
        // Event Normalization
        //
----------------------------------------------------------------------------------------------------
        PointerDragging.prototype.createEventFromMouse = function (ev,
isFirst) {
            var deltaX = 0;
            var deltaY = 0;
            // TODO: repeat code
            if (isFirst) {
                this.origPageX = ev.pageX;
                this.origPageY = ev.pageY;
            }
            else {
                deltaX = ev.pageX - this.origPageX;
                deltaY = ev.pageY - this.origPageY;
            }
            return {
                origEvent: ev,
                isTouch: false,
                subjectEl: this.subjectEl,
                pageX: ev.pageX,
                pageY: ev.pageY,
                deltaX: deltaX,
                deltaY: deltaY,
            };
        };
        PointerDragging.prototype.createEventFromTouch = function (ev,
isFirst) {
            var touches = ev.touches;
            var pageX;
            var pageY;
            var deltaX = 0;
            var deltaY = 0;
            // if touch coords available, prefer,
            // because FF would give bad ev.pageX ev.pageY
            if (touches && touches.length) {
                pageX = touches[0].pageX;
                pageY = touches[0].pageY;
            }
            else {
                pageX = ev.pageX;
                pageY = ev.pageY;
            }
            // TODO: repeat code
            if (isFirst) {
                this.origPageX = pageX;
                this.origPageY = pageY;
            }
            else {
                deltaX = pageX - this.origPageX;
                deltaY = pageY - this.origPageY;
            }
            return {
                origEvent: ev,
                isTouch: true,
                subjectEl: this.subjectEl,
                pageX: pageX,
                pageY: pageY,
                deltaX: deltaX,
                deltaY: deltaY,
            };
        };
        return PointerDragging;
    }());
    // Returns a boolean whether this was a left mouse click and no ctrl
key (which means right click on Mac)
    function isPrimaryMouseButton(ev) {
        return ev.button === 0 && !ev.ctrlKey;
    }
    // Ignoring fake mouse events generated by touch
    //
----------------------------------------------------------------------------------------------------
    function startIgnoringMouse() {
        ignoreMouseDepth += 1;
        setTimeout(function () {
            ignoreMouseDepth -= 1;
        }, config.touchMouseIgnoreWait);
    }
    // We want to attach touchmove as early as possible for Safari
    //
----------------------------------------------------------------------------------------------------
    function listenerCreated() {
        listenerCnt += 1;
        if (listenerCnt === 1) {
            window.addEventListener('touchmove',
onWindowTouchMove, { passive: false });
        }
    }
    function listenerDestroyed() {
        listenerCnt -= 1;
        if (!listenerCnt) {
            window.removeEventListener('touchmove',
onWindowTouchMove, { passive: false });
        }
    }
    function onWindowTouchMove(ev) {
        if (isWindowTouchMoveCancelled) {
            ev.preventDefault();
        }
    }

    /*
    An effect in which an element follows the movement of a pointer across
the screen.
    The moving element is a clone of some other element.
    Must call start + handleMove + stop.
    */
    var ElementMirror = /** @class */ (function () {
        function ElementMirror() {
            this.isVisible = false; // must be explicitly enabled
            this.sourceEl = null;
            this.mirrorEl = null;
            this.sourceElRect = null; // screen coords relative to viewport
            // options that can be set directly by caller
            this.parentNode = document.body;
            this.zIndex = 9999;
            this.revertDuration = 0;
        }
        ElementMirror.prototype.start = function (sourceEl, pageX, pageY) {
            this.sourceEl = sourceEl;
            this.sourceElRect = this.sourceEl.getBoundingClientRect();
            this.origScreenX = pageX - window.pageXOffset;
            this.origScreenY = pageY - window.pageYOffset;
            this.deltaX = 0;
            this.deltaY = 0;
            this.updateElPosition();
        };
        ElementMirror.prototype.handleMove = function (pageX, pageY) {
            this.deltaX = (pageX - window.pageXOffset) - this.origScreenX;
            this.deltaY = (pageY - window.pageYOffset) - this.origScreenY;
            this.updateElPosition();
        };
        // can be called before start
        ElementMirror.prototype.setIsVisible = function (bool) {
            if (bool) {
                if (!this.isVisible) {
                    if (this.mirrorEl) {
                        this.mirrorEl.style.display = '';
                    }
                    this.isVisible = bool; // needs to happen before
updateElPosition
                    this.updateElPosition(); // because was not updating
the position while invisible
                }
            }
            else if (this.isVisible) {
                if (this.mirrorEl) {
                    this.mirrorEl.style.display = 'none';
                }
                this.isVisible = bool;
            }
        };
        // always async
        ElementMirror.prototype.stop = function (needsRevertAnimation,
callback) {
            var _this = this;
            var done = function () {
                _this.cleanup();
                callback();
            };
            if (needsRevertAnimation &&
                this.mirrorEl &&
                this.isVisible &&
                this.revertDuration && // if 0, transition
won't work
                (this.deltaX || this.deltaY) // if same coords, transition
won't work
            ) {
                this.doRevertAnimation(done, this.revertDuration);
            }
            else {
                setTimeout(done, 0);
            }
        };
        ElementMirror.prototype.doRevertAnimation = function (callback,
revertDuration) {
            var mirrorEl = this.mirrorEl;
            var finalSourceElRect = this.sourceEl.getBoundingClientRect();
// because autoscrolling might have happened
            mirrorEl.style.transition =
                'top ' + revertDuration + 'ms,' +
                    'left ' + revertDuration + 'ms';
            applyStyle(mirrorEl, {
                left: finalSourceElRect.left,
                top: finalSourceElRect.top,
            });
            whenTransitionDone(mirrorEl, function () {
                mirrorEl.style.transition = '';
                callback();
            });
        };
        ElementMirror.prototype.cleanup = function () {
            if (this.mirrorEl) {
                removeElement(this.mirrorEl);
                this.mirrorEl = null;
            }
            this.sourceEl = null;
        };
        ElementMirror.prototype.updateElPosition = function () {
            if (this.sourceEl && this.isVisible) {
                applyStyle(this.getMirrorEl(), {
                    left: this.sourceElRect.left + this.deltaX,
                    top: this.sourceElRect.top + this.deltaY,
                });
            }
        };
        ElementMirror.prototype.getMirrorEl = function () {
            var sourceElRect = this.sourceElRect;
            var mirrorEl = this.mirrorEl;
            if (!mirrorEl) {
                mirrorEl = this.mirrorEl = this.sourceEl.cloneNode(true);
// cloneChildren=true
                // we don't want long taps or any mouse interaction
causing selection/menus.
                // would use preventSelection(), but that prevents
selectstart, causing problems.
                mirrorEl.classList.add('fc-unselectable');
                mirrorEl.classList.add('fc-event-dragging');
                applyStyle(mirrorEl, {
                    position: 'fixed',
                    zIndex: this.zIndex,
                    visibility: '',
                    boxSizing: 'border-box',
                    width: sourceElRect.right - sourceElRect.left,
                    height: sourceElRect.bottom - sourceElRect.top,
                    right: 'auto',
                    bottom: 'auto',
                    margin: 0,
                });
                this.parentNode.appendChild(mirrorEl);
            }
            return mirrorEl;
        };
        return ElementMirror;
    }());

    /*
    Is a cache for a given element's scroll information (all the info
that ScrollController stores)
    in addition the "client rectangle" of the element.. the area
within the scrollbars.

    The cache can be in one of two modes:
    - doesListening:false - ignores when the container is scrolled by
someone else
    - doesListening:true - watch for scrolling and update the cache
    */
    var ScrollGeomCache = /** @class */ (function (_super) {
        __extends(ScrollGeomCache, _super);
        function ScrollGeomCache(scrollController, doesListening) {
            var _this = _super.call(this) || this;
            _this.handleScroll = function () {
                _this.scrollTop = _this.scrollController.getScrollTop();
                _this.scrollLeft = _this.scrollController.getScrollLeft();
                _this.handleScrollChange();
            };
            _this.scrollController = scrollController;
            _this.doesListening = doesListening;
            _this.scrollTop = _this.origScrollTop =
scrollController.getScrollTop();
            _this.scrollLeft = _this.origScrollLeft =
scrollController.getScrollLeft();
            _this.scrollWidth = scrollController.getScrollWidth();
            _this.scrollHeight = scrollController.getScrollHeight();
            _this.clientWidth = scrollController.getClientWidth();
            _this.clientHeight = scrollController.getClientHeight();
            _this.clientRect = _this.computeClientRect(); // do last in
case it needs cached values
            if (_this.doesListening) {
                _this.getEventTarget().addEventListener('scroll',
_this.handleScroll);
            }
            return _this;
        }
        ScrollGeomCache.prototype.destroy = function () {
            if (this.doesListening) {
               
this.getEventTarget().removeEventListener('scroll',
this.handleScroll);
            }
        };
        ScrollGeomCache.prototype.getScrollTop = function () {
            return this.scrollTop;
        };
        ScrollGeomCache.prototype.getScrollLeft = function () {
            return this.scrollLeft;
        };
        ScrollGeomCache.prototype.setScrollTop = function (top) {
            this.scrollController.setScrollTop(top);
            if (!this.doesListening) {
                // we are not relying on the element to normalize
out-of-bounds scroll values
                // so we need to sanitize ourselves
                this.scrollTop = Math.max(Math.min(top,
this.getMaxScrollTop()), 0);
                this.handleScrollChange();
            }
        };
        ScrollGeomCache.prototype.setScrollLeft = function (top) {
            this.scrollController.setScrollLeft(top);
            if (!this.doesListening) {
                // we are not relying on the element to normalize
out-of-bounds scroll values
                // so we need to sanitize ourselves
                this.scrollLeft = Math.max(Math.min(top,
this.getMaxScrollLeft()), 0);
                this.handleScrollChange();
            }
        };
        ScrollGeomCache.prototype.getClientWidth = function () {
            return this.clientWidth;
        };
        ScrollGeomCache.prototype.getClientHeight = function () {
            return this.clientHeight;
        };
        ScrollGeomCache.prototype.getScrollWidth = function () {
            return this.scrollWidth;
        };
        ScrollGeomCache.prototype.getScrollHeight = function () {
            return this.scrollHeight;
        };
        ScrollGeomCache.prototype.handleScrollChange = function () {
        };
        return ScrollGeomCache;
    }(ScrollController));

    var ElementScrollGeomCache = /** @class */ (function (_super) {
        __extends(ElementScrollGeomCache, _super);
        function ElementScrollGeomCache(el, doesListening) {
            return _super.call(this, new ElementScrollController(el),
doesListening) || this;
        }
        ElementScrollGeomCache.prototype.getEventTarget = function () {
            return this.scrollController.el;
        };
        ElementScrollGeomCache.prototype.computeClientRect = function () {
            return computeInnerRect(this.scrollController.el);
        };
        return ElementScrollGeomCache;
    }(ScrollGeomCache));

    var WindowScrollGeomCache = /** @class */ (function (_super) {
        __extends(WindowScrollGeomCache, _super);
        function WindowScrollGeomCache(doesListening) {
            return _super.call(this, new WindowScrollController(),
doesListening) || this;
        }
        WindowScrollGeomCache.prototype.getEventTarget = function () {
            return window;
        };
        WindowScrollGeomCache.prototype.computeClientRect = function () {
            return {
                left: this.scrollLeft,
                right: this.scrollLeft + this.clientWidth,
                top: this.scrollTop,
                bottom: this.scrollTop + this.clientHeight,
            };
        };
        // the window is the only scroll object that changes it's
rectangle relative
        // to the document's topleft as it scrolls
        WindowScrollGeomCache.prototype.handleScrollChange = function () {
            this.clientRect = this.computeClientRect();
        };
        return WindowScrollGeomCache;
    }(ScrollGeomCache));

    // If available we are using native "performance" API instead
of "Date"
    // Read more about it on MDN:
    // https://developer.mozilla.org/en-US/docs/Web/API/Performance
    var getTime = typeof performance === 'function' ?
performance.now : Date.now;
    /*
    For a pointer interaction, automatically scrolls certain scroll
containers when the pointer
    approaches the edge.

    The caller must call start + handleMove + stop.
    */
    var AutoScroller = /** @class */ (function () {
        function AutoScroller() {
            var _this = this;
            // options that can be set by caller
            this.isEnabled = true;
            this.scrollQuery = [window, '.fc-scroller'];
            this.edgeThreshold = 50; // pixels
            this.maxVelocity = 300; // pixels per second
            // internal state
            this.pointerScreenX = null;
            this.pointerScreenY = null;
            this.isAnimating = false;
            this.scrollCaches = null;
            // protect against the initial pointerdown being too close to
an edge and starting the scroll
            this.everMovedUp = false;
            this.everMovedDown = false;
            this.everMovedLeft = false;
            this.everMovedRight = false;
            this.animate = function () {
                if (_this.isAnimating) { // wasn't cancelled between
animation calls
                    var edge = _this.computeBestEdge(_this.pointerScreenX +
window.pageXOffset, _this.pointerScreenY + window.pageYOffset);
                    if (edge) {
                        var now = getTime();
                        _this.handleSide(edge, (now - _this.msSinceRequest)
/ 1000);
                        _this.requestAnimation(now);
                    }
                    else {
                        _this.isAnimating = false; // will stop animation
                    }
                }
            };
        }
        AutoScroller.prototype.start = function (pageX, pageY) {
            if (this.isEnabled) {
                this.scrollCaches = this.buildCaches();
                this.pointerScreenX = null;
                this.pointerScreenY = null;
                this.everMovedUp = false;
                this.everMovedDown = false;
                this.everMovedLeft = false;
                this.everMovedRight = false;
                this.handleMove(pageX, pageY);
            }
        };
        AutoScroller.prototype.handleMove = function (pageX, pageY) {
            if (this.isEnabled) {
                var pointerScreenX = pageX - window.pageXOffset;
                var pointerScreenY = pageY - window.pageYOffset;
                var yDelta = this.pointerScreenY === null ? 0 :
pointerScreenY - this.pointerScreenY;
                var xDelta = this.pointerScreenX === null ? 0 :
pointerScreenX - this.pointerScreenX;
                if (yDelta < 0) {
                    this.everMovedUp = true;
                }
                else if (yDelta > 0) {
                    this.everMovedDown = true;
                }
                if (xDelta < 0) {
                    this.everMovedLeft = true;
                }
                else if (xDelta > 0) {
                    this.everMovedRight = true;
                }
                this.pointerScreenX = pointerScreenX;
                this.pointerScreenY = pointerScreenY;
                if (!this.isAnimating) {
                    this.isAnimating = true;
                    this.requestAnimation(getTime());
                }
            }
        };
        AutoScroller.prototype.stop = function () {
            if (this.isEnabled) {
                this.isAnimating = false; // will stop animation
                for (var _i = 0, _a = this.scrollCaches; _i < _a.length;
_i++) {
                    var scrollCache = _a[_i];
                    scrollCache.destroy();
                }
                this.scrollCaches = null;
            }
        };
        AutoScroller.prototype.requestAnimation = function (now) {
            this.msSinceRequest = now;
            requestAnimationFrame(this.animate);
        };
        AutoScroller.prototype.handleSide = function (edge, seconds) {
            var scrollCache = edge.scrollCache;
            var edgeThreshold = this.edgeThreshold;
            var invDistance = edgeThreshold - edge.distance;
            var velocity = // the closer to the edge, the faster we scroll
             ((invDistance * invDistance) / (edgeThreshold *
edgeThreshold)) * // quadratic
                this.maxVelocity * seconds;
            var sign = 1;
            switch (edge.name) {
                case 'left':
                    sign = -1;
                // falls through
                case 'right':
                    scrollCache.setScrollLeft(scrollCache.getScrollLeft() +
velocity * sign);
                    break;
                case 'top':
                    sign = -1;
                // falls through
                case 'bottom':
                    scrollCache.setScrollTop(scrollCache.getScrollTop() +
velocity * sign);
                    break;
            }
        };
        // left/top are relative to document topleft
        AutoScroller.prototype.computeBestEdge = function (left, top) {
            var edgeThreshold = this.edgeThreshold;
            var bestSide = null;
            for (var _i = 0, _a = this.scrollCaches; _i < _a.length;
_i++) {
                var scrollCache = _a[_i];
                var rect = scrollCache.clientRect;
                var leftDist = left - rect.left;
                var rightDist = rect.right - left;
                var topDist = top - rect.top;
                var bottomDist = rect.bottom - top;
                // completely within the rect?
                if (leftDist >= 0 && rightDist >= 0
&& topDist >= 0 && bottomDist >= 0) {
                    if (topDist <= edgeThreshold &&
this.everMovedUp && scrollCache.canScrollUp() &&
                        (!bestSide || bestSide.distance > topDist)) {
                        bestSide = { scrollCache: scrollCache, name:
'top', distance: topDist };
                    }
                    if (bottomDist <= edgeThreshold &&
this.everMovedDown && scrollCache.canScrollDown() &&
                        (!bestSide || bestSide.distance > bottomDist)) {
                        bestSide = { scrollCache: scrollCache, name:
'bottom', distance: bottomDist };
                    }
                    if (leftDist <= edgeThreshold &&
this.everMovedLeft && scrollCache.canScrollLeft() &&
                        (!bestSide || bestSide.distance > leftDist)) {
                        bestSide = { scrollCache: scrollCache, name:
'left', distance: leftDist };
                    }
                    if (rightDist <= edgeThreshold &&
this.everMovedRight && scrollCache.canScrollRight() &&
                        (!bestSide || bestSide.distance > rightDist)) {
                        bestSide = { scrollCache: scrollCache, name:
'right', distance: rightDist };
                    }
                }
            }
            return bestSide;
        };
        AutoScroller.prototype.buildCaches = function () {
            return this.queryScrollEls().map(function (el) {
                if (el === window) {
                    return new WindowScrollGeomCache(false); // false =
don't listen to user-generated scrolls
                }
                return new ElementScrollGeomCache(el, false); // false =
don't listen to user-generated scrolls
            });
        };
        AutoScroller.prototype.queryScrollEls = function () {
            var els = [];
            for (var _i = 0, _a = this.scrollQuery; _i < _a.length;
_i++) {
                var query = _a[_i];
                if (typeof query === 'object') {
                    els.push(query);
                }
                else {
                    els.push.apply(els,
Array.prototype.slice.call(document.querySelectorAll(query)));
                }
            }
            return els;
        };
        return AutoScroller;
    }());

    /*
    Monitors dragging on an element. Has a number of high-level features:
    - minimum distance required before dragging
    - minimum wait time ("delay") before dragging
    - a mirror element that follows the pointer
    */
    var FeaturefulElementDragging = /** @class */ (function (_super) {
        __extends(FeaturefulElementDragging, _super);
        function FeaturefulElementDragging(containerEl, selector) {
            var _this = _super.call(this, containerEl) || this;
            // options that can be directly set by caller
            // the caller can also set the PointerDragging's options
as well
            _this.delay = null;
            _this.minDistance = 0;
            _this.touchScrollAllowed = true; // prevents drag from starting
and blocks scrolling during drag
            _this.mirrorNeedsRevert = false;
            _this.isInteracting = false; // is the user validly moving the
pointer? lasts until pointerup
            _this.isDragging = false; // is it INTENTFULLY dragging? lasts
until after revert animation
            _this.isDelayEnded = false;
            _this.isDistanceSurpassed = false;
            _this.delayTimeoutId = null;
            _this.onPointerDown = function (ev) {
                if (!_this.isDragging) { // so new drag doesn't happen
while revert animation is going
                    _this.isInteracting = true;
                    _this.isDelayEnded = false;
                    _this.isDistanceSurpassed = false;
                    preventSelection(document.body);
                    preventContextMenu(document.body);
                    // prevent links from being visited if there's an
eventual drag.
                    // also prevents selection in older browsers (maybe?).
                    // not necessary for touch, besides, browser would
complain about passiveness.
                    if (!ev.isTouch) {
                        ev.origEvent.preventDefault();
                    }
                    _this.emitter.trigger('pointerdown', ev);
                    if (_this.isInteracting && // not destroyed via
pointerdown handler
                        !_this.pointer.shouldIgnoreMove) {
                        // actions related to initiating
dragstart+dragmove+dragend...
                        _this.mirror.setIsVisible(false); // reset. caller
must set-visible
                        _this.mirror.start(ev.subjectEl, ev.pageX,
ev.pageY); // must happen on first pointer down
                        _this.startDelay(ev);
                        if (!_this.minDistance) {
                            _this.handleDistanceSurpassed(ev);
                        }
                    }
                }
            };
            _this.onPointerMove = function (ev) {
                if (_this.isInteracting) {
                    _this.emitter.trigger('pointermove', ev);
                    if (!_this.isDistanceSurpassed) {
                        var minDistance = _this.minDistance;
                        var distanceSq = void 0; // current distance from
the origin, squared
                        var deltaX = ev.deltaX, deltaY = ev.deltaY;
                        distanceSq = deltaX * deltaX + deltaY * deltaY;
                        if (distanceSq >= minDistance * minDistance) {
// use pythagorean theorem
                            _this.handleDistanceSurpassed(ev);
                        }
                    }
                    if (_this.isDragging) {
                        // a real pointer move? (not one simulated by
scrolling)
                        if (ev.origEvent.type !== 'scroll') {
                            _this.mirror.handleMove(ev.pageX, ev.pageY);
                            _this.autoScroller.handleMove(ev.pageX,
ev.pageY);
                        }
                        _this.emitter.trigger('dragmove', ev);
                    }
                }
            };
            _this.onPointerUp = function (ev) {
                if (_this.isInteracting) {
                    _this.isInteracting = false;
                    allowSelection(document.body);
                    allowContextMenu(document.body);
                    _this.emitter.trigger('pointerup', ev); //
can potentially set mirrorNeedsRevert
                    if (_this.isDragging) {
                        _this.autoScroller.stop();
                        _this.tryStopDrag(ev); // which will stop the
mirror
                    }
                    if (_this.delayTimeoutId) {
                        clearTimeout(_this.delayTimeoutId);
                        _this.delayTimeoutId = null;
                    }
                }
            };
            var pointer = _this.pointer = new PointerDragging(containerEl);
            pointer.emitter.on('pointerdown',
_this.onPointerDown);
            pointer.emitter.on('pointermove',
_this.onPointerMove);
            pointer.emitter.on('pointerup', _this.onPointerUp);
            if (selector) {
                pointer.selector = selector;
            }
            _this.mirror = new ElementMirror();
            _this.autoScroller = new AutoScroller();
            return _this;
        }
        FeaturefulElementDragging.prototype.destroy = function () {
            this.pointer.destroy();
            // HACK: simulate a pointer-up to end the current drag
            // TODO: fire 'dragend' directly and stop
interaction. discourage use of pointerup event (b/c might not fire)
            this.onPointerUp({});
        };
        FeaturefulElementDragging.prototype.startDelay = function (ev) {
            var _this = this;
            if (typeof this.delay === 'number') {
                this.delayTimeoutId = setTimeout(function () {
                    _this.delayTimeoutId = null;
                    _this.handleDelayEnd(ev);
                }, this.delay); // not assignable to number!
            }
            else {
                this.handleDelayEnd(ev);
            }
        };
        FeaturefulElementDragging.prototype.handleDelayEnd = function (ev)
{
            this.isDelayEnded = true;
            this.tryStartDrag(ev);
        };
        FeaturefulElementDragging.prototype.handleDistanceSurpassed =
function (ev) {
            this.isDistanceSurpassed = true;
            this.tryStartDrag(ev);
        };
        FeaturefulElementDragging.prototype.tryStartDrag = function (ev) {
            if (this.isDelayEnded && this.isDistanceSurpassed) {
                if (!this.pointer.wasTouchScroll ||
this.touchScrollAllowed) {
                    this.isDragging = true;
                    this.mirrorNeedsRevert = false;
                    this.autoScroller.start(ev.pageX, ev.pageY);
                    this.emitter.trigger('dragstart', ev);
                    if (this.touchScrollAllowed === false) {
                        this.pointer.cancelTouchScroll();
                    }
                }
            }
        };
        FeaturefulElementDragging.prototype.tryStopDrag = function (ev) {
            // .stop() is ALWAYS asynchronous, which we NEED because we
want all pointerup events
            // that come from the document to fire beforehand. much more
convenient this way.
            this.mirror.stop(this.mirrorNeedsRevert,
this.stopDrag.bind(this, ev));
        };
        FeaturefulElementDragging.prototype.stopDrag = function (ev) {
            this.isDragging = false;
            this.emitter.trigger('dragend', ev);
        };
        // fill in the implementations...
        FeaturefulElementDragging.prototype.setIgnoreMove = function (bool)
{
            this.pointer.shouldIgnoreMove = bool;
        };
        FeaturefulElementDragging.prototype.setMirrorIsVisible = function
(bool) {
            this.mirror.setIsVisible(bool);
        };
        FeaturefulElementDragging.prototype.setMirrorNeedsRevert = function
(bool) {
            this.mirrorNeedsRevert = bool;
        };
        FeaturefulElementDragging.prototype.setAutoScrollEnabled = function
(bool) {
            this.autoScroller.isEnabled = bool;
        };
        return FeaturefulElementDragging;
    }(ElementDragging));

    /*
    When this class is instantiated, it records the offset of an element
(relative to the document topleft),
    and continues to monitor scrolling, updating the cached coordinates if
it needs to.
    Does not access the DOM after instantiation, so highly performant.

    Also keeps track of all scrolling/overflow:hidden containers that are
parents of the given element
    and an determine if a given point is inside the combined clipping
rectangle.
    */
    var OffsetTracker = /** @class */ (function () {
        function OffsetTracker(el) {
            this.origRect = computeRect(el);
            // will work fine for divs that have overflow:hidden
            this.scrollCaches = getClippingParents(el).map(function
(scrollEl) { return new ElementScrollGeomCache(scrollEl, true); });
        }
        OffsetTracker.prototype.destroy = function () {
            for (var _i = 0, _a = this.scrollCaches; _i < _a.length;
_i++) {
                var scrollCache = _a[_i];
                scrollCache.destroy();
            }
        };
        OffsetTracker.prototype.computeLeft = function () {
            var left = this.origRect.left;
            for (var _i = 0, _a = this.scrollCaches; _i < _a.length;
_i++) {
                var scrollCache = _a[_i];
                left += scrollCache.origScrollLeft -
scrollCache.getScrollLeft();
            }
            return left;
        };
        OffsetTracker.prototype.computeTop = function () {
            var top = this.origRect.top;
            for (var _i = 0, _a = this.scrollCaches; _i < _a.length;
_i++) {
                var scrollCache = _a[_i];
                top += scrollCache.origScrollTop -
scrollCache.getScrollTop();
            }
            return top;
        };
        OffsetTracker.prototype.isWithinClipping = function (pageX, pageY)
{
            var point = { left: pageX, top: pageY };
            for (var _i = 0, _a = this.scrollCaches; _i < _a.length;
_i++) {
                var scrollCache = _a[_i];
                if (!isIgnoredClipping(scrollCache.getEventTarget())
&&
                    !pointInsideRect(point, scrollCache.clientRect)) {
                    return false;
                }
            }
            return true;
        };
        return OffsetTracker;
    }());
    // certain clipping containers should never constrain interactions,
like <html> and <body>
    // https://github.com/fullcalendar/fullcalendar/issues/3615
    function isIgnoredClipping(node) {
        var tagName = node.tagName;
        return tagName === 'HTML' || tagName ===
'BODY';
    }

    /*
    Tracks movement over multiple droppable areas (aka "hits")
    that exist in one or more DateComponents.
    Relies on an existing draggable.

    emits:
    - pointerdown
    - dragstart
    - hitchange - fires initially, even if not over a hit
    - pointerup
    - (hitchange - again, to null, if ended over a hit)
    - dragend
    */
    var HitDragging = /** @class */ (function () {
        function HitDragging(dragging, droppableStore) {
            var _this = this;
            // options that can be set by caller
            this.useSubjectCenter = false;
            this.requireInitial = true; // if doesn't start out on a
hit, won't emit any events
            this.initialHit = null;
            this.movingHit = null;
            this.finalHit = null; // won't ever be populated if
shouldIgnoreMove
            this.handlePointerDown = function (ev) {
                var dragging = _this.dragging;
                _this.initialHit = null;
                _this.movingHit = null;
                _this.finalHit = null;
                _this.prepareHits();
                _this.processFirstCoord(ev);
                if (_this.initialHit || !_this.requireInitial) {
                    dragging.setIgnoreMove(false);
                    // TODO: fire this before computing processFirstCoord,
so listeners can cancel. this gets fired by almost every handler :(
                    _this.emitter.trigger('pointerdown', ev);
                }
                else {
                    dragging.setIgnoreMove(true);
                }
            };
            this.handleDragStart = function (ev) {
                _this.emitter.trigger('dragstart', ev);
                _this.handleMove(ev, true); // force = fire even if
initially null
            };
            this.handleDragMove = function (ev) {
                _this.emitter.trigger('dragmove', ev);
                _this.handleMove(ev);
            };
            this.handlePointerUp = function (ev) {
                _this.releaseHits();
                _this.emitter.trigger('pointerup', ev);
            };
            this.handleDragEnd = function (ev) {
                if (_this.movingHit) {
                    _this.emitter.trigger('hitupdate', null,
true, ev);
                }
                _this.finalHit = _this.movingHit;
                _this.movingHit = null;
                _this.emitter.trigger('dragend', ev);
            };
            this.droppableStore = droppableStore;
            dragging.emitter.on('pointerdown',
this.handlePointerDown);
            dragging.emitter.on('dragstart',
this.handleDragStart);
            dragging.emitter.on('dragmove', this.handleDragMove);
            dragging.emitter.on('pointerup',
this.handlePointerUp);
            dragging.emitter.on('dragend', this.handleDragEnd);
            this.dragging = dragging;
            this.emitter = new Emitter();
        }
        // sets initialHit
        // sets coordAdjust
        HitDragging.prototype.processFirstCoord = function (ev) {
            var origPoint = { left: ev.pageX, top: ev.pageY };
            var adjustedPoint = origPoint;
            var subjectEl = ev.subjectEl;
            var subjectRect;
            if (subjectEl !== document) {
                subjectRect = computeRect(subjectEl);
                adjustedPoint = constrainPoint(adjustedPoint, subjectRect);
            }
            var initialHit = this.initialHit =
this.queryHitForOffset(adjustedPoint.left, adjustedPoint.top);
            if (initialHit) {
                if (this.useSubjectCenter && subjectRect) {
                    var slicedSubjectRect = intersectRects(subjectRect,
initialHit.rect);
                    if (slicedSubjectRect) {
                        adjustedPoint = getRectCenter(slicedSubjectRect);
                    }
                }
                this.coordAdjust = diffPoints(adjustedPoint, origPoint);
            }
            else {
                this.coordAdjust = { left: 0, top: 0 };
            }
        };
        HitDragging.prototype.handleMove = function (ev, forceHandle) {
            var hit = this.queryHitForOffset(ev.pageX +
this.coordAdjust.left, ev.pageY + this.coordAdjust.top);
            if (forceHandle || !isHitsEqual(this.movingHit, hit)) {
                this.movingHit = hit;
                this.emitter.trigger('hitupdate', hit, false,
ev);
            }
        };
        HitDragging.prototype.prepareHits = function () {
            this.offsetTrackers = mapHash(this.droppableStore, function
(interactionSettings) {
                interactionSettings.component.prepareHits();
                return new OffsetTracker(interactionSettings.el);
            });
        };
        HitDragging.prototype.releaseHits = function () {
            var offsetTrackers = this.offsetTrackers;
            for (var id in offsetTrackers) {
                offsetTrackers[id].destroy();
            }
            this.offsetTrackers = {};
        };
        HitDragging.prototype.queryHitForOffset = function (offsetLeft,
offsetTop) {
            var _a = this, droppableStore = _a.droppableStore,
offsetTrackers = _a.offsetTrackers;
            var bestHit = null;
            for (var id in droppableStore) {
                var component = droppableStore[id].component;
                var offsetTracker = offsetTrackers[id];
                if (offsetTracker && // wasn't destroyed
mid-drag
                    offsetTracker.isWithinClipping(offsetLeft, offsetTop))
{
                    var originLeft = offsetTracker.computeLeft();
                    var originTop = offsetTracker.computeTop();
                    var positionLeft = offsetLeft - originLeft;
                    var positionTop = offsetTop - originTop;
                    var origRect = offsetTracker.origRect;
                    var width = origRect.right - origRect.left;
                    var height = origRect.bottom - origRect.top;
                    if (
                    // must be within the element's bounds
                    positionLeft >= 0 && positionLeft < width
&&
                        positionTop >= 0 && positionTop <
height) {
                        var hit = component.queryHit(positionLeft,
positionTop, width, height);
                        var dateProfile =
component.context.getCurrentData().dateProfile;
                        if (hit &&
                            (
                            // make sure the hit is within activeRange,
meaning it's not a deal cell
                            rangeContainsRange(dateProfile.activeRange,
hit.dateSpan.range)) &&
                            (!bestHit || hit.layer > bestHit.layer)) {
                            // TODO: better way to re-orient rectangle
                            hit.rect.left += originLeft;
                            hit.rect.right += originLeft;
                            hit.rect.top += originTop;
                            hit.rect.bottom += originTop;
                            bestHit = hit;
                        }
                    }
                }
            }
            return bestHit;
        };
        return HitDragging;
    }());
    function isHitsEqual(hit0, hit1) {
        if (!hit0 && !hit1) {
            return true;
        }
        if (Boolean(hit0) !== Boolean(hit1)) {
            return false;
        }
        return isDateSpansEqual(hit0.dateSpan, hit1.dateSpan);
    }

    function buildDatePointApiWithContext(dateSpan, context) {
        var props = {};
        for (var _i = 0, _a = context.pluginHooks.datePointTransforms; _i
< _a.length; _i++) {
            var transform = _a[_i];
            __assign(props, transform(dateSpan, context));
        }
        __assign(props, buildDatePointApi(dateSpan, context.dateEnv));
        return props;
    }
    function buildDatePointApi(span, dateEnv) {
        return {
            date: dateEnv.toDate(span.range.start),
            dateStr: dateEnv.formatIso(span.range.start, { omitTime:
span.allDay }),
            allDay: span.allDay,
        };
    }

    /*
    Monitors when the user clicks on a specific date/time of a component.
    A pointerdown+pointerup on the same "hit" constitutes a
click.
    */
    var DateClicking = /** @class */ (function (_super) {
        __extends(DateClicking, _super);
        function DateClicking(settings) {
            var _this = _super.call(this, settings) || this;
            _this.handlePointerDown = function (pev) {
                var dragging = _this.dragging;
                var downEl = pev.origEvent.target;
                // do this in pointerdown (not dragend) because DOM might
be mutated by the time dragend is fired
               
dragging.setIgnoreMove(!_this.component.isValidDateDownEl(downEl));
            };
            // won't even fire if moving was ignored
            _this.handleDragEnd = function (ev) {
                var component = _this.component;
                var pointer = _this.dragging.pointer;
                if (!pointer.wasTouchScroll) {
                    var _a = _this.hitDragging, initialHit = _a.initialHit,
finalHit = _a.finalHit;
                    if (initialHit && finalHit &&
isHitsEqual(initialHit, finalHit)) {
                        var context = component.context;
                        var arg = __assign(__assign({},
buildDatePointApiWithContext(initialHit.dateSpan, context)), { dayEl:
initialHit.dayEl, jsEvent: ev.origEvent, view: context.viewApi ||
context.calendarApi.view });
                        context.emitter.trigger('dateClick',
arg);
                    }
                }
            };
            // we DO want to watch pointer moves because otherwise finalHit
won't get populated
            _this.dragging = new FeaturefulElementDragging(settings.el);
            _this.dragging.autoScroller.isEnabled = false;
            var hitDragging = _this.hitDragging = new
HitDragging(_this.dragging, interactionSettingsToStore(settings));
            hitDragging.emitter.on('pointerdown',
_this.handlePointerDown);
            hitDragging.emitter.on('dragend',
_this.handleDragEnd);
            return _this;
        }
        DateClicking.prototype.destroy = function () {
            this.dragging.destroy();
        };
        return DateClicking;
    }(Interaction));

    /*
    Tracks when the user selects a portion of time of a component,
    constituted by a drag over date cells, with a possible delay at the
beginning of the drag.
    */
    var DateSelecting = /** @class */ (function (_super) {
        __extends(DateSelecting, _super);
        function DateSelecting(settings) {
            var _this = _super.call(this, settings) || this;
            _this.dragSelection = null;
            _this.handlePointerDown = function (ev) {
                var _a = _this, component = _a.component, dragging =
_a.dragging;
                var options = component.context.options;
                var canSelect = options.selectable &&
                    component.isValidDateDownEl(ev.origEvent.target);
                // don't bother to watch expensive moves if component
won't do selection
                dragging.setIgnoreMove(!canSelect);
                // if touch, require user to hold down
                dragging.delay = ev.isTouch ?
getComponentTouchDelay(component) : null;
            };
            _this.handleDragStart = function (ev) {
                _this.component.context.calendarApi.unselect(ev); //
unselect previous selections
            };
            _this.handleHitUpdate = function (hit, isFinal) {
                var context = _this.component.context;
                var dragSelection = null;
                var isInvalid = false;
                if (hit) {
                    dragSelection =
joinHitsIntoSelection(_this.hitDragging.initialHit, hit,
context.pluginHooks.dateSelectionTransformers);
                    if (!dragSelection ||
!_this.component.isDateSelectionValid(dragSelection)) {
                        isInvalid = true;
                        dragSelection = null;
                    }
                }
                if (dragSelection) {
                    context.dispatch({ type: 'SELECT_DATES',
selection: dragSelection });
                }
                else if (!isFinal) { // only unselect if moved away while
dragging
                    context.dispatch({ type: 'UNSELECT_DATES' });
                }
                if (!isInvalid) {
                    enableCursor();
                }
                else {
                    disableCursor();
                }
                if (!isFinal) {
                    _this.dragSelection = dragSelection; // only clear if
moved away from all hits while dragging
                }
            };
            _this.handlePointerUp = function (pev) {
                if (_this.dragSelection) {
                    // selection is already rendered, so just need to
report selection
                    triggerDateSelect(_this.dragSelection, pev,
_this.component.context);
                    _this.dragSelection = null;
                }
            };
            var component = settings.component;
            var options = component.context.options;
            var dragging = _this.dragging = new
FeaturefulElementDragging(settings.el);
            dragging.touchScrollAllowed = false;
            dragging.minDistance = options.selectMinDistance || 0;
            dragging.autoScroller.isEnabled = options.dragScroll;
            var hitDragging = _this.hitDragging = new
HitDragging(_this.dragging, interactionSettingsToStore(settings));
            hitDragging.emitter.on('pointerdown',
_this.handlePointerDown);
            hitDragging.emitter.on('dragstart',
_this.handleDragStart);
            hitDragging.emitter.on('hitupdate',
_this.handleHitUpdate);
            hitDragging.emitter.on('pointerup',
_this.handlePointerUp);
            return _this;
        }
        DateSelecting.prototype.destroy = function () {
            this.dragging.destroy();
        };
        return DateSelecting;
    }(Interaction));
    function getComponentTouchDelay(component) {
        var options = component.context.options;
        var delay = options.selectLongPressDelay;
        if (delay == null) {
            delay = options.longPressDelay;
        }
        return delay;
    }
    function joinHitsIntoSelection(hit0, hit1, dateSelectionTransformers) {
        var dateSpan0 = hit0.dateSpan;
        var dateSpan1 = hit1.dateSpan;
        var ms = [
            dateSpan0.range.start,
            dateSpan0.range.end,
            dateSpan1.range.start,
            dateSpan1.range.end,
        ];
        ms.sort(compareNumbers);
        var props = {};
        for (var _i = 0, dateSelectionTransformers_1 =
dateSelectionTransformers; _i < dateSelectionTransformers_1.length;
_i++) {
            var transformer = dateSelectionTransformers_1[_i];
            var res = transformer(hit0, hit1);
            if (res === false) {
                return null;
            }
            if (res) {
                __assign(props, res);
            }
        }
        props.range = { start: ms[0], end: ms[3] };
        props.allDay = dateSpan0.allDay;
        return props;
    }

    var EventDragging = /** @class */ (function (_super) {
        __extends(EventDragging, _super);
        function EventDragging(settings) {
            var _this = _super.call(this, settings) || this;
            // internal state
            _this.subjectEl = null;
            _this.subjectSeg = null; // the seg being selected/dragged
            _this.isDragging = false;
            _this.eventRange = null;
            _this.relevantEvents = null; // the events being dragged
            _this.receivingContext = null;
            _this.validMutation = null;
            _this.mutatedRelevantEvents = null;
            _this.handlePointerDown = function (ev) {
                var origTarget = ev.origEvent.target;
                var _a = _this, component = _a.component, dragging =
_a.dragging;
                var mirror = dragging.mirror;
                var options = component.context.options;
                var initialContext = component.context;
                _this.subjectEl = ev.subjectEl;
                var subjectSeg = _this.subjectSeg = getElSeg(ev.subjectEl);
                var eventRange = _this.eventRange = subjectSeg.eventRange;
                var eventInstanceId = eventRange.instance.instanceId;
                _this.relevantEvents =
getRelevantEvents(initialContext.getCurrentData().eventStore,
eventInstanceId);
                dragging.minDistance = ev.isTouch ? 0 :
options.eventDragMinDistance;
                dragging.delay =
                    // only do a touch delay if touch and this event
hasn't been selected yet
                    (ev.isTouch && eventInstanceId !==
component.props.eventSelection) ?
                        getComponentTouchDelay$1(component) :
                        null;
                if (options.fixedMirrorParent) {
                    mirror.parentNode = options.fixedMirrorParent;
                }
                else {
                    mirror.parentNode = elementClosest(origTarget,
'.fc');
                }
                mirror.revertDuration = options.dragRevertDuration;
                var isValid = component.isValidSegDownEl(origTarget)
&&
                    !elementClosest(origTarget,
'.fc-event-resizer'); // NOT on a resizer
                dragging.setIgnoreMove(!isValid);
                // disable dragging for elements that are resizable (ie,
selectable)
                // but are not draggable
                _this.isDragging = isValid &&
                   
ev.subjectEl.classList.contains('fc-event-draggable');
            };
            _this.handleDragStart = function (ev) {
                var initialContext = _this.component.context;
                var eventRange = _this.eventRange;
                var eventInstanceId = eventRange.instance.instanceId;
                if (ev.isTouch) {
                    // need to select a different event?
                    if (eventInstanceId !==
_this.component.props.eventSelection) {
                        initialContext.dispatch({ type:
'SELECT_EVENT', eventInstanceId: eventInstanceId });
                    }
                }
                else {
                    // if now using mouse, but was previous touch
interaction, clear selected event
                    initialContext.dispatch({ type:
'UNSELECT_EVENT' });
                }
                if (_this.isDragging) {
                    initialContext.calendarApi.unselect(ev); // unselect
*date* selection
                   
initialContext.emitter.trigger('eventDragStart', {
                        el: _this.subjectEl,
                        event: new EventApi(initialContext, eventRange.def,
eventRange.instance),
                        jsEvent: ev.origEvent,
                        view: initialContext.viewApi,
                    });
                }
            };
            _this.handleHitUpdate = function (hit, isFinal) {
                if (!_this.isDragging) {
                    return;
                }
                var relevantEvents = _this.relevantEvents;
                var initialHit = _this.hitDragging.initialHit;
                var initialContext = _this.component.context;
                // states based on new hit
                var receivingContext = null;
                var mutation = null;
                var mutatedRelevantEvents = null;
                var isInvalid = false;
                var interaction = {
                    affectedEvents: relevantEvents,
                    mutatedEvents: createEmptyEventStore(),
                    isEvent: true,
                };
                if (hit) {
                    var receivingComponent = hit.component;
                    receivingContext = receivingComponent.context;
                    var receivingOptions = receivingContext.options;
                    if (initialContext === receivingContext ||
                        (receivingOptions.editable &&
receivingOptions.droppable)) {
                        mutation = computeEventMutation(initialHit, hit,
receivingContext.getCurrentData().pluginHooks.eventDragMutationMassagers);
                        if (mutation) {
                            mutatedRelevantEvents =
applyMutationToEventStore(relevantEvents,
receivingContext.getCurrentData().eventUiBases, mutation,
receivingContext);
                            interaction.mutatedEvents =
mutatedRelevantEvents;
                            if
(!receivingComponent.isInteractionValid(interaction)) {
                                isInvalid = true;
                                mutation = null;
                                mutatedRelevantEvents = null;
                                interaction.mutatedEvents =
createEmptyEventStore();
                            }
                        }
                    }
                    else {
                        receivingContext = null;
                    }
                }
                _this.displayDrag(receivingContext, interaction);
                if (!isInvalid) {
                    enableCursor();
                }
                else {
                    disableCursor();
                }
                if (!isFinal) {
                    if (initialContext === receivingContext && //
TODO: write test for this
                        isHitsEqual(initialHit, hit)) {
                        mutation = null;
                    }
                    _this.dragging.setMirrorNeedsRevert(!mutation);
                    // render the mirror if no already-rendered mirror
                    // TODO: wish we could somehow wait for dispatch to
guarantee render
                    _this.dragging.setMirrorIsVisible(!hit ||
!document.querySelector('.fc-event-mirror'));
                    // assign states based on new hit
                    _this.receivingContext = receivingContext;
                    _this.validMutation = mutation;
                    _this.mutatedRelevantEvents = mutatedRelevantEvents;
                }
            };
            _this.handlePointerUp = function () {
                if (!_this.isDragging) {
                    _this.cleanup(); // because handleDragEnd won't
fire
                }
            };
            _this.handleDragEnd = function (ev) {
                if (_this.isDragging) {
                    var initialContext_1 = _this.component.context;
                    var initialView = initialContext_1.viewApi;
                    var _a = _this, receivingContext_1 =
_a.receivingContext, validMutation = _a.validMutation;
                    var eventDef = _this.eventRange.def;
                    var eventInstance = _this.eventRange.instance;
                    var eventApi = new EventApi(initialContext_1, eventDef,
eventInstance);
                    var relevantEvents_1 = _this.relevantEvents;
                    var mutatedRelevantEvents_1 =
_this.mutatedRelevantEvents;
                    var finalHit = _this.hitDragging.finalHit;
                    _this.clearDrag(); // must happen after revert
animation
                   
initialContext_1.emitter.trigger('eventDragStop', {
                        el: _this.subjectEl,
                        event: eventApi,
                        jsEvent: ev.origEvent,
                        view: initialView,
                    });
                    if (validMutation) {
                        // dropped within same calendar
                        if (receivingContext_1 === initialContext_1) {
                            var updatedEventApi = new
EventApi(initialContext_1, mutatedRelevantEvents_1.defs[eventDef.defId],
eventInstance ? mutatedRelevantEvents_1.instances[eventInstance.instanceId]
: null);
                            initialContext_1.dispatch({
                                type: 'MERGE_EVENTS',
                                eventStore: mutatedRelevantEvents_1,
                            });
                            var eventChangeArg = {
                                oldEvent: eventApi,
                                event: updatedEventApi,
                                relatedEvents:
buildEventApis(mutatedRelevantEvents_1, initialContext_1, eventInstance),
                                revert: function () {
                                    initialContext_1.dispatch({
                                        type: 'MERGE_EVENTS',
                                        eventStore: relevantEvents_1,
                                    });
                                },
                            };
                            var transformed = {};
                            for (var _i = 0, _b =
initialContext_1.getCurrentData().pluginHooks.eventDropTransformers; _i
< _b.length; _i++) {
                                var transformer = _b[_i];
                                __assign(transformed,
transformer(validMutation, initialContext_1));
                            }
                           
initialContext_1.emitter.trigger('eventDrop',
__assign(__assign(__assign({}, eventChangeArg), transformed), { el:
ev.subjectEl, delta: validMutation.datesDelta, jsEvent: ev.origEvent, view:
initialView }));
                           
initialContext_1.emitter.trigger('eventChange', eventChangeArg);
                            // dropped in different calendar
                        }
                        else if (receivingContext_1) {
                            var eventRemoveArg = {
                                event: eventApi,
                                relatedEvents:
buildEventApis(relevantEvents_1, initialContext_1, eventInstance),
                                revert: function () {
                                    initialContext_1.dispatch({
                                        type: 'MERGE_EVENTS',
                                        eventStore: relevantEvents_1,
                                    });
                                },
                            };
                           
initialContext_1.emitter.trigger('eventLeave',
__assign(__assign({}, eventRemoveArg), { draggedEl: ev.subjectEl, view:
initialView }));
                            initialContext_1.dispatch({
                                type: 'REMOVE_EVENTS',
                                eventStore: relevantEvents_1,
                            });
                           
initialContext_1.emitter.trigger('eventRemove', eventRemoveArg);
                            var addedEventDef =
mutatedRelevantEvents_1.defs[eventDef.defId];
                            var addedEventInstance =
mutatedRelevantEvents_1.instances[eventInstance.instanceId];
                            var addedEventApi = new
EventApi(receivingContext_1, addedEventDef, addedEventInstance);
                            receivingContext_1.dispatch({
                                type: 'MERGE_EVENTS',
                                eventStore: mutatedRelevantEvents_1,
                            });
                            var eventAddArg = {
                                event: addedEventApi,
                                relatedEvents:
buildEventApis(mutatedRelevantEvents_1, receivingContext_1,
addedEventInstance),
                                revert: function () {
                                    receivingContext_1.dispatch({
                                        type: 'REMOVE_EVENTS',
                                        eventStore:
mutatedRelevantEvents_1,
                                    });
                                },
                            };
                           
receivingContext_1.emitter.trigger('eventAdd', eventAddArg);
                            if (ev.isTouch) {
                                receivingContext_1.dispatch({
                                    type: 'SELECT_EVENT',
                                    eventInstanceId:
eventInstance.instanceId,
                                });
                            }
                           
receivingContext_1.emitter.trigger('drop', __assign(__assign({},
buildDatePointApiWithContext(finalHit.dateSpan, receivingContext_1)), {
draggedEl: ev.subjectEl, jsEvent: ev.origEvent, view:
finalHit.component.context.viewApi }));
                           
receivingContext_1.emitter.trigger('eventReceive',
__assign(__assign({}, eventAddArg), { draggedEl: ev.subjectEl, view:
finalHit.component.context.viewApi }));
                        }
                    }
                    else {
                       
initialContext_1.emitter.trigger('_noEventDrop');
                    }
                }
                _this.cleanup();
            };
            var component = _this.component;
            var options = component.context.options;
            var dragging = _this.dragging = new
FeaturefulElementDragging(settings.el);
            dragging.pointer.selector = EventDragging.SELECTOR;
            dragging.touchScrollAllowed = false;
            dragging.autoScroller.isEnabled = options.dragScroll;
            var hitDragging = _this.hitDragging = new
HitDragging(_this.dragging, interactionSettingsStore);
            hitDragging.useSubjectCenter = settings.useEventCenter;
            hitDragging.emitter.on('pointerdown',
_this.handlePointerDown);
            hitDragging.emitter.on('dragstart',
_this.handleDragStart);
            hitDragging.emitter.on('hitupdate',
_this.handleHitUpdate);
            hitDragging.emitter.on('pointerup',
_this.handlePointerUp);
            hitDragging.emitter.on('dragend',
_this.handleDragEnd);
            return _this;
        }
        EventDragging.prototype.destroy = function () {
            this.dragging.destroy();
        };
        // render a drag state on the next receivingCalendar
        EventDragging.prototype.displayDrag = function (nextContext, state)
{
            var initialContext = this.component.context;
            var prevContext = this.receivingContext;
            // does the previous calendar need to be cleared?
            if (prevContext && prevContext !== nextContext) {
                // does the initial calendar need to be cleared?
                // if so, don't clear all the way. we still need to to
hide the affectedEvents
                if (prevContext === initialContext) {
                    prevContext.dispatch({
                        type: 'SET_EVENT_DRAG',
                        state: {
                            affectedEvents: state.affectedEvents,
                            mutatedEvents: createEmptyEventStore(),
                            isEvent: true,
                        },
                    });
                    // completely clear the old calendar if it wasn't
the initial
                }
                else {
                    prevContext.dispatch({ type:
'UNSET_EVENT_DRAG' });
                }
            }
            if (nextContext) {
                nextContext.dispatch({ type: 'SET_EVENT_DRAG',
state: state });
            }
        };
        EventDragging.prototype.clearDrag = function () {
            var initialCalendar = this.component.context;
            var receivingContext = this.receivingContext;
            if (receivingContext) {
                receivingContext.dispatch({ type:
'UNSET_EVENT_DRAG' });
            }
            // the initial calendar might have an dummy drag state from
displayDrag
            if (initialCalendar !== receivingContext) {
                initialCalendar.dispatch({ type:
'UNSET_EVENT_DRAG' });
            }
        };
        EventDragging.prototype.cleanup = function () {
            this.subjectSeg = null;
            this.isDragging = false;
            this.eventRange = null;
            this.relevantEvents = null;
            this.receivingContext = null;
            this.validMutation = null;
            this.mutatedRelevantEvents = null;
        };
        // TODO: test this in IE11
        // QUESTION: why do we need it on the resizable???
        EventDragging.SELECTOR = '.fc-event-draggable,
.fc-event-resizable';
        return EventDragging;
    }(Interaction));
    function computeEventMutation(hit0, hit1, massagers) {
        var dateSpan0 = hit0.dateSpan;
        var dateSpan1 = hit1.dateSpan;
        var date0 = dateSpan0.range.start;
        var date1 = dateSpan1.range.start;
        var standardProps = {};
        if (dateSpan0.allDay !== dateSpan1.allDay) {
            standardProps.allDay = dateSpan1.allDay;
            standardProps.hasEnd =
hit1.component.context.options.allDayMaintainDuration;
            if (dateSpan1.allDay) {
                // means date1 is already start-of-day,
                // but date0 needs to be converted
                date0 = startOfDay(date0);
            }
        }
        var delta = diffDates(date0, date1, hit0.component.context.dateEnv,
hit0.component === hit1.component ?
            hit0.component.largeUnit :
            null);
        if (delta.milliseconds) { // has hours/minutes/seconds
            standardProps.allDay = false;
        }
        var mutation = {
            datesDelta: delta,
            standardProps: standardProps,
        };
        for (var _i = 0, massagers_1 = massagers; _i <
massagers_1.length; _i++) {
            var massager = massagers_1[_i];
            massager(mutation, hit0, hit1);
        }
        return mutation;
    }
    function getComponentTouchDelay$1(component) {
        var options = component.context.options;
        var delay = options.eventLongPressDelay;
        if (delay == null) {
            delay = options.longPressDelay;
        }
        return delay;
    }

    var EventResizing = /** @class */ (function (_super) {
        __extends(EventResizing, _super);
        function EventResizing(settings) {
            var _this = _super.call(this, settings) || this;
            // internal state
            _this.draggingSegEl = null;
            _this.draggingSeg = null; // TODO: rename to resizingSeg?
subjectSeg?
            _this.eventRange = null;
            _this.relevantEvents = null;
            _this.validMutation = null;
            _this.mutatedRelevantEvents = null;
            _this.handlePointerDown = function (ev) {
                var component = _this.component;
                var segEl = _this.querySegEl(ev);
                var seg = getElSeg(segEl);
                var eventRange = _this.eventRange = seg.eventRange;
                _this.dragging.minDistance =
component.context.options.eventDragMinDistance;
                // if touch, need to be working with a selected event
               
_this.dragging.setIgnoreMove(!_this.component.isValidSegDownEl(ev.origEvent.target)
||
                    (ev.isTouch &&
_this.component.props.eventSelection !== eventRange.instance.instanceId));
            };
            _this.handleDragStart = function (ev) {
                var context = _this.component.context;
                var eventRange = _this.eventRange;
                _this.relevantEvents =
getRelevantEvents(context.getCurrentData().eventStore,
_this.eventRange.instance.instanceId);
                var segEl = _this.querySegEl(ev);
                _this.draggingSegEl = segEl;
                _this.draggingSeg = getElSeg(segEl);
                context.calendarApi.unselect();
                context.emitter.trigger('eventResizeStart', {
                    el: segEl,
                    event: new EventApi(context, eventRange.def,
eventRange.instance),
                    jsEvent: ev.origEvent,
                    view: context.viewApi,
                });
            };
            _this.handleHitUpdate = function (hit, isFinal, ev) {
                var context = _this.component.context;
                var relevantEvents = _this.relevantEvents;
                var initialHit = _this.hitDragging.initialHit;
                var eventInstance = _this.eventRange.instance;
                var mutation = null;
                var mutatedRelevantEvents = null;
                var isInvalid = false;
                var interaction = {
                    affectedEvents: relevantEvents,
                    mutatedEvents: createEmptyEventStore(),
                    isEvent: true,
                };
                if (hit) {
                    mutation = computeMutation(initialHit, hit,
ev.subjectEl.classList.contains('fc-event-resizer-start'),
eventInstance.range, context.pluginHooks.eventResizeJoinTransforms);
                }
                if (mutation) {
                    mutatedRelevantEvents =
applyMutationToEventStore(relevantEvents,
context.getCurrentData().eventUiBases, mutation, context);
                    interaction.mutatedEvents = mutatedRelevantEvents;
                    if (!_this.component.isInteractionValid(interaction)) {
                        isInvalid = true;
                        mutation = null;
                        mutatedRelevantEvents = null;
                        interaction.mutatedEvents = null;
                    }
                }
                if (mutatedRelevantEvents) {
                    context.dispatch({
                        type: 'SET_EVENT_RESIZE',
                        state: interaction,
                    });
                }
                else {
                    context.dispatch({ type: 'UNSET_EVENT_RESIZE'
});
                }
                if (!isInvalid) {
                    enableCursor();
                }
                else {
                    disableCursor();
                }
                if (!isFinal) {
                    if (mutation && isHitsEqual(initialHit, hit)) {
                        mutation = null;
                    }
                    _this.validMutation = mutation;
                    _this.mutatedRelevantEvents = mutatedRelevantEvents;
                }
            };
            _this.handleDragEnd = function (ev) {
                var context = _this.component.context;
                var eventDef = _this.eventRange.def;
                var eventInstance = _this.eventRange.instance;
                var eventApi = new EventApi(context, eventDef,
eventInstance);
                var relevantEvents = _this.relevantEvents;
                var mutatedRelevantEvents = _this.mutatedRelevantEvents;
                context.emitter.trigger('eventResizeStop', {
                    el: _this.draggingSegEl,
                    event: eventApi,
                    jsEvent: ev.origEvent,
                    view: context.viewApi,
                });
                if (_this.validMutation) {
                    var updatedEventApi = new EventApi(context,
mutatedRelevantEvents.defs[eventDef.defId], eventInstance ?
mutatedRelevantEvents.instances[eventInstance.instanceId] : null);
                    context.dispatch({
                        type: 'MERGE_EVENTS',
                        eventStore: mutatedRelevantEvents,
                    });
                    var eventChangeArg = {
                        oldEvent: eventApi,
                        event: updatedEventApi,
                        relatedEvents:
buildEventApis(mutatedRelevantEvents, context, eventInstance),
                        revert: function () {
                            context.dispatch({
                                type: 'MERGE_EVENTS',
                                eventStore: relevantEvents,
                            });
                        },
                    };
                    context.emitter.trigger('eventResize',
__assign(__assign({}, eventChangeArg), { el: _this.draggingSegEl,
startDelta: _this.validMutation.startDelta || createDuration(0), endDelta:
_this.validMutation.endDelta || createDuration(0), jsEvent: ev.origEvent,
view: context.viewApi }));
                    context.emitter.trigger('eventChange',
eventChangeArg);
                }
                else {
                    context.emitter.trigger('_noEventResize');
                }
                // reset all internal state
                _this.draggingSeg = null;
                _this.relevantEvents = null;
                _this.validMutation = null;
                // okay to keep eventInstance around. useful to set it in
handlePointerDown
            };
            var component = settings.component;
            var dragging = _this.dragging = new
FeaturefulElementDragging(settings.el);
            dragging.pointer.selector = '.fc-event-resizer';
            dragging.touchScrollAllowed = false;
            dragging.autoScroller.isEnabled =
component.context.options.dragScroll;
            var hitDragging = _this.hitDragging = new
HitDragging(_this.dragging, interactionSettingsToStore(settings));
            hitDragging.emitter.on('pointerdown',
_this.handlePointerDown);
            hitDragging.emitter.on('dragstart',
_this.handleDragStart);
            hitDragging.emitter.on('hitupdate',
_this.handleHitUpdate);
            hitDragging.emitter.on('dragend',
_this.handleDragEnd);
            return _this;
        }
        EventResizing.prototype.destroy = function () {
            this.dragging.destroy();
        };
        EventResizing.prototype.querySegEl = function (ev) {
            return elementClosest(ev.subjectEl, '.fc-event');
        };
        return EventResizing;
    }(Interaction));
    function computeMutation(hit0, hit1, isFromStart, instanceRange,
transforms) {
        var dateEnv = hit0.component.context.dateEnv;
        var date0 = hit0.dateSpan.range.start;
        var date1 = hit1.dateSpan.range.start;
        var delta = diffDates(date0, date1, dateEnv,
hit0.component.largeUnit);
        var props = {};
        for (var _i = 0, transforms_1 = transforms; _i <
transforms_1.length; _i++) {
            var transform = transforms_1[_i];
            var res = transform(hit0, hit1);
            if (res === false) {
                return null;
            }
            if (res) {
                __assign(props, res);
            }
        }
        if (isFromStart) {
            if (dateEnv.add(instanceRange.start, delta) <
instanceRange.end) {
                props.startDelta = delta;
                return props;
            }
        }
        else if (dateEnv.add(instanceRange.end, delta) >
instanceRange.start) {
            props.endDelta = delta;
            return props;
        }
        return null;
    }

    var UnselectAuto = /** @class */ (function () {
        function UnselectAuto(context) {
            var _this = this;
            this.context = context;
            this.isRecentPointerDateSelect = false; // wish we could use a
selector to detect date selection, but uses hit system
            this.matchesCancel = false;
            this.matchesEvent = false;
            this.onSelect = function (selectInfo) {
                if (selectInfo.jsEvent) {
                    _this.isRecentPointerDateSelect = true;
                }
            };
            this.onDocumentPointerDown = function (pev) {
                var unselectCancel = _this.context.options.unselectCancel;
                var downEl = pev.origEvent.target;
                _this.matchesCancel = !!elementClosest(downEl,
unselectCancel);
                _this.matchesEvent = !!elementClosest(downEl,
EventDragging.SELECTOR); // interaction started on an event?
            };
            this.onDocumentPointerUp = function (pev) {
                var context = _this.context;
                var documentPointer = _this.documentPointer;
                var calendarState = context.getCurrentData();
                // touch-scrolling should never unfocus any type of
selection
                if (!documentPointer.wasTouchScroll) {
                    if (calendarState.dateSelection && // an
existing date selection?
                        !_this.isRecentPointerDateSelect // a new
pointer-initiated date selection since last onDocumentPointerUp?
                    ) {
                        var unselectAuto = context.options.unselectAuto;
                        if (unselectAuto && (!unselectAuto ||
!_this.matchesCancel)) {
                            context.calendarApi.unselect(pev);
                        }
                    }
                    if (calendarState.eventSelection && // an
existing event selected?
                        !_this.matchesEvent // interaction DIDN'T
start on an event
                    ) {
                        context.dispatch({ type: 'UNSELECT_EVENT'
});
                    }
                }
                _this.isRecentPointerDateSelect = false;
            };
            var documentPointer = this.documentPointer = new
PointerDragging(document);
            documentPointer.shouldIgnoreMove = true;
            documentPointer.shouldWatchScroll = false;
            documentPointer.emitter.on('pointerdown',
this.onDocumentPointerDown);
            documentPointer.emitter.on('pointerup',
this.onDocumentPointerUp);
            /*
            TODO: better way to know about whether there was a selection
with the pointer
            */
            context.emitter.on('select', this.onSelect);
        }
        UnselectAuto.prototype.destroy = function () {
            this.context.emitter.off('select', this.onSelect);
            this.documentPointer.destroy();
        };
        return UnselectAuto;
    }());

    var OPTION_REFINERS = {
        fixedMirrorParent: identity,
    };
    var LISTENER_REFINERS = {
        dateClick: identity,
        eventDragStart: identity,
        eventDragStop: identity,
        eventDrop: identity,
        eventResizeStart: identity,
        eventResizeStop: identity,
        eventResize: identity,
        drop: identity,
        eventReceive: identity,
        eventLeave: identity,
    };

    /*
    Given an already instantiated draggable object for one-or-more
elements,
    Interprets any dragging as an attempt to drag an events that lives
outside
    of a calendar onto a calendar.
    */
    var ExternalElementDragging = /** @class */ (function () {
        function ExternalElementDragging(dragging, suppliedDragMeta) {
            var _this = this;
            this.receivingContext = null;
            this.droppableEvent = null; // will exist for all drags, even
if create:false
            this.suppliedDragMeta = null;
            this.dragMeta = null;
            this.handleDragStart = function (ev) {
                _this.dragMeta = _this.buildDragMeta(ev.subjectEl);
            };
            this.handleHitUpdate = function (hit, isFinal, ev) {
                var dragging = _this.hitDragging.dragging;
                var receivingContext = null;
                var droppableEvent = null;
                var isInvalid = false;
                var interaction = {
                    affectedEvents: createEmptyEventStore(),
                    mutatedEvents: createEmptyEventStore(),
                    isEvent: _this.dragMeta.create,
                };
                if (hit) {
                    receivingContext = hit.component.context;
                    if (_this.canDropElOnCalendar(ev.subjectEl,
receivingContext)) {
                        droppableEvent =
computeEventForDateSpan(hit.dateSpan, _this.dragMeta, receivingContext);
                        interaction.mutatedEvents =
eventTupleToStore(droppableEvent);
                        isInvalid = !isInteractionValid(interaction,
receivingContext);
                        if (isInvalid) {
                            interaction.mutatedEvents =
createEmptyEventStore();
                            droppableEvent = null;
                        }
                    }
                }
                _this.displayDrag(receivingContext, interaction);
                // show mirror if no already-rendered mirror element OR if
we are shutting down the mirror (?)
                // TODO: wish we could somehow wait for dispatch to
guarantee render
                dragging.setMirrorIsVisible(isFinal || !droppableEvent ||
!document.querySelector('.fc-event-mirror'));
                if (!isInvalid) {
                    enableCursor();
                }
                else {
                    disableCursor();
                }
                if (!isFinal) {
                    dragging.setMirrorNeedsRevert(!droppableEvent);
                    _this.receivingContext = receivingContext;
                    _this.droppableEvent = droppableEvent;
                }
            };
            this.handleDragEnd = function (pev) {
                var _a = _this, receivingContext = _a.receivingContext,
droppableEvent = _a.droppableEvent;
                _this.clearDrag();
                if (receivingContext && droppableEvent) {
                    var finalHit = _this.hitDragging.finalHit;
                    var finalView = finalHit.component.context.viewApi;
                    var dragMeta = _this.dragMeta;
                    receivingContext.emitter.trigger('drop',
__assign(__assign({}, buildDatePointApiWithContext(finalHit.dateSpan,
receivingContext)), { draggedEl: pev.subjectEl, jsEvent: pev.origEvent,
view: finalView }));
                    if (dragMeta.create) {
                        var addingEvents_1 =
eventTupleToStore(droppableEvent);
                        receivingContext.dispatch({
                            type: 'MERGE_EVENTS',
                            eventStore: addingEvents_1,
                        });
                        if (pev.isTouch) {
                            receivingContext.dispatch({
                                type: 'SELECT_EVENT',
                                eventInstanceId:
droppableEvent.instance.instanceId,
                            });
                        }
                        // signal that an external event landed
                       
receivingContext.emitter.trigger('eventReceive', {
                            event: new EventApi(receivingContext,
droppableEvent.def, droppableEvent.instance),
                            relatedEvents: [],
                            revert: function () {
                                receivingContext.dispatch({
                                    type: 'REMOVE_EVENTS',
                                    eventStore: addingEvents_1,
                                });
                            },
                            draggedEl: pev.subjectEl,
                            view: finalView,
                        });
                    }
                }
                _this.receivingContext = null;
                _this.droppableEvent = null;
            };
            var hitDragging = this.hitDragging = new HitDragging(dragging,
interactionSettingsStore);
            hitDragging.requireInitial = false; // will start outside of a
component
            hitDragging.emitter.on('dragstart',
this.handleDragStart);
            hitDragging.emitter.on('hitupdate',
this.handleHitUpdate);
            hitDragging.emitter.on('dragend',
this.handleDragEnd);
            this.suppliedDragMeta = suppliedDragMeta;
        }
        ExternalElementDragging.prototype.buildDragMeta = function
(subjectEl) {
            if (typeof this.suppliedDragMeta === 'object') {
                return parseDragMeta(this.suppliedDragMeta);
            }
            if (typeof this.suppliedDragMeta === 'function') {
                return parseDragMeta(this.suppliedDragMeta(subjectEl));
            }
            return getDragMetaFromEl(subjectEl);
        };
        ExternalElementDragging.prototype.displayDrag = function
(nextContext, state) {
            var prevContext = this.receivingContext;
            if (prevContext && prevContext !== nextContext) {
                prevContext.dispatch({ type: 'UNSET_EVENT_DRAG'
});
            }
            if (nextContext) {
                nextContext.dispatch({ type: 'SET_EVENT_DRAG',
state: state });
            }
        };
        ExternalElementDragging.prototype.clearDrag = function () {
            if (this.receivingContext) {
                this.receivingContext.dispatch({ type:
'UNSET_EVENT_DRAG' });
            }
        };
        ExternalElementDragging.prototype.canDropElOnCalendar = function
(el, receivingContext) {
            var dropAccept = receivingContext.options.dropAccept;
            if (typeof dropAccept === 'function') {
                return dropAccept.call(receivingContext.calendarApi, el);
            }
            if (typeof dropAccept === 'string' &&
dropAccept) {
                return Boolean(elementMatches(el, dropAccept));
            }
            return true;
        };
        return ExternalElementDragging;
    }());
    // Utils for computing event store from the DragMeta
    //
----------------------------------------------------------------------------------------------------
    function computeEventForDateSpan(dateSpan, dragMeta, context) {
        var defProps = __assign({}, dragMeta.leftoverProps);
        for (var _i = 0, _a = context.pluginHooks.externalDefTransforms; _i
< _a.length; _i++) {
            var transform = _a[_i];
            __assign(defProps, transform(dateSpan, dragMeta));
        }
        var _b = refineEventDef(defProps, context), refined = _b.refined,
extra = _b.extra;
        var def = parseEventDef(refined, extra, dragMeta.sourceId,
dateSpan.allDay, context.options.forceEventDuration ||
Boolean(dragMeta.duration), // hasEnd
        context);
        var start = dateSpan.range.start;
        // only rely on time info if drop zone is all-day,
        // otherwise, we already know the time
        if (dateSpan.allDay && dragMeta.startTime) {
            start = context.dateEnv.add(start, dragMeta.startTime);
        }
        var end = dragMeta.duration ?
            context.dateEnv.add(start, dragMeta.duration) :
            getDefaultEventEnd(dateSpan.allDay, start, context);
        var instance = createEventInstance(def.defId, { start: start, end:
end });
        return { def: def, instance: instance };
    }
    // Utils for extracting data from element
    //
----------------------------------------------------------------------------------------------------
    function getDragMetaFromEl(el) {
        var str = getEmbeddedElData(el, 'event');
        var obj = str ?
            JSON.parse(str) :
            { create: false }; // if no embedded data, assume no event
creation
        return parseDragMeta(obj);
    }
    config.dataAttrPrefix = '';
    function getEmbeddedElData(el, name) {
        var prefix = config.dataAttrPrefix;
        var prefixedName = (prefix ? prefix + '-' : '')
+ name;
        return el.getAttribute('data-' + prefixedName) ||
'';
    }

    /*
    Makes an element (that is *external* to any calendar) draggable.
    Can pass in data that determines how an event will be created when
dropped onto a calendar.
    Leverages FullCalendar's internal drag-n-drop functionality
WITHOUT a third-party drag system.
    */
    var ExternalDraggable = /** @class */ (function () {
        function ExternalDraggable(el, settings) {
            var _this = this;
            if (settings === void 0) { settings = {}; }
            this.handlePointerDown = function (ev) {
                var dragging = _this.dragging;
                var _a = _this.settings, minDistance = _a.minDistance,
longPressDelay = _a.longPressDelay;
                dragging.minDistance =
                    minDistance != null ?
                        minDistance :
                        (ev.isTouch ? 0 :
BASE_OPTION_DEFAULTS.eventDragMinDistance);
                dragging.delay =
                    ev.isTouch ? // TODO: eventually read
eventLongPressDelay instead vvv
                        (longPressDelay != null ? longPressDelay :
BASE_OPTION_DEFAULTS.longPressDelay) :
                        0;
            };
            this.handleDragStart = function (ev) {
                if (ev.isTouch &&
                    _this.dragging.delay &&
                    ev.subjectEl.classList.contains('fc-event'))
{
                   
_this.dragging.mirror.getMirrorEl().classList.add('fc-event-selected');
                }
            };
            this.settings = settings;
            var dragging = this.dragging = new
FeaturefulElementDragging(el);
            dragging.touchScrollAllowed = false;
            if (settings.itemSelector != null) {
                dragging.pointer.selector = settings.itemSelector;
            }
            if (settings.appendTo != null) {
                dragging.mirror.parentNode = settings.appendTo; // TODO:
write tests
            }
            dragging.emitter.on('pointerdown',
this.handlePointerDown);
            dragging.emitter.on('dragstart',
this.handleDragStart);
            new ExternalElementDragging(dragging, settings.eventData); //
eslint-disable-line no-new
        }
        ExternalDraggable.prototype.destroy = function () {
            this.dragging.destroy();
        };
        return ExternalDraggable;
    }());

    /*
    Detects when a *THIRD-PARTY* drag-n-drop system interacts with
elements.
    The third-party system is responsible for drawing the visuals effects
of the drag.
    This class simply monitors for pointer movements and fires events.
    It also has the ability to hide the moving element (the
"mirror") during the drag.
    */
    var InferredElementDragging = /** @class */ (function (_super) {
        __extends(InferredElementDragging, _super);
        function InferredElementDragging(containerEl) {
            var _this = _super.call(this, containerEl) || this;
            _this.shouldIgnoreMove = false;
            _this.mirrorSelector = '';
            _this.currentMirrorEl = null;
            _this.handlePointerDown = function (ev) {
                _this.emitter.trigger('pointerdown', ev);
                if (!_this.shouldIgnoreMove) {
                    // fire dragstart right away. does not support delay or
min-distance
                    _this.emitter.trigger('dragstart', ev);
                }
            };
            _this.handlePointerMove = function (ev) {
                if (!_this.shouldIgnoreMove) {
                    _this.emitter.trigger('dragmove', ev);
                }
            };
            _this.handlePointerUp = function (ev) {
                _this.emitter.trigger('pointerup', ev);
                if (!_this.shouldIgnoreMove) {
                    // fire dragend right away. does not support a revert
animation
                    _this.emitter.trigger('dragend', ev);
                }
            };
            var pointer = _this.pointer = new PointerDragging(containerEl);
            pointer.emitter.on('pointerdown',
_this.handlePointerDown);
            pointer.emitter.on('pointermove',
_this.handlePointerMove);
            pointer.emitter.on('pointerup',
_this.handlePointerUp);
            return _this;
        }
        InferredElementDragging.prototype.destroy = function () {
            this.pointer.destroy();
        };
        InferredElementDragging.prototype.setIgnoreMove = function (bool) {
            this.shouldIgnoreMove = bool;
        };
        InferredElementDragging.prototype.setMirrorIsVisible = function
(bool) {
            if (bool) {
                // restore a previously hidden element.
                // use the reference in case the selector class has already
been removed.
                if (this.currentMirrorEl) {
                    this.currentMirrorEl.style.visibility = '';
                    this.currentMirrorEl = null;
                }
            }
            else {
                var mirrorEl = this.mirrorSelector ?
                    document.querySelector(this.mirrorSelector) :
                    null;
                if (mirrorEl) {
                    this.currentMirrorEl = mirrorEl;
                    mirrorEl.style.visibility = 'hidden';
                }
            }
        };
        return InferredElementDragging;
    }(ElementDragging));

    /*
    Bridges third-party drag-n-drop systems with FullCalendar.
    Must be instantiated and destroyed by caller.
    */
    var ThirdPartyDraggable = /** @class */ (function () {
        function ThirdPartyDraggable(containerOrSettings, settings) {
            var containerEl = document;
            if (
            // wish we could just test instanceof EventTarget, but
doesn't work in IE11
            containerOrSettings === document ||
                containerOrSettings instanceof Element) {
                containerEl = containerOrSettings;
                settings = settings || {};
            }
            else {
                settings = (containerOrSettings || {});
            }
            var dragging = this.dragging = new
InferredElementDragging(containerEl);
            if (typeof settings.itemSelector === 'string') {
                dragging.pointer.selector = settings.itemSelector;
            }
            else if (containerEl === document) {
                dragging.pointer.selector = '[data-event]';
            }
            if (typeof settings.mirrorSelector === 'string') {
                dragging.mirrorSelector = settings.mirrorSelector;
            }
            new ExternalElementDragging(dragging, settings.eventData); //
eslint-disable-line no-new
        }
        ThirdPartyDraggable.prototype.destroy = function () {
            this.dragging.destroy();
        };
        return ThirdPartyDraggable;
    }());

    var interactionPlugin = createPlugin({
        componentInteractions: [DateClicking, DateSelecting, EventDragging,
EventResizing],
        calendarInteractions: [UnselectAuto],
        elementDraggingImpl: FeaturefulElementDragging,
        optionRefiners: OPTION_REFINERS,
        listenerRefiners: LISTENER_REFINERS,
    });

    /* An abstract class for the daygrid views, as well as month view.
Renders one or more rows of day cells.
   
----------------------------------------------------------------------------------------------------------------------*/
    // It is a manager for a Table subcomponent, which does most of the
heavy lifting.
    // It is responsible for managing width/height.
    var TableView = /** @class */ (function (_super) {
        __extends(TableView, _super);
        function TableView() {
            var _this = _super !== null && _super.apply(this,
arguments) || this;
            _this.headerElRef = createRef();
            return _this;
        }
        TableView.prototype.renderSimpleLayout = function
(headerRowContent, bodyContent) {
            var _a = this, props = _a.props, context = _a.context;
            var sections = [];
            var stickyHeaderDates = getStickyHeaderDates(context.options);
            if (headerRowContent) {
                sections.push({
                    type: 'header',
                    key: 'header',
                    isSticky: stickyHeaderDates,
                    chunk: {
                        elRef: this.headerElRef,
                        tableClassName: 'fc-col-header',
                        rowContent: headerRowContent,
                    },
                });
            }
            sections.push({
                type: 'body',
                key: 'body',
                liquid: true,
                chunk: { content: bodyContent },
            });
            return (createElement(ViewRoot, { viewSpec: context.viewSpec },
function (rootElRef, classNames) { return (createElement("div", {
ref: rootElRef, className:
['fc-daygrid'].concat(classNames).join(' ') },
                createElement(SimpleScrollGrid, { liquid:
!props.isHeightAuto && !props.forPrint, cols: [] /* TODO: make
optional? */, sections: sections }))); }));
        };
        TableView.prototype.renderHScrollLayout = function
(headerRowContent, bodyContent, colCnt, dayMinWidth) {
            var ScrollGrid = this.context.pluginHooks.scrollGridImpl;
            if (!ScrollGrid) {
                throw new Error('No ScrollGrid implementation');
            }
            var _a = this, props = _a.props, context = _a.context;
            var stickyHeaderDates = !props.forPrint &&
getStickyHeaderDates(context.options);
            var stickyFooterScrollbar = !props.forPrint &&
getStickyFooterScrollbar(context.options);
            var sections = [];
            if (headerRowContent) {
                sections.push({
                    type: 'header',
                    key: 'header',
                    isSticky: stickyHeaderDates,
                    chunks: [{
                            key: 'main',
                            elRef: this.headerElRef,
                            tableClassName: 'fc-col-header',
                            rowContent: headerRowContent,
                        }],
                });
            }
            sections.push({
                type: 'body',
                key: 'body',
                liquid: true,
                chunks: [{
                        key: 'main',
                        content: bodyContent,
                    }],
            });
            if (stickyFooterScrollbar) {
                sections.push({
                    type: 'footer',
                    key: 'footer',
                    isSticky: true,
                    chunks: [{
                            key: 'main',
                            content: renderScrollShim,
                        }],
                });
            }
            return (createElement(ViewRoot, { viewSpec: context.viewSpec },
function (rootElRef, classNames) { return (createElement("div", {
ref: rootElRef, className:
['fc-daygrid'].concat(classNames).join(' ') },
                createElement(ScrollGrid, { liquid: !props.isHeightAuto
&& !props.forPrint, colGroups: [{ cols: [{ span: colCnt, minWidth:
dayMinWidth }] }], sections: sections }))); }));
        };
        return TableView;
    }(DateComponent));

    function splitSegsByRow(segs, rowCnt) {
        var byRow = [];
        for (var i = 0; i < rowCnt; i += 1) {
            byRow[i] = [];
        }
        for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
            var seg = segs_1[_i];
            byRow[seg.row].push(seg);
        }
        return byRow;
    }
    function splitSegsByFirstCol(segs, colCnt) {
        var byCol = [];
        for (var i = 0; i < colCnt; i += 1) {
            byCol[i] = [];
        }
        for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {
            var seg = segs_2[_i];
            byCol[seg.firstCol].push(seg);
        }
        return byCol;
    }
    function splitInteractionByRow(ui, rowCnt) {
        var byRow = [];
        if (!ui) {
            for (var i = 0; i < rowCnt; i += 1) {
                byRow[i] = null;
            }
        }
        else {
            for (var i = 0; i < rowCnt; i += 1) {
                byRow[i] = {
                    affectedInstances: ui.affectedInstances,
                    isEvent: ui.isEvent,
                    segs: [],
                };
            }
            for (var _i = 0, _a = ui.segs; _i < _a.length; _i++) {
                var seg = _a[_i];
                byRow[seg.row].segs.push(seg);
            }
        }
        return byRow;
    }

    var TableCellTop = /** @class */ (function (_super) {
        __extends(TableCellTop, _super);
        function TableCellTop() {
            return _super !== null && _super.apply(this, arguments)
|| this;
        }
        TableCellTop.prototype.render = function () {
            var props = this.props;
            var navLinkAttrs = this.context.options.navLinks
                ? { 'data-navlink': buildNavLinkData(props.date),
tabIndex: 0 }
                : {};
            return (createElement(DayCellContent, { date: props.date,
dateProfile: props.dateProfile, todayRange: props.todayRange,
showDayNumber: props.showDayNumber, extraHookProps: props.extraHookProps,
defaultContent: renderTopInner }, function (innerElRef, innerContent) {
return ((innerContent || props.forceDayTop) &&
(createElement("div", { className:
"fc-daygrid-day-top", ref: innerElRef },
                createElement("a", __assign({ className:
"fc-daygrid-day-number" }, navLinkAttrs), innerContent ||
createElement(Fragment, null, "\u00A0"))))); }));
        };
        return TableCellTop;
    }(BaseComponent));
    function renderTopInner(props) {
        return props.dayNumberText;
    }

    var DEFAULT_WEEK_NUM_FORMAT = createFormatter({ week:
'narrow' });
    var TableCell = /** @class */ (function (_super) {
        __extends(TableCell, _super);
        function TableCell() {
            var _this = _super !== null && _super.apply(this,
arguments) || this;
            _this.handleRootEl = function (el) {
                _this.rootEl = el;
                setRef(_this.props.elRef, el);
            };
            _this.handleMoreLinkClick = function (ev) {
                var props = _this.props;
                if (props.onMoreClick) {
                    var allSegs = props.segsByEachCol;
                    var hiddenSegs = allSegs.filter(function (seg) { return
props.segIsHidden[seg.eventRange.instance.instanceId]; });
                    props.onMoreClick({
                        date: props.date,
                        allSegs: allSegs,
                        hiddenSegs: hiddenSegs,
                        moreCnt: props.moreCnt,
                        dayEl: _this.rootEl,
                        ev: ev,
                    });
                }
            };
            return _this;
        }
        TableCell.prototype.render = function () {
            var _this = this;
            var _a = this.context, options = _a.options, viewApi =
_a.viewApi;
            var props = this.props;
            var date = props.date, dateProfile = props.dateProfile;
            var hookProps = {
                num: props.moreCnt,
                text: props.buildMoreLinkText(props.moreCnt),
                view: viewApi,
            };
            var navLinkAttrs = options.navLinks
                ? { 'data-navlink': buildNavLinkData(date,
'week'), tabIndex: 0 }
                : {};
            return (createElement(DayCellRoot, { date: date, dateProfile:
dateProfile, todayRange: props.todayRange, showDayNumber:
props.showDayNumber, extraHookProps: props.extraHookProps, elRef:
this.handleRootEl }, function (dayElRef, dayClassNames, rootDataAttrs,
isDisabled) { return (createElement("td", __assign({ ref:
dayElRef, className: ['fc-daygrid-day'].concat(dayClassNames,
props.extraClassNames || []).join(' ') }, rootDataAttrs,
props.extraDataAttrs),
                createElement("div", { className:
"fc-daygrid-day-frame fc-scrollgrid-sync-inner", ref:
props.innerElRef /* different from hook system! RENAME */ },
                    props.showWeekNumber &&
(createElement(WeekNumberRoot, { date: date, defaultFormat:
DEFAULT_WEEK_NUM_FORMAT }, function (weekElRef, weekClassNames, innerElRef,
innerContent) { return (createElement("a", __assign({ ref:
weekElRef, className:
['fc-daygrid-week-number'].concat(weekClassNames).join('
') }, navLinkAttrs), innerContent)); })),
                    !isDisabled && (createElement(TableCellTop, {
date: date, dateProfile: dateProfile, showDayNumber: props.showDayNumber,
forceDayTop: props.forceDayTop, todayRange: props.todayRange,
extraHookProps: props.extraHookProps })),
                    createElement("div", { className:
"fc-daygrid-day-events", ref: props.fgContentElRef, style: {
paddingBottom: props.fgPaddingBottom } },
                        props.fgContent,
                        Boolean(props.moreCnt) &&
(createElement("div", { className:
"fc-daygrid-day-bottom", style: { marginTop: props.moreMarginTop
} },
                            createElement(RenderHook, { hookProps:
hookProps, classNames: options.moreLinkClassNames, content:
options.moreLinkContent, defaultContent: renderMoreLinkInner, didMount:
options.moreLinkDidMount, willUnmount: options.moreLinkWillUnmount },
function (rootElRef, classNames, innerElRef, innerContent) { return
(createElement("a", { ref: rootElRef, className:
['fc-daygrid-more-link'].concat(classNames).join(' '),
onClick: _this.handleMoreLinkClick }, innerContent)); })))),
                    createElement("div", { className:
"fc-daygrid-day-bg" }, props.bgContent)))); }));
        };
        return TableCell;
    }(DateComponent));
    TableCell.addPropsEquality({
        onMoreClick: true,
    });
    function renderMoreLinkInner(props) {
        return props.text;
    }

    var DEFAULT_TABLE_EVENT_TIME_FORMAT = createFormatter({
        hour: 'numeric',
        minute: '2-digit',
        omitZeroMinute: true,
        meridiem: 'narrow',
    });
    function hasListItemDisplay(seg) {
        var display = seg.eventRange.ui.display;
        return display === 'list-item' || (display ===
'auto' &&
            !seg.eventRange.def.allDay &&
            seg.firstCol === seg.lastCol && // can't be
multi-day
            seg.isStart && // "
            seg.isEnd // "
        );
    }

    var TableListItemEvent = /** @class */ (function (_super) {
        __extends(TableListItemEvent, _super);
        function TableListItemEvent() {
            return _super !== null && _super.apply(this, arguments)
|| this;
        }
        TableListItemEvent.prototype.render = function () {
            var _a = this, props = _a.props, context = _a.context;
            var timeFormat = context.options.eventTimeFormat ||
DEFAULT_TABLE_EVENT_TIME_FORMAT;
            var timeText = buildSegTimeText(props.seg, timeFormat, context,
true, props.defaultDisplayEventEnd);
            return (createElement(EventRoot, { seg: props.seg, timeText:
timeText, defaultContent: renderInnerContent$2, isDragging:
props.isDragging, isResizing: false, isDateSelecting: false, isSelected:
props.isSelected, isPast: props.isPast, isFuture: props.isFuture, isToday:
props.isToday }, function (rootElRef, classNames, innerElRef, innerContent)
{ return ( // we don't use styles!
            createElement("a", __assign({ className:
['fc-daygrid-event',
'fc-daygrid-dot-event'].concat(classNames).join(' '),
ref: rootElRef }, getSegAnchorAttrs$1(props.seg)), innerContent)); }));
        };
        return TableListItemEvent;
    }(BaseComponent));
    function renderInnerContent$2(innerProps) {
        return (createElement(Fragment, null,
            createElement("div", { className:
"fc-daygrid-event-dot", style: { borderColor:
innerProps.borderColor || innerProps.backgroundColor } }),
            innerProps.timeText && (createElement("div",
{ className: "fc-event-time" }, innerProps.timeText)),
            createElement("div", { className:
"fc-event-title" }, innerProps.event.title ||
createElement(Fragment, null, "\u00A0"))));
    }
    function getSegAnchorAttrs$1(seg) {
        var url = seg.eventRange.def.url;
        return url ? { href: url } : {};
    }

    var TableBlockEvent = /** @class */ (function (_super) {
        __extends(TableBlockEvent, _super);
        function TableBlockEvent() {
            return _super !== null && _super.apply(this, arguments)
|| this;
        }
        TableBlockEvent.prototype.render = function () {
            var props = this.props;
            return (createElement(StandardEvent, __assign({}, props, {
extraClassNames: ['fc-daygrid-event',
'fc-daygrid-block-event', 'fc-h-event'],
defaultTimeFormat: DEFAULT_TABLE_EVENT_TIME_FORMAT, defaultDisplayEventEnd:
props.defaultDisplayEventEnd, disableResizing:
!props.seg.eventRange.def.allDay })));
        };
        return TableBlockEvent;
    }(BaseComponent));

    function computeFgSegPlacement(// for one row. TODO: print mode?
    cellModels, segs, dayMaxEvents, dayMaxEventRows, eventHeights,
maxContentHeight, colCnt, eventOrderSpecs) {
        var colPlacements = []; // if event spans multiple cols, its
present in each col
        var moreCnts = []; // by-col
        var segIsHidden = {};
        var segTops = {}; // always populated for each seg
        var segMarginTops = {}; // simetimes populated for each seg
        var moreTops = {};
        var paddingBottoms = {}; // for each cell's inner-wrapper div
        for (var i = 0; i < colCnt; i += 1) {
            colPlacements.push([]);
            moreCnts.push(0);
        }
        segs = sortEventSegs(segs, eventOrderSpecs);
        for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
            var seg = segs_1[_i];
            var instanceId = seg.eventRange.instance.instanceId;
            var eventHeight = eventHeights[instanceId + ':' +
seg.firstCol];
            placeSeg(seg, eventHeight || 0); // will keep colPlacements
sorted by top
        }
        if (dayMaxEvents === true || dayMaxEventRows === true) {
            limitByMaxHeight(moreCnts, segIsHidden, colPlacements,
maxContentHeight); // populates moreCnts/segIsHidden
        }
        else if (typeof dayMaxEvents === 'number') {
            limitByMaxEvents(moreCnts, segIsHidden, colPlacements,
dayMaxEvents); // populates moreCnts/segIsHidden
        }
        else if (typeof dayMaxEventRows === 'number') {
            limitByMaxRows(moreCnts, segIsHidden, colPlacements,
dayMaxEventRows); // populates moreCnts/segIsHidden
        }
        // computes segTops/segMarginTops/moreTops/paddingBottoms
        for (var col = 0; col < colCnt; col += 1) {
            var placements = colPlacements[col];
            var currentNonAbsBottom = 0;
            var currentAbsHeight = 0;
            for (var _a = 0, placements_1 = placements; _a <
placements_1.length; _a++) {
                var placement = placements_1[_a];
                var seg = placement.seg;
                if (!segIsHidden[seg.eventRange.instance.instanceId]) {
                    segTops[seg.eventRange.instance.instanceId] =
placement.top; // from top of container
                    if (seg.firstCol === seg.lastCol && seg.isStart
&& seg.isEnd) { // TODO: simpler way? NOT DRY
                        segMarginTops[seg.eventRange.instance.instanceId] =
                            placement.top - currentNonAbsBottom; // from
previous seg bottom
                        currentAbsHeight = 0;
                        currentNonAbsBottom = placement.bottom;
                    }
                    else { // multi-col event, abs positioned
                        currentAbsHeight = placement.bottom -
currentNonAbsBottom;
                    }
                }
            }
            if (currentAbsHeight) {
                if (moreCnts[col]) {
                    moreTops[col] = currentAbsHeight;
                }
                else {
                    paddingBottoms[col] = currentAbsHeight;
                }
            }
        }
        function placeSeg(seg, segHeight) {
            if (!tryPlaceSegAt(seg, segHeight, 0)) {
                for (var col = seg.firstCol; col <= seg.lastCol; col +=
1) {
                    for (var _i = 0, _a = colPlacements[col]; _i <
_a.length; _i++) { // will repeat multi-day segs!!!!!!! bad!!!!!!
                        var placement = _a[_i];
                        if (tryPlaceSegAt(seg, segHeight,
placement.bottom)) {
                            return;
                        }
                    }
                }
            }
        }
        function tryPlaceSegAt(seg, segHeight, top) {
            if (canPlaceSegAt(seg, segHeight, top)) {
                for (var col = seg.firstCol; col <= seg.lastCol; col +=
1) {
                    var placements = colPlacements[col];
                    var insertionIndex = 0;
                    while (insertionIndex < placements.length &&
                        top >= placements[insertionIndex].top) {
                        insertionIndex += 1;
                    }
                    placements.splice(insertionIndex, 0, {
                        seg: seg,
                        top: top,
                        bottom: top + segHeight,
                    });
                }
                return true;
            }
            return false;
        }
        function canPlaceSegAt(seg, segHeight, top) {
            for (var col = seg.firstCol; col <= seg.lastCol; col += 1) {
                for (var _i = 0, _a = colPlacements[col]; _i <
_a.length; _i++) {
                    var placement = _a[_i];
                    if (top < placement.bottom && top +
segHeight > placement.top) { // collide?
                        return false;
                    }
                }
            }
            return true;
        }
        // what does this do!?
        for (var instanceIdAndFirstCol in eventHeights) {
            if (!eventHeights[instanceIdAndFirstCol]) {
                segIsHidden[instanceIdAndFirstCol.split(':')[0]]
= true;
            }
        }
        var segsByFirstCol = colPlacements.map(extractFirstColSegs); //
operates on the sorted cols
        var segsByEachCol = colPlacements.map(function (placements, col) {
            var segsForCols = extractAllColSegs(placements);
            segsForCols = resliceDaySegs(segsForCols, cellModels[col].date,
col);
            return segsForCols;
        });
        return {
            segsByFirstCol: segsByFirstCol,
            segsByEachCol: segsByEachCol,
            segIsHidden: segIsHidden,
            segTops: segTops,
            segMarginTops: segMarginTops,
            moreCnts: moreCnts,
            moreTops: moreTops,
            paddingBottoms: paddingBottoms,
        };
    }
    function extractFirstColSegs(oneColPlacements, col) {
        var segs = [];
        for (var _i = 0, oneColPlacements_1 = oneColPlacements; _i <
oneColPlacements_1.length; _i++) {
            var placement = oneColPlacements_1[_i];
            if (placement.seg.firstCol === col) {
                segs.push(placement.seg);
            }
        }
        return segs;
    }
    function extractAllColSegs(oneColPlacements) {
        var segs = [];
        for (var _i = 0, oneColPlacements_2 = oneColPlacements; _i <
oneColPlacements_2.length; _i++) {
            var placement = oneColPlacements_2[_i];
            segs.push(placement.seg);
        }
        return segs;
    }
    function limitByMaxHeight(hiddenCnts, segIsHidden, colPlacements,
maxContentHeight) {
        limitEvents(hiddenCnts, segIsHidden, colPlacements, true, function
(placement) { return placement.bottom <= maxContentHeight; });
    }
    function limitByMaxEvents(hiddenCnts, segIsHidden, colPlacements,
dayMaxEvents) {
        limitEvents(hiddenCnts, segIsHidden, colPlacements, false, function
(placement, levelIndex) { return levelIndex < dayMaxEvents; });
    }
    function limitByMaxRows(hiddenCnts, segIsHidden, colPlacements,
dayMaxEventRows) {
        limitEvents(hiddenCnts, segIsHidden, colPlacements, true, function
(placement, levelIndex) { return levelIndex < dayMaxEventRows; });
    }
    /*
    populates the given hiddenCnts/segIsHidden, which are supplied empty.
    TODO: return them instead
    */
    function limitEvents(hiddenCnts, segIsHidden, colPlacements,
_moreLinkConsumesLevel, isPlacementInBounds) {
        var colCnt = hiddenCnts.length;
        var segIsVisible = {}; // TODO: instead, use segIsHidden with
true/false?
        var visibleColPlacements = []; // will mirror colPlacements
        for (var col = 0; col < colCnt; col += 1) {
            visibleColPlacements.push([]);
        }
        for (var col = 0; col < colCnt; col += 1) {
            var placements = colPlacements[col];
            var level = 0;
            for (var _i = 0, placements_2 = placements; _i <
placements_2.length; _i++) {
                var placement = placements_2[_i];
                if (isPlacementInBounds(placement, level)) {
                    recordVisible(placement);
                }
                else {
                    recordHidden(placement, level, _moreLinkConsumesLevel);
                }
                // only considered a level if the seg had height
                if (placement.top !== placement.bottom) {
                    level += 1;
                }
            }
        }
        function recordVisible(placement) {
            var seg = placement.seg;
            var instanceId = seg.eventRange.instance.instanceId;
            if (!segIsVisible[instanceId]) {
                segIsVisible[instanceId] = true;
                for (var col = seg.firstCol; col <= seg.lastCol; col +=
1) {
                    var destPlacements = visibleColPlacements[col];
                    var newPosition = 0;
                    // insert while keeping top sorted in each column
                    while (newPosition < destPlacements.length
&&
                        placement.top >=
destPlacements[newPosition].top) {
                        newPosition += 1;
                    }
                    destPlacements.splice(newPosition, 0, placement);
                }
            }
        }
        function recordHidden(placement, currentLevel,
moreLinkConsumesLevel) {
            var seg = placement.seg;
            var instanceId = seg.eventRange.instance.instanceId;
            if (!segIsHidden[instanceId]) {
                segIsHidden[instanceId] = true;
                for (var col = seg.firstCol; col <= seg.lastCol; col +=
1) {
                    hiddenCnts[col] += 1;
                    var hiddenCnt = hiddenCnts[col];
                    if (moreLinkConsumesLevel && hiddenCnt === 1
&& currentLevel > 0) {
                        var doomedLevel = currentLevel - 1;
                        while (visibleColPlacements[col].length >
doomedLevel) {
                            recordHidden(visibleColPlacements[col].pop(),
// removes
                            visibleColPlacements[col].length, // will
execute after the pop. will be the index of the removed placement
                            false);
                        }
                    }
                }
            }
        }
    }
    // Given the events within an array of segment objects, reslice them to
be in a single day
    function resliceDaySegs(segs, dayDate, colIndex) {
        var dayStart = dayDate;
        var dayEnd = addDays(dayStart, 1);
        var dayRange = { start: dayStart, end: dayEnd };
        var newSegs = [];
        for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {
            var seg = segs_2[_i];
            var eventRange = seg.eventRange;
            var origRange = eventRange.range;
            var slicedRange = intersectRanges(origRange, dayRange);
            if (slicedRange) {
                newSegs.push(__assign(__assign({}, seg), { firstCol:
colIndex, lastCol: colIndex, eventRange: {
                        def: eventRange.def,
                        ui: __assign(__assign({}, eventRange.ui), {
durationEditable: false }),
                        instance: eventRange.instance,
                        range: slicedRange,
                    }, isStart: seg.isStart &&
slicedRange.start.valueOf() === origRange.start.valueOf(), isEnd: seg.isEnd
&& slicedRange.end.valueOf() === origRange.end.valueOf() }));
            }
        }
        return newSegs;
    }

    var TableRow = /** @class */ (function (_super) {
        __extends(TableRow, _super);
        function TableRow() {
            var _this = _super !== null && _super.apply(this,
arguments) || this;
            _this.cellElRefs = new RefMap(); // the <td>
            _this.frameElRefs = new RefMap(); // the fc-daygrid-day-frame
            _this.fgElRefs = new RefMap(); // the fc-daygrid-day-events
            _this.segHarnessRefs = new RefMap(); // indexed by
"instanceId:firstCol"
            _this.rootElRef = createRef();
            _this.state = {
                framePositions: null,
                maxContentHeight: null,
                segHeights: {},
            };
            return _this;
        }
        TableRow.prototype.render = function () {
            var _this = this;
            var _a = this, props = _a.props, state = _a.state, context =
_a.context;
            var colCnt = props.cells.length;
            var businessHoursByCol =
splitSegsByFirstCol(props.businessHourSegs, colCnt);
            var bgEventSegsByCol = splitSegsByFirstCol(props.bgEventSegs,
colCnt);
            var highlightSegsByCol =
splitSegsByFirstCol(this.getHighlightSegs(), colCnt);
            var mirrorSegsByCol = splitSegsByFirstCol(this.getMirrorSegs(),
colCnt);
            var _b = computeFgSegPlacement(props.cells, props.fgEventSegs,
props.dayMaxEvents, props.dayMaxEventRows, state.segHeights,
state.maxContentHeight, colCnt, context.options.eventOrder), paddingBottoms
= _b.paddingBottoms, segsByFirstCol = _b.segsByFirstCol, segsByEachCol =
_b.segsByEachCol, segIsHidden = _b.segIsHidden, segTops = _b.segTops,
segMarginTops = _b.segMarginTops, moreCnts = _b.moreCnts, moreTops =
_b.moreTops;
            var selectedInstanceHash = // TODO: messy way to compute this
             (props.eventDrag && props.eventDrag.affectedInstances)
||
                (props.eventResize &&
props.eventResize.affectedInstances) ||
                {};
            return (createElement("tr", { ref: this.rootElRef },
                props.renderIntro && props.renderIntro(),
                props.cells.map(function (cell, col) {
                    var normalFgNodes =
_this.renderFgSegs(segsByFirstCol[col], segIsHidden, segTops,
segMarginTops, selectedInstanceHash, props.todayRange);
                    var mirrorFgNodes =
_this.renderFgSegs(mirrorSegsByCol[col], {}, segTops, // use same tops as
real rendering
                    {}, {}, props.todayRange, Boolean(props.eventDrag),
Boolean(props.eventResize), false);
                    return (createElement(TableCell, { key: cell.key,
elRef: _this.cellElRefs.createRef(cell.key), innerElRef:
_this.frameElRefs.createRef(cell.key) /* FF <td> problem, but okay to
use for left/right. TODO: rename prop */, dateProfile: props.dateProfile,
date: cell.date, showDayNumber: props.showDayNumbers, showWeekNumber:
props.showWeekNumbers && col === 0, forceDayTop:
props.showWeekNumbers /* even displaying weeknum for row, not necessarily
day */, todayRange: props.todayRange, extraHookProps: cell.extraHookProps,
extraDataAttrs: cell.extraDataAttrs, extraClassNames: cell.extraClassNames,
moreCnt: moreCnts[col], buildMoreLinkText: props.buildMoreLinkText,
onMoreClick: function (arg) {
                            props.onMoreClick(__assign(__assign({}, arg), {
fromCol: col }));
                        }, segIsHidden: segIsHidden, moreMarginTop:
moreTops[col] /* rename */, segsByEachCol: segsByEachCol[col],
fgPaddingBottom: paddingBottoms[col], fgContentElRef:
_this.fgElRefs.createRef(cell.key), fgContent: ( // Fragment scopes the
keys
                        createElement(Fragment, null,
                            createElement(Fragment, null, normalFgNodes),
                            createElement(Fragment, null, mirrorFgNodes))),
bgContent: ( // Fragment scopes the keys
                        createElement(Fragment, null,
                            _this.renderFillSegs(highlightSegsByCol[col],
'highlight'),
                            _this.renderFillSegs(businessHoursByCol[col],
'non-business'),
                            _this.renderFillSegs(bgEventSegsByCol[col],
'bg-event'))) }));
                })));
        };
        TableRow.prototype.componentDidMount = function () {
            this.updateSizing(true);
        };
        TableRow.prototype.componentDidUpdate = function (prevProps,
prevState) {
            var currentProps = this.props;
            this.updateSizing(!isPropsEqual(prevProps, currentProps));
        };
        TableRow.prototype.getHighlightSegs = function () {
            var props = this.props;
            if (props.eventDrag && props.eventDrag.segs.length) {
// messy check
                return props.eventDrag.segs;
            }
            if (props.eventResize && props.eventResize.segs.length)
{ // messy check
                return props.eventResize.segs;
            }
            return props.dateSelectionSegs;
        };
        TableRow.prototype.getMirrorSegs = function () {
            var props = this.props;
            if (props.eventResize && props.eventResize.segs.length)
{ // messy check
                return props.eventResize.segs;
            }
            return [];
        };
        TableRow.prototype.renderFgSegs = function (segs, segIsHidden, //
does NOT mean display:hidden
        segTops, segMarginTops, selectedInstanceHash, todayRange,
isDragging, isResizing, isDateSelecting) {
            var context = this.context;
            var eventSelection = this.props.eventSelection;
            var framePositions = this.state.framePositions;
            var defaultDisplayEventEnd = this.props.cells.length === 1; //
colCnt === 1
            var nodes = [];
            if (framePositions) {
                for (var _i = 0, segs_1 = segs; _i < segs_1.length;
_i++) {
                    var seg = segs_1[_i];
                    var instanceId = seg.eventRange.instance.instanceId;
                    var isMirror = isDragging || isResizing ||
isDateSelecting;
                    var isSelected = selectedInstanceHash[instanceId];
                    var isInvisible = segIsHidden[instanceId] ||
isSelected;
                    // TODO: simpler way? NOT DRY
                    var isAbsolute = segIsHidden[instanceId] || isMirror ||
seg.firstCol !== seg.lastCol || !seg.isStart || !seg.isEnd;
                    var marginTop = void 0;
                    var top_1 = void 0;
                    var left = void 0;
                    var right = void 0;
                    if (isAbsolute) {
                        top_1 = segTops[instanceId];
                        if (context.isRtl) {
                            right = 0;
                            left = framePositions.lefts[seg.lastCol] -
framePositions.lefts[seg.firstCol];
                        }
                        else {
                            left = 0;
                            right = framePositions.rights[seg.firstCol] -
framePositions.rights[seg.lastCol];
                        }
                    }
                    else {
                        marginTop = segMarginTops[instanceId];
                    }
                    /*
                    known bug: events that are force to be list-item but
span multiple days still take up space in later columns
                    */
                    nodes.push(createElement("div", { className:
'fc-daygrid-event-harness' + (isAbsolute ? '
fc-daygrid-event-harness-abs' : ''), key: instanceId, 
                        // in print mode when in mult cols, could collide
                        ref: isMirror ? null :
this.segHarnessRefs.createRef(instanceId + ':' + seg.firstCol),
style: {
                            visibility: isInvisible ? 'hidden' :
'',
                            marginTop: marginTop || '',
                            top: top_1 || '',
                            left: left || '',
                            right: right || '',
                        } }, hasListItemDisplay(seg) ?
(createElement(TableListItemEvent, __assign({ seg: seg, isDragging:
isDragging, isSelected: instanceId === eventSelection,
defaultDisplayEventEnd: defaultDisplayEventEnd }, getSegMeta(seg,
todayRange)))) : (createElement(TableBlockEvent, __assign({ seg: seg,
isDragging: isDragging, isResizing: isResizing, isDateSelecting:
isDateSelecting, isSelected: instanceId === eventSelection,
defaultDisplayEventEnd: defaultDisplayEventEnd }, getSegMeta(seg,
todayRange))))));
                }
            }
            return nodes;
        };
        TableRow.prototype.renderFillSegs = function (segs, fillType) {
            var isRtl = this.context.isRtl;
            var todayRange = this.props.todayRange;
            var framePositions = this.state.framePositions;
            var nodes = [];
            if (framePositions) {
                for (var _i = 0, segs_2 = segs; _i < segs_2.length;
_i++) {
                    var seg = segs_2[_i];
                    var leftRightCss = isRtl ? {
                        right: 0,
                        left: framePositions.lefts[seg.lastCol] -
framePositions.lefts[seg.firstCol],
                    } : {
                        left: 0,
                        right: framePositions.rights[seg.firstCol] -
framePositions.rights[seg.lastCol],
                    };
                    nodes.push(createElement("div", { key:
buildEventRangeKey(seg.eventRange), className:
"fc-daygrid-bg-harness", style: leftRightCss }, fillType ===
'bg-event' ?
                        createElement(BgEvent, __assign({ seg: seg },
getSegMeta(seg, todayRange))) :
                        renderFill(fillType)));
                }
            }
            return createElement.apply(void 0, __spreadArrays([Fragment,
{}], nodes));
        };
        TableRow.prototype.updateSizing = function (isExternalSizingChange)
{
            var _a = this, props = _a.props, frameElRefs = _a.frameElRefs;
            if (props.clientWidth !== null) { // positioning ready?
                if (isExternalSizingChange) {
                    var frameEls = props.cells.map(function (cell) { return
frameElRefs.currentMap[cell.key]; });
                    if (frameEls.length) {
                        var originEl = this.rootElRef.current;
                        this.setState({
                            framePositions: new PositionCache(originEl,
frameEls, true, // isHorizontal
                            false),
                        });
                    }
                }
                var limitByContentHeight = props.dayMaxEvents === true ||
props.dayMaxEventRows === true;
                this.setState({
                    segHeights: this.computeSegHeights(),
                    maxContentHeight: limitByContentHeight ?
this.computeMaxContentHeight() : null,
                });
            }
        };
        TableRow.prototype.computeSegHeights = function () {
            return mapHash(this.segHarnessRefs.currentMap, function
(eventHarnessEl) { return (eventHarnessEl.getBoundingClientRect().height);
});
        };
        TableRow.prototype.computeMaxContentHeight = function () {
            var firstKey = this.props.cells[0].key;
            var cellEl = this.cellElRefs.currentMap[firstKey];
            var fcContainerEl = this.fgElRefs.currentMap[firstKey];
            return cellEl.getBoundingClientRect().bottom -
fcContainerEl.getBoundingClientRect().top;
        };
        TableRow.prototype.getCellEls = function () {
            var elMap = this.cellElRefs.currentMap;
            return this.props.cells.map(function (cell) { return
elMap[cell.key]; });
        };
        return TableRow;
    }(DateComponent));
    TableRow.addPropsEquality({
        onMoreClick: true,
    });
    TableRow.addStateEquality({
        segHeights: isPropsEqual,
    });

    var PADDING_FROM_VIEWPORT = 10;
    var SCROLL_DEBOUNCE = 10;
    var Popover = /** @class */ (function (_super) {
        __extends(Popover, _super);
        function Popover() {
            var _this = _super !== null && _super.apply(this,
arguments) || this;
            _this.repositioner = new
DelayedRunner(_this.updateSize.bind(_this));
            _this.handleRootEl = function (el) {
                _this.rootEl = el;
                if (_this.props.elRef) {
                    setRef(_this.props.elRef, el);
                }
            };
            // Triggered when the user clicks *anywhere* in the document,
for the autoHide feature
            _this.handleDocumentMousedown = function (ev) {
                var onClose = _this.props.onClose;
                // only hide the popover if the click happened outside the
popover
                if (onClose && !_this.rootEl.contains(ev.target)) {
                    onClose();
                }
            };
            _this.handleDocumentScroll = function () {
                _this.repositioner.request(SCROLL_DEBOUNCE);
            };
            _this.handleCloseClick = function () {
                var onClose = _this.props.onClose;
                if (onClose) {
                    onClose();
                }
            };
            return _this;
        }
        Popover.prototype.render = function () {
            var theme = this.context.theme;
            var props = this.props;
            var classNames = [
                'fc-popover',
                theme.getClass('popover'),
            ].concat(props.extraClassNames || []);
            return (createElement("div", __assign({ className:
classNames.join(' ') }, props.extraAttrs, { ref:
this.handleRootEl }),
                createElement("div", { className:
'fc-popover-header ' + theme.getClass('popoverHeader')
},
                    createElement("span", { className:
"fc-popover-title" }, props.title),
                    createElement("span", { className:
'fc-popover-close ' + theme.getIconClass('close'),
onClick: this.handleCloseClick })),
                createElement("div", { className:
'fc-popover-body ' + theme.getClass('popoverContent')
}, props.children)));
        };
        Popover.prototype.componentDidMount = function () {
            document.addEventListener('mousedown',
this.handleDocumentMousedown);
            document.addEventListener('scroll',
this.handleDocumentScroll);
            this.updateSize();
        };
        Popover.prototype.componentWillUnmount = function () {
            document.removeEventListener('mousedown',
this.handleDocumentMousedown);
            document.removeEventListener('scroll',
this.handleDocumentScroll);
        };
        // TODO: adjust on window resize
        /*
        NOTE: the popover is position:fixed, so coordinates are relative to
the viewport
        NOTE: the PARENT calls this as well, on window resize. we would
have wanted to use the repositioner,
              but need to ensure that all other components have updated
size first (for alignmentEl)
        */
        Popover.prototype.updateSize = function () {
            var _a = this.props, alignmentEl = _a.alignmentEl,
topAlignmentEl = _a.topAlignmentEl;
            var rootEl = this.rootEl;
            if (!rootEl) {
                return; // not sure why this was null, but we
shouldn't let external components call updateSize() anyway
            }
            var dims = rootEl.getBoundingClientRect(); // only used for
width,height
            var alignment = alignmentEl.getBoundingClientRect();
            var top = topAlignmentEl ?
topAlignmentEl.getBoundingClientRect().top : alignment.top;
            top = Math.min(top, window.innerHeight - dims.height -
PADDING_FROM_VIEWPORT);
            top = Math.max(top, PADDING_FROM_VIEWPORT);
            var left;
            if (this.context.isRtl) {
                left = alignment.right - dims.width;
            }
            else {
                left = alignment.left;
            }
            left = Math.min(left, window.innerWidth - dims.width -
PADDING_FROM_VIEWPORT);
            left = Math.max(left, PADDING_FROM_VIEWPORT);
            applyStyle(rootEl, { top: top, left: left });
        };
        return Popover;
    }(BaseComponent));

    var MorePopover = /** @class */ (function (_super) {
        __extends(MorePopover, _super);
        function MorePopover() {
            var _this = _super !== null && _super.apply(this,
arguments) || this;
            _this.rootElRef = createRef();
            return _this;
        }
        MorePopover.prototype.render = function () {
            var _a = this.context, options = _a.options, dateEnv =
_a.dateEnv;
            var props = this.props;
            var date = props.date, hiddenInstances = props.hiddenInstances,
todayRange = props.todayRange, dateProfile = props.dateProfile,
selectedInstanceId = props.selectedInstanceId;
            var title = dateEnv.format(date, options.dayPopoverFormat);
            return (createElement(DayCellRoot, { date: date, dateProfile:
dateProfile, todayRange: todayRange, elRef: this.rootElRef }, function
(rootElRef, dayClassNames, dataAttrs) { return (createElement(Popover, {
elRef: rootElRef, title: title, extraClassNames:
['fc-more-popover'].concat(dayClassNames), extraAttrs: dataAttrs,
onClose: props.onCloseClick, alignmentEl: props.alignmentEl,
topAlignmentEl: props.topAlignmentEl },
                createElement(DayCellContent, { date: date, dateProfile:
dateProfile, todayRange: todayRange }, function (innerElRef, innerContent)
{ return (innerContent &&
                    createElement("div", { className:
"fc-more-popover-misc", ref: innerElRef }, innerContent)); }),
                props.segs.map(function (seg) {
                    var instanceId = seg.eventRange.instance.instanceId;
                    return (createElement("div", { className:
"fc-daygrid-event-harness", key: instanceId, style: {
                            visibility: hiddenInstances[instanceId] ?
'hidden' : '',
                        } }, hasListItemDisplay(seg) ?
(createElement(TableListItemEvent, __assign({ seg: seg, isDragging: false,
isSelected: instanceId === selectedInstanceId, defaultDisplayEventEnd:
false }, getSegMeta(seg, todayRange)))) : (createElement(TableBlockEvent,
__assign({ seg: seg, isDragging: false, isResizing: false, isDateSelecting:
false, isSelected: instanceId === selectedInstanceId,
defaultDisplayEventEnd: false }, getSegMeta(seg, todayRange))))));
                }))); }));
        };
        MorePopover.prototype.positionToHit = function (positionLeft,
positionTop, originEl) {
            var rootEl = this.rootElRef.current;
            if (!originEl || !rootEl) { // why?
                return null;
            }
            var originRect = originEl.getBoundingClientRect();
            var elRect = rootEl.getBoundingClientRect();
            var newOriginLeft = elRect.left - originRect.left;
            var newOriginTop = elRect.top - originRect.top;
            var localLeft = positionLeft - newOriginLeft;
            var localTop = positionTop - newOriginTop;
            var date = this.props.date;
            if ( // ugly way to detect intersection
            localLeft >= 0 && localLeft < elRect.width
&&
                localTop >= 0 && localTop < elRect.height) {
                return {
                    dateSpan: {
                        allDay: true,
                        range: { start: date, end: addDays(date, 1) },
                    },
                    dayEl: rootEl,
                    relativeRect: {
                        left: newOriginLeft,
                        top: newOriginTop,
                        right: elRect.width,
                        bottom: elRect.height,
                    },
                    layer: 1,
                };
            }
            return null;
        };
        return MorePopover;
    }(DateComponent));

    var Table = /** @class */ (function (_super) {
        __extends(Table, _super);
        function Table() {
            var _this = _super !== null && _super.apply(this,
arguments) || this;
            _this.splitBusinessHourSegs = memoize(splitSegsByRow);
            _this.splitBgEventSegs = memoize(splitSegsByRow);
            _this.splitFgEventSegs = memoize(splitSegsByRow);
            _this.splitDateSelectionSegs = memoize(splitSegsByRow);
            _this.splitEventDrag = memoize(splitInteractionByRow);
            _this.splitEventResize = memoize(splitInteractionByRow);
            _this.buildBuildMoreLinkText = memoize(buildBuildMoreLinkText);
            _this.morePopoverRef = createRef();
            _this.rowRefs = new RefMap();
            _this.state = {
                morePopoverState: null,
            };
            _this.handleRootEl = function (rootEl) {
                _this.rootEl = rootEl;
                setRef(_this.props.elRef, rootEl);
            };
            // TODO: bad names "more link click" versus
"more click"
            _this.handleMoreLinkClick = function (arg) {
                var context = _this.context;
                var dateEnv = context.dateEnv;
                var clickOption = context.options.moreLinkClick;
                function segForPublic(seg) {
                    var _a = seg.eventRange, def = _a.def, instance =
_a.instance, range = _a.range;
                    return {
                        event: new EventApi(context, def, instance),
                        start: dateEnv.toDate(range.start),
                        end: dateEnv.toDate(range.end),
                        isStart: seg.isStart,
                        isEnd: seg.isEnd,
                    };
                }
                if (typeof clickOption === 'function') {
                    clickOption = clickOption({
                        date: dateEnv.toDate(arg.date),
                        allDay: true,
                        allSegs: arg.allSegs.map(segForPublic),
                        hiddenSegs: arg.hiddenSegs.map(segForPublic),
                        jsEvent: arg.ev,
                        view: context.viewApi,
                    }); // hack to handle void
                }
                if (!clickOption || clickOption === 'popover') {
                    _this.setState({
                        morePopoverState: __assign(__assign({}, arg), {
currentFgEventSegs: _this.props.fgEventSegs, fromRow: arg.fromRow, fromCol:
arg.fromCol }),
                    });
                }
                else if (typeof clickOption === 'string') { // a
view name
                    context.calendarApi.zoomTo(arg.date, clickOption);
                }
            };
            _this.handleMorePopoverClose = function () {
                _this.setState({
                    morePopoverState: null,
                });
            };
            return _this;
        }
        Table.prototype.render = function () {
            var _this = this;
            var props = this.props;
            var dateProfile = props.dateProfile, dayMaxEventRows =
props.dayMaxEventRows, dayMaxEvents = props.dayMaxEvents, expandRows =
props.expandRows;
            var morePopoverState = this.state.morePopoverState;
            var rowCnt = props.cells.length;
            var businessHourSegsByRow =
this.splitBusinessHourSegs(props.businessHourSegs, rowCnt);
            var bgEventSegsByRow = this.splitBgEventSegs(props.bgEventSegs,
rowCnt);
            var fgEventSegsByRow = this.splitFgEventSegs(props.fgEventSegs,
rowCnt);
            var dateSelectionSegsByRow =
this.splitDateSelectionSegs(props.dateSelectionSegs, rowCnt);
            var eventDragByRow = this.splitEventDrag(props.eventDrag,
rowCnt);
            var eventResizeByRow = this.splitEventResize(props.eventResize,
rowCnt);
            var buildMoreLinkText =
this.buildBuildMoreLinkText(this.context.options.moreLinkText);
            var limitViaBalanced = dayMaxEvents === true || dayMaxEventRows
=== true;
            // if rows can't expand to fill fixed height, can't
do balanced-height event limit
            // TODO: best place to normalize these options?
            if (limitViaBalanced && !expandRows) {
                limitViaBalanced = false;
                dayMaxEventRows = null;
                dayMaxEvents = null;
            }
            var classNames = [
                'fc-daygrid-body',
                limitViaBalanced ? 'fc-daygrid-body-balanced' :
'fc-daygrid-body-unbalanced',
                expandRows ? '' :
'fc-daygrid-body-natural',
            ];
            return (createElement("div", { className:
classNames.join(' '), ref: this.handleRootEl, style: {
                    // these props are important to give this wrapper
correct dimensions for interactions
                    // TODO: if we set it here, can we avoid giving to
inner tables?
                    width: props.clientWidth,
                    minWidth: props.tableMinWidth,
                } },
                createElement(NowTimer, { unit: "day" }, function
(nowDate, todayRange) { return (createElement(Fragment, null,
                    createElement("table", { className:
"fc-scrollgrid-sync-table", style: {
                            width: props.clientWidth,
                            minWidth: props.tableMinWidth,
                            height: expandRows ? props.clientHeight :
'',
                        } },
                        props.colGroupNode,
                        createElement("tbody", null,
props.cells.map(function (cells, row) { return (createElement(TableRow, {
ref: _this.rowRefs.createRef(row), key: cells.length
                                ? cells[0].date.toISOString() /* best? or
put key on cell? or use diff formatter? */
                                : row // in case there are no cells (like
when resource view is loading)
                            , showDayNumbers: rowCnt > 1,
showWeekNumbers: props.showWeekNumbers, todayRange: todayRange,
dateProfile: dateProfile, cells: cells, renderIntro: props.renderRowIntro,
businessHourSegs: businessHourSegsByRow[row], eventSelection:
props.eventSelection, bgEventSegs:
bgEventSegsByRow[row].filter(isSegAllDay) /* hack */, fgEventSegs:
fgEventSegsByRow[row], dateSelectionSegs: dateSelectionSegsByRow[row],
eventDrag: eventDragByRow[row], eventResize: eventResizeByRow[row],
dayMaxEvents: dayMaxEvents, dayMaxEventRows: dayMaxEventRows, clientWidth:
props.clientWidth, clientHeight: props.clientHeight, buildMoreLinkText:
buildMoreLinkText, onMoreClick: function (arg) {
                               
_this.handleMoreLinkClick(__assign(__assign({}, arg), { fromRow: row }));
                            } })); }))),
                    (!props.forPrint && morePopoverState &&
morePopoverState.currentFgEventSegs === props.fgEventSegs) &&
(createElement(MorePopover, { ref: _this.morePopoverRef, date:
morePopoverState.date, dateProfile: dateProfile, segs:
morePopoverState.allSegs, alignmentEl: morePopoverState.dayEl,
topAlignmentEl: rowCnt === 1 ? props.headerAlignElRef.current : null,
onCloseClick: _this.handleMorePopoverClose, selectedInstanceId:
props.eventSelection, hiddenInstances: // yuck
                        (props.eventDrag ?
props.eventDrag.affectedInstances : null) ||
                            (props.eventResize ?
props.eventResize.affectedInstances : null) ||
                            {}, todayRange: todayRange })))); })));
        };
        // Hit System
        //
----------------------------------------------------------------------------------------------------
        Table.prototype.prepareHits = function () {
            this.rowPositions = new PositionCache(this.rootEl,
this.rowRefs.collect().map(function (rowObj) { return
rowObj.getCellEls()[0]; }), // first cell el in each row. TODO: not optimal
            false, true);
            this.colPositions = new PositionCache(this.rootEl,
this.rowRefs.currentMap[0].getCellEls(), // cell els in first row
            true, // horizontal
            false);
        };
        Table.prototype.positionToHit = function (leftPosition,
topPosition) {
            var morePopover = this.morePopoverRef.current;
            var morePopoverHit = morePopover ?
morePopover.positionToHit(leftPosition, topPosition, this.rootEl) : null;
            var morePopoverState = this.state.morePopoverState;
            if (morePopoverHit) {
                return __assign({ row: morePopoverState.fromRow, col:
morePopoverState.fromCol }, morePopoverHit);
            }
            var _a = this, colPositions = _a.colPositions, rowPositions =
_a.rowPositions;
            var col = colPositions.leftToIndex(leftPosition);
            var row = rowPositions.topToIndex(topPosition);
            if (row != null && col != null) {
                return {
                    row: row,
                    col: col,
                    dateSpan: {
                        range: this.getCellRange(row, col),
                        allDay: true,
                    },
                    dayEl: this.getCellEl(row, col),
                    relativeRect: {
                        left: colPositions.lefts[col],
                        right: colPositions.rights[col],
                        top: rowPositions.tops[row],
                        bottom: rowPositions.bottoms[row],
                    },
                };
            }
            return null;
        };
        Table.prototype.getCellEl = function (row, col) {
            return this.rowRefs.currentMap[row].getCellEls()[col]; // TODO:
not optimal
        };
        Table.prototype.getCellRange = function (row, col) {
            var start = this.props.cells[row][col].date;
            var end = addDays(start, 1);
            return { start: start, end: end };
        };
        return Table;
    }(DateComponent));
    function buildBuildMoreLinkText(moreLinkTextInput) {
        if (typeof moreLinkTextInput === 'function') {
            return moreLinkTextInput;
        }
        return function (num) { return "+" + num + " "
+ moreLinkTextInput; };
    }
    function isSegAllDay(seg) {
        return seg.eventRange.def.allDay;
    }

    var DayTableSlicer = /** @class */ (function (_super) {
        __extends(DayTableSlicer, _super);
        function DayTableSlicer() {
            var _this = _super !== null && _super.apply(this,
arguments) || this;
            _this.forceDayIfListItem = true;
            return _this;
        }
        DayTableSlicer.prototype.sliceRange = function (dateRange,
dayTableModel) {
            return dayTableModel.sliceRange(dateRange);
        };
        return DayTableSlicer;
    }(Slicer));

    var DayTable = /** @class */ (function (_super) {
        __extends(DayTable, _super);
        function DayTable() {
            var _this = _super !== null && _super.apply(this,
arguments) || this;
            _this.slicer = new DayTableSlicer();
            _this.tableRef = createRef();
            _this.handleRootEl = function (rootEl) {
                if (rootEl) {
                    _this.context.registerInteractiveComponent(_this, { el:
rootEl });
                }
                else {
                    _this.context.unregisterInteractiveComponent(_this);
                }
            };
            return _this;
        }
        DayTable.prototype.render = function () {
            var _a = this, props = _a.props, context = _a.context;
            return (createElement(Table, __assign({ ref: this.tableRef,
elRef: this.handleRootEl }, this.slicer.sliceProps(props,
props.dateProfile, props.nextDayThreshold, context, props.dayTableModel), {
dateProfile: props.dateProfile, cells: props.dayTableModel.cells,
colGroupNode: props.colGroupNode, tableMinWidth: props.tableMinWidth,
renderRowIntro: props.renderRowIntro, dayMaxEvents: props.dayMaxEvents,
dayMaxEventRows: props.dayMaxEventRows, showWeekNumbers:
props.showWeekNumbers, expandRows: props.expandRows, headerAlignElRef:
props.headerAlignElRef, clientWidth: props.clientWidth, clientHeight:
props.clientHeight, forPrint: props.forPrint })));
        };
        DayTable.prototype.prepareHits = function () {
            this.tableRef.current.prepareHits();
        };
        DayTable.prototype.queryHit = function (positionLeft, positionTop)
{
            var rawHit = this.tableRef.current.positionToHit(positionLeft,
positionTop);
            if (rawHit) {
                return {
                    component: this,
                    dateSpan: rawHit.dateSpan,
                    dayEl: rawHit.dayEl,
                    rect: {
                        left: rawHit.relativeRect.left,
                        right: rawHit.relativeRect.right,
                        top: rawHit.relativeRect.top,
                        bottom: rawHit.relativeRect.bottom,
                    },
                    layer: 0,
                };
            }
            return null;
        };
        return DayTable;
    }(DateComponent));

    var DayTableView = /** @class */ (function (_super) {
        __extends(DayTableView, _super);
        function DayTableView() {
            var _this = _super !== null && _super.apply(this,
arguments) || this;
            _this.buildDayTableModel = memoize(buildDayTableModel);
            _this.headerRef = createRef();
            _this.tableRef = createRef();
            return _this;
        }
        DayTableView.prototype.render = function () {
            var _this = this;
            var _a = this.context, options = _a.options,
dateProfileGenerator = _a.dateProfileGenerator;
            var props = this.props;
            var dayTableModel = this.buildDayTableModel(props.dateProfile,
dateProfileGenerator);
            var headerContent = options.dayHeaders &&
(createElement(DayHeader, { ref: this.headerRef, dateProfile:
props.dateProfile, dates: dayTableModel.headerDates, datesRepDistinctDays:
dayTableModel.rowCnt === 1 }));
            var bodyContent = function (contentArg) { return
(createElement(DayTable, { ref: _this.tableRef, dateProfile:
props.dateProfile, dayTableModel: dayTableModel, businessHours:
props.businessHours, dateSelection: props.dateSelection, eventStore:
props.eventStore, eventUiBases: props.eventUiBases, eventSelection:
props.eventSelection, eventDrag: props.eventDrag, eventResize:
props.eventResize, nextDayThreshold: options.nextDayThreshold,
colGroupNode: contentArg.tableColGroupNode, tableMinWidth:
contentArg.tableMinWidth, dayMaxEvents: options.dayMaxEvents,
dayMaxEventRows: options.dayMaxEventRows, showWeekNumbers:
options.weekNumbers, expandRows: !props.isHeightAuto, headerAlignElRef:
_this.headerElRef, clientWidth: contentArg.clientWidth, clientHeight:
contentArg.clientHeight, forPrint: props.forPrint })); };
            return options.dayMinWidth
                ? this.renderHScrollLayout(headerContent, bodyContent,
dayTableModel.colCnt, options.dayMinWidth)
                : this.renderSimpleLayout(headerContent, bodyContent);
        };
        return DayTableView;
    }(TableView));
    function buildDayTableModel(dateProfile, dateProfileGenerator) {
        var daySeries = new DaySeriesModel(dateProfile.renderRange,
dateProfileGenerator);
        return new DayTableModel(daySeries,
/year|month|week/.test(dateProfile.currentRangeUnit));
    }

    var TableDateProfileGenerator = /** @class */ (function (_super) {
        __extends(TableDateProfileGenerator, _super);
        function TableDateProfileGenerator() {
            return _super !== null && _super.apply(this, arguments)
|| this;
        }
        // Computes the date range that will be rendered.
        TableDateProfileGenerator.prototype.buildRenderRange = function
(currentRange, currentRangeUnit, isRangeAllDay) {
            var dateEnv = this.props.dateEnv;
            var renderRange = _super.prototype.buildRenderRange.call(this,
currentRange, currentRangeUnit, isRangeAllDay);
            var start = renderRange.start;
            var end = renderRange.end;
            var endOfWeek;
            // year and month views should be aligned with weeks. this is
already done for week
            if (/^(year|month)$/.test(currentRangeUnit)) {
                start = dateEnv.startOfWeek(start);
                // make end-of-week if not already
                endOfWeek = dateEnv.startOfWeek(end);
                if (endOfWeek.valueOf() !== end.valueOf()) {
                    end = addWeeks(endOfWeek, 1);
                }
            }
            // ensure 6 weeks
            if (this.props.monthMode &&
                this.props.fixedWeekCount) {
                var rowCnt = Math.ceil(// could be partial weeks due to
hiddenDays
                diffWeeks(start, end));
                end = addWeeks(end, 6 - rowCnt);
            }
            return { start: start, end: end };
        };
        return TableDateProfileGenerator;
    }(DateProfileGenerator));

    var OPTION_REFINERS$1 = {
        moreLinkClick: identity,
        moreLinkClassNames: identity,
        moreLinkContent: identity,
        moreLinkDidMount: identity,
        moreLinkWillUnmount: identity,
    };

    var dayGridPlugin = createPlugin({
        initialView: 'dayGridMonth',
        optionRefiners: OPTION_REFINERS$1,
        views: {
            dayGrid: {
                component: DayTableView,
                dateProfileGeneratorClass: TableDateProfileGenerator,
            },
            dayGridDay: {
                type: 'dayGrid',
                duration: { days: 1 },
            },
            dayGridWeek: {
                type: 'dayGrid',
                duration: { weeks: 1 },
            },
            dayGridMonth: {
                type: 'dayGrid',
                duration: { months: 1 },
                monthMode: true,
                fixedWeekCount: true,
            },
        },
    });

    var AllDaySplitter = /** @class */ (function (_super) {
        __extends(AllDaySplitter, _super);
        function AllDaySplitter() {
            return _super !== null && _super.apply(this, arguments)
|| this;
        }
        AllDaySplitter.prototype.getKeyInfo = function () {
            return {
                allDay: {},
                timed: {},
            };
        };
        AllDaySplitter.prototype.getKeysForDateSpan = function (dateSpan) {
            if (dateSpan.allDay) {
                return ['allDay'];
            }
            return ['timed'];
        };
        AllDaySplitter.prototype.getKeysForEventDef = function (eventDef) {
            if (!eventDef.allDay) {
                return ['timed'];
            }
            if (hasBgRendering(eventDef)) {
                return ['timed', 'allDay'];
            }
            return ['allDay'];
        };
        return AllDaySplitter;
    }(Splitter));

    var DEFAULT_SLAT_LABEL_FORMAT = createFormatter({
        hour: 'numeric',
        minute: '2-digit',
        omitZeroMinute: true,
        meridiem: 'short',
    });
    function TimeColsAxisCell(props) {
        var classNames = [
            'fc-timegrid-slot',
            'fc-timegrid-slot-label',
            props.isLabeled ? 'fc-scrollgrid-shrink' :
'fc-timegrid-slot-minor',
        ];
        return (createElement(ViewContextType.Consumer, null, function
(context) {
            if (!props.isLabeled) {
                return (createElement("td", { className:
classNames.join(' '), "data-time": props.isoTimeStr
}));
            }
            var dateEnv = context.dateEnv, options = context.options,
viewApi = context.viewApi;
            var labelFormat = // TODO: fully pre-parse
             options.slotLabelFormat == null ? DEFAULT_SLAT_LABEL_FORMAT :
                Array.isArray(options.slotLabelFormat) ?
createFormatter(options.slotLabelFormat[0]) :
                    createFormatter(options.slotLabelFormat);
            var hookProps = {
                level: 0,
                time: props.time,
                date: dateEnv.toDate(props.date),
                view: viewApi,
                text: dateEnv.format(props.date, labelFormat),
            };
            return (createElement(RenderHook, { hookProps: hookProps,
classNames: options.slotLabelClassNames, content: options.slotLabelContent,
defaultContent: renderInnerContent$3, didMount: options.slotLabelDidMount,
willUnmount: options.slotLabelWillUnmount }, function (rootElRef,
customClassNames, innerElRef, innerContent) { return
(createElement("td", { ref: rootElRef, className:
classNames.concat(customClassNames).join(' '),
"data-time": props.isoTimeStr },
                createElement("div", { className:
"fc-timegrid-slot-label-frame fc-scrollgrid-shrink-frame" },
                    createElement("div", { className:
"fc-timegrid-slot-label-cushion fc-scrollgrid-shrink-cushion",
ref: innerElRef }, innerContent)))); }));
        }));
    }
    function renderInnerContent$3(props) {
        return props.text;
    }

    var TimeBodyAxis = /** @class */ (function (_super) {
        __extends(TimeBodyAxis, _super);
        function TimeBodyAxis() {
            return _super !== null && _super.apply(this, arguments)
|| this;
        }
        TimeBodyAxis.prototype.render = function () {
            return this.props.slatMetas.map(function (slatMeta) { return
(createElement("tr", { key: slatMeta.key },
                createElement(TimeColsAxisCell, __assign({}, slatMeta))));
});
        };
        return TimeBodyAxis;
    }(BaseComponent));

    var DEFAULT_WEEK_NUM_FORMAT$1 = createFormatter({ week:
'short' });
    var AUTO_ALL_DAY_MAX_EVENT_ROWS = 5;
    var TimeColsView = /** @class */ (function (_super) {
        __extends(TimeColsView, _super);
        function TimeColsView() {
            var _this = _super !== null && _super.apply(this,
arguments) || this;
            _this.allDaySplitter = new AllDaySplitter(); // for use by
subclasses
            _this.headerElRef = createRef();
            _this.rootElRef = createRef();
            _this.scrollerElRef = createRef();
            _this.state = {
                slatCoords: null,
            };
            _this.handleScrollTopRequest = function (scrollTop) {
                var scrollerEl = _this.scrollerElRef.current;
                if (scrollerEl) { // TODO: not sure how this could ever be
null. weirdness with the reducer
                    scrollerEl.scrollTop = scrollTop;
                }
            };
            /* Header Render Methods
           
------------------------------------------------------------------------------------------------------------------*/
            _this.renderHeadAxis = function (rowKey, frameHeight) {
                if (frameHeight === void 0) { frameHeight = ''; }
                var options = _this.context.options;
                var dateProfile = _this.props.dateProfile;
                var range = dateProfile.renderRange;
                var dayCnt = diffDays(range.start, range.end);
                var navLinkAttrs = (options.navLinks && dayCnt ===
1) // only do in day views (to avoid doing in week views that dont need it)
                    ? { 'data-navlink':
buildNavLinkData(range.start, 'week'), tabIndex: 0 }
                    : {};
                if (options.weekNumbers && rowKey ===
'day') {
                    return (createElement(WeekNumberRoot, { date:
range.start, defaultFormat: DEFAULT_WEEK_NUM_FORMAT$1 }, function
(rootElRef, classNames, innerElRef, innerContent) { return
(createElement("th", { ref: rootElRef, className: [
                            'fc-timegrid-axis',
                            'fc-scrollgrid-shrink',
                        ].concat(classNames).join(' ') },
                        createElement("div", { className:
"fc-timegrid-axis-frame fc-scrollgrid-shrink-frame
fc-timegrid-axis-frame-liquid", style: { height: frameHeight } },
                            createElement("a", __assign({ ref:
innerElRef, className: "fc-timegrid-axis-cushion
fc-scrollgrid-shrink-cushion fc-scrollgrid-sync-inner" },
navLinkAttrs), innerContent)))); }));
                }
                return (createElement("th", { className:
"fc-timegrid-axis" },
                    createElement("div", { className:
"fc-timegrid-axis-frame", style: { height: frameHeight } })));
            };
            /* Table Component Render Methods
           
------------------------------------------------------------------------------------------------------------------*/
            // only a one-way height sync. we don't send the axis
inner-content height to the DayGrid,
            // but DayGrid still needs to have classNames on inner elements
in order to measure.
            _this.renderTableRowAxis = function (rowHeight) {
                var _a = _this.context, options = _a.options, viewApi =
_a.viewApi;
                var hookProps = {
                    text: options.allDayText,
                    view: viewApi,
                };
                return (
                // TODO: make reusable hook. used in list view too
                createElement(RenderHook, { hookProps: hookProps,
classNames: options.allDayClassNames, content: options.allDayContent,
defaultContent: renderAllDayInner, didMount: options.allDayDidMount,
willUnmount: options.allDayWillUnmount }, function (rootElRef, classNames,
innerElRef, innerContent) { return (createElement("td", { ref:
rootElRef, className: [
                        'fc-timegrid-axis',
                        'fc-scrollgrid-shrink',
                    ].concat(classNames).join(' ') },
                    createElement("div", { className:
'fc-timegrid-axis-frame fc-scrollgrid-shrink-frame' + (rowHeight
== null ? ' fc-timegrid-axis-frame-liquid' : ''),
style: { height: rowHeight } },
                        createElement("span", { className:
"fc-timegrid-axis-cushion fc-scrollgrid-shrink-cushion
fc-scrollgrid-sync-inner", ref: innerElRef }, innerContent)))); }));
            };
            _this.handleSlatCoords = function (slatCoords) {
                _this.setState({ slatCoords: slatCoords });
            };
            return _this;
        }
        // rendering
        //
----------------------------------------------------------------------------------------------------
        TimeColsView.prototype.renderSimpleLayout = function
(headerRowContent, allDayContent, timeContent) {
            var _a = this, context = _a.context, props = _a.props;
            var sections = [];
            var stickyHeaderDates = getStickyHeaderDates(context.options);
            if (headerRowContent) {
                sections.push({
                    type: 'header',
                    key: 'header',
                    isSticky: stickyHeaderDates,
                    chunk: {
                        elRef: this.headerElRef,
                        tableClassName: 'fc-col-header',
                        rowContent: headerRowContent,
                    },
                });
            }
            if (allDayContent) {
                sections.push({
                    type: 'body',
                    key: 'all-day',
                    chunk: { content: allDayContent },
                });
                sections.push({
                    type: 'body',
                    key: 'all-day-divider',
                    outerContent: ( // TODO: rename to cellContent so
don't need to define <tr>?
                    createElement("tr", { className:
"fc-scrollgrid-section" },
                        createElement("td", { className:
'fc-timegrid-divider ' +
context.theme.getClass('tableCellShaded') }))),
                });
            }
            sections.push({
                type: 'body',
                key: 'body',
                liquid: true,
                expandRows: Boolean(context.options.expandRows),
                chunk: {
                    scrollerElRef: this.scrollerElRef,
                    content: timeContent,
                },
            });
            return (createElement(ViewRoot, { viewSpec: context.viewSpec,
elRef: this.rootElRef }, function (rootElRef, classNames) { return
(createElement("div", { className:
['fc-timegrid'].concat(classNames).join(' '), ref:
rootElRef },
                createElement(SimpleScrollGrid, { liquid:
!props.isHeightAuto && !props.forPrint, cols: [{ width:
'shrink' }], sections: sections }))); }));
        };
        TimeColsView.prototype.renderHScrollLayout = function
(headerRowContent, allDayContent, timeContent, colCnt, dayMinWidth,
slatMetas, slatCoords) {
            var _this = this;
            var ScrollGrid = this.context.pluginHooks.scrollGridImpl;
            if (!ScrollGrid) {
                throw new Error('No ScrollGrid implementation');
            }
            var _a = this, context = _a.context, props = _a.props;
            var stickyHeaderDates = !props.forPrint &&
getStickyHeaderDates(context.options);
            var stickyFooterScrollbar = !props.forPrint &&
getStickyFooterScrollbar(context.options);
            var sections = [];
            if (headerRowContent) {
                sections.push({
                    type: 'header',
                    key: 'header',
                    isSticky: stickyHeaderDates,
                    syncRowHeights: true,
                    chunks: [
                        {
                            key: 'axis',
                            rowContent: function (arg) { return
(createElement("tr", null, _this.renderHeadAxis('day',
arg.rowSyncHeights[0]))); },
                        },
                        {
                            key: 'cols',
                            elRef: this.headerElRef,
                            tableClassName: 'fc-col-header',
                            rowContent: headerRowContent,
                        },
                    ],
                });
            }
            if (allDayContent) {
                sections.push({
                    type: 'body',
                    key: 'all-day',
                    syncRowHeights: true,
                    chunks: [
                        {
                            key: 'axis',
                            rowContent: function (contentArg) { return
(createElement("tr", null,
_this.renderTableRowAxis(contentArg.rowSyncHeights[0]))); },
                        },
                        {
                            key: 'cols',
                            content: allDayContent,
                        },
                    ],
                });
                sections.push({
                    key: 'all-day-divider',
                    type: 'body',
                    outerContent: ( // TODO: rename to cellContent so
don't need to define <tr>?
                    createElement("tr", { className:
"fc-scrollgrid-section" },
                        createElement("td", { colSpan: 2,
className: 'fc-timegrid-divider ' +
context.theme.getClass('tableCellShaded') }))),
                });
            }
            var isNowIndicator = context.options.nowIndicator;
            sections.push({
                type: 'body',
                key: 'body',
                liquid: true,
                expandRows: Boolean(context.options.expandRows),
                chunks: [
                    {
                        key: 'axis',
                        content: function (arg) { return (
                        // TODO: make this now-indicator arrow more DRY
with TimeColsContent
                        createElement("div", { className:
"fc-timegrid-axis-chunk" },
                            createElement("table", { style: {
height: arg.expandRows ? arg.clientHeight : '' } },
                                arg.tableColGroupNode,
                                createElement("tbody", null,
                                    createElement(TimeBodyAxis, {
slatMetas: slatMetas }))),
                            createElement("div", { className:
"fc-timegrid-now-indicator-container" },
                                createElement(NowTimer, { unit:
isNowIndicator ? 'minute' : 'day' /* hacky */ },
function (nowDate) {
                                    var nowIndicatorTop = isNowIndicator
&&
                                        slatCoords &&
                                        slatCoords.safeComputeTop(nowDate);
// might return void
                                    if (typeof nowIndicatorTop ===
'number') {
                                        return
(createElement(NowIndicatorRoot, { isAxis: true, date: nowDate }, function
(rootElRef, classNames, innerElRef, innerContent) { return
(createElement("div", { ref: rootElRef, className:
['fc-timegrid-now-indicator-arrow'].concat(classNames).join('
'), style: { top: nowIndicatorTop } }, innerContent)); }));
                                    }
                                    return null;
                                })))); },
                    },
                    {
                        key: 'cols',
                        scrollerElRef: this.scrollerElRef,
                        content: timeContent,
                    },
                ],
            });
            if (stickyFooterScrollbar) {
                sections.push({
                    key: 'footer',
                    type: 'footer',
                    isSticky: true,
                    chunks: [
                        {
                            key: 'axis',
                            content: renderScrollShim,
                        },
                        {
                            key: 'cols',
                            content: renderScrollShim,
                        },
                    ],
                });
            }
            return (createElement(ViewRoot, { viewSpec: context.viewSpec,
elRef: this.rootElRef }, function (rootElRef, classNames) { return
(createElement("div", { className:
['fc-timegrid'].concat(classNames).join(' '), ref:
rootElRef },
                createElement(ScrollGrid, { liquid: !props.isHeightAuto
&& !props.forPrint, colGroups: [
                        { width: 'shrink', cols: [{ width:
'shrink' }] },
                        { cols: [{ span: colCnt, minWidth: dayMinWidth }]
},
                    ], sections: sections }))); }));
        };
        /* Dimensions
       
------------------------------------------------------------------------------------------------------------------*/
        TimeColsView.prototype.getAllDayMaxEventProps = function () {
            var _a = this.context.options, dayMaxEvents = _a.dayMaxEvents,
dayMaxEventRows = _a.dayMaxEventRows;
            if (dayMaxEvents === true || dayMaxEventRows === true) { // is
auto?
                dayMaxEvents = undefined;
                dayMaxEventRows = AUTO_ALL_DAY_MAX_EVENT_ROWS; // make sure
"auto" goes to a real number
            }
            return { dayMaxEvents: dayMaxEvents, dayMaxEventRows:
dayMaxEventRows };
        };
        return TimeColsView;
    }(DateComponent));
    function renderAllDayInner(hookProps) {
        return hookProps.text;
    }

    var TimeColsSlatsCoords = /** @class */ (function () {
        function TimeColsSlatsCoords(positions, dateProfile, slotDuration)
{
            this.positions = positions;
            this.dateProfile = dateProfile;
            this.slotDuration = slotDuration;
        }
        TimeColsSlatsCoords.prototype.safeComputeTop = function (date) {
            var dateProfile = this.dateProfile;
            if (rangeContainsMarker(dateProfile.currentRange, date)) {
                var startOfDayDate = startOfDay(date);
                var timeMs = date.valueOf() - startOfDayDate.valueOf();
                if (timeMs >= asRoughMs(dateProfile.slotMinTime)
&&
                    timeMs < asRoughMs(dateProfile.slotMaxTime)) {
                    return this.computeTimeTop(createDuration(timeMs));
                }
            }
            return null;
        };
        // Computes the top coordinate, relative to the bounds of the grid,
of the given date.
        // A `startOfDayDate` must be given for avoiding ambiguity over how
to treat midnight.
        TimeColsSlatsCoords.prototype.computeDateTop = function (when,
startOfDayDate) {
            if (!startOfDayDate) {
                startOfDayDate = startOfDay(when);
            }
            return this.computeTimeTop(createDuration(when.valueOf() -
startOfDayDate.valueOf()));
        };
        // Computes the top coordinate, relative to the bounds of the grid,
of the given time (a Duration).
        // This is a makeshify way to compute the time-top. Assumes all
slatMetas dates are uniform.
        // Eventually allow computation with arbirary slat dates.
        TimeColsSlatsCoords.prototype.computeTimeTop = function (duration)
{
            var _a = this, positions = _a.positions, dateProfile =
_a.dateProfile;
            var len = positions.els.length;
            // floating-point value of # of slots covered
            var slatCoverage = (duration.milliseconds -
asRoughMs(dateProfile.slotMinTime)) / asRoughMs(this.slotDuration);
            var slatIndex;
            var slatRemainder;
            // compute a floating-point number for how many slats should be
progressed through.
            // from 0 to number of slats (inclusive)
            // constrained because slotMinTime/slotMaxTime might be
customized.
            slatCoverage = Math.max(0, slatCoverage);
            slatCoverage = Math.min(len, slatCoverage);
            // an integer index of the furthest whole slat
            // from 0 to number slats (*exclusive*, so len-1)
            slatIndex = Math.floor(slatCoverage);
            slatIndex = Math.min(slatIndex, len - 1);
            // how much further through the slatIndex slat (from 0.0-1.0)
must be covered in addition.
            // could be 1.0 if slatCoverage is covering *all* the slots
            slatRemainder = slatCoverage - slatIndex;
            return positions.tops[slatIndex] +
                positions.getHeight(slatIndex) * slatRemainder;
        };
        return TimeColsSlatsCoords;
    }());

    var TimeColsSlatsBody = /** @class */ (function (_super) {
        __extends(TimeColsSlatsBody, _super);
        function TimeColsSlatsBody() {
            return _super !== null && _super.apply(this, arguments)
|| this;
        }
        TimeColsSlatsBody.prototype.render = function () {
            var _a = this, props = _a.props, context = _a.context;
            var options = context.options;
            var slatElRefs = props.slatElRefs;
            return (createElement("tbody", null,
props.slatMetas.map(function (slatMeta, i) {
                var hookProps = {
                    time: slatMeta.time,
                    date: context.dateEnv.toDate(slatMeta.date),
                    view: context.viewApi,
                };
                var classNames = [
                    'fc-timegrid-slot',
                    'fc-timegrid-slot-lane',
                    slatMeta.isLabeled ? '' :
'fc-timegrid-slot-minor',
                ];
                return (createElement("tr", { key: slatMeta.key,
ref: slatElRefs.createRef(slatMeta.key) },
                    props.axis && (createElement(TimeColsAxisCell,
__assign({}, slatMeta))),
                    createElement(RenderHook, { hookProps: hookProps,
classNames: options.slotLaneClassNames, content: options.slotLaneContent,
didMount: options.slotLaneDidMount, willUnmount:
options.slotLaneWillUnmount }, function (rootElRef, customClassNames,
innerElRef, innerContent) { return (createElement("td", { ref:
rootElRef, className: classNames.concat(customClassNames).join('
'), "data-time": slatMeta.isoTimeStr }, innerContent));
})));
            })));
        };
        return TimeColsSlatsBody;
    }(BaseComponent));

    /*
    for the horizontal "slats" that run width-wise. Has a time
axis on a side. Depends on RTL.
    */
    var TimeColsSlats = /** @class */ (function (_super) {
        __extends(TimeColsSlats, _super);
        function TimeColsSlats() {
            var _this = _super !== null && _super.apply(this,
arguments) || this;
            _this.rootElRef = createRef();
            _this.slatElRefs = new RefMap();
            return _this;
        }
        TimeColsSlats.prototype.render = function () {
            var _a = this, props = _a.props, context = _a.context;
            return (createElement("div", { className:
"fc-timegrid-slots", ref: this.rootElRef },
                createElement("table", { className:
context.theme.getClass('table'), style: {
                        minWidth: props.tableMinWidth,
                        width: props.clientWidth,
                        height: props.minHeight,
                    } },
                    props.tableColGroupNode /* relies on there only being a
single <col> for the axis */,
                    createElement(TimeColsSlatsBody, { slatElRefs:
this.slatElRefs, axis: props.axis, slatMetas: props.slatMetas }))));
        };
        TimeColsSlats.prototype.componentDidMount = function () {
            this.updateSizing();
        };
        TimeColsSlats.prototype.componentDidUpdate = function () {
            this.updateSizing();
        };
        TimeColsSlats.prototype.componentWillUnmount = function () {
            if (this.props.onCoords) {
                this.props.onCoords(null);
            }
        };
        TimeColsSlats.prototype.updateSizing = function () {
            var _a = this, context = _a.context, props = _a.props;
            if (props.onCoords &&
                props.clientWidth !== null // means sizing has stabilized
            ) {
                var rootEl = this.rootElRef.current;
                if (rootEl.offsetHeight) { // not hidden by css
                    props.onCoords(new TimeColsSlatsCoords(new
PositionCache(this.rootElRef.current,
collectSlatEls(this.slatElRefs.currentMap, props.slatMetas), false, true),
this.props.dateProfile, context.options.slotDuration));
                }
            }
        };
        return TimeColsSlats;
    }(BaseComponent));
    function collectSlatEls(elMap, slatMetas) {
        return slatMetas.map(function (slatMeta) { return
elMap[slatMeta.key]; });
    }

    function splitSegsByCol(segs, colCnt) {
        var segsByCol = [];
        var i;
        for (i = 0; i < colCnt; i += 1) {
            segsByCol.push([]);
        }
        if (segs) {
            for (i = 0; i < segs.length; i += 1) {
                segsByCol[segs[i].col].push(segs[i]);
            }
        }
        return segsByCol;
    }
    function splitInteractionByCol(ui, colCnt) {
        var byRow = [];
        if (!ui) {
            for (var i = 0; i < colCnt; i += 1) {
                byRow[i] = null;
            }
        }
        else {
            for (var i = 0; i < colCnt; i += 1) {
                byRow[i] = {
                    affectedInstances: ui.affectedInstances,
                    isEvent: ui.isEvent,
                    segs: [],
                };
            }
            for (var _i = 0, _a = ui.segs; _i < _a.length; _i++) {
                var seg = _a[_i];
                byRow[seg.col].segs.push(seg);
            }
        }
        return byRow;
    }

    // UNFORTUNATELY, assigns results to the
top/bottom/level/forwardCoord/backwardCoord props of the actual segs.
    // TODO: return hash (by instanceId) of results
    function computeSegCoords(segs, dayDate, slatCoords, eventMinHeight,
eventOrderSpecs) {
        computeSegVerticals(segs, dayDate, slatCoords, eventMinHeight);
        return computeSegHorizontals(segs, eventOrderSpecs); // requires
top/bottom from computeSegVerticals
    }
    // For each segment in an array, computes and assigns its top and
bottom properties
    function computeSegVerticals(segs, dayDate, slatCoords, eventMinHeight)
{
        for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
            var seg = segs_1[_i];
            seg.top = slatCoords.computeDateTop(seg.start, dayDate);
            seg.bottom = Math.max(seg.top + (eventMinHeight || 0), // yuck
            slatCoords.computeDateTop(seg.end, dayDate));
        }
    }
    // Given an array of segments that are all in the same column, sets the
backwardCoord and forwardCoord on each.
    // Assumed the segs are already ordered.
    // NOTE: Also reorders the given array by date!
    function computeSegHorizontals(segs, eventOrderSpecs) {
        // IMPORTANT TO CLEAR OLD RESULTS :(
        for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {
            var seg = segs_2[_i];
            seg.level = null;
            seg.forwardCoord = null;
            seg.backwardCoord = null;
            seg.forwardPressure = null;
        }
        segs = sortEventSegs(segs, eventOrderSpecs);
        var level0;
        var levels = buildSlotSegLevels(segs);
        computeForwardSlotSegs(levels);
        if ((level0 = levels[0])) {
            for (var _a = 0, level0_1 = level0; _a < level0_1.length;
_a++) {
                var seg = level0_1[_a];
                computeSlotSegPressures(seg);
            }
            for (var _b = 0, level0_2 = level0; _b < level0_2.length;
_b++) {
                var seg = level0_2[_b];
                computeSegForwardBack(seg, 0, 0, eventOrderSpecs);
            }
        }
        return segs;
    }
    // Builds an array of segments "levels". The first level will
be the leftmost tier of segments if the calendar is
    // left-to-right, or the rightmost if the calendar is right-to-left.
Assumes the segments are already ordered by date.
    function buildSlotSegLevels(segs) {
        var levels = [];
        var i;
        var seg;
        var j;
        for (i = 0; i < segs.length; i += 1) {
            seg = segs[i];
            // go through all the levels and stop on the first level where
there are no collisions
            for (j = 0; j < levels.length; j += 1) {
                if (!computeSlotSegCollisions(seg, levels[j]).length) {
                    break;
                }
            }
            seg.level = j;
            (levels[j] || (levels[j] = [])).push(seg);
        }
        return levels;
    }
    // Find all the segments in `otherSegs` that vertically collide with
`seg`.
    // Append into an optionally-supplied `results` array and return.
    function computeSlotSegCollisions(seg, otherSegs, results) {
        if (results === void 0) { results = []; }
        for (var i = 0; i < otherSegs.length; i += 1) {
            if (isSlotSegCollision(seg, otherSegs[i])) {
                results.push(otherSegs[i]);
            }
        }
        return results;
    }
    // Do these segments occupy the same vertical space?
    function isSlotSegCollision(seg1, seg2) {
        return seg1.bottom > seg2.top && seg1.top <
seg2.bottom;
    }
    // For every segment, figure out the other segments that are in
subsequent
    // levels that also occupy the same vertical space. Accumulate in
seg.forwardSegs
    function computeForwardSlotSegs(levels) {
        var i;
        var level;
        var j;
        var seg;
        var k;
        for (i = 0; i < levels.length; i += 1) {
            level = levels[i];
            for (j = 0; j < level.length; j += 1) {
                seg = level[j];
                seg.forwardSegs = [];
                for (k = i + 1; k < levels.length; k += 1) {
                    computeSlotSegCollisions(seg, levels[k],
seg.forwardSegs);
                }
            }
        }
    }
    // Figure out which path forward (via seg.forwardSegs) results in the
longest path until
    // the furthest edge is reached. The number of segments in this path
will be seg.forwardPressure
    function computeSlotSegPressures(seg) {
        var forwardSegs = seg.forwardSegs;
        var forwardPressure = 0;
        var i;
        var forwardSeg;
        if (seg.forwardPressure == null) { // not already computed
            for (i = 0; i < forwardSegs.length; i += 1) {
                forwardSeg = forwardSegs[i];
                // figure out the child's maximum forward path
                computeSlotSegPressures(forwardSeg);
                // either use the existing maximum, or use the child's
forward pressure
                // plus one (for the forwardSeg itself)
                forwardPressure = Math.max(forwardPressure, 1 +
forwardSeg.forwardPressure);
            }
            seg.forwardPressure = forwardPressure;
        }
    }
    // Calculate seg.forwardCoord and seg.backwardCoord for the segment,
where both values range
    // from 0 to 1. If the calendar is left-to-right, the seg.backwardCoord
maps to "left" and
    // seg.forwardCoord maps to "right" (via percentage).
Vice-versa if the calendar is right-to-left.
    //
    // The segment might be part of a "series", which means
consecutive segments with the same pressure
    // who's width is unknown until an edge has been hit.
`seriesBackwardPressure` is the number of
    // segments behind this one in the current series, and
`seriesBackwardCoord` is the starting
    // coordinate of the first segment in the series.
    function computeSegForwardBack(seg, seriesBackwardPressure,
seriesBackwardCoord, eventOrderSpecs) {
        var forwardSegs = seg.forwardSegs;
        var i;
        if (seg.forwardCoord == null) { // not already computed
            if (!forwardSegs.length) {
                // if there are no forward segments, this segment should
butt up against the edge
                seg.forwardCoord = 1;
            }
            else {
                // sort highest pressure first
                sortForwardSegs(forwardSegs, eventOrderSpecs);
                // this segment's forwardCoord will be calculated from
the backwardCoord of the
                // highest-pressure forward segment.
                computeSegForwardBack(forwardSegs[0],
seriesBackwardPressure + 1, seriesBackwardCoord, eventOrderSpecs);
                seg.forwardCoord = forwardSegs[0].backwardCoord;
            }
            // calculate the backwardCoord from the forwardCoord. consider
the series
            seg.backwardCoord = seg.forwardCoord -
                (seg.forwardCoord - seriesBackwardCoord) / // available
width for series
                    (seriesBackwardPressure + 1); // # of segments in the
series
            // use this segment's coordinates to computed the
coordinates of the less-pressurized
            // forward segments
            for (i = 0; i < forwardSegs.length; i += 1) {
                computeSegForwardBack(forwardSegs[i], 0, seg.forwardCoord,
eventOrderSpecs);
            }
        }
    }
    function sortForwardSegs(forwardSegs, eventOrderSpecs) {
        var objs = forwardSegs.map(buildTimeGridSegCompareObj);
        var specs = [
            // put higher-pressure first
            { field: 'forwardPressure', order: -1 },
            // put segments that are closer to initial edge first (and
favor ones with no coords yet)
            { field: 'backwardCoord', order: 1 },
        ].concat(eventOrderSpecs);
        objs.sort(function (obj0, obj1) { return compareByFieldSpecs(obj0,
obj1, specs); });
        return objs.map(function (c) { return c._seg; });
    }
    function buildTimeGridSegCompareObj(seg) {
        var obj = buildSegCompareObj(seg);
        obj.forwardPressure = seg.forwardPressure;
        obj.backwardCoord = seg.backwardCoord;
        return obj;
    }

    var DEFAULT_TIME_FORMAT = createFormatter({
        hour: 'numeric',
        minute: '2-digit',
        meridiem: false,
    });
    var TimeColEvent = /** @class */ (function (_super) {
        __extends(TimeColEvent, _super);
        function TimeColEvent() {
            return _super !== null && _super.apply(this, arguments)
|| this;
        }
        TimeColEvent.prototype.render = function () {
            var classNames = [
                'fc-timegrid-event',
                'fc-v-event',
            ];
            if (this.props.isCondensed) {
                classNames.push('fc-timegrid-event-condensed');
            }
            return (createElement(StandardEvent, __assign({}, this.props, {
defaultTimeFormat: DEFAULT_TIME_FORMAT, extraClassNames: classNames })));
        };
        return TimeColEvent;
    }(BaseComponent));

    var TimeColMisc = /** @class */ (function (_super) {
        __extends(TimeColMisc, _super);
        function TimeColMisc() {
            return _super !== null && _super.apply(this, arguments)
|| this;
        }
        TimeColMisc.prototype.render = function () {
            var props = this.props;
            return (createElement(DayCellContent, { date: props.date,
dateProfile: props.dateProfile, todayRange: props.todayRange,
extraHookProps: props.extraHookProps }, function (innerElRef, innerContent)
{ return (innerContent &&
                createElement("div", { className:
"fc-timegrid-col-misc", ref: innerElRef }, innerContent)); }));
        };
        return TimeColMisc;
    }(BaseComponent));

    config.timeGridEventCondensedHeight = 30;
    var TimeCol = /** @class */ (function (_super) {
        __extends(TimeCol, _super);
        function TimeCol() {
            return _super !== null && _super.apply(this, arguments)
|| this;
        }
        TimeCol.prototype.render = function () {
            var _this = this;
            var _a = this, props = _a.props, context = _a.context;
            var isSelectMirror = context.options.selectMirror;
            var mirrorSegs = (props.eventDrag &&
props.eventDrag.segs) ||
                (props.eventResize && props.eventResize.segs) ||
                (isSelectMirror && props.dateSelectionSegs) ||
                [];
            var interactionAffectedInstances = // TODO: messy way to
compute this
             (props.eventDrag && props.eventDrag.affectedInstances)
||
                (props.eventResize &&
props.eventResize.affectedInstances) ||
                {};
            return (createElement(DayCellRoot, { elRef: props.elRef, date:
props.date, dateProfile: props.dateProfile, todayRange: props.todayRange,
extraHookProps: props.extraHookProps }, function (rootElRef, classNames,
dataAttrs) { return (createElement("td", __assign({ ref:
rootElRef, className: ['fc-timegrid-col'].concat(classNames,
props.extraClassNames || []).join(' ') }, dataAttrs,
props.extraDataAttrs),
                createElement("div", { className:
"fc-timegrid-col-frame" },
                    createElement("div", { className:
"fc-timegrid-col-bg" },
                        _this.renderFillSegs(props.businessHourSegs,
'non-business'),
                        _this.renderFillSegs(props.bgEventSegs,
'bg-event'),
                        _this.renderFillSegs(props.dateSelectionSegs,
'highlight')),
                    createElement("div", { className:
"fc-timegrid-col-events" }, _this.renderFgSegs(props.fgEventSegs,
interactionAffectedInstances)),
                    createElement("div", { className:
"fc-timegrid-col-events" }, _this.renderFgSegs(mirrorSegs, {},
Boolean(props.eventDrag), Boolean(props.eventResize),
Boolean(isSelectMirror))),
                    createElement("div", { className:
"fc-timegrid-now-indicator-container" },
_this.renderNowIndicator(props.nowIndicatorSegs)),
                    createElement(TimeColMisc, { date: props.date,
dateProfile: props.dateProfile, todayRange: props.todayRange,
extraHookProps: props.extraHookProps })))); }));
        };
        TimeCol.prototype.renderFgSegs = function (segs, segIsInvisible,
isDragging, isResizing, isDateSelecting) {
            var props = this.props;
            if (props.forPrint) {
                return this.renderPrintFgSegs(segs);
            }
            if (props.slatCoords) {
                return this.renderPositionedFgSegs(segs, segIsInvisible,
isDragging, isResizing, isDateSelecting);
            }
            return null;
        };
        TimeCol.prototype.renderPrintFgSegs = function (segs) {
            var _a = this, props = _a.props, context = _a.context;
            // not DRY
            segs = sortEventSegs(segs, context.options.eventOrder);
            return segs.map(function (seg) { return
(createElement("div", { className:
"fc-timegrid-event-harness", key:
seg.eventRange.instance.instanceId },
                createElement(TimeColEvent, __assign({ seg: seg,
isDragging: false, isResizing: false, isDateSelecting: false, isSelected:
false, isCondensed: false }, getSegMeta(seg, props.todayRange,
props.nowDate))))); });
        };
        TimeCol.prototype.renderPositionedFgSegs = function (segs,
segIsInvisible, isDragging, isResizing, isDateSelecting) {
            var _this = this;
            var _a = this, context = _a.context, props = _a.props;
            // assigns TO THE SEGS THEMSELVES
            // also, receives resorted array
            segs = computeSegCoords(segs, props.date, props.slatCoords,
context.options.eventMinHeight, context.options.eventOrder);
            return segs.map(function (seg) {
                var instanceId = seg.eventRange.instance.instanceId;
                var isMirror = isDragging || isResizing || isDateSelecting;
                var positionCss = isMirror
                    // will span entire column width
                    // also, won't assign z-index, which is good,
fc-event-mirror will overpower other harnesses
                    ? __assign({ left: 0, right: 0 },
_this.computeSegTopBottomCss(seg)) : _this.computeFgSegPositionCss(seg);
                return (createElement("div", { className:
'fc-timegrid-event-harness' + (seg.level > 0 ? '
fc-timegrid-event-harness-inset' : ''), key: instanceId,
style: __assign({ visibility: segIsInvisible[instanceId] ?
'hidden' : '' }, positionCss) },
                    createElement(TimeColEvent, __assign({ seg: seg,
isDragging: isDragging, isResizing: isResizing, isDateSelecting:
isDateSelecting, isSelected: instanceId === props.eventSelection,
isCondensed: (seg.bottom - seg.top) <
config.timeGridEventCondensedHeight }, getSegMeta(seg, props.todayRange,
props.nowDate)))));
            });
        };
        TimeCol.prototype.renderFillSegs = function (segs, fillType) {
            var _this = this;
            var _a = this, context = _a.context, props = _a.props;
            if (!props.slatCoords) {
                return null;
            }
            // BAD: assigns TO THE SEGS THEMSELVES
            computeSegVerticals(segs, props.date, props.slatCoords,
context.options.eventMinHeight);
            var children = segs.map(function (seg) { return
(createElement("div", { key: buildEventRangeKey(seg.eventRange),
className: "fc-timegrid-bg-harness", style:
_this.computeSegTopBottomCss(seg) }, fillType === 'bg-event' ?
                createElement(BgEvent, __assign({ seg: seg },
getSegMeta(seg, props.todayRange, props.nowDate))) :
                renderFill(fillType))); });
            return createElement(Fragment, null, children);
        };
        TimeCol.prototype.renderNowIndicator = function (segs) {
            var _a = this.props, slatCoords = _a.slatCoords, date =
_a.date;
            if (!slatCoords) {
                return null;
            }
            return segs.map(function (seg, i) { return
(createElement(NowIndicatorRoot, { isAxis: false, date: date, 
                // key doesn't matter. will only ever be one
                key: i }, function (rootElRef, classNames, innerElRef,
innerContent) { return (createElement("div", { ref: rootElRef,
className:
['fc-timegrid-now-indicator-line'].concat(classNames).join('
'), style: { top: slatCoords.computeDateTop(seg.start, date) } },
innerContent)); })); });
        };
        TimeCol.prototype.computeFgSegPositionCss = function (seg) {
            var _a = this.context, isRtl = _a.isRtl, options = _a.options;
            var shouldOverlap = options.slotEventOverlap;
            var backwardCoord = seg.backwardCoord; // the left side if LTR.
the right side if RTL. floating-point
            var forwardCoord = seg.forwardCoord; // the right side if LTR.
the left side if RTL. floating-point
            var left; // amount of space from left edge, a fraction of the
total width
            var right; // amount of space from right edge, a fraction of
the total width
            if (shouldOverlap) {
                // double the width, but don't go beyond the maximum
forward coordinate (1.0)
                forwardCoord = Math.min(1, backwardCoord + (forwardCoord -
backwardCoord) * 2);
            }
            if (isRtl) {
                left = 1 - forwardCoord;
                right = backwardCoord;
            }
            else {
                left = backwardCoord;
                right = 1 - forwardCoord;
            }
            var props = {
                zIndex: seg.level + 1,
                left: left * 100 + '%',
                right: right * 100 + '%',
            };
            if (shouldOverlap && seg.forwardPressure) {
                // add padding to the edge so that forward stacked events
don't cover the resizer's icon
                props[isRtl ? 'marginLeft' :
'marginRight'] = 10 * 2; // 10 is a guesstimate of the
icon's width
            }
            return __assign(__assign({}, props),
this.computeSegTopBottomCss(seg));
        };
        TimeCol.prototype.computeSegTopBottomCss = function (seg) {
            return {
                top: seg.top,
                bottom: -seg.bottom,
            };
        };
        return TimeCol;
    }(BaseComponent));

    var TimeColsContent = /** @class */ (function (_super) {
        __extends(TimeColsContent, _super);
        function TimeColsContent() {
            var _this = _super !== null && _super.apply(this,
arguments) || this;
            _this.splitFgEventSegs = memoize(splitSegsByCol);
            _this.splitBgEventSegs = memoize(splitSegsByCol);
            _this.splitBusinessHourSegs = memoize(splitSegsByCol);
            _this.splitNowIndicatorSegs = memoize(splitSegsByCol);
            _this.splitDateSelectionSegs = memoize(splitSegsByCol);
            _this.splitEventDrag = memoize(splitInteractionByCol);
            _this.splitEventResize = memoize(splitInteractionByCol);
            _this.rootElRef = createRef();
            _this.cellElRefs = new RefMap();
            return _this;
        }
        TimeColsContent.prototype.render = function () {
            var _this = this;
            var _a = this, props = _a.props, context = _a.context;
            var nowIndicatorTop = context.options.nowIndicator &&
                props.slatCoords &&
                props.slatCoords.safeComputeTop(props.nowDate); // might
return void
            var colCnt = props.cells.length;
            var fgEventSegsByRow = this.splitFgEventSegs(props.fgEventSegs,
colCnt);
            var bgEventSegsByRow = this.splitBgEventSegs(props.bgEventSegs,
colCnt);
            var businessHourSegsByRow =
this.splitBusinessHourSegs(props.businessHourSegs, colCnt);
            var nowIndicatorSegsByRow =
this.splitNowIndicatorSegs(props.nowIndicatorSegs, colCnt);
            var dateSelectionSegsByRow =
this.splitDateSelectionSegs(props.dateSelectionSegs, colCnt);
            var eventDragByRow = this.splitEventDrag(props.eventDrag,
colCnt);
            var eventResizeByRow = this.splitEventResize(props.eventResize,
colCnt);
            return (createElement("div", { className:
"fc-timegrid-cols", ref: this.rootElRef },
                createElement("table", { style: {
                        minWidth: props.tableMinWidth,
                        width: props.clientWidth,
                    } },
                    props.tableColGroupNode,
                    createElement("tbody", null,
                        createElement("tr", null,
                            props.axis &&
(createElement("td", { className: "fc-timegrid-col
fc-timegrid-axis" },
                                createElement("div", { className:
"fc-timegrid-col-frame" },
                                    createElement("div", {
className: "fc-timegrid-now-indicator-container" }, typeof
nowIndicatorTop === 'number' &&
(createElement(NowIndicatorRoot, { isAxis: true, date: props.nowDate },
function (rootElRef, classNames, innerElRef, innerContent) { return
(createElement("div", { ref: rootElRef, className:
['fc-timegrid-now-indicator-arrow'].concat(classNames).join('
'), style: { top: nowIndicatorTop } }, innerContent)); })))))),
                            props.cells.map(function (cell, i) { return
(createElement(TimeCol, { key: cell.key, elRef:
_this.cellElRefs.createRef(cell.key), dateProfile: props.dateProfile, date:
cell.date, nowDate: props.nowDate, todayRange: props.todayRange,
extraHookProps: cell.extraHookProps, extraDataAttrs: cell.extraDataAttrs,
extraClassNames: cell.extraClassNames, fgEventSegs: fgEventSegsByRow[i],
bgEventSegs: bgEventSegsByRow[i], businessHourSegs:
businessHourSegsByRow[i], nowIndicatorSegs: nowIndicatorSegsByRow[i],
dateSelectionSegs: dateSelectionSegsByRow[i], eventDrag: eventDragByRow[i],
eventResize: eventResizeByRow[i], slatCoords: props.slatCoords,
eventSelection: props.eventSelection, forPrint: props.forPrint }));
}))))));
        };
        TimeColsContent.prototype.componentDidMount = function () {
            this.updateCoords();
        };
        TimeColsContent.prototype.componentDidUpdate = function () {
            this.updateCoords();
        };
        TimeColsContent.prototype.updateCoords = function () {
            var props = this.props;
            if (props.onColCoords &&
                props.clientWidth !== null // means sizing has stabilized
            ) {
                props.onColCoords(new PositionCache(this.rootElRef.current,
collectCellEls(this.cellElRefs.currentMap, props.cells), true, //
horizontal
                false));
            }
        };
        return TimeColsContent;
    }(BaseComponent));
    function collectCellEls(elMap, cells) {
        return cells.map(function (cell) { return elMap[cell.key]; });
    }

    /* A component that renders one or more columns of vertical time slots
   
----------------------------------------------------------------------------------------------------------------------*/
    var TimeCols = /** @class */ (function (_super) {
        __extends(TimeCols, _super);
        function TimeCols() {
            var _this = _super !== null && _super.apply(this,
arguments) || this;
            _this.processSlotOptions = memoize(processSlotOptions);
            _this.state = {
                slatCoords: null,
            };
            _this.handleScrollRequest = function (request) {
                var onScrollTopRequest = _this.props.onScrollTopRequest;
                var slatCoords = _this.state.slatCoords;
                if (onScrollTopRequest && slatCoords) {
                    if (request.time) {
                        var top_1 =
slatCoords.computeTimeTop(request.time);
                        top_1 = Math.ceil(top_1); // zoom can give weird
floating-point values. rather scroll a little bit further
                        if (top_1) {
                            top_1 += 1; // to overcome top border that
slots beyond the first have. looks better
                        }
                        onScrollTopRequest(top_1);
                    }
                    return true;
                }
                return false;
            };
            _this.handleColCoords = function (colCoords) {
                _this.colCoords = colCoords;
            };
            _this.handleSlatCoords = function (slatCoords) {
                _this.setState({ slatCoords: slatCoords });
                if (_this.props.onSlatCoords) {
                    _this.props.onSlatCoords(slatCoords);
                }
            };
            return _this;
        }
        TimeCols.prototype.render = function () {
            var _a = this, props = _a.props, state = _a.state;
            return (createElement("div", { className:
"fc-timegrid-body", ref: props.rootElRef, style: {
                    // these props are important to give this wrapper
correct dimensions for interactions
                    // TODO: if we set it here, can we avoid giving to
inner tables?
                    width: props.clientWidth,
                    minWidth: props.tableMinWidth,
                } },
                createElement(TimeColsSlats, { axis: props.axis,
dateProfile: props.dateProfile, slatMetas: props.slatMetas, clientWidth:
props.clientWidth, minHeight: props.expandRows ? props.clientHeight :
'', tableMinWidth: props.tableMinWidth, tableColGroupNode:
props.axis ? props.tableColGroupNode : null /* axis depends on the
colgroup's shrinking */, onCoords: this.handleSlatCoords }),
                createElement(TimeColsContent, { cells: props.cells, axis:
props.axis, dateProfile: props.dateProfile, businessHourSegs:
props.businessHourSegs, bgEventSegs: props.bgEventSegs, fgEventSegs:
props.fgEventSegs, dateSelectionSegs: props.dateSelectionSegs,
eventSelection: props.eventSelection, eventDrag: props.eventDrag,
eventResize: props.eventResize, todayRange: props.todayRange, nowDate:
props.nowDate, nowIndicatorSegs: props.nowIndicatorSegs, clientWidth:
props.clientWidth, tableMinWidth: props.tableMinWidth, tableColGroupNode:
props.tableColGroupNode, slatCoords: state.slatCoords, onColCoords:
this.handleColCoords, forPrint: props.forPrint })));
        };
        TimeCols.prototype.componentDidMount = function () {
            this.scrollResponder =
this.context.createScrollResponder(this.handleScrollRequest);
        };
        TimeCols.prototype.componentDidUpdate = function (prevProps) {
            this.scrollResponder.update(prevProps.dateProfile !==
this.props.dateProfile);
        };
        TimeCols.prototype.componentWillUnmount = function () {
            this.scrollResponder.detach();
        };
        TimeCols.prototype.positionToHit = function (positionLeft,
positionTop) {
            var _a = this.context, dateEnv = _a.dateEnv, options =
_a.options;
            var colCoords = this.colCoords;
            var dateProfile = this.props.dateProfile;
            var slatCoords = this.state.slatCoords;
            var _b = this.processSlotOptions(this.props.slotDuration,
options.snapDuration), snapDuration = _b.snapDuration, snapsPerSlot =
_b.snapsPerSlot;
            var colIndex = colCoords.leftToIndex(positionLeft);
            var slatIndex = slatCoords.positions.topToIndex(positionTop);
            if (colIndex != null && slatIndex != null) {
                var slatTop = slatCoords.positions.tops[slatIndex];
                var slatHeight = slatCoords.positions.getHeight(slatIndex);
                var partial = (positionTop - slatTop) / slatHeight; //
floating point number between 0 and 1
                var localSnapIndex = Math.floor(partial * snapsPerSlot); //
the snap # relative to start of slat
                var snapIndex = slatIndex * snapsPerSlot + localSnapIndex;
                var dayDate = this.props.cells[colIndex].date;
                var time = addDurations(dateProfile.slotMinTime,
multiplyDuration(snapDuration, snapIndex));
                var start = dateEnv.add(dayDate, time);
                var end = dateEnv.add(start, snapDuration);
                return {
                    col: colIndex,
                    dateSpan: {
                        range: { start: start, end: end },
                        allDay: false,
                    },
                    dayEl: colCoords.els[colIndex],
                    relativeRect: {
                        left: colCoords.lefts[colIndex],
                        right: colCoords.rights[colIndex],
                        top: slatTop,
                        bottom: slatTop + slatHeight,
                    },
                };
            }
            return null;
        };
        return TimeCols;
    }(BaseComponent));
    function processSlotOptions(slotDuration, snapDurationOverride) {
        var snapDuration = snapDurationOverride || slotDuration;
        var snapsPerSlot = wholeDivideDurations(slotDuration,
snapDuration);
        if (snapsPerSlot === null) {
            snapDuration = slotDuration;
            snapsPerSlot = 1;
            // TODO: say warning?
        }
        return { snapDuration: snapDuration, snapsPerSlot: snapsPerSlot };
    }

    var DayTimeColsSlicer = /** @class */ (function (_super) {
        __extends(DayTimeColsSlicer, _super);
        function DayTimeColsSlicer() {
            return _super !== null && _super.apply(this, arguments)
|| this;
        }
        DayTimeColsSlicer.prototype.sliceRange = function (range,
dayRanges) {
            var segs = [];
            for (var col = 0; col < dayRanges.length; col += 1) {
                var segRange = intersectRanges(range, dayRanges[col]);
                if (segRange) {
                    segs.push({
                        start: segRange.start,
                        end: segRange.end,
                        isStart: segRange.start.valueOf() ===
range.start.valueOf(),
                        isEnd: segRange.end.valueOf() ===
range.end.valueOf(),
                        col: col,
                    });
                }
            }
            return segs;
        };
        return DayTimeColsSlicer;
    }(Slicer));

    var DayTimeCols = /** @class */ (function (_super) {
        __extends(DayTimeCols, _super);
        function DayTimeCols() {
            var _this = _super !== null && _super.apply(this,
arguments) || this;
            _this.buildDayRanges = memoize(buildDayRanges);
            _this.slicer = new DayTimeColsSlicer();
            _this.timeColsRef = createRef();
            _this.handleRootEl = function (rootEl) {
                if (rootEl) {
                    _this.context.registerInteractiveComponent(_this, { el:
rootEl });
                }
                else {
                    _this.context.unregisterInteractiveComponent(_this);
                }
            };
            return _this;
        }
        DayTimeCols.prototype.render = function () {
            var _this = this;
            var _a = this, props = _a.props, context = _a.context;
            var dateProfile = props.dateProfile, dayTableModel =
props.dayTableModel;
            var isNowIndicator = context.options.nowIndicator;
            var dayRanges = this.buildDayRanges(dayTableModel, dateProfile,
context.dateEnv);
            // give it the first row of cells
            // TODO: would move this further down hierarchy, but
sliceNowDate needs it
            return (createElement(NowTimer, { unit: isNowIndicator ?
'minute' : 'day' }, function (nowDate, todayRange) {
return (createElement(TimeCols, __assign({ ref: _this.timeColsRef,
rootElRef: _this.handleRootEl }, _this.slicer.sliceProps(props,
dateProfile, null, context, dayRanges), { forPrint: props.forPrint, axis:
props.axis, dateProfile: dateProfile, slatMetas: props.slatMetas,
slotDuration: props.slotDuration, cells: dayTableModel.cells[0],
tableColGroupNode: props.tableColGroupNode, tableMinWidth:
props.tableMinWidth, clientWidth: props.clientWidth, clientHeight:
props.clientHeight, expandRows: props.expandRows, nowDate: nowDate,
nowIndicatorSegs: isNowIndicator &&
_this.slicer.sliceNowDate(nowDate, context, dayRanges), todayRange:
todayRange, onScrollTopRequest: props.onScrollTopRequest, onSlatCoords:
props.onSlatCoords }))); }));
        };
        DayTimeCols.prototype.queryHit = function (positionLeft,
positionTop) {
            var rawHit =
this.timeColsRef.current.positionToHit(positionLeft, positionTop);
            if (rawHit) {
                return {
                    component: this,
                    dateSpan: rawHit.dateSpan,
                    dayEl: rawHit.dayEl,
                    rect: {
                        left: rawHit.relativeRect.left,
                        right: rawHit.relativeRect.right,
                        top: rawHit.relativeRect.top,
                        bottom: rawHit.relativeRect.bottom,
                    },
                    layer: 0,
                };
            }
            return null;
        };
        return DayTimeCols;
    }(DateComponent));
    function buildDayRanges(dayTableModel, dateProfile, dateEnv) {
        var ranges = [];
        for (var _i = 0, _a = dayTableModel.headerDates; _i < _a.length;
_i++) {
            var date = _a[_i];
            ranges.push({
                start: dateEnv.add(date, dateProfile.slotMinTime),
                end: dateEnv.add(date, dateProfile.slotMaxTime),
            });
        }
        return ranges;
    }

    // potential nice values for the slot-duration and interval-duration
    // from largest to smallest
    var STOCK_SUB_DURATIONS = [
        { hours: 1 },
        { minutes: 30 },
        { minutes: 15 },
        { seconds: 30 },
        { seconds: 15 },
    ];
    function buildSlatMetas(slotMinTime, slotMaxTime,
explicitLabelInterval, slotDuration, dateEnv) {
        var dayStart = new Date(0);
        var slatTime = slotMinTime;
        var slatIterator = createDuration(0);
        var labelInterval = explicitLabelInterval ||
computeLabelInterval(slotDuration);
        var metas = [];
        while (asRoughMs(slatTime) < asRoughMs(slotMaxTime)) {
            var date = dateEnv.add(dayStart, slatTime);
            var isLabeled = wholeDivideDurations(slatIterator,
labelInterval) !== null;
            metas.push({
                date: date,
                time: slatTime,
                key: date.toISOString(),
                isoTimeStr: formatIsoTimeString(date),
                isLabeled: isLabeled,
            });
            slatTime = addDurations(slatTime, slotDuration);
            slatIterator = addDurations(slatIterator, slotDuration);
        }
        return metas;
    }
    // Computes an automatic value for slotLabelInterval
    function computeLabelInterval(slotDuration) {
        var i;
        var labelInterval;
        var slotsPerLabel;
        // find the smallest stock label interval that results in more than
one slots-per-label
        for (i = STOCK_SUB_DURATIONS.length - 1; i >= 0; i -= 1) {
            labelInterval = createDuration(STOCK_SUB_DURATIONS[i]);
            slotsPerLabel = wholeDivideDurations(labelInterval,
slotDuration);
            if (slotsPerLabel !== null && slotsPerLabel > 1) {
                return labelInterval;
            }
        }
        return slotDuration; // fall back
    }

    var DayTimeColsView = /** @class */ (function (_super) {
        __extends(DayTimeColsView, _super);
        function DayTimeColsView() {
            var _this = _super !== null && _super.apply(this,
arguments) || this;
            _this.buildTimeColsModel = memoize(buildTimeColsModel);
            _this.buildSlatMetas = memoize(buildSlatMetas);
            return _this;
        }
        DayTimeColsView.prototype.render = function () {
            var _this = this;
            var _a = this.context, options = _a.options, dateEnv =
_a.dateEnv, dateProfileGenerator = _a.dateProfileGenerator;
            var props = this.props;
            var dateProfile = props.dateProfile;
            var dayTableModel = this.buildTimeColsModel(dateProfile,
dateProfileGenerator);
            var splitProps = this.allDaySplitter.splitProps(props);
            var slatMetas = this.buildSlatMetas(dateProfile.slotMinTime,
dateProfile.slotMaxTime, options.slotLabelInterval, options.slotDuration,
dateEnv);
            var dayMinWidth = options.dayMinWidth;
            var hasAttachedAxis = !dayMinWidth;
            var hasDetachedAxis = dayMinWidth;
            var headerContent = options.dayHeaders &&
(createElement(DayHeader, { dates: dayTableModel.headerDates, dateProfile:
dateProfile, datesRepDistinctDays: true, renderIntro: hasAttachedAxis ?
this.renderHeadAxis : null }));
            var allDayContent = (options.allDaySlot !== false) &&
(function (contentArg) { return (createElement(DayTable, __assign({},
splitProps.allDay, { dateProfile: dateProfile, dayTableModel:
dayTableModel, nextDayThreshold: options.nextDayThreshold, tableMinWidth:
contentArg.tableMinWidth, colGroupNode: contentArg.tableColGroupNode,
renderRowIntro: hasAttachedAxis ? _this.renderTableRowAxis : null,
showWeekNumbers: false, expandRows: false, headerAlignElRef:
_this.headerElRef, clientWidth: contentArg.clientWidth, clientHeight:
contentArg.clientHeight, forPrint: props.forPrint },
_this.getAllDayMaxEventProps()))); });
            var timeGridContent = function (contentArg) { return
(createElement(DayTimeCols, __assign({}, splitProps.timed, { dayTableModel:
dayTableModel, dateProfile: dateProfile, axis: hasAttachedAxis,
slotDuration: options.slotDuration, slatMetas: slatMetas, forPrint:
props.forPrint, tableColGroupNode: contentArg.tableColGroupNode,
tableMinWidth: contentArg.tableMinWidth, clientWidth:
contentArg.clientWidth, clientHeight: contentArg.clientHeight,
onSlatCoords: _this.handleSlatCoords, expandRows: contentArg.expandRows,
onScrollTopRequest: _this.handleScrollTopRequest }))); };
            return hasDetachedAxis
                ? this.renderHScrollLayout(headerContent, allDayContent,
timeGridContent, dayTableModel.colCnt, dayMinWidth, slatMetas,
this.state.slatCoords)
                : this.renderSimpleLayout(headerContent, allDayContent,
timeGridContent);
        };
        return DayTimeColsView;
    }(TimeColsView));
    function buildTimeColsModel(dateProfile, dateProfileGenerator) {
        var daySeries = new DaySeriesModel(dateProfile.renderRange,
dateProfileGenerator);
        return new DayTableModel(daySeries, false);
    }

    var OPTION_REFINERS$2 = {
        allDaySlot: Boolean,
    };

    var timeGridPlugin = createPlugin({
        initialView: 'timeGridWeek',
        optionRefiners: OPTION_REFINERS$2,
        views: {
            timeGrid: {
                component: DayTimeColsView,
                usesMinMaxTime: true,
                allDaySlot: true,
                slotDuration: '00:30:00',
                slotEventOverlap: true,
            },
            timeGridDay: {
                type: 'timeGrid',
                duration: { days: 1 },
            },
            timeGridWeek: {
                type: 'timeGrid',
                duration: { weeks: 1 },
            },
        },
    });

    var ListViewHeaderRow = /** @class */ (function (_super) {
        __extends(ListViewHeaderRow, _super);
        function ListViewHeaderRow() {
            return _super !== null && _super.apply(this, arguments)
|| this;
        }
        ListViewHeaderRow.prototype.render = function () {
            var _a = this.props, dayDate = _a.dayDate, todayRange =
_a.todayRange;
            var _b = this.context, theme = _b.theme, dateEnv = _b.dateEnv,
options = _b.options, viewApi = _b.viewApi;
            var dayMeta = getDateMeta(dayDate, todayRange);
            // will ever be falsy?
            var text = options.listDayFormat ? dateEnv.format(dayDate,
options.listDayFormat) : '';
            // will ever be falsy? also, BAD NAME "alt"
            var sideText = options.listDaySideFormat ?
dateEnv.format(dayDate, options.listDaySideFormat) : '';
            var navLinkData = options.navLinks
                ? buildNavLinkData(dayDate)
                : null;
            var hookProps = __assign({ date: dateEnv.toDate(dayDate), view:
viewApi, text: text,
                sideText: sideText,
                navLinkData: navLinkData }, dayMeta);
            var classNames =
['fc-list-day'].concat(getDayClassNames(dayMeta, theme));
            // TODO: make a reusable HOC for dayHeader (used in
daygrid/timegrid too)
            return (createElement(RenderHook, { hookProps: hookProps,
classNames: options.dayHeaderClassNames, content: options.dayHeaderContent,
defaultContent: renderInnerContent$4, didMount: options.dayHeaderDidMount,
willUnmount: options.dayHeaderWillUnmount }, function (rootElRef,
customClassNames, innerElRef, innerContent) { return
(createElement("tr", { ref: rootElRef, className:
classNames.concat(customClassNames).join(' '),
"data-date": formatDayString(dayDate) },
                createElement("th", { colSpan: 3 },
                    createElement("div", { className:
'fc-list-day-cushion ' +
theme.getClass('tableCellShaded'), ref: innerElRef },
innerContent)))); }));
        };
        return ListViewHeaderRow;
    }(BaseComponent));
    function renderInnerContent$4(props) {
        var navLinkAttrs = props.navLinkData // is there a type for this?
            ? { 'data-navlink': props.navLinkData, tabIndex: 0 }
            : {};
        return (createElement(Fragment, null,
            props.text && (createElement("a", __assign({
className: "fc-list-day-text" }, navLinkAttrs), props.text)),
            props.sideText && (createElement("a",
__assign({ className: "fc-list-day-side-text" }, navLinkAttrs),
props.sideText))));
    }

    var DEFAULT_TIME_FORMAT$1 = createFormatter({
        hour: 'numeric',
        minute: '2-digit',
        meridiem: 'short',
    });
    var ListViewEventRow = /** @class */ (function (_super) {
        __extends(ListViewEventRow, _super);
        function ListViewEventRow() {
            return _super !== null && _super.apply(this, arguments)
|| this;
        }
        ListViewEventRow.prototype.render = function () {
            var _a = this, props = _a.props, context = _a.context;
            var seg = props.seg;
            var timeFormat = context.options.eventTimeFormat ||
DEFAULT_TIME_FORMAT$1;
            return (createElement(EventRoot, { seg: seg, timeText:
"" // BAD. because of all-day content
                , disableDragging: true, disableResizing: true,
defaultContent: renderEventInnerContent, isPast: props.isPast, isFuture:
props.isFuture, isToday: props.isToday, isSelected: props.isSelected,
isDragging: props.isDragging, isResizing: props.isResizing,
isDateSelecting: props.isDateSelecting }, function (rootElRef, classNames,
innerElRef, innerContent, hookProps) { return
(createElement("tr", { className: ['fc-list-event',
hookProps.event.url ? 'fc-event-forced-url' :
''].concat(classNames).join(' '), ref: rootElRef },
                buildTimeContent(seg, timeFormat, context),
                createElement("td", { className:
"fc-list-event-graphic" },
                    createElement("span", { className:
"fc-list-event-dot", style: { borderColor: hookProps.borderColor
|| hookProps.backgroundColor } })),
                createElement("td", { className:
"fc-list-event-title", ref: innerElRef }, innerContent))); }));
        };
        return ListViewEventRow;
    }(BaseComponent));
    function renderEventInnerContent(props) {
        var event = props.event;
        var url = event.url;
        var anchorAttrs = url ? { href: url } : {};
        return (createElement("a", __assign({}, anchorAttrs),
event.title));
    }
    function buildTimeContent(seg, timeFormat, context) {
        var options = context.options;
        if (options.displayEventTime !== false) {
            var eventDef = seg.eventRange.def;
            var eventInstance = seg.eventRange.instance;
            var doAllDay = false;
            var timeText = void 0;
            if (eventDef.allDay) {
                doAllDay = true;
            }
            else if (isMultiDayRange(seg.eventRange.range)) { // TODO: use
(!isStart || !isEnd) instead?
                if (seg.isStart) {
                    timeText = buildSegTimeText(seg, timeFormat, context,
null, null, eventInstance.range.start, seg.end);
                }
                else if (seg.isEnd) {
                    timeText = buildSegTimeText(seg, timeFormat, context,
null, null, seg.start, eventInstance.range.end);
                }
                else {
                    doAllDay = true;
                }
            }
            else {
                timeText = buildSegTimeText(seg, timeFormat, context);
            }
            if (doAllDay) {
                var hookProps = {
                    text: context.options.allDayText,
                    view: context.viewApi,
                };
                return (createElement(RenderHook, { hookProps: hookProps,
classNames: options.allDayClassNames, content: options.allDayContent,
defaultContent: renderAllDayInner$1, didMount: options.allDayDidMount,
willUnmount: options.allDayWillUnmount }, function (rootElRef, classNames,
innerElRef, innerContent) { return (createElement("td", {
className: ['fc-list-event-time'].concat(classNames).join('
'), ref: rootElRef }, innerContent)); }));
            }
            return (createElement("td", { className:
"fc-list-event-time" }, timeText));
        }
        return null;
    }
    function renderAllDayInner$1(hookProps) {
        return hookProps.text;
    }

    /*
    Responsible for the scroller, and forwarding event-related actions into
the "grid".
    */
    var ListView = /** @class */ (function (_super) {
        __extends(ListView, _super);
        function ListView() {
            var _this = _super !== null && _super.apply(this,
arguments) || this;
            _this.computeDateVars = memoize(computeDateVars);
            _this.eventStoreToSegs = memoize(_this._eventStoreToSegs);
            _this.setRootEl = function (rootEl) {
                if (rootEl) {
                    _this.context.registerInteractiveComponent(_this, {
                        el: rootEl,
                    });
                }
                else {
                    _this.context.unregisterInteractiveComponent(_this);
                }
            };
            return _this;
        }
        ListView.prototype.render = function () {
            var _this = this;
            var _a = this, props = _a.props, context = _a.context;
            var extraClassNames = [
                'fc-list',
                context.theme.getClass('table'),
                context.options.stickyHeaderDates !== false ?
'fc-list-sticky' : '',
            ];
            var _b = this.computeDateVars(props.dateProfile), dayDates =
_b.dayDates, dayRanges = _b.dayRanges;
            var eventSegs = this.eventStoreToSegs(props.eventStore,
props.eventUiBases, dayRanges);
            return (createElement(ViewRoot, { viewSpec: context.viewSpec,
elRef: this.setRootEl }, function (rootElRef, classNames) { return
(createElement("div", { ref: rootElRef, className:
extraClassNames.concat(classNames).join(' ') },
                createElement(Scroller, { liquid: !props.isHeightAuto,
overflowX: props.isHeightAuto ? 'visible' : 'hidden',
overflowY: props.isHeightAuto ? 'visible' : 'auto' },
eventSegs.length > 0 ?
                    _this.renderSegList(eventSegs, dayDates) :
                    _this.renderEmptyMessage()))); }));
        };
        ListView.prototype.renderEmptyMessage = function () {
            var _a = this.context, options = _a.options, viewApi =
_a.viewApi;
            var hookProps = {
                text: options.noEventsText,
                view: viewApi,
            };
            return (createElement(RenderHook, { hookProps: hookProps,
classNames: options.noEventsClassNames, content: options.noEventsContent,
defaultContent: renderNoEventsInner, didMount: options.noEventsDidMount,
willUnmount: options.noEventsWillUnmount }, function (rootElRef,
classNames, innerElRef, innerContent) { return
(createElement("div", { className:
['fc-list-empty'].concat(classNames).join(' '), ref:
rootElRef },
                createElement("div", { className:
"fc-list-empty-cushion", ref: innerElRef }, innerContent))); }));
        };
        ListView.prototype.renderSegList = function (allSegs, dayDates) {
            var _a = this.context, theme = _a.theme, options = _a.options;
            var segsByDay = groupSegsByDay(allSegs); // sparse array
            return (createElement(NowTimer, { unit: "day" },
function (nowDate, todayRange) {
                var innerNodes = [];
                for (var dayIndex = 0; dayIndex < segsByDay.length;
dayIndex += 1) {
                    var daySegs = segsByDay[dayIndex];
                    if (daySegs) { // sparse array, so might be undefined
                        var dayStr = dayDates[dayIndex].toISOString();
                        // append a day header
                        innerNodes.push(createElement(ListViewHeaderRow, {
key: dayStr, dayDate: dayDates[dayIndex], todayRange: todayRange }));
                        daySegs = sortEventSegs(daySegs,
options.eventOrder);
                        for (var _i = 0, daySegs_1 = daySegs; _i <
daySegs_1.length; _i++) {
                            var seg = daySegs_1[_i];
                            innerNodes.push(createElement(ListViewEventRow,
__assign({ key: dayStr + ':' + seg.eventRange.instance.instanceId
/* are multiple segs for an instanceId */, seg: seg, isDragging: false,
isResizing: false, isDateSelecting: false, isSelected: false },
getSegMeta(seg, todayRange, nowDate))));
                        }
                    }
                }
                return (createElement("table", { className:
'fc-list-table ' + theme.getClass('table') },
                    createElement("tbody", null, innerNodes)));
            }));
        };
        ListView.prototype._eventStoreToSegs = function (eventStore,
eventUiBases, dayRanges) {
            return this.eventRangesToSegs(sliceEventStore(eventStore,
eventUiBases, this.props.dateProfile.activeRange,
this.context.options.nextDayThreshold).fg, dayRanges);
        };
        ListView.prototype.eventRangesToSegs = function (eventRanges,
dayRanges) {
            var segs = [];
            for (var _i = 0, eventRanges_1 = eventRanges; _i <
eventRanges_1.length; _i++) {
                var eventRange = eventRanges_1[_i];
                segs.push.apply(segs, this.eventRangeToSegs(eventRange,
dayRanges));
            }
            return segs;
        };
        ListView.prototype.eventRangeToSegs = function (eventRange,
dayRanges) {
            var dateEnv = this.context.dateEnv;
            var nextDayThreshold = this.context.options.nextDayThreshold;
            var range = eventRange.range;
            var allDay = eventRange.def.allDay;
            var dayIndex;
            var segRange;
            var seg;
            var segs = [];
            for (dayIndex = 0; dayIndex < dayRanges.length; dayIndex +=
1) {
                segRange = intersectRanges(range, dayRanges[dayIndex]);
                if (segRange) {
                    seg = {
                        component: this,
                        eventRange: eventRange,
                        start: segRange.start,
                        end: segRange.end,
                        isStart: eventRange.isStart &&
segRange.start.valueOf() === range.start.valueOf(),
                        isEnd: eventRange.isEnd &&
segRange.end.valueOf() === range.end.valueOf(),
                        dayIndex: dayIndex,
                    };
                    segs.push(seg);
                    // detect when range won't go fully into the next
day,
                    // and mutate the latest seg to the be the end.
                    if (!seg.isEnd && !allDay &&
                        dayIndex + 1 < dayRanges.length &&
                        range.end <
                            dateEnv.add(dayRanges[dayIndex + 1].start,
nextDayThreshold)) {
                        seg.end = range.end;
                        seg.isEnd = true;
                        break;
                    }
                }
            }
            return segs;
        };
        return ListView;
    }(DateComponent));
    function renderNoEventsInner(hookProps) {
        return hookProps.text;
    }
    function computeDateVars(dateProfile) {
        var dayStart = startOfDay(dateProfile.renderRange.start);
        var viewEnd = dateProfile.renderRange.end;
        var dayDates = [];
        var dayRanges = [];
        while (dayStart < viewEnd) {
            dayDates.push(dayStart);
            dayRanges.push({
                start: dayStart,
                end: addDays(dayStart, 1),
            });
            dayStart = addDays(dayStart, 1);
        }
        return { dayDates: dayDates, dayRanges: dayRanges };
    }
    // Returns a sparse array of arrays, segs grouped by their dayIndex
    function groupSegsByDay(segs) {
        var segsByDay = []; // sparse array
        var i;
        var seg;
        for (i = 0; i < segs.length; i += 1) {
            seg = segs[i];
            (segsByDay[seg.dayIndex] || (segsByDay[seg.dayIndex] = []))
                .push(seg);
        }
        return segsByDay;
    }

    var OPTION_REFINERS$3 = {
        listDayFormat: createFalsableFormatter,
        listDaySideFormat: createFalsableFormatter,
        noEventsClassNames: identity,
        noEventsContent: identity,
        noEventsDidMount: identity,
        noEventsWillUnmount: identity,
    };
    function createFalsableFormatter(input) {
        return input === false ? null : createFormatter(input);
    }

    var listPlugin = createPlugin({
        optionRefiners: OPTION_REFINERS$3,
        views: {
            list: {
                component: ListView,
                buttonTextKey: 'list',
                listDayFormat: { month: 'long', day:
'numeric', year: 'numeric' },
            },
            listDay: {
                type: 'list',
                duration: { days: 1 },
                listDayFormat: { weekday: 'long' },
            },
            listWeek: {
                type: 'list',
                duration: { weeks: 1 },
                listDayFormat: { weekday: 'long' },
                listDaySideFormat: { month: 'long', day:
'numeric', year: 'numeric' },
            },
            listMonth: {
                type: 'list',
                duration: { month: 1 },
                listDaySideFormat: { weekday: 'long' },
            },
            listYear: {
                type: 'list',
                duration: { year: 1 },
                listDaySideFormat: { weekday: 'long' },
            },
        },
    });

    var BootstrapTheme = /** @class */ (function (_super) {
        __extends(BootstrapTheme, _super);
        function BootstrapTheme() {
            return _super !== null && _super.apply(this, arguments)
|| this;
        }
        return BootstrapTheme;
    }(Theme));
    BootstrapTheme.prototype.classes = {
        root: 'fc-theme-bootstrap',
        table: 'table-bordered',
        tableCellShaded: 'table-active',
        buttonGroup: 'btn-group',
        button: 'btn btn-primary',
        buttonActive: 'active',
        popover: 'popover',
        popoverHeader: 'popover-header',
        popoverContent: 'popover-body',
    };
    BootstrapTheme.prototype.baseIconClass = 'fa';
    BootstrapTheme.prototype.iconClasses = {
        close: 'fa-times',
        prev: 'fa-chevron-left',
        next: 'fa-chevron-right',
        prevYear: 'fa-angle-double-left',
        nextYear: 'fa-angle-double-right',
    };
    BootstrapTheme.prototype.rtlIconClasses = {
        prev: 'fa-chevron-right',
        next: 'fa-chevron-left',
        prevYear: 'fa-angle-double-right',
        nextYear: 'fa-angle-double-left',
    };
    BootstrapTheme.prototype.iconOverrideOption =
'bootstrapFontAwesome'; // TODO: make TS-friendly. move the
option-processing into this plugin
    BootstrapTheme.prototype.iconOverrideCustomButtonOption =
'bootstrapFontAwesome';
    BootstrapTheme.prototype.iconOverridePrefix = 'fa-';
    var plugin = createPlugin({
        themeClasses: {
            bootstrap: BootstrapTheme,
        },
    });

    // rename this file to options.ts like other packages?
    var OPTION_REFINERS$4 = {
        googleCalendarApiKey: String,
    };

    var EVENT_SOURCE_REFINERS$1 = {
        googleCalendarApiKey: String,
        googleCalendarId: String,
        googleCalendarApiBase: String,
        extraParams: identity,
    };

    // TODO: expose somehow
    var API_BASE =
'https://www.googleapis.com/calendar/v3/calendars';
    var eventSourceDef$3 = {
        parseMeta: function (refined) {
            var googleCalendarId = refined.googleCalendarId;
            if (!googleCalendarId && refined.url) {
                googleCalendarId = parseGoogleCalendarId(refined.url);
            }
            if (googleCalendarId) {
                return {
                    googleCalendarId: googleCalendarId,
                    googleCalendarApiKey: refined.googleCalendarApiKey,
                    googleCalendarApiBase: refined.googleCalendarApiBase,
                    extraParams: refined.extraParams,
                };
            }
            return null;
        },
        fetch: function (arg, onSuccess, onFailure) {
            var _a = arg.context, dateEnv = _a.dateEnv, options =
_a.options;
            var meta = arg.eventSource.meta;
            var apiKey = meta.googleCalendarApiKey ||
options.googleCalendarApiKey;
            if (!apiKey) {
                onFailure({
                    message: 'Specify a googleCalendarApiKey. See
http://fullcalendar.io/docs/google_calendar/',
                });
            }
            else {
                var url = buildUrl(meta);
                // TODO: make DRY with json-feed-event-source
                var extraParams = meta.extraParams;
                var extraParamsObj = typeof extraParams ===
'function' ? extraParams() : extraParams;
                var requestParams_1 = buildRequestParams$1(arg.range,
apiKey, extraParamsObj, dateEnv);
                requestJson('GET', url, requestParams_1, function
(body, xhr) {
                    if (body.error) {
                        onFailure({
                            message: 'Google Calendar API: ' +
body.error.message,
                            errors: body.error.errors,
                            xhr: xhr,
                        });
                    }
                    else {
                        onSuccess({
                            rawEvents: gcalItemsToRawEventDefs(body.items,
requestParams_1.timeZone),
                            xhr: xhr,
                        });
                    }
                }, function (message, xhr) {
                    onFailure({ message: message, xhr: xhr });
                });
            }
        },
    };
    function parseGoogleCalendarId(url) {
        var match;
        // detect if the ID was specified as a single string.
        // will match calendars like
"asdf1234@calendar.google.com" in addition to person email
calendars.
        if (/^[^/]+@([^/.]+\.)*(google|googlemail|gmail)\.com$/.test(url))
{
            return url;
        }
        if ((match =
/^https:\/\/www.googleapis.com\/calendar\/v3\/calendars\/([^/]*)/.exec(url))
||
            (match =
/^https?:\/\/www.google.com\/calendar\/feeds\/([^/]*)/.exec(url))) {
            return decodeURIComponent(match[1]);
        }
        return null;
    }
    function buildUrl(meta) {
        var apiBase = meta.googleCalendarApiBase;
        if (!apiBase) {
            apiBase = API_BASE;
        }
        return apiBase + '/' +
encodeURIComponent(meta.googleCalendarId) + '/events';
    }
    function buildRequestParams$1(range, apiKey, extraParams, dateEnv) {
        var params;
        var startStr;
        var endStr;
        if (dateEnv.canComputeOffset) {
            // strings will naturally have offsets, which GCal needs
            startStr = dateEnv.formatIso(range.start);
            endStr = dateEnv.formatIso(range.end);
        }
        else {
            // when timezone isn't known, we don't know what the
UTC offset should be, so ask for +/- 1 day
            // from the UTC day-start to guarantee we're getting all
the events
            // (start/end will be UTC-coerced dates, so toISOString is
okay)
            startStr = addDays(range.start, -1).toISOString();
            endStr = addDays(range.end, 1).toISOString();
        }
        params = __assign(__assign({}, (extraParams || {})), { key: apiKey,
timeMin: startStr, timeMax: endStr, singleEvents: true, maxResults: 9999
});
        if (dateEnv.timeZone !== 'local') {
            params.timeZone = dateEnv.timeZone;
        }
        return params;
    }
    function gcalItemsToRawEventDefs(items, gcalTimezone) {
        return items.map(function (item) { return
gcalItemToRawEventDef(item, gcalTimezone); });
    }
    function gcalItemToRawEventDef(item, gcalTimezone) {
        var url = item.htmlLink || null;
        // make the URLs for each event show times in the correct timezone
        if (url && gcalTimezone) {
            url = injectQsComponent(url, 'ctz=' + gcalTimezone);
        }
        return {
            id: item.id,
            title: item.summary,
            start: item.start.dateTime || item.start.date,
            end: item.end.dateTime || item.end.date,
            url: url,
            location: item.location,
            description: item.description,
        };
    }
    // Injects a string like "arg=value" into the querystring of
a URL
    // TODO: move to a general util file?
    function injectQsComponent(url, component) {
        // inject it after the querystring but before the fragment
        return url.replace(/(\?.*?)?(#|$)/, function (whole, qs, hash) {
return (qs ? qs + '&' : '?') + component + hash;
});
    }
    var googleCalendarPlugin = createPlugin({
        eventSourceDefs: [eventSourceDef$3],
        optionRefiners: OPTION_REFINERS$4,
        eventSourceRefiners: EVENT_SOURCE_REFINERS$1,
    });

    globalPlugins.push(interactionPlugin, dayGridPlugin, timeGridPlugin,
listPlugin, plugin, googleCalendarPlugin);

    exports.BASE_OPTION_DEFAULTS = BASE_OPTION_DEFAULTS;
    exports.BASE_OPTION_REFINERS = BASE_OPTION_REFINERS;
    exports.BaseComponent = BaseComponent;
    exports.BgEvent = BgEvent;
    exports.BootstrapTheme = BootstrapTheme;
    exports.Calendar = Calendar;
    exports.CalendarApi = CalendarApi;
    exports.CalendarContent = CalendarContent;
    exports.CalendarDataManager = CalendarDataManager;
    exports.CalendarDataProvider = CalendarDataProvider;
    exports.CalendarRoot = CalendarRoot;
    exports.Component = Component;
    exports.ContentHook = ContentHook;
    exports.CustomContentRenderContext = CustomContentRenderContext;
    exports.DateComponent = DateComponent;
    exports.DateEnv = DateEnv;
    exports.DateProfileGenerator = DateProfileGenerator;
    exports.DayCellContent = DayCellContent;
    exports.DayCellRoot = DayCellRoot;
    exports.DayGridView = DayTableView;
    exports.DayHeader = DayHeader;
    exports.DaySeriesModel = DaySeriesModel;
    exports.DayTable = DayTable;
    exports.DayTableModel = DayTableModel;
    exports.DayTableSlicer = DayTableSlicer;
    exports.DayTimeCols = DayTimeCols;
    exports.DayTimeColsSlicer = DayTimeColsSlicer;
    exports.DayTimeColsView = DayTimeColsView;
    exports.DelayedRunner = DelayedRunner;
    exports.Draggable = ExternalDraggable;
    exports.ElementDragging = ElementDragging;
    exports.ElementScrollController = ElementScrollController;
    exports.Emitter = Emitter;
    exports.EventApi = EventApi;
    exports.EventRoot = EventRoot;
    exports.EventSourceApi = EventSourceApi;
    exports.FeaturefulElementDragging = FeaturefulElementDragging;
    exports.Fragment = Fragment;
    exports.Interaction = Interaction;
    exports.ListView = ListView;
    exports.MountHook = MountHook;
    exports.NamedTimeZoneImpl = NamedTimeZoneImpl;
    exports.NowIndicatorRoot = NowIndicatorRoot;
    exports.NowTimer = NowTimer;
    exports.PointerDragging = PointerDragging;
    exports.PositionCache = PositionCache;
    exports.RefMap = RefMap;
    exports.RenderHook = RenderHook;
    exports.ScrollController = ScrollController;
    exports.ScrollResponder = ScrollResponder;
    exports.Scroller = Scroller;
    exports.SimpleScrollGrid = SimpleScrollGrid;
    exports.Slicer = Slicer;
    exports.Splitter = Splitter;
    exports.StandardEvent = StandardEvent;
    exports.Table = Table;
    exports.TableDateCell = TableDateCell;
    exports.TableDowCell = TableDowCell;
    exports.TableView = TableView;
    exports.Theme = Theme;
    exports.ThirdPartyDraggable = ThirdPartyDraggable;
    exports.TimeCols = TimeCols;
    exports.TimeColsSlatsCoords = TimeColsSlatsCoords;
    exports.TimeColsView = TimeColsView;
    exports.ViewApi = ViewApi;
    exports.ViewContextType = ViewContextType;
    exports.ViewRoot = ViewRoot;
    exports.WeekNumberRoot = WeekNumberRoot;
    exports.WindowScrollController = WindowScrollController;
    exports.addDays = addDays;
    exports.addDurations = addDurations;
    exports.addMs = addMs;
    exports.addWeeks = addWeeks;
    exports.allowContextMenu = allowContextMenu;
    exports.allowSelection = allowSelection;
    exports.applyMutationToEventStore = applyMutationToEventStore;
    exports.applyStyle = applyStyle;
    exports.applyStyleProp = applyStyleProp;
    exports.asCleanDays = asCleanDays;
    exports.asRoughMinutes = asRoughMinutes;
    exports.asRoughMs = asRoughMs;
    exports.asRoughSeconds = asRoughSeconds;
    exports.buildClassNameNormalizer = buildClassNameNormalizer;
    exports.buildDayRanges = buildDayRanges;
    exports.buildDayTableModel = buildDayTableModel;
    exports.buildEventApis = buildEventApis;
    exports.buildEventRangeKey = buildEventRangeKey;
    exports.buildHashFromArray = buildHashFromArray;
    exports.buildNavLinkData = buildNavLinkData;
    exports.buildSegCompareObj = buildSegCompareObj;
    exports.buildSegTimeText = buildSegTimeText;
    exports.buildSlatMetas = buildSlatMetas;
    exports.buildTimeColsModel = buildTimeColsModel;
    exports.collectFromHash = collectFromHash;
    exports.combineEventUis = combineEventUis;
    exports.compareByFieldSpec = compareByFieldSpec;
    exports.compareByFieldSpecs = compareByFieldSpecs;
    exports.compareNumbers = compareNumbers;
    exports.compareObjs = compareObjs;
    exports.computeEdges = computeEdges;
    exports.computeFallbackHeaderFormat = computeFallbackHeaderFormat;
    exports.computeHeightAndMargins = computeHeightAndMargins;
    exports.computeInnerRect = computeInnerRect;
    exports.computeRect = computeRect;
    exports.computeSegDraggable = computeSegDraggable;
    exports.computeSegEndResizable = computeSegEndResizable;
    exports.computeSegStartResizable = computeSegStartResizable;
    exports.computeShrinkWidth = computeShrinkWidth;
    exports.computeSmallestCellWidth = computeSmallestCellWidth;
    exports.computeVisibleDayRange = computeVisibleDayRange;
    exports.config = config;
    exports.constrainPoint = constrainPoint;
    exports.createContext = createContext$1;
    exports.createDuration = createDuration;
    exports.createElement = createElement;
    exports.createEmptyEventStore = createEmptyEventStore;
    exports.createEventInstance = createEventInstance;
    exports.createEventUi = createEventUi;
    exports.createFormatter = createFormatter;
    exports.createPlugin = createPlugin;
    exports.createRef = createRef;
    exports.diffDates = diffDates;
    exports.diffDayAndTime = diffDayAndTime;
    exports.diffDays = diffDays;
    exports.diffPoints = diffPoints;
    exports.diffWeeks = diffWeeks;
    exports.diffWholeDays = diffWholeDays;
    exports.diffWholeWeeks = diffWholeWeeks;
    exports.disableCursor = disableCursor;
    exports.elementClosest = elementClosest;
    exports.elementMatches = elementMatches;
    exports.enableCursor = enableCursor;
    exports.eventTupleToStore = eventTupleToStore;
    exports.filterEventStoreDefs = filterEventStoreDefs;
    exports.filterHash = filterHash;
    exports.findDirectChildren = findDirectChildren;
    exports.findElements = findElements;
    exports.flexibleCompare = flexibleCompare;
    exports.flushToDom = flushToDom$1;
    exports.formatDate = formatDate;
    exports.formatDayString = formatDayString;
    exports.formatIsoTimeString = formatIsoTimeString;
    exports.formatRange = formatRange;
    exports.getAllowYScrolling = getAllowYScrolling;
    exports.getCanVGrowWithinCell = getCanVGrowWithinCell;
    exports.getClippingParents = getClippingParents;
    exports.getDateMeta = getDateMeta;
    exports.getDayClassNames = getDayClassNames;
    exports.getDefaultEventEnd = getDefaultEventEnd;
    exports.getElSeg = getElSeg;
    exports.getEventClassNames = getEventClassNames;
    exports.getIsRtlScrollbarOnLeft = getIsRtlScrollbarOnLeft;
    exports.getRectCenter = getRectCenter;
    exports.getRelevantEvents = getRelevantEvents;
    exports.getScrollGridClassNames = getScrollGridClassNames;
    exports.getScrollbarWidths = getScrollbarWidths;
    exports.getSectionClassNames = getSectionClassNames;
    exports.getSectionHasLiquidHeight = getSectionHasLiquidHeight;
    exports.getSegMeta = getSegMeta;
    exports.getSlotClassNames = getSlotClassNames;
    exports.getStickyFooterScrollbar = getStickyFooterScrollbar;
    exports.getStickyHeaderDates = getStickyHeaderDates;
    exports.getUnequalProps = getUnequalProps;
    exports.globalLocales = globalLocales;
    exports.globalPlugins = globalPlugins;
    exports.greatestDurationDenominator = greatestDurationDenominator;
    exports.guid = guid;
    exports.hasBgRendering = hasBgRendering;
    exports.hasShrinkWidth = hasShrinkWidth;
    exports.identity = identity;
    exports.interactionSettingsStore = interactionSettingsStore;
    exports.interactionSettingsToStore = interactionSettingsToStore;
    exports.intersectRanges = intersectRanges;
    exports.intersectRects = intersectRects;
    exports.isArraysEqual = isArraysEqual;
    exports.isColPropsEqual = isColPropsEqual;
    exports.isDateSpansEqual = isDateSpansEqual;
    exports.isInt = isInt;
    exports.isInteractionValid = isInteractionValid;
    exports.isMultiDayRange = isMultiDayRange;
    exports.isPropsEqual = isPropsEqual;
    exports.isPropsValid = isPropsValid;
    exports.isValidDate = isValidDate;
    exports.listenBySelector = listenBySelector;
    exports.mapHash = mapHash;
    exports.memoize = memoize;
    exports.memoizeArraylike = memoizeArraylike;
    exports.memoizeHashlike = memoizeHashlike;
    exports.memoizeObjArg = memoizeObjArg;
    exports.mergeEventStores = mergeEventStores;
    exports.multiplyDuration = multiplyDuration;
    exports.padStart = padStart;
    exports.parseBusinessHours = parseBusinessHours;
    exports.parseClassNames = parseClassNames;
    exports.parseDragMeta = parseDragMeta;
    exports.parseEventDef = parseEventDef;
    exports.parseFieldSpecs = parseFieldSpecs;
    exports.parseMarker = parse;
    exports.pointInsideRect = pointInsideRect;
    exports.preventContextMenu = preventContextMenu;
    exports.preventDefault = preventDefault;
    exports.preventSelection = preventSelection;
    exports.rangeContainsMarker = rangeContainsMarker;
    exports.rangeContainsRange = rangeContainsRange;
    exports.rangesEqual = rangesEqual;
    exports.rangesIntersect = rangesIntersect;
    exports.refineEventDef = refineEventDef;
    exports.refineProps = refineProps;
    exports.removeElement = removeElement;
    exports.removeExact = removeExact;
    exports.render = render;
    exports.renderChunkContent = renderChunkContent;
    exports.renderFill = renderFill;
    exports.renderMicroColGroup = renderMicroColGroup;
    exports.renderScrollShim = renderScrollShim;
    exports.requestJson = requestJson;
    exports.sanitizeShrinkWidth = sanitizeShrinkWidth;
    exports.setElSeg = setElSeg;
    exports.setRef = setRef;
    exports.sliceEventStore = sliceEventStore;
    exports.sliceEvents = sliceEvents;
    exports.sortEventSegs = sortEventSegs;
    exports.startOfDay = startOfDay;
    exports.translateRect = translateRect;
    exports.triggerDateSelect = triggerDateSelect;
    exports.unmountComponentAtNode = unmountComponentAtNode$1;
    exports.unpromisify = unpromisify;
    exports.version = version;
    exports.whenTransitionDone = whenTransitionDone;
    exports.wholeDivideDurations = wholeDivideDurations;

    Object.defineProperty(exports, '__esModule', { value: true
});

    return exports;

}({}));
PK,�[�#o,,images/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK,�[h�g�""js/appointment.jsnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		appointment.js
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

 
PK,�[I�~1js/bbbclass.jsnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		bbbclass.js
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

 
PK,�[40oO
js/capital.jsnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		capital.js
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

 
PK,�[1��J
js/comment.jsnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		comment.js
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

 
PK,�[�A_�!!js/consultant.jsnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		consultant.js
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

 
PK,�[Ⱦ�js/doctor.jsnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		doctor.js
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/




/***[JCBGUI.admin_view.javascript_view_file.121.$$$$]***/
jQuery(document).ready(function($){

   var gettoken= Joomla.getOptions('token');


   $('select#jform_capitalid').change(function () {

      var capitalid= $(this).val();
      var token= gettoken;

      $.ajax({
         url: 'index.php?option=com_reservation',
         method: 'post',
         dataType: 'json',
         data: {[token] : '1',task:'ajax.getCity',
format: 'json' , raw: 'true' , capitalid: capitalid},
         success: function (msg) {

            var temp='<option value="">Select an
option</option>';
            msg.each(function(value, index){

               temp += '<option
value="'+value.id+'">'+value.name+'</option>';

            });

            $('select#jform_cityid').html(temp);
            $( "select#jform_cityid" ).trigger(
"liszt:updated" );
         },
         error: function (err) {
            console.log(err);
         }
      });


   });


});/***[/JCBGUI$$$$]***/
 
PK,�[�#o,,
js/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK,�[3�-�
js/message.jsnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		message.js
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

 
PK,�[�]�
js/plan.jsnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		plan.js
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

 
PK,�[6q��
js/reserve.jsnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		reserve.js
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

 
PK,�[��1�
js/session.jsnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		session.js
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/

 
PK,�[n\t�
js/sick.jsnu�[���/*----------------------------------------------------------------------------------|
 www.vdm.io  |----/
				fdsh 
/-------------------------------------------------------------------------------------------------------/

	@version		1.0.39
	@build			4th April, 2023
	@created		17th December, 2020
	@package		Reservation
	@subpackage		sick.js
	@author			farhad shahbazi <http://farhad.com>	
	@copyright		Copyright (C) 2015. All Rights Reserved
	@license		GNU/GPL Version 2 or later -
http://www.gnu.org/licenses/gpl-2.0.html
  ____  _____  _____  __  __  __      __       ___  _____  __  __  ____ 
_____  _  _  ____  _  _  ____ 
 (_  _)(  _  )(  _  )(  \/  )(  )    /__\     / __)(  _  )(  \/  )(  _ \( 
_  )( \( )( ___)( \( )(_  _)
.-_)(   )(_)(  )(_)(  )    (  )(__  /(__)\   ( (__  )(_)(  )    (  )___/
)(_)(  )  (  )__)  )  (   )(  
\____) (_____)(_____)(_/\/\_)(____)(__)(__)   \___)(_____)(_/\/\_)(__) 
(_____)(_)\_)(____)(_)\_) (__) 

/------------------------------------------------------------------------------------------------------*/




/***[JCBGUI.admin_view.javascript_view_file.113.$$$$]***/
jQuery(document).ready(function($){

   var gettoken= Joomla.getOptions('token');
   var route= Joomla.getOptions('route');


   $('select#jform_capitalid').change(function () {

      var capitalid= $(this).val();
      var token= gettoken;

      $.ajax({
         url: route,
         method: 'post',
         dataType: 'json',
         data: {[token] : '1',task:'ajax.getCity',
format: 'json' , raw: 'true' , capitalid: capitalid},
         success: function (msg) {

            var temp='<option value="">Select an
option</option>';
            msg.each(function(value, index){

               temp += '<option
value="'+value.id+'">'+value.name+'</option>';

            });

            $('select#jform_cityid').html(temp);
            $( "select#jform_cityid" ).trigger(
"liszt:updated" );
         },
         error: function (err) {
            console.log(err);
         }
      });


   });


});/***[/JCBGUI$$$$]***/
 
PK,�[�#o,,pusher/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK,�[�#o,,pusher/js/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK,�[j'μ�pusher/js/pusher.min.jsnu�[���/*!
 * Pusher JavaScript Library v7.0.6
 * https://pusher.com/
 *
 * Copyright 2020, Pusher
 * Released under the MIT licence.
 */
!function(t,e){"object"==typeof
exports&&"object"==typeof
module?module.exports=e():"function"==typeof
define&&define.amd?define([],e):"object"==typeof
exports?exports.Pusher=e():t.Pusher=e()}(window,(function(){return
function(t){var e={};function n(o){if(e[o])return e[o].exports;var
r=e[o]={i:o,l:!1,exports:{}};return
t[o].call(r.exports,r,r.exports,n),r.l=!0,r.exports}return
n.m=t,n.c=e,n.d=function(t,e,o){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:o})},n.r=function(t){"undefined"!=typeof
Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return
t;if(4&e&&"object"==typeof
t&&t&&t.__esModule)return t;var
o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof
t)for(var r in t)n.d(o,r,function(e){return t[e]}.bind(null,r));return
o},n.n=function(t){var e=t&&t.__esModule?function(){return
t.default}:function(){return t};return
n.d(e,"a",e),e},n.o=function(t,e){return
Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=2)}([function(t,e,n){"use
strict";var
o,r=this&&this.__extends||(o=function(t,e){return(o=Object.setPrototypeOf||{__proto__:[]}instanceof
Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in
e)e.hasOwnProperty(n)&&(t[n]=e[n])})(t,e)},function(t,e){function
n(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new
n)});Object.defineProperty(e,"__esModule",{value:!0});var
i=function(){function t(t){void
0===t&&(t="="),this._paddingCharacter=t}return
t.prototype.encodedLength=function(t){return
this._paddingCharacter?(t+2)/3*4|0:(8*t+5)/6|0},t.prototype.encode=function(t){for(var
e="",n=0;n<t.length-2;n+=3){var
o=t[n]<<16|t[n+1]<<8|t[n+2];e+=this._encodeByte(o>>>18&63),e+=this._encodeByte(o>>>12&63),e+=this._encodeByte(o>>>6&63),e+=this._encodeByte(o>>>0&63)}var
r=t.length-n;if(r>0){o=t[n]<<16|(2===r?t[n+1]<<8:0);e+=this._encodeByte(o>>>18&63),e+=this._encodeByte(o>>>12&63),e+=2===r?this._encodeByte(o>>>6&63):this._paddingCharacter||"",e+=this._paddingCharacter||""}return
e},t.prototype.maxDecodedLength=function(t){return
this._paddingCharacter?t/4*3|0:(6*t+7)/8|0},t.prototype.decodedLength=function(t){return
this.maxDecodedLength(t.length-this._getPaddingLength(t))},t.prototype.decode=function(t){if(0===t.length)return
new Uint8Array(0);for(var e=this._getPaddingLength(t),n=t.length-e,o=new
Uint8Array(this.maxDecodedLength(n)),r=0,i=0,s=0,c=0,a=0,u=0,h=0;i<n-4;i+=4)c=this._decodeChar(t.charCodeAt(i+0)),a=this._decodeChar(t.charCodeAt(i+1)),u=this._decodeChar(t.charCodeAt(i+2)),h=this._decodeChar(t.charCodeAt(i+3)),o[r++]=c<<2|a>>>4,o[r++]=a<<4|u>>>2,o[r++]=u<<6|h,s|=256&c,s|=256&a,s|=256&u,s|=256&h;if(i<n-1&&(c=this._decodeChar(t.charCodeAt(i)),a=this._decodeChar(t.charCodeAt(i+1)),o[r++]=c<<2|a>>>4,s|=256&c,s|=256&a),i<n-2&&(u=this._decodeChar(t.charCodeAt(i+2)),o[r++]=a<<4|u>>>2,s|=256&u),i<n-3&&(h=this._decodeChar(t.charCodeAt(i+3)),o[r++]=u<<6|h,s|=256&h),0!==s)throw
new Error("Base64Coder: incorrect characters for
decoding");return o},t.prototype._encodeByte=function(t){var
e=t;return
e+=65,e+=25-t>>>8&6,e+=51-t>>>8&-75,e+=61-t>>>8&-15,e+=62-t>>>8&3,String.fromCharCode(e)},t.prototype._decodeChar=function(t){var
e=256;return
e+=(42-t&t-44)>>>8&-256+t-43+62,e+=(46-t&t-48)>>>8&-256+t-47+63,e+=(47-t&t-58)>>>8&-256+t-48+52,e+=(64-t&t-91)>>>8&-256+t-65+0,e+=(96-t&t-123)>>>8&-256+t-97+26},t.prototype._getPaddingLength=function(t){var
e=0;if(this._paddingCharacter){for(var
n=t.length-1;n>=0&&t[n]===this._paddingCharacter;n--)e++;if(t.length<4||e>2)throw
new Error("Base64Coder: incorrect padding")}return
e},t}();e.Coder=i;var s=new i;e.encode=function(t){return
s.encode(t)},e.decode=function(t){return s.decode(t)};var
c=function(t){function e(){return
null!==t&&t.apply(this,arguments)||this}return
r(e,t),e.prototype._encodeByte=function(t){var e=t;return
e+=65,e+=25-t>>>8&6,e+=51-t>>>8&-75,e+=61-t>>>8&-13,e+=62-t>>>8&49,String.fromCharCode(e)},e.prototype._decodeChar=function(t){var
e=256;return
e+=(44-t&t-46)>>>8&-256+t-45+62,e+=(94-t&t-96)>>>8&-256+t-95+63,e+=(47-t&t-58)>>>8&-256+t-48+52,e+=(64-t&t-91)>>>8&-256+t-65+0,e+=(96-t&t-123)>>>8&-256+t-97+26},e}(i);e.URLSafeCoder=c;var
a=new c;e.encodeURLSafe=function(t){return
a.encode(t)},e.decodeURLSafe=function(t){return
a.decode(t)},e.encodedLength=function(t){return
s.encodedLength(t)},e.maxDecodedLength=function(t){return
s.maxDecodedLength(t)},e.decodedLength=function(t){return
s.decodedLength(t)}},function(t,e,n){"use
strict";Object.defineProperty(e,"__esModule",{value:!0});var
o="utf8: invalid source encoding";function r(t){for(var
e=0,n=0;n<t.length;n++){var o=t.charCodeAt(n);if(o<128)e+=1;else
if(o<2048)e+=2;else if(o<55296)e+=3;else{if(!(o<=57343))throw new
Error("utf8: invalid string");if(n>=t.length-1)throw new
Error("utf8: invalid string");n++,e+=4}}return
e}e.encode=function(t){for(var e=new
Uint8Array(r(t)),n=0,o=0;o<t.length;o++){var
i=t.charCodeAt(o);i<128?e[n++]=i:i<2048?(e[n++]=192|i>>6,e[n++]=128|63&i):i<55296?(e[n++]=224|i>>12,e[n++]=128|i>>6&63,e[n++]=128|63&i):(o++,i=(1023&i)<<10,i|=1023&t.charCodeAt(o),i+=65536,e[n++]=240|i>>18,e[n++]=128|i>>12&63,e[n++]=128|i>>6&63,e[n++]=128|63&i)}return
e},e.encodedLength=r,e.decode=function(t){for(var
e=[],n=0;n<t.length;n++){var r=t[n];if(128&r){var i=void
0;if(r<224){if(n>=t.length)throw new
Error(o);if(128!=(192&(s=t[++n])))throw new
Error(o);r=(31&r)<<6|63&s,i=128}else
if(r<240){if(n>=t.length-1)throw new Error(o);var
s=t[++n],c=t[++n];if(128!=(192&s)||128!=(192&c))throw new
Error(o);r=(15&r)<<12|(63&s)<<6|63&c,i=2048}else{if(!(r<248))throw
new Error(o);if(n>=t.length-2)throw new Error(o);s=t[++n],c=t[++n];var
a=t[++n];if(128!=(192&s)||128!=(192&c)||128!=(192&a))throw new
Error(o);r=(15&r)<<18|(63&s)<<12|(63&c)<<6|63&a,i=65536}if(r<i||r>=55296&&r<=57343)throw
new Error(o);if(r>=65536){if(r>1114111)throw new
Error(o);r-=65536,e.push(String.fromCharCode(55296|r>>10)),r=56320|1023&r}}e.push(String.fromCharCode(r))}return
e.join("")}},function(t,e,n){t.exports=n(3).default},function(t,e,n){"use
strict";n.r(e);var o,r=function(){function
t(t,e){this.lastId=0,this.prefix=t,this.name=e}return
t.prototype.create=function(t){this.lastId++;var
e=this.lastId,n=this.prefix+e,o=this.name+"["+e+"]",r=!1,i=function(){r||(t.apply(null,arguments),r=!0)};return
this[e]=i,{number:e,id:n,name:o,callback:i}},t.prototype.remove=function(t){delete
this[t.number]},t}(),i=new
r("_pusher_script_","Pusher.ScriptReceivers"),s={VERSION:"7.0.6",PROTOCOL:7,wsPort:80,wssPort:443,wsPath:"",httpHost:"sockjs.pusher.com",httpPort:80,httpsPort:443,httpPath:"/pusher",stats_host:"stats.pusher.com",authEndpoint:"/pusher/auth",authTransport:"ajax",activityTimeout:12e4,pongTimeout:3e4,unavailableTimeout:1e4,cluster:"mt1",cdn_http:"http://js.pusher.com",cdn_https:"https://js.pusher.com",dependency_suffix:""},c=function(){function
t(t){this.options=t,this.receivers=t.receivers||i,this.loading={}}return
t.prototype.load=function(t,e,n){var
o=this;if(o.loading[t]&&o.loading[t].length>0)o.loading[t].push(n);else{o.loading[t]=[n];var
r=_e.createScriptRequest(o.getPath(t,e)),i=o.receivers.create((function(e){if(o.receivers.remove(i),o.loading[t]){var
n=o.loading[t];delete o.loading[t];for(var
s=function(t){t||r.cleanup()},c=0;c<n.length;c++)n[c](e,s)}}));r.send(i)}},t.prototype.getRoot=function(t){var
e=_e.getDocument().location.protocol;return(t&&t.useTLS||"https:"===e?this.options.cdn_https:this.options.cdn_http).replace(/\/*$/,"")+"/"+this.options.version},t.prototype.getPath=function(t,e){return
this.getRoot(e)+"/"+t+this.options.suffix+".js"},t}(),a=new
r("_pusher_dependencies","Pusher.DependenciesReceivers"),u=new
c({cdn_http:s.cdn_http,cdn_https:s.cdn_https,version:s.VERSION,suffix:s.dependency_suffix,receivers:a}),h={baseUrl:"https://pusher.com",urls:{authenticationEndpoint:{path:"/docs/authenticating_users"},javascriptQuickStart:{path:"/docs/javascript_quick_start"},triggeringClientEvents:{path:"/docs/client_api_guide/client_events#trigger-events"},encryptedChannelSupport:{fullUrl:"https://github.com/pusher/pusher-js/tree/cc491015371a4bde5743d1c87a0fbac0feb53195#encrypted-channel-support"}}},p=function(t){var
e,n=h.urls[t];return
n?(n.fullUrl?e=n.fullUrl:n.path&&(e=h.baseUrl+n.path),e?"See:
"+e:""):""},l=(o=function(t,e){return(o=Object.setPrototypeOf||{__proto__:[]}instanceof
Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in
e)e.hasOwnProperty(n)&&(t[n]=e[n])})(t,e)},function(t,e){function
n(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new
n)}),f=function(t){function e(e){var
n=this.constructor,o=t.call(this,e)||this;return
Object.setPrototypeOf(o,n.prototype),o}return
l(e,t),e}(Error),d=function(t){function e(e){var
n=this.constructor,o=t.call(this,e)||this;return
Object.setPrototypeOf(o,n.prototype),o}return
l(e,t),e}(Error),y=function(t){function e(e){var
n=this.constructor,o=t.call(this,e)||this;return
Object.setPrototypeOf(o,n.prototype),o}return
l(e,t),e}(Error),g=function(t){function e(e){var
n=this.constructor,o=t.call(this,e)||this;return
Object.setPrototypeOf(o,n.prototype),o}return
l(e,t),e}(Error),v=function(t){function e(e){var
n=this.constructor,o=t.call(this,e)||this;return
Object.setPrototypeOf(o,n.prototype),o}return
l(e,t),e}(Error),b=function(t){function e(e){var
n=this.constructor,o=t.call(this,e)||this;return
Object.setPrototypeOf(o,n.prototype),o}return
l(e,t),e}(Error),m=function(t){function e(e){var
n=this.constructor,o=t.call(this,e)||this;return
Object.setPrototypeOf(o,n.prototype),o}return
l(e,t),e}(Error),w=function(t){function e(e,n){var
o=this.constructor,r=t.call(this,n)||this;return
r.status=e,Object.setPrototypeOf(r,o.prototype),r}return
l(e,t),e}(Error),_=function(t,e,n){var o,r=this;for(var i
in(o=_e.createXHR()).open("POST",r.options.authEndpoint,!0),o.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),this.authOptions.headers)o.setRequestHeader(i,this.authOptions.headers[i]);return
o.onreadystatechange=function(){if(4===o.readyState)if(200===o.status){var
t=void 0,e=!1;try{t=JSON.parse(o.responseText),e=!0}catch(t){n(new
w(200,"JSON returned from auth endpoint was invalid, yet status code
was 200. Data was:
"+o.responseText),{auth:""})}e&&n(null,t)}else{var
i=p("authenticationEndpoint");n(new w(o.status,"Unable to
retrieve auth string from auth endpoint - received status:
"+o.status+" from "+r.options.authEndpoint+". Clients
must be authenticated to join private or presence channels.
"+i),{auth:""})}},o.send(this.composeQuery(e)),o};for(var
S=String.fromCharCode,k="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",C={},T=0,P=k.length;T<P;T++)C[k.charAt(T)]=T;var
O=function(t){var e=t.charCodeAt(0);return
e<128?t:e<2048?S(192|e>>>6)+S(128|63&e):S(224|e>>>12&15)+S(128|e>>>6&63)+S(128|63&e)},E=function(t){return
t.replace(/[^\x00-\x7F]/g,O)},L=function(t){var
e=[0,2,1][t.length%3],n=t.charCodeAt(0)<<16|(t.length>1?t.charCodeAt(1):0)<<8|(t.length>2?t.charCodeAt(2):0);return[k.charAt(n>>>18),k.charAt(n>>>12&63),e>=2?"=":k.charAt(n>>>6&63),e>=1?"=":k.charAt(63&n)].join("")},x=window.btoa||function(t){return
t.replace(/[\s\S]{1,3}/g,L)},A=function(){function t(t,e,n,o){var
r=this;this.clear=e,this.timer=t((function(){r.timer&&(r.timer=o(r.timer))}),n)}return
t.prototype.isRunning=function(){return
null!==this.timer},t.prototype.ensureAborted=function(){this.timer&&(this.clear(this.timer),this.timer=null)},t}(),R=function(){var
t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof
Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in
e)e.hasOwnProperty(n)&&(t[n]=e[n])})(e,n)};return
function(e,n){function
o(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(o.prototype=n.prototype,new
o)}}();function j(t){window.clearTimeout(t)}function
D(t){window.clearInterval(t)}var I=function(t){function e(e,n){return
t.call(this,setTimeout,j,e,(function(t){return n(),null}))||this}return
R(e,t),e}(A),N=function(t){function e(e,n){return
t.call(this,setInterval,D,e,(function(t){return n(),t}))||this}return
R(e,t),e}(A),M={now:function(){return Date.now?Date.now():(new
Date).valueOf()},defer:function(t){return new
I(0,t)},method:function(t){for(var
e=[],n=1;n<arguments.length;n++)e[n-1]=arguments[n];var
o=Array.prototype.slice.call(arguments,1);return function(e){return
e[t].apply(e,o.concat(arguments))}}};function H(t){for(var
e=[],n=1;n<arguments.length;n++)e[n-1]=arguments[n];for(var
o=0;o<e.length;o++){var r=e[o];for(var i in
r)r[i]&&r[i].constructor&&r[i].constructor===Object?t[i]=H(t[i]||{},r[i]):t[i]=r[i]}return
t}function q(){for(var
t=["Pusher"],e=0;e<arguments.length;e++)"string"==typeof
arguments[e]?t.push(arguments[e]):t.push(Y(arguments[e]));return
t.join(" : ")}function B(t,e){var
n=Array.prototype.indexOf;if(null===t)return-1;if(n&&t.indexOf===n)return
t.indexOf(e);for(var o=0,r=t.length;o<r;o++)if(t[o]===e)return
o;return-1}function z(t,e){for(var n in
t)Object.prototype.hasOwnProperty.call(t,n)&&e(t[n],n,t)}function
U(t){var e=[];return z(t,(function(t,n){e.push(n)})),e}function
F(t,e,n){for(var o=0;o<t.length;o++)e.call(n||window,t[o],o,t)}function
X(t,e){for(var n=[],o=0;o<t.length;o++)n.push(e(t[o],o,t,n));return
n}function J(t,e){e=e||function(t){return!!t};for(var
n=[],o=0;o<t.length;o++)e(t[o],o,t,n)&&n.push(t[o]);return
n}function W(t,e){var n={};return
z(t,(function(o,r){(e&&e(o,r,t,n)||Boolean(o))&&(n[r]=o)})),n}function
G(t,e){for(var
n=0;n<t.length;n++)if(e(t[n],n,t))return!0;return!1}function Q(t){return
e=function(t){return"object"==typeof
t&&(t=Y(t)),encodeURIComponent((e=t.toString(),x(E(e))));var
e},n={},z(t,(function(t,o){n[o]=e(t)})),n;var e,n}function V(t){var
e,n,o=W(t,(function(t){return void 0!==t}));return
X((e=Q(o),n=[],z(e,(function(t,e){n.push([e,t])})),n),M.method("join","=")).join("&")}function
Y(t){try{return JSON.stringify(t)}catch(o){return
JSON.stringify((e=[],n=[],function t(o,r){var i,s,c;switch(typeof
o){case"object":if(!o)return
null;for(i=0;i<e.length;i+=1)if(e[i]===o)return{$ref:n[i]};if(e.push(o),n.push(r),"[object
Array]"===Object.prototype.toString.apply(o))for(c=[],i=0;i<o.length;i+=1)c[i]=t(o[i],r+"["+i+"]");else
for(s in
c={},o)Object.prototype.hasOwnProperty.call(o,s)&&(c[s]=t(o[s],r+"["+JSON.stringify(s)+"]"));return
c;case"number":case"string":case"boolean":return
o}}(t,"$")))}var e,n}var $=new(function(){function
t(){this.globalLog=function(t){window.console&&window.console.log&&window.console.log(t)}}return
t.prototype.debug=function(){for(var
t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];this.log(this.globalLog,t)},t.prototype.warn=function(){for(var
t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];this.log(this.globalLogWarn,t)},t.prototype.error=function(){for(var
t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];this.log(this.globalLogError,t)},t.prototype.globalLogWarn=function(t){window.console&&window.console.warn?window.console.warn(t):this.globalLog(t)},t.prototype.globalLogError=function(t){window.console&&window.console.error?window.console.error(t):this.globalLogWarn(t)},t.prototype.log=function(t){for(var
e=[],n=1;n<arguments.length;n++)e[n-1]=arguments[n];var
o=q.apply(this,arguments);if(Ie.log)Ie.log(o);else if(Ie.logToConsole){var
r=t.bind(this);r(o)}},t}()),K=function(t,e,n){void
0!==this.authOptions.headers&&$.warn("To send headers with the
auth request, you must use AJAX, rather than JSONP.");var
o=t.nextAuthCallbackID.toString();t.nextAuthCallbackID++;var
r=t.getDocument(),i=r.createElement("script");t.auth_callbacks[o]=function(t){n(null,t)};var
s="Pusher.auth_callbacks['"+o+"']";i.src=this.options.authEndpoint+"?callback="+encodeURIComponent(s)+"&"+this.composeQuery(e);var
c=r.getElementsByTagName("head")[0]||r.documentElement;c.insertBefore(i,c.firstChild)},Z=function(){function
t(t){this.src=t}return t.prototype.send=function(t){var
e=this,n="Error loading
"+e.src;e.script=document.createElement("script"),e.script.id=t.id,e.script.src=e.src,e.script.type="text/javascript",e.script.charset="UTF-8",e.script.addEventListener?(e.script.onerror=function(){t.callback(n)},e.script.onload=function(){t.callback(null)}):e.script.onreadystatechange=function(){"loaded"!==e.script.readyState&&"complete"!==e.script.readyState||t.callback(null)},void
0===e.script.async&&document.attachEvent&&/opera/i.test(navigator.userAgent)?(e.errorScript=document.createElement("script"),e.errorScript.id=t.id+"_error",e.errorScript.text=t.name+"('"+n+"');",e.script.async=e.errorScript.async=!1):e.script.async=!0;var
o=document.getElementsByTagName("head")[0];o.insertBefore(e.script,o.firstChild),e.errorScript&&o.insertBefore(e.errorScript,e.script.nextSibling)},t.prototype.cleanup=function(){this.script&&(this.script.onload=this.script.onerror=null,this.script.onreadystatechange=null),this.script&&this.script.parentNode&&this.script.parentNode.removeChild(this.script),this.errorScript&&this.errorScript.parentNode&&this.errorScript.parentNode.removeChild(this.errorScript),this.script=null,this.errorScript=null},t}(),tt=function(){function
t(t,e){this.url=t,this.data=e}return
t.prototype.send=function(t){if(!this.request){var
e=V(this.data),n=this.url+"/"+t.number+"?"+e;this.request=_e.createScriptRequest(n),this.request.send(t)}},t.prototype.cleanup=function(){this.request&&this.request.cleanup()},t}(),et={name:"jsonp",getAgent:function(t,e){return
function(n,o){var
r="http"+(e?"s":"")+"://"+(t.host||t.options.host)+t.options.path,s=_e.createJSONPRequest(r,n),c=_e.ScriptReceivers.create((function(e,n){i.remove(c),s.cleanup(),n&&n.host&&(t.host=n.host),o&&o(e,n)}));s.send(c)}}};function
nt(t,e,n){return
t+(e.useTLS?"s":"")+"://"+(e.useTLS?e.hostTLS:e.hostNonTLS)+n}function
ot(t,e){return"/app/"+t+("?protocol="+s.PROTOCOL+"&client=js&version="+s.VERSION+(e?"&"+e:""))}var
rt={getInitial:function(t,e){return
nt("ws",e,(e.httpPath||"")+ot(t,"flash=false"))}},it={getInitial:function(t,e){return
nt("http",e,(e.httpPath||"/pusher")+ot(t))}},st={getInitial:function(t,e){return
nt("http",e,e.httpPath||"/pusher")},getPath:function(t,e){return
ot(t)}},ct=function(){function t(){this._callbacks={}}return
t.prototype.get=function(t){return
this._callbacks[at(t)]},t.prototype.add=function(t,e,n){var
o=at(t);this._callbacks[o]=this._callbacks[o]||[],this._callbacks[o].push({fn:e,context:n})},t.prototype.remove=function(t,e,n){if(t||e||n){var
o=t?[at(t)]:U(this._callbacks);e||n?this.removeCallback(o,e,n):this.removeAllCallbacks(o)}else
this._callbacks={}},t.prototype.removeCallback=function(t,e,n){F(t,(function(t){this._callbacks[t]=J(this._callbacks[t]||[],(function(t){return
e&&e!==t.fn||n&&n!==t.context})),0===this._callbacks[t].length&&delete
this._callbacks[t]}),this)},t.prototype.removeAllCallbacks=function(t){F(t,(function(t){delete
this._callbacks[t]}),this)},t}();function at(t){return"_"+t}var
ut=function(){function t(t){this.callbacks=new
ct,this.global_callbacks=[],this.failThrough=t}return
t.prototype.bind=function(t,e,n){return
this.callbacks.add(t,e,n),this},t.prototype.bind_global=function(t){return
this.global_callbacks.push(t),this},t.prototype.unbind=function(t,e,n){return
this.callbacks.remove(t,e,n),this},t.prototype.unbind_global=function(t){return
t?(this.global_callbacks=J(this.global_callbacks||[],(function(e){return
e!==t})),this):(this.global_callbacks=[],this)},t.prototype.unbind_all=function(){return
this.unbind(),this.unbind_global(),this},t.prototype.emit=function(t,e,n){for(var
o=0;o<this.global_callbacks.length;o++)this.global_callbacks[o](t,e);var
r=this.callbacks.get(t),i=[];if(n?i.push(e,n):e&&i.push(e),r&&r.length>0)for(o=0;o<r.length;o++)r[o].fn.apply(r[o].context||window,i);else
this.failThrough&&this.failThrough(t,e);return
this},t}(),ht=function(){var
t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof
Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in
e)e.hasOwnProperty(n)&&(t[n]=e[n])})(e,n)};return
function(e,n){function
o(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(o.prototype=n.prototype,new
o)}}(),pt=function(t){function e(e,n,o,r,i){var s=t.call(this)||this;return
s.initialize=_e.transportConnectionInitializer,s.hooks=e,s.name=n,s.priority=o,s.key=r,s.options=i,s.state="new",s.timeline=i.timeline,s.activityTimeout=i.activityTimeout,s.id=s.timeline.generateUniqueID(),s}return
ht(e,t),e.prototype.handlesActivityChecks=function(){return
Boolean(this.hooks.handlesActivityChecks)},e.prototype.supportsPing=function(){return
Boolean(this.hooks.supportsPing)},e.prototype.connect=function(){var
t=this;if(this.socket||"initialized"!==this.state)return!1;var
e=this.hooks.urls.getInitial(this.key,this.options);try{this.socket=this.hooks.getSocket(e,this.options)}catch(e){return
M.defer((function(){t.onError(e),t.changeState("closed")})),!1}return
this.bindListeners(),$.debug("Connecting",{transport:this.name,url:e}),this.changeState("connecting"),!0},e.prototype.close=function(){return!!this.socket&&(this.socket.close(),!0)},e.prototype.send=function(t){var
e=this;return"open"===this.state&&(M.defer((function(){e.socket&&e.socket.send(t)})),!0)},e.prototype.ping=function(){"open"===this.state&&this.supportsPing()&&this.socket.ping()},e.prototype.onOpen=function(){this.hooks.beforeOpen&&this.hooks.beforeOpen(this.socket,this.hooks.urls.getPath(this.key,this.options)),this.changeState("open"),this.socket.onopen=void
0},e.prototype.onError=function(t){this.emit("error",{type:"WebSocketError",error:t}),this.timeline.error(this.buildTimelineMessage({error:t.toString()}))},e.prototype.onClose=function(t){t?this.changeState("closed",{code:t.code,reason:t.reason,wasClean:t.wasClean}):this.changeState("closed"),this.unbindListeners(),this.socket=void
0},e.prototype.onMessage=function(t){this.emit("message",t)},e.prototype.onActivity=function(){this.emit("activity")},e.prototype.bindListeners=function(){var
t=this;this.socket.onopen=function(){t.onOpen()},this.socket.onerror=function(e){t.onError(e)},this.socket.onclose=function(e){t.onClose(e)},this.socket.onmessage=function(e){t.onMessage(e)},this.supportsPing()&&(this.socket.onactivity=function(){t.onActivity()})},e.prototype.unbindListeners=function(){this.socket&&(this.socket.onopen=void
0,this.socket.onerror=void 0,this.socket.onclose=void
0,this.socket.onmessage=void
0,this.supportsPing()&&(this.socket.onactivity=void
0))},e.prototype.changeState=function(t,e){this.state=t,this.timeline.info(this.buildTimelineMessage({state:t,params:e})),this.emit(t,e)},e.prototype.buildTimelineMessage=function(t){return
H({cid:this.id},t)},e}(ut),lt=function(){function t(t){this.hooks=t}return
t.prototype.isSupported=function(t){return
this.hooks.isSupported(t)},t.prototype.createConnection=function(t,e,n,o){return
new pt(this.hooks,t,e,n,o)},t}(),ft=new
lt({urls:rt,handlesActivityChecks:!1,supportsPing:!1,isInitialized:function(){return
Boolean(_e.getWebSocketAPI())},isSupported:function(){return
Boolean(_e.getWebSocketAPI())},getSocket:function(t){return
_e.createWebSocket(t)}}),dt={urls:it,handlesActivityChecks:!1,supportsPing:!0,isInitialized:function(){return!0}},yt=H({getSocket:function(t){return
_e.HTTPFactory.createStreamingSocket(t)}},dt),gt=H({getSocket:function(t){return
_e.HTTPFactory.createPollingSocket(t)}},dt),vt={isSupported:function(){return
_e.isXHRSupported()}},bt={ws:ft,xhr_streaming:new
lt(H({},yt,vt)),xhr_polling:new lt(H({},gt,vt))},mt=new
lt({file:"sockjs",urls:st,handlesActivityChecks:!0,supportsPing:!1,isSupported:function(){return!0},isInitialized:function(){return
void 0!==window.SockJS},getSocket:function(t,e){return new
window.SockJS(t,null,{js_path:u.getPath("sockjs",{useTLS:e.useTLS}),ignore_null_origin:e.ignoreNullOrigin})},beforeOpen:function(t,e){t.send(JSON.stringify({path:e}))}}),wt={isSupported:function(t){return
_e.isXDRSupported(t.useTLS)}},_t=new lt(H({},yt,wt)),St=new
lt(H({},gt,wt));bt.xdr_streaming=_t,bt.xdr_polling=St,bt.sockjs=mt;var
kt=bt,Ct=function(){var
t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof
Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in
e)e.hasOwnProperty(n)&&(t[n]=e[n])})(e,n)};return
function(e,n){function
o(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(o.prototype=n.prototype,new
o)}}(),Tt=new(function(t){function e(){var e=t.call(this)||this,n=e;return
void
0!==window.addEventListener&&(window.addEventListener("online",(function(){n.emit("online")}),!1),window.addEventListener("offline",(function(){n.emit("offline")}),!1)),e}return
Ct(e,t),e.prototype.isOnline=function(){return void
0===window.navigator.onLine||window.navigator.onLine},e}(ut)),Pt=function(){function
t(t,e,n){this.manager=t,this.transport=e,this.minPingDelay=n.minPingDelay,this.maxPingDelay=n.maxPingDelay,this.pingDelay=void
0}return t.prototype.createConnection=function(t,e,n,o){var
r=this;o=H({},o,{activityTimeout:this.pingDelay});var
i=this.transport.createConnection(t,e,n,o),s=null,c=function(){i.unbind("open",c),i.bind("closed",a),s=M.now()},a=function(t){if(i.unbind("closed",a),1002===t.code||1003===t.code)r.manager.reportDeath();else
if(!t.wasClean&&s){var
e=M.now()-s;e<2*r.maxPingDelay&&(r.manager.reportDeath(),r.pingDelay=Math.max(e/2,r.minPingDelay))}};return
i.bind("open",c),i},t.prototype.isSupported=function(t){return
this.manager.isAlive()&&this.transport.isSupported(t)},t}(),Ot={decodeMessage:function(t){try{var
e=JSON.parse(t.data),n=e.data;if("string"==typeof
n)try{n=JSON.parse(e.data)}catch(t){}var
o={event:e.event,channel:e.channel,data:n};return
e.user_id&&(o.user_id=e.user_id),o}catch(e){throw{type:"MessageParseError",error:e,data:t.data}}},encodeMessage:function(t){return
JSON.stringify(t)},processHandshake:function(t){var
e=Ot.decodeMessage(t);if("pusher:connection_established"===e.event){if(!e.data.activity_timeout)throw"No
activity timeout specified in
handshake";return{action:"connected",id:e.data.socket_id,activityTimeout:1e3*e.data.activity_timeout}}if("pusher:error"===e.event)return{action:this.getCloseAction(e.data),error:this.getCloseError(e.data)};throw"Invalid
handshake"},getCloseAction:function(t){return
t.code<4e3?t.code>=1002&&t.code<=1004?"backoff":null:4e3===t.code?"tls_only":t.code<4100?"refused":t.code<4200?"backoff":t.code<4300?"retry":"refused"},getCloseError:function(t){return
1e3!==t.code&&1001!==t.code?{type:"PusherError",data:{code:t.code,message:t.reason||t.message}}:null}},Et=Ot,Lt=function(){var
t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof
Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in
e)e.hasOwnProperty(n)&&(t[n]=e[n])})(e,n)};return
function(e,n){function
o(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(o.prototype=n.prototype,new
o)}}(),xt=function(t){function e(e,n){var o=t.call(this)||this;return
o.id=e,o.transport=n,o.activityTimeout=n.activityTimeout,o.bindListeners(),o}return
Lt(e,t),e.prototype.handlesActivityChecks=function(){return
this.transport.handlesActivityChecks()},e.prototype.send=function(t){return
this.transport.send(t)},e.prototype.send_event=function(t,e,n){var
o={event:t,data:e};return n&&(o.channel=n),$.debug("Event
sent",o),this.send(Et.encodeMessage(o))},e.prototype.ping=function(){this.transport.supportsPing()?this.transport.ping():this.send_event("pusher:ping",{})},e.prototype.close=function(){this.transport.close()},e.prototype.bindListeners=function(){var
t=this,e={message:function(e){var
n;try{n=Et.decodeMessage(e)}catch(n){t.emit("error",{type:"MessageParseError",error:n,data:e.data})}if(void
0!==n){switch($.debug("Event
recd",n),n.event){case"pusher:error":t.emit("error",{type:"PusherError",data:n.data});break;case"pusher:ping":t.emit("ping");break;case"pusher:pong":t.emit("pong")}t.emit("message",n)}},activity:function(){t.emit("activity")},error:function(e){t.emit("error",e)},closed:function(e){n(),e&&e.code&&t.handleCloseEvent(e),t.transport=null,t.emit("closed")}},n=function(){z(e,(function(e,n){t.transport.unbind(n,e)}))};z(e,(function(e,n){t.transport.bind(n,e)}))},e.prototype.handleCloseEvent=function(t){var
e=Et.getCloseAction(t),n=Et.getCloseError(t);n&&this.emit("error",n),e&&this.emit(e,{action:e,error:n})},e}(ut),At=function(){function
t(t,e){this.transport=t,this.callback=e,this.bindListeners()}return
t.prototype.close=function(){this.unbindListeners(),this.transport.close()},t.prototype.bindListeners=function(){var
t=this;this.onMessage=function(e){var
n;t.unbindListeners();try{n=Et.processHandshake(e)}catch(e){return
t.finish("error",{error:e}),void
t.transport.close()}"connected"===n.action?t.finish("connected",{connection:new
xt(n.id,t.transport),activityTimeout:n.activityTimeout}):(t.finish(n.action,{error:n.error}),t.transport.close())},this.onClosed=function(e){t.unbindListeners();var
n=Et.getCloseAction(e)||"backoff",o=Et.getCloseError(e);t.finish(n,{error:o})},this.transport.bind("message",this.onMessage),this.transport.bind("closed",this.onClosed)},t.prototype.unbindListeners=function(){this.transport.unbind("message",this.onMessage),this.transport.unbind("closed",this.onClosed)},t.prototype.finish=function(t,e){this.callback(H({transport:this.transport,action:t},e))},t}(),Rt=function(){function
t(t,e){this.channel=t;var n=e.authTransport;if(void
0===_e.getAuthorizers()[n])throw"'"+n+"' is not a
recognized auth
transport";this.type=n,this.options=e,this.authOptions=e.auth||{}}return
t.prototype.composeQuery=function(t){var
e="socket_id="+encodeURIComponent(t)+"&channel_name="+encodeURIComponent(this.channel.name);for(var
n in
this.authOptions.params)e+="&"+encodeURIComponent(n)+"="+encodeURIComponent(this.authOptions.params[n]);return
e},t.prototype.authorize=function(e,n){t.authorizers=t.authorizers||_e.getAuthorizers(),t.authorizers[this.type].call(this,_e,e,n)},t}(),jt=function(){function
t(t,e){this.timeline=t,this.options=e||{}}return
t.prototype.send=function(t,e){this.timeline.isEmpty()||this.timeline.send(_e.TimelineTransport.getAgent(this,t),e)},t}(),Dt=function(){var
t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof
Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in
e)e.hasOwnProperty(n)&&(t[n]=e[n])})(e,n)};return
function(e,n){function
o(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(o.prototype=n.prototype,new
o)}}(),It=function(t){function e(e,n){var
o=t.call(this,(function(t,n){$.debug("No callbacks on "+e+"
for "+t)}))||this;return
o.name=e,o.pusher=n,o.subscribed=!1,o.subscriptionPending=!1,o.subscriptionCancelled=!1,o}return
Dt(e,t),e.prototype.authorize=function(t,e){return
e(null,{auth:""})},e.prototype.trigger=function(t,e){if(0!==t.indexOf("client-"))throw
new f("Event '"+t+"' does not start with
'client-'");if(!this.subscribed){var
n=p("triggeringClientEvents");$.warn("Client event triggered
before channel 'subscription_succeeded' event . "+n)}return
this.pusher.send_event(t,e,this.name)},e.prototype.disconnect=function(){this.subscribed=!1,this.subscriptionPending=!1},e.prototype.handleEvent=function(t){var
e=t.event,n=t.data;if("pusher_internal:subscription_succeeded"===e)this.handleSubscriptionSucceededEvent(t);else
if(0!==e.indexOf("pusher_internal:")){this.emit(e,n,{})}},e.prototype.handleSubscriptionSucceededEvent=function(t){this.subscriptionPending=!1,this.subscribed=!0,this.subscriptionCancelled?this.pusher.unsubscribe(this.name):this.emit("pusher:subscription_succeeded",t.data)},e.prototype.subscribe=function(){var
t=this;this.subscribed||(this.subscriptionPending=!0,this.subscriptionCancelled=!1,this.authorize(this.pusher.connection.socket_id,(function(e,n){e?(t.subscriptionPending=!1,$.error(e.toString()),t.emit("pusher:subscription_error",Object.assign({},{type:"AuthError",error:e.message},e
instanceof
w?{status:e.status}:{}))):t.pusher.send_event("pusher:subscribe",{auth:n.auth,channel_data:n.channel_data,channel:t.name})})))},e.prototype.unsubscribe=function(){this.subscribed=!1,this.pusher.send_event("pusher:unsubscribe",{channel:this.name})},e.prototype.cancelSubscription=function(){this.subscriptionCancelled=!0},e.prototype.reinstateSubscription=function(){this.subscriptionCancelled=!1},e}(ut),Nt=function(){var
t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof
Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in
e)e.hasOwnProperty(n)&&(t[n]=e[n])})(e,n)};return
function(e,n){function
o(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(o.prototype=n.prototype,new
o)}}(),Mt=function(t){function e(){return
null!==t&&t.apply(this,arguments)||this}return
Nt(e,t),e.prototype.authorize=function(t,e){return
Qt.createAuthorizer(this,this.pusher.config).authorize(t,e)},e}(It),Ht=function(){function
t(){this.reset()}return t.prototype.get=function(t){return
Object.prototype.hasOwnProperty.call(this.members,t)?{id:t,info:this.members[t]}:null},t.prototype.each=function(t){var
e=this;z(this.members,(function(n,o){t(e.get(o))}))},t.prototype.setMyID=function(t){this.myID=t},t.prototype.onSubscription=function(t){this.members=t.presence.hash,this.count=t.presence.count,this.me=this.get(this.myID)},t.prototype.addMember=function(t){return
null===this.get(t.user_id)&&this.count++,this.members[t.user_id]=t.user_info,this.get(t.user_id)},t.prototype.removeMember=function(t){var
e=this.get(t.user_id);return e&&(delete
this.members[t.user_id],this.count--),e},t.prototype.reset=function(){this.members={},this.count=0,this.myID=null,this.me=null},t}(),qt=function(){var
t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof
Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in
e)e.hasOwnProperty(n)&&(t[n]=e[n])})(e,n)};return
function(e,n){function
o(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(o.prototype=n.prototype,new
o)}}(),Bt=function(t){function e(e,n){var o=t.call(this,e,n)||this;return
o.members=new Ht,o}return qt(e,t),e.prototype.authorize=function(e,n){var
o=this;t.prototype.authorize.call(this,e,(function(t,e){if(!t){if(void
0===(e=e).channel_data){var r=p("authenticationEndpoint");return
$.error("Invalid auth response for channel
'"+o.name+"',expected 'channel_data' field.
"+r),void n("Invalid auth response")}var
i=JSON.parse(e.channel_data);o.members.setMyID(i.user_id)}n(t,e)}))},e.prototype.handleEvent=function(t){var
e=t.event;if(0===e.indexOf("pusher_internal:"))this.handleInternalEvent(t);else{var
n=t.data,o={};t.user_id&&(o.user_id=t.user_id),this.emit(e,n,o)}},e.prototype.handleInternalEvent=function(t){var
e=t.event,n=t.data;switch(e){case"pusher_internal:subscription_succeeded":this.handleSubscriptionSucceededEvent(t);break;case"pusher_internal:member_added":var
o=this.members.addMember(n);this.emit("pusher:member_added",o);break;case"pusher_internal:member_removed":var
r=this.members.removeMember(n);r&&this.emit("pusher:member_removed",r)}},e.prototype.handleSubscriptionSucceededEvent=function(t){this.subscriptionPending=!1,this.subscribed=!0,this.subscriptionCancelled?this.pusher.unsubscribe(this.name):(this.members.onSubscription(t.data),this.emit("pusher:subscription_succeeded",this.members))},e.prototype.disconnect=function(){this.members.reset(),t.prototype.disconnect.call(this)},e}(Mt),zt=n(1),Ut=n(0),Ft=function(){var
t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof
Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in
e)e.hasOwnProperty(n)&&(t[n]=e[n])})(e,n)};return
function(e,n){function
o(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(o.prototype=n.prototype,new
o)}}(),Xt=function(t){function e(e,n,o){var r=t.call(this,e,n)||this;return
r.key=null,r.nacl=o,r}return
Ft(e,t),e.prototype.authorize=function(e,n){var
o=this;t.prototype.authorize.call(this,e,(function(t,e){if(t)n(t,e);else{var
r=e.shared_secret;r?(o.key=Object(Ut.decode)(r),delete
e.shared_secret,n(null,e)):n(new Error("No shared_secret key in auth
payload for encrypted channel:
"+o.name),null)}}))},e.prototype.trigger=function(t,e){throw new
v("Client events are not currently supported for encrypted
channels")},e.prototype.handleEvent=function(e){var
n=e.event,o=e.data;0!==n.indexOf("pusher_internal:")&&0!==n.indexOf("pusher:")?this.handleEncryptedEvent(n,o):t.prototype.handleEvent.call(this,e)},e.prototype.handleEncryptedEvent=function(t,e){var
n=this;if(this.key)if(e.ciphertext&&e.nonce){var
o=Object(Ut.decode)(e.ciphertext);if(o.length<this.nacl.secretbox.overheadLength)$.error("Expected
encrypted event ciphertext length to be
"+this.nacl.secretbox.overheadLength+", got:
"+o.length);else{var
r=Object(Ut.decode)(e.nonce);if(r.length<this.nacl.secretbox.nonceLength)$.error("Expected
encrypted event nonce length to be
"+this.nacl.secretbox.nonceLength+", got:
"+r.length);else{var
i=this.nacl.secretbox.open(o,r,this.key);if(null===i)return
$.debug("Failed to decrypt an event, probably because it was encrypted
with a different key. Fetching a new key from the
authEndpoint..."),void
this.authorize(this.pusher.connection.socket_id,(function(e,s){e?$.error("Failed
to make a request to the authEndpoint: "+s+". Unable to fetch new
key, so dropping encrypted
event"):null!==(i=n.nacl.secretbox.open(o,r,n.key))?n.emit(t,n.getDataToEmit(i)):$.error("Failed
to decrypt event with new key. Dropping encrypted
event")}));this.emit(t,this.getDataToEmit(i))}}}else
$.error("Unexpected format for encrypted event, expected object with
`ciphertext` and `nonce` fields, got: "+e);else $.debug("Received
encrypted event before key has been retrieved from the
authEndpoint")},e.prototype.getDataToEmit=function(t){var
e=Object(zt.decode)(t);try{return JSON.parse(e)}catch(t){return
e}},e}(Mt),Jt=function(){var
t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof
Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in
e)e.hasOwnProperty(n)&&(t[n]=e[n])})(e,n)};return
function(e,n){function
o(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(o.prototype=n.prototype,new
o)}}(),Wt=function(t){function e(e,n){var
o=t.call(this)||this;o.state="initialized",o.connection=null,o.key=e,o.options=n,o.timeline=o.options.timeline,o.usingTLS=o.options.useTLS,o.errorCallbacks=o.buildErrorCallbacks(),o.connectionCallbacks=o.buildConnectionCallbacks(o.errorCallbacks),o.handshakeCallbacks=o.buildHandshakeCallbacks(o.errorCallbacks);var
r=_e.getNetwork();return
r.bind("online",(function(){o.timeline.info({netinfo:"online"}),"connecting"!==o.state&&"unavailable"!==o.state||o.retryIn(0)})),r.bind("offline",(function(){o.timeline.info({netinfo:"offline"}),o.connection&&o.sendActivityCheck()})),o.updateStrategy(),o}return
Jt(e,t),e.prototype.connect=function(){this.connection||this.runner||(this.strategy.isSupported()?(this.updateState("connecting"),this.startConnecting(),this.setUnavailableTimer()):this.updateState("failed"))},e.prototype.send=function(t){return!!this.connection&&this.connection.send(t)},e.prototype.send_event=function(t,e,n){return!!this.connection&&this.connection.send_event(t,e,n)},e.prototype.disconnect=function(){this.disconnectInternally(),this.updateState("disconnected")},e.prototype.isUsingTLS=function(){return
this.usingTLS},e.prototype.startConnecting=function(){var
t=this,e=function(n,o){n?t.runner=t.strategy.connect(0,e):"error"===o.action?(t.emit("error",{type:"HandshakeError",error:o.error}),t.timeline.error({handshakeError:o.error})):(t.abortConnecting(),t.handshakeCallbacks[o.action](o))};this.runner=this.strategy.connect(0,e)},e.prototype.abortConnecting=function(){this.runner&&(this.runner.abort(),this.runner=null)},e.prototype.disconnectInternally=function(){(this.abortConnecting(),this.clearRetryTimer(),this.clearUnavailableTimer(),this.connection)&&this.abandonConnection().close()},e.prototype.updateStrategy=function(){this.strategy=this.options.getStrategy({key:this.key,timeline:this.timeline,useTLS:this.usingTLS})},e.prototype.retryIn=function(t){var
e=this;this.timeline.info({action:"retry",delay:t}),t>0&&this.emit("connecting_in",Math.round(t/1e3)),this.retryTimer=new
I(t||0,(function(){e.disconnectInternally(),e.connect()}))},e.prototype.clearRetryTimer=function(){this.retryTimer&&(this.retryTimer.ensureAborted(),this.retryTimer=null)},e.prototype.setUnavailableTimer=function(){var
t=this;this.unavailableTimer=new
I(this.options.unavailableTimeout,(function(){t.updateState("unavailable")}))},e.prototype.clearUnavailableTimer=function(){this.unavailableTimer&&this.unavailableTimer.ensureAborted()},e.prototype.sendActivityCheck=function(){var
t=this;this.stopActivityCheck(),this.connection.ping(),this.activityTimer=new
I(this.options.pongTimeout,(function(){t.timeline.error({pong_timed_out:t.options.pongTimeout}),t.retryIn(0)}))},e.prototype.resetActivityCheck=function(){var
t=this;this.stopActivityCheck(),this.connection&&!this.connection.handlesActivityChecks()&&(this.activityTimer=new
I(this.activityTimeout,(function(){t.sendActivityCheck()})))},e.prototype.stopActivityCheck=function(){this.activityTimer&&this.activityTimer.ensureAborted()},e.prototype.buildConnectionCallbacks=function(t){var
e=this;return
H({},t,{message:function(t){e.resetActivityCheck(),e.emit("message",t)},ping:function(){e.send_event("pusher:pong",{})},activity:function(){e.resetActivityCheck()},error:function(t){e.emit("error",t)},closed:function(){e.abandonConnection(),e.shouldRetry()&&e.retryIn(1e3)}})},e.prototype.buildHandshakeCallbacks=function(t){var
e=this;return
H({},t,{connected:function(t){e.activityTimeout=Math.min(e.options.activityTimeout,t.activityTimeout,t.connection.activityTimeout||1/0),e.clearUnavailableTimer(),e.setConnection(t.connection),e.socket_id=e.connection.id,e.updateState("connected",{socket_id:e.socket_id})}})},e.prototype.buildErrorCallbacks=function(){var
t=this,e=function(e){return
function(n){n.error&&t.emit("error",{type:"WebSocketError",error:n.error}),e(n)}};return{tls_only:e((function(){t.usingTLS=!0,t.updateStrategy(),t.retryIn(0)})),refused:e((function(){t.disconnect()})),backoff:e((function(){t.retryIn(1e3)})),retry:e((function(){t.retryIn(0)}))}},e.prototype.setConnection=function(t){for(var
e in
this.connection=t,this.connectionCallbacks)this.connection.bind(e,this.connectionCallbacks[e]);this.resetActivityCheck()},e.prototype.abandonConnection=function(){if(this.connection){for(var
t in
this.stopActivityCheck(),this.connectionCallbacks)this.connection.unbind(t,this.connectionCallbacks[t]);var
e=this.connection;return
this.connection=null,e}},e.prototype.updateState=function(t,e){var
n=this.state;if(this.state=t,n!==t){var
o=t;"connected"===o&&(o+=" with new socket ID
"+e.socket_id),$.debug("State changed",n+" ->
"+o),this.timeline.info({state:t,params:e}),this.emit("state_change",{previous:n,current:t}),this.emit(t,e)}},e.prototype.shouldRetry=function(){return"connecting"===this.state||"connected"===this.state},e}(ut),Gt=function(){function
t(){this.channels={}}return t.prototype.add=function(t,e){return
this.channels[t]||(this.channels[t]=function(t,e){if(0===t.indexOf("private-encrypted-")){if(e.config.nacl)return
Qt.createEncryptedChannel(t,e,e.config.nacl);var
n=p("encryptedChannelSupport");throw new v("Tried to
subscribe to a private-encrypted- channel but no nacl implementation
available. "+n)}return
0===t.indexOf("private-")?Qt.createPrivateChannel(t,e):0===t.indexOf("presence-")?Qt.createPresenceChannel(t,e):Qt.createChannel(t,e)}(t,e)),this.channels[t]},t.prototype.all=function(){return
function(t){var e=[];return
z(t,(function(t){e.push(t)})),e}(this.channels)},t.prototype.find=function(t){return
this.channels[t]},t.prototype.remove=function(t){var
e=this.channels[t];return delete
this.channels[t],e},t.prototype.disconnect=function(){z(this.channels,(function(t){t.disconnect()}))},t}();var
Qt={createChannels:function(){return new
Gt},createConnectionManager:function(t,e){return new
Wt(t,e)},createChannel:function(t,e){return new
It(t,e)},createPrivateChannel:function(t,e){return new
Mt(t,e)},createPresenceChannel:function(t,e){return new
Bt(t,e)},createEncryptedChannel:function(t,e,n){return new
Xt(t,e,n)},createTimelineSender:function(t,e){return new
jt(t,e)},createAuthorizer:function(t,e){return
e.authorizer?e.authorizer(t,e):new
Rt(t,e)},createHandshake:function(t,e){return new
At(t,e)},createAssistantToTheTransportManager:function(t,e,n){return new
Pt(t,e,n)}},Vt=function(){function
t(t){this.options=t||{},this.livesLeft=this.options.lives||1/0}return
t.prototype.getAssistant=function(t){return
Qt.createAssistantToTheTransportManager(this,t,{minPingDelay:this.options.minPingDelay,maxPingDelay:this.options.maxPingDelay})},t.prototype.isAlive=function(){return
this.livesLeft>0},t.prototype.reportDeath=function(){this.livesLeft-=1},t}(),Yt=function(){function
t(t,e){this.strategies=t,this.loop=Boolean(e.loop),this.failFast=Boolean(e.failFast),this.timeout=e.timeout,this.timeoutLimit=e.timeoutLimit}return
t.prototype.isSupported=function(){return
G(this.strategies,M.method("isSupported"))},t.prototype.connect=function(t,e){var
n=this,o=this.strategies,r=0,i=this.timeout,s=null,c=function(a,u){u?e(null,u):(r+=1,n.loop&&(r%=o.length),r<o.length?(i&&(i*=2,n.timeoutLimit&&(i=Math.min(i,n.timeoutLimit))),s=n.tryStrategy(o[r],t,{timeout:i,failFast:n.failFast},c)):e(!0))};return
s=this.tryStrategy(o[r],t,{timeout:i,failFast:this.failFast},c),{abort:function(){s.abort()},forceMinPriority:function(e){t=e,s&&s.forceMinPriority(e)}}},t.prototype.tryStrategy=function(t,e,n,o){var
r=null,i=null;return n.timeout>0&&(r=new
I(n.timeout,(function(){i.abort(),o(!0)}))),i=t.connect(e,(function(t,e){t&&r&&r.isRunning()&&!n.failFast||(r&&r.ensureAborted(),o(t,e))})),{abort:function(){r&&r.ensureAborted(),i.abort()},forceMinPriority:function(t){i.forceMinPriority(t)}}},t}(),$t=function(){function
t(t){this.strategies=t}return t.prototype.isSupported=function(){return
G(this.strategies,M.method("isSupported"))},t.prototype.connect=function(t,e){return
function(t,e,n){var o=X(t,(function(t,o,r,i){return
t.connect(e,n(o,i))}));return{abort:function(){F(o,Kt)},forceMinPriority:function(t){F(o,(function(e){e.forceMinPriority(t)}))}}}(this.strategies,t,(function(t,n){return
function(o,r){n[t].error=o,o?function(t){return function(t,e){for(var
n=0;n<t.length;n++)if(!e(t[n],n,t))return!1;return!0}(t,(function(t){return
Boolean(t.error)}))}(n)&&e(!0):(F(n,(function(t){t.forceMinPriority(r.transport.priority)})),e(null,r))}}))},t}();function
Kt(t){t.error||t.aborted||(t.abort(),t.aborted=!0)}var
Zt=function(){function
t(t,e,n){this.strategy=t,this.transports=e,this.ttl=n.ttl||18e5,this.usingTLS=n.useTLS,this.timeline=n.timeline}return
t.prototype.isSupported=function(){return
this.strategy.isSupported()},t.prototype.connect=function(t,e){var
n=this.usingTLS,o=function(t){var e=_e.getLocalStorage();if(e)try{var
n=e[te(t)];if(n)return JSON.parse(n)}catch(e){ee(t)}return
null}(n),r=[this.strategy];if(o&&o.timestamp+this.ttl>=M.now()){var
i=this.transports[o.transport];i&&(this.timeline.info({cached:!0,transport:o.transport,latency:o.latency}),r.push(new
Yt([i],{timeout:2*o.latency+1e3,failFast:!0})))}var
s=M.now(),c=r.pop().connect(t,(function
o(i,a){i?(ee(n),r.length>0?(s=M.now(),c=r.pop().connect(t,o)):e(i)):(!function(t,e,n){var
o=_e.getLocalStorage();if(o)try{o[te(t)]=Y({timestamp:M.now(),transport:e,latency:n})}catch(t){}}(n,a.transport.name,M.now()-s),e(null,a))}));return{abort:function(){c.abort()},forceMinPriority:function(e){t=e,c&&c.forceMinPriority(e)}}},t}();function
te(t){return"pusherTransport"+(t?"TLS":"NonTLS")}function
ee(t){var e=_e.getLocalStorage();if(e)try{delete e[te(t)]}catch(t){}}var
ne=function(){function t(t,e){var
n=e.delay;this.strategy=t,this.options={delay:n}}return
t.prototype.isSupported=function(){return
this.strategy.isSupported()},t.prototype.connect=function(t,e){var
n,o=this.strategy,r=new
I(this.options.delay,(function(){n=o.connect(t,e)}));return{abort:function(){r.ensureAborted(),n&&n.abort()},forceMinPriority:function(e){t=e,n&&n.forceMinPriority(e)}}},t}(),oe=function(){function
t(t,e,n){this.test=t,this.trueBranch=e,this.falseBranch=n}return
t.prototype.isSupported=function(){return(this.test()?this.trueBranch:this.falseBranch).isSupported()},t.prototype.connect=function(t,e){return(this.test()?this.trueBranch:this.falseBranch).connect(t,e)},t}(),re=function(){function
t(t){this.strategy=t}return t.prototype.isSupported=function(){return
this.strategy.isSupported()},t.prototype.connect=function(t,e){var
n=this.strategy.connect(t,(function(t,o){o&&n.abort(),e(t,o)}));return
n},t}();function ie(t){return function(){return t.isSupported()}}var
se,ce=function(t,e,n){var o={};function r(e,r,i,s,c){var
a=n(t,e,r,i,s,c);return o[e]=a,a}var
i,s=Object.assign({},e,{hostNonTLS:t.wsHost+":"+t.wsPort,hostTLS:t.wsHost+":"+t.wssPort,httpPath:t.wsPath}),c=Object.assign({},s,{useTLS:!0}),a=Object.assign({},e,{hostNonTLS:t.httpHost+":"+t.httpPort,hostTLS:t.httpHost+":"+t.httpsPort,httpPath:t.httpPath}),u={loop:!0,timeout:15e3,timeoutLimit:6e4},h=new
Vt({lives:2,minPingDelay:1e4,maxPingDelay:t.activityTimeout}),p=new
Vt({lives:2,minPingDelay:1e4,maxPingDelay:t.activityTimeout}),l=r("ws","ws",3,s,h),f=r("wss","ws",3,c,h),d=r("sockjs","sockjs",1,a),y=r("xhr_streaming","xhr_streaming",1,a,p),g=r("xdr_streaming","xdr_streaming",1,a,p),v=r("xhr_polling","xhr_polling",1,a),b=r("xdr_polling","xdr_polling",1,a),m=new
Yt([l],u),w=new Yt([f],u),_=new Yt([d],u),S=new Yt([new
oe(ie(y),y,g)],u),k=new Yt([new oe(ie(v),v,b)],u),C=new Yt([new
oe(ie(S),new $t([S,new ne(k,{delay:4e3})]),k)],u),T=new
oe(ie(C),C,_);return i=e.useTLS?new $t([m,new ne(T,{delay:2e3})]):new
$t([m,new ne(w,{delay:2e3}),new ne(T,{delay:5e3})]),new Zt(new re(new
oe(ie(l),i,T)),o,{ttl:18e5,timeline:e.timeline,useTLS:e.useTLS})},ae={getRequest:function(t){var
e=new window.XDomainRequest;return
e.ontimeout=function(){t.emit("error",new
d),t.close()},e.onerror=function(e){t.emit("error",e),t.close()},e.onprogress=function(){e.responseText&&e.responseText.length>0&&t.onChunk(200,e.responseText)},e.onload=function(){e.responseText&&e.responseText.length>0&&t.onChunk(200,e.responseText),t.emit("finished",200),t.close()},e},abortRequest:function(t){t.ontimeout=t.onerror=t.onprogress=t.onload=null,t.abort()}},ue=function(){var
t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof
Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in
e)e.hasOwnProperty(n)&&(t[n]=e[n])})(e,n)};return
function(e,n){function
o(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(o.prototype=n.prototype,new
o)}}(),he=function(t){function e(e,n,o){var r=t.call(this)||this;return
r.hooks=e,r.method=n,r.url=o,r}return
ue(e,t),e.prototype.start=function(t){var
e=this;this.position=0,this.xhr=this.hooks.getRequest(this),this.unloader=function(){e.close()},_e.addUnloadListener(this.unloader),this.xhr.open(this.method,this.url,!0),this.xhr.setRequestHeader&&this.xhr.setRequestHeader("Content-Type","application/json"),this.xhr.send(t)},e.prototype.close=function(){this.unloader&&(_e.removeUnloadListener(this.unloader),this.unloader=null),this.xhr&&(this.hooks.abortRequest(this.xhr),this.xhr=null)},e.prototype.onChunk=function(t,e){for(;;){var
n=this.advanceBuffer(e);if(!n)break;this.emit("chunk",{status:t,data:n})}this.isBufferTooLong(e)&&this.emit("buffer_too_long")},e.prototype.advanceBuffer=function(t){var
e=t.slice(this.position),n=e.indexOf("\n");return-1!==n?(this.position+=n+1,e.slice(0,n)):null},e.prototype.isBufferTooLong=function(t){return
this.position===t.length&&t.length>262144},e}(ut);!function(t){t[t.CONNECTING=0]="CONNECTING",t[t.OPEN=1]="OPEN",t[t.CLOSED=3]="CLOSED"}(se||(se={}));var
pe=se,le=1;function fe(t){var
e=-1===t.indexOf("?")?"?":"&";return
t+e+"t="+ +new Date+"&n="+le++}function
de(t){return Math.floor(Math.random()*t)}var ye,ge=function(){function
t(t,e){this.hooks=t,this.session=de(1e3)+"/"+function(t){for(var
e=[],n=0;n<t;n++)e.push(de(32).toString(32));return
e.join("")}(8),this.location=function(t){var
e=/([^\?]*)\/*(\??.*)/.exec(t);return{base:e[1],queryString:e[2]}}(e),this.readyState=pe.CONNECTING,this.openStream()}return
t.prototype.send=function(t){return
this.sendRaw(JSON.stringify([t]))},t.prototype.ping=function(){this.hooks.sendHeartbeat(this)},t.prototype.close=function(t,e){this.onClose(t,e,!0)},t.prototype.sendRaw=function(t){if(this.readyState!==pe.OPEN)return!1;try{return
_e.createSocketRequest("POST",fe((e=this.location,n=this.session,e.base+"/"+n+"/xhr_send"))).start(t),!0}catch(t){return!1}var
e,n},t.prototype.reconnect=function(){this.closeStream(),this.openStream()},t.prototype.onClose=function(t,e,n){this.closeStream(),this.readyState=pe.CLOSED,this.onclose&&this.onclose({code:t,reason:e,wasClean:n})},t.prototype.onChunk=function(t){var
e;if(200===t.status)switch(this.readyState===pe.OPEN&&this.onActivity(),t.data.slice(0,1)){case"o":e=JSON.parse(t.data.slice(1)||"{}"),this.onOpen(e);break;case"a":e=JSON.parse(t.data.slice(1)||"[]");for(var
n=0;n<e.length;n++)this.onEvent(e[n]);break;case"m":e=JSON.parse(t.data.slice(1)||"null"),this.onEvent(e);break;case"h":this.hooks.onHeartbeat(this);break;case"c":e=JSON.parse(t.data.slice(1)||"[]"),this.onClose(e[0],e[1],!0)}},t.prototype.onOpen=function(t){var
e,n,o;this.readyState===pe.CONNECTING?(t&&t.hostname&&(this.location.base=(e=this.location.base,n=t.hostname,(o=/(https?:\/\/)([^\/:]+)((\/|:)?.*)/.exec(e))[1]+n+o[3])),this.readyState=pe.OPEN,this.onopen&&this.onopen()):this.onClose(1006,"Server
lost
session",!0)},t.prototype.onEvent=function(t){this.readyState===pe.OPEN&&this.onmessage&&this.onmessage({data:t})},t.prototype.onActivity=function(){this.onactivity&&this.onactivity()},t.prototype.onError=function(t){this.onerror&&this.onerror(t)},t.prototype.openStream=function(){var
t=this;this.stream=_e.createSocketRequest("POST",fe(this.hooks.getReceiveURL(this.location,this.session))),this.stream.bind("chunk",(function(e){t.onChunk(e)})),this.stream.bind("finished",(function(e){t.hooks.onFinished(t,e)})),this.stream.bind("buffer_too_long",(function(){t.reconnect()}));try{this.stream.start()}catch(e){M.defer((function(){t.onError(e),t.onClose(1006,"Could
not start
streaming",!1)}))}},t.prototype.closeStream=function(){this.stream&&(this.stream.unbind_all(),this.stream.close(),this.stream=null)},t}(),ve={getReceiveURL:function(t,e){return
t.base+"/"+e+"/xhr_streaming"+t.queryString},onHeartbeat:function(t){t.sendRaw("[]")},sendHeartbeat:function(t){t.sendRaw("[]")},onFinished:function(t,e){t.onClose(1006,"Connection
interrupted
("+e+")",!1)}},be={getReceiveURL:function(t,e){return
t.base+"/"+e+"/xhr"+t.queryString},onHeartbeat:function(){},sendHeartbeat:function(t){t.sendRaw("[]")},onFinished:function(t,e){200===e?t.reconnect():t.onClose(1006,"Connection
interrupted ("+e+")",!1)}},me={getRequest:function(t){var
e=new(_e.getXHRAPI());return
e.onreadystatechange=e.onprogress=function(){switch(e.readyState){case
3:e.responseText&&e.responseText.length>0&&t.onChunk(e.status,e.responseText);break;case
4:e.responseText&&e.responseText.length>0&&t.onChunk(e.status,e.responseText),t.emit("finished",e.status),t.close()}},e},abortRequest:function(t){t.onreadystatechange=null,t.abort()}},we={createStreamingSocket:function(t){return
this.createSocket(ve,t)},createPollingSocket:function(t){return
this.createSocket(be,t)},createSocket:function(t,e){return new
ge(t,e)},createXHR:function(t,e){return
this.createRequest(me,t,e)},createRequest:function(t,e,n){return new
he(t,e,n)},createXDR:function(t,e){return
this.createRequest(ae,t,e)}},_e={nextAuthCallbackID:1,auth_callbacks:{},ScriptReceivers:i,DependenciesReceivers:a,getDefaultStrategy:ce,Transports:kt,transportConnectionInitializer:function(){var
t=this;t.timeline.info(t.buildTimelineMessage({transport:t.name+(t.options.useTLS?"s":"")})),t.hooks.isInitialized()?t.changeState("initialized"):t.hooks.file?(t.changeState("initializing"),u.load(t.hooks.file,{useTLS:t.options.useTLS},(function(e,n){t.hooks.isInitialized()?(t.changeState("initialized"),n(!0)):(e&&t.onError(e),t.onClose(),n(!1))}))):t.onClose()},HTTPFactory:we,TimelineTransport:et,getXHRAPI:function(){return
window.XMLHttpRequest},getWebSocketAPI:function(){return
window.WebSocket||window.MozWebSocket},setup:function(t){var
e=this;window.Pusher=t;var
n=function(){e.onDocumentBody(t.ready)};window.JSON?n():u.load("json2",{},n)},getDocument:function(){return
document},getProtocol:function(){return
this.getDocument().location.protocol},getAuthorizers:function(){return{ajax:_,jsonp:K}},onDocumentBody:function(t){var
e=this;document.body?t():setTimeout((function(){e.onDocumentBody(t)}),0)},createJSONPRequest:function(t,e){return
new tt(t,e)},createScriptRequest:function(t){return new
Z(t)},getLocalStorage:function(){try{return
window.localStorage}catch(t){return}},createXHR:function(){return
this.getXHRAPI()?this.createXMLHttpRequest():this.createMicrosoftXHR()},createXMLHttpRequest:function(){return
new(this.getXHRAPI())},createMicrosoftXHR:function(){return new
ActiveXObject("Microsoft.XMLHTTP")},getNetwork:function(){return
Tt},createWebSocket:function(t){return
new(this.getWebSocketAPI())(t)},createSocketRequest:function(t,e){if(this.isXHRSupported())return
this.HTTPFactory.createXHR(t,e);if(this.isXDRSupported(0===e.indexOf("https:")))return
this.HTTPFactory.createXDR(t,e);throw"Cross-origin HTTP requests are
not supported"},isXHRSupported:function(){var
t=this.getXHRAPI();return Boolean(t)&&void 0!==(new
t).withCredentials},isXDRSupported:function(t){var
e=t?"https:":"http:",n=this.getProtocol();return
Boolean(window.XDomainRequest)&&n===e},addUnloadListener:function(t){void
0!==window.addEventListener?window.addEventListener("unload",t,!1):void
0!==window.attachEvent&&window.attachEvent("onunload",t)},removeUnloadListener:function(t){void
0!==window.addEventListener?window.removeEventListener("unload",t,!1):void
0!==window.detachEvent&&window.detachEvent("onunload",t)}};!function(t){t[t.ERROR=3]="ERROR",t[t.INFO=6]="INFO",t[t.DEBUG=7]="DEBUG"}(ye||(ye={}));var
Se=ye,ke=function(){function
t(t,e,n){this.key=t,this.session=e,this.events=[],this.options=n||{},this.sent=0,this.uniqueID=0}return
t.prototype.log=function(t,e){t<=this.options.level&&(this.events.push(H({},e,{timestamp:M.now()})),this.options.limit&&this.events.length>this.options.limit&&this.events.shift())},t.prototype.error=function(t){this.log(Se.ERROR,t)},t.prototype.info=function(t){this.log(Se.INFO,t)},t.prototype.debug=function(t){this.log(Se.DEBUG,t)},t.prototype.isEmpty=function(){return
0===this.events.length},t.prototype.send=function(t,e){var
n=this,o=H({session:this.session,bundle:this.sent+1,key:this.key,lib:"js",version:this.options.version,cluster:this.options.cluster,features:this.options.features,timeline:this.events},this.options.params);return
this.events=[],t(o,(function(t,o){t||n.sent++,e&&e(t,o)})),!0},t.prototype.generateUniqueID=function(){return
this.uniqueID++,this.uniqueID},t}(),Ce=function(){function
t(t,e,n,o){this.name=t,this.priority=e,this.transport=n,this.options=o||{}}return
t.prototype.isSupported=function(){return
this.transport.isSupported({useTLS:this.options.useTLS})},t.prototype.connect=function(t,e){var
n=this;if(!this.isSupported())return Te(new
m,e);if(this.priority<t)return Te(new y,e);var
o=!1,r=this.transport.createConnection(this.name,this.priority,this.options.key,this.options),i=null,s=function(){r.unbind("initialized",s),r.connect()},c=function(){i=Qt.createHandshake(r,(function(t){o=!0,h(),e(null,t)}))},a=function(t){h(),e(t)},u=function(){var
t;h(),t=Y(r),e(new
g(t))},h=function(){r.unbind("initialized",s),r.unbind("open",c),r.unbind("error",a),r.unbind("closed",u)};return
r.bind("initialized",s),r.bind("open",c),r.bind("error",a),r.bind("closed",u),r.initialize(),{abort:function(){o||(h(),i?i.close():r.close())},forceMinPriority:function(t){o||n.priority<t&&(i?i.close():r.close())}}},t}();function
Te(t,e){return
M.defer((function(){e(t)})),{abort:function(){},forceMinPriority:function(){}}}var
Pe=_e.Transports,Oe=function(t,e,n,o,r,i){var s,c=Pe[n];if(!c)throw new
b(n);return!(t.enabledTransports&&-1===B(t.enabledTransports,e)||t.disabledTransports&&-1!==B(t.disabledTransports,e))?(r=Object.assign({ignoreNullOrigin:t.ignoreNullOrigin},r),s=new
Ce(e,o,i?i.getAssistant(c):c,r)):s=Ee,s},Ee={isSupported:function(){return!1},connect:function(t,e){var
n=M.defer((function(){e(new
m)}));return{abort:function(){n.ensureAborted()},forceMinPriority:function(){}}}};function
Le(t){return
t.httpHost?t.httpHost:t.cluster?"sockjs-"+t.cluster+".pusher.com":s.httpHost}function
xe(t){return
t.wsHost?t.wsHost:t.cluster?Ae(t.cluster):Ae(s.cluster)}function
Ae(t){return"ws-"+t+".pusher.com"}function
Re(t){return"https:"===_e.getProtocol()||!1!==t.forceTLS}function
je(t){return"enableStats"in
t?t.enableStats:"disableStats"in t&&!t.disableStats}var
De=function(){function t(e,n){var
o,r,i=this;if(function(t){if(null==t)throw"You must pass your app key
when you instantiate
Pusher."}(e),!(n=n||{}).cluster&&!n.wsHost&&!n.httpHost){var
c=p("javascriptQuickStart");$.warn("You should always
specify a cluster when connecting. "+c)}"disableStats"in
n&&$.warn("The disableStats option is deprecated in favor of
enableStats"),this.key=e,this.config=(r={activityTimeout:(o=n).activityTimeout||s.activityTimeout,authEndpoint:o.authEndpoint||s.authEndpoint,authTransport:o.authTransport||s.authTransport,cluster:o.cluster||s.cluster,httpPath:o.httpPath||s.httpPath,httpPort:o.httpPort||s.httpPort,httpsPort:o.httpsPort||s.httpsPort,pongTimeout:o.pongTimeout||s.pongTimeout,statsHost:o.statsHost||s.stats_host,unavailableTimeout:o.unavailableTimeout||s.unavailableTimeout,wsPath:o.wsPath||s.wsPath,wsPort:o.wsPort||s.wsPort,wssPort:o.wssPort||s.wssPort,enableStats:je(o),httpHost:Le(o),useTLS:Re(o),wsHost:xe(o)},"auth"in
o&&(r.auth=o.auth),"authorizer"in
o&&(r.authorizer=o.authorizer),"disabledTransports"in
o&&(r.disabledTransports=o.disabledTransports),"enabledTransports"in
o&&(r.enabledTransports=o.enabledTransports),"ignoreNullOrigin"in
o&&(r.ignoreNullOrigin=o.ignoreNullOrigin),"timelineParams"in
o&&(r.timelineParams=o.timelineParams),"nacl"in
o&&(r.nacl=o.nacl),r),this.channels=Qt.createChannels(),this.global_emitter=new
ut,this.sessionID=Math.floor(1e9*Math.random()),this.timeline=new
ke(this.key,this.sessionID,{cluster:this.config.cluster,features:t.getClientFeatures(),params:this.config.timelineParams||{},limit:50,level:Se.INFO,version:s.VERSION}),this.config.enableStats&&(this.timelineSender=Qt.createTimelineSender(this.timeline,{host:this.config.statsHost,path:"/timeline/v2/"+_e.TimelineTransport.name}));this.connection=Qt.createConnectionManager(this.key,{getStrategy:function(t){return
_e.getDefaultStrategy(i.config,t,Oe)},timeline:this.timeline,activityTimeout:this.config.activityTimeout,pongTimeout:this.config.pongTimeout,unavailableTimeout:this.config.unavailableTimeout,useTLS:Boolean(this.config.useTLS)}),this.connection.bind("connected",(function(){i.subscribeAll(),i.timelineSender&&i.timelineSender.send(i.connection.isUsingTLS())})),this.connection.bind("message",(function(t){var
e=0===t.event.indexOf("pusher_internal:");if(t.channel){var
n=i.channel(t.channel);n&&n.handleEvent(t)}e||i.global_emitter.emit(t.event,t.data)})),this.connection.bind("connecting",(function(){i.channels.disconnect()})),this.connection.bind("disconnected",(function(){i.channels.disconnect()})),this.connection.bind("error",(function(t){$.warn(t)})),t.instances.push(this),this.timeline.info({instances:t.instances.length}),t.isReady&&this.connect()}return
t.ready=function(){t.isReady=!0;for(var
e=0,n=t.instances.length;e<n;e++)t.instances[e].connect()},t.getClientFeatures=function(){return
U(W({ws:_e.Transports.ws},(function(t){return
t.isSupported({})})))},t.prototype.channel=function(t){return
this.channels.find(t)},t.prototype.allChannels=function(){return
this.channels.all()},t.prototype.connect=function(){if(this.connection.connect(),this.timelineSender&&!this.timelineSenderTimer){var
t=this.connection.isUsingTLS(),e=this.timelineSender;this.timelineSenderTimer=new
N(6e4,(function(){e.send(t)}))}},t.prototype.disconnect=function(){this.connection.disconnect(),this.timelineSenderTimer&&(this.timelineSenderTimer.ensureAborted(),this.timelineSenderTimer=null)},t.prototype.bind=function(t,e,n){return
this.global_emitter.bind(t,e,n),this},t.prototype.unbind=function(t,e,n){return
this.global_emitter.unbind(t,e,n),this},t.prototype.bind_global=function(t){return
this.global_emitter.bind_global(t),this},t.prototype.unbind_global=function(t){return
this.global_emitter.unbind_global(t),this},t.prototype.unbind_all=function(t){return
this.global_emitter.unbind_all(),this},t.prototype.subscribeAll=function(){var
t;for(t in
this.channels.channels)this.channels.channels.hasOwnProperty(t)&&this.subscribe(t)},t.prototype.subscribe=function(t){var
e=this.channels.add(t,this);return
e.subscriptionPending&&e.subscriptionCancelled?e.reinstateSubscription():e.subscriptionPending||"connected"!==this.connection.state||e.subscribe(),e},t.prototype.unsubscribe=function(t){var
e=this.channels.find(t);e&&e.subscriptionPending?e.cancelSubscription():(e=this.channels.remove(t))&&e.subscribed&&e.unsubscribe()},t.prototype.send_event=function(t,e,n){return
this.connection.send_event(t,e,n)},t.prototype.shouldUseTLS=function(){return
this.config.useTLS},t.instances=[],t.isReady=!1,t.logToConsole=!1,t.Runtime=_e,t.ScriptReceivers=_e.ScriptReceivers,t.DependenciesReceivers=_e.DependenciesReceivers,t.auth_callbacks=_e.auth_callbacks,t}(),Ie=e.default=De;_e.setup(De)}])}));
//#
sourceMappingURL=pusher.min.js.mapPK,�[�#o,,vector/index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK4~�[��Uy:y:
access.xmlnu�[���PK4~�[:��	TT�:assets/css/admin.cssnu�[���PK4~�[�О66K?assets/css/appointment.cssnu�[���PK4~�[��77�Cassets/css/appointments.cssnu�[���PK4~�[ġ�33MHassets/css/bbbclass.cssnu�[���PK4~�[p���55�Lassets/css/bbbclasses.cssnu�[���PK4~�[���22EQassets/css/capital.cssnu�[���PK4~�[
��33�Uassets/css/capitals.cssnu�[���PK4~�[,�>�227Zassets/css/comment.cssnu�[���PK4~�[���33�^assets/css/comments.cssnu�[���PK4~�[����55)cassets/css/consultant.cssnu�[���PK4~�[�4��66�gassets/css/consultants.cssnu�[���PK4~�[|��ۡ�'lassets/css/dashboard.cssnu�[���PK4~�[��ys11�assets/css/doctor.cssnu�[���PK4~�[�v�22��assets/css/doctors.cssnu�[���PK4~�[�#o,,��assets/css/index.htmlnu�[���PK4~�['E22o�assets/css/message.cssnu�[���PK4~�[�Kv33�assets/css/messages.cssnu�[���PK4~�[�
�DDa�assets/css/order.cssnu�[���PK4~�[�m��EE�assets/css/orders.cssnu�[���PK4~�[%i7N//s�assets/css/plan.cssnu�[���PK4~�[�XI�00�assets/css/plans.cssnu�[���PK4~�[�
��22Y�assets/css/reserve.cssnu�[���PK4~�[�2t-33ѩassets/css/reserves.cssnu�[���PK4~�[��22K�assets/css/session.cssnu�[���PK4~�[1(��33òassets/css/sessions.cssnu�[���PK4~�[�w`�//=�assets/css/sick.cssnu�[���PK4~�[���h00��assets/css/sicks.cssnu�[���PK4~�[�#o,,#�assets/images/icons/index.htmlnu�[���PK4~�[/o������assets/images/import.gifnu�[���PK4~�[�#o,,�assets/images/index.htmlnu�[���PK4~�[�#o,,E�assets/index.htmlnu�[���PK4~�[2[�rr��assets/js/admin.jsnu�[���PK4~�[�#o,,f�assets/js/index.htmlnu�[���PK4~�[!���M(M(
��config.xmlnu�[���PK4~�[�@�	ll]�controller.phpnu�[���PK4~�[U�11controllers/ajax.json.phpnu�[���PK4~�[MnXC!C!�controllers/appointment.phpnu�[���PK4~�[���Acontrollers/appointments.phpnu�[���PK4~�[>PV�*!*!sRcontrollers/bbbclass.phpnu�[���PK4~�[�ff���scontrollers/bbbclasses.phpnu�[���PK4~�[���!!�controllers/capital.phpnu�[���PK4~�[��'�����controllers/capitals.phpnu�[���PK4~�[�ZP!!!��controllers/comment.phpnu�[���PK4~�[�N4`���controllers/comments.phpnu�[���PK4~�[]ؖ�4"4"�controllers/consultant.phpnu�[���PK4~�[��M�controllers/consultants.phpnu�[���PK4~�[Ũ�?""�controllers/doctor.phpnu�[���PK4~�[���A��3@controllers/doctors.phpnu�[���PK4~�[ɳ`E��8Qcontrollers/import.phpnu�[���PK4~�[w�K@��Zcontrollers/import_reserves.phpnu�[���PK4~�[�#o,,Yccontrollers/index.htmlnu�[���PK4~�[&[��!!�ccontrollers/message.phpnu�[���PK4~�[��>t��1�controllers/messages.phpnu�[���PK4~�[�4-""I�controllers/order.phpnu�[���PK4~�[��yn����controllers/orders.phpnu�[���PK4~�[���?"?"��controllers/plan.phpnu�[���PK4~�[���՚�O�controllers/plans.phpnu�[���PK4~�[�����.�controllers/reservation.phpnu�[���PK4~�[^�8�!!Xcontrollers/reserve.phpnu�[���PK4~�[7�2���#controllers/reserves.phpnu�[���PK4~�[R�C�!!�4controllers/session.phpnu�[���PK4~�[�1���<Vcontrollers/sessions.phpnu�[���PK4~�[��X�!!Tgcontrollers/sick.phpnu�[���PK4~�[���̚���controllers/sicks.phpnu�[���PK4~�[���s��{�helpers/headercheck.phpnu�[���PK4~�[��HJ
J
��helpers/html/batch_.phpnu�[���PK4~�[�#o,,7�helpers/html/index.htmlnu�[���PK4~�[�#o,,��helpers/index.htmlnu�[���PK4~�[��j����helpers/reservation.phpnu�[���PK4~�[��%p��ughelpers/webhook.phpnu�[���PK4~�[�#o,,
fiindex.htmlnu�[���PK4~�[L��+��$�ilayouts/appointment/details_left.phpnu�[���PK4~�[n�<%��%�rlayouts/appointment/details_right.phpnu�[���PK4~�[�#o,,|layouts/appointment/index.htmlnu�[���PK4~�[�w+e��"�|layouts/appointment/publishing.phpnu�[���PK4~�[8���"ʅlayouts/appointment/publlshing.phpnu�[���PK4~�[f&S

�layouts/batchselection.phpnu�[���PK4~�[tv�t��!a�layouts/bbbclass/details_left.phpnu�[���PK4~�[�#o,,��layouts/bbbclass/index.htmlnu�[���PK4~�[�����'�layouts/bbbclass/publishing.phpnu�[���PK4~�[8���o�layouts/bbbclass/publlshing.phpnu�[���PK4~�[�l����
��layouts/capital/details_left.phpnu�[���PK4~�[o���!ɾlayouts/capital/details_right.phpnu�[���PK4~�[�#o,,��layouts/capital/index.htmlnu�[���PK4~�[�����X�layouts/capital/publishing.phpnu�[���PK4~�[8�����layouts/capital/publlshing.phpnu�[���PK4~�[��=��%��layouts/comment/details_fullwidth.phpnu�[���PK4~�[Fu
0��
+�layouts/comment/details_left.phpnu�[���PK4~�[���N��!W�layouts/comment/details_right.phpnu�[���PK4~�[�#o,,w�layouts/comment/index.htmlnu�[���PK4~�[������layouts/comment/publishing.phpnu�[���PK4~�[8���4layouts/comment/publlshing.phpnu�[���PK4~�[�c�4,	,	({	layouts/consultant/details_fullwidth.phpnu�[���PK4~�[Knn-	-	#�layouts/consultant/details_left.phpnu�[���PK4~�[$脽		$layouts/consultant/details_right.phpnu�[���PK4~�[�#o,,�%layouts/consultant/index.htmlnu�[���PK4~�[�����!j&layouts/consultant/publishing.phpnu�[���PK4~�[8���!�/layouts/consultant/publlshing.phpnu�[���PK4~�[OH��$�8layouts/doctor/details_fullwidth.phpnu�[���PK4~�[M����EBlayouts/doctor/details_left.phpnu�[���PK4~�[�u����
�Klayouts/doctor/details_right.phpnu�[���PK4~�[�#o,,�Tlayouts/doctor/index.htmlnu�[���PK4~�[�����AUlayouts/doctor/publishing.phpnu�[���PK4~�[8����^layouts/doctor/publlshing.phpnu�[���PK4~�[�#o,,�glayouts/index.htmlnu�[���PK4~�[��5��
;hlayouts/message/details_left.phpnu�[���PK4~�[B��z��!lqlayouts/message/details_right.phpnu�[���PK4~�[�#o,,�zlayouts/message/index.htmlnu�[���PK4~�[�����{layouts/message/publishing.phpnu�[���PK4~�[8���M�layouts/message/publlshing.phpnu�[���PK4~�[���`		��layouts/order/details_left.phpnu�[���PK4~�[`��A		�layouts/order/details_right.phpnu�[���PK4~�[�#o,,K�layouts/order/index.htmlnu�[���PK4~�[~�w�)	)	��layouts/order/publishing.phpnu�[���PK4~�[9LM�)	)	4�layouts/order/publlshing.phpnu�[���PK4~�[���w����layouts/plan/details_left.phpnu�[���PK4~�[���g��׼layouts/plan/details_right.phpnu�[���PK4~�[�#o,,��layouts/plan/index.htmlnu�[���PK4~�[�����k�layouts/plan/publishing.phpnu�[���PK4~�[8�����layouts/plan/publlshing.phpnu�[���PK4~�[2����
��layouts/reserve/details_left.phpnu�[���PK4~�[�V$��!8�layouts/reserve/details_right.phpnu�[���PK4~�[�#o,,��layouts/reserve/index.htmlnu�[���PK4~�[�������layouts/reserve/publishing.phpnu�[���PK4~�[8���B�layouts/reserve/publlshing.phpnu�[���PK4~�[Rg����
��layouts/session/details_left.phpnu�[���PK4~�[��AN��!�layouts/session/details_right.phpnu�[���PK4~�[�#o,,�layouts/session/index.htmlnu�[���PK4~�[�����\layouts/session/publishing.phpnu�[���PK4~�[8����layouts/session/publlshing.phpnu�[���PK4~�[�
�K���#layouts/sick/details_left.phpnu�[���PK4~�[X	^��-layouts/sick/details_right.phpnu�[���PK4~�[�#o,,M6layouts/sick/index.htmlnu�[���PK4~�[������6layouts/sick/publishing.phpnu�[���PK4~�[8���@layouts/sick/publlshing.phpnu�[���PK4~�[�L���HImodels/ajax.phpnu�[���PK4~�[n���NUNU5Ymodels/appointment.phpnu�[���PK4~�[�C�|�,�,ɮmodels/appointments.phpnu�[���PK4~�[���n#U#U��models/bbbclass.phpnu�[���PK4~�[X�&]-]-1models/bbbclasses.phpnu�[���PK4~�[%P�T�T�^models/capital.phpnu�[���PK4~�[��h�-�-ݳmodels/capitals.phpnu�[���PK4~�[i��BUBU��models/comment.phpnu�[���PK4~�[��9i,,A7	models/comments.phpnu�[���PK4~�[&vӘX�X�c	models/consultant.phpnu�[���PK4~�[z<�<D0D0}�	models/consultants.phpnu�[���PK4~�[���]XX�	models/doctor.phpnu�[���PK4~�[a&�c4646ME
models/doctors.phpnu�[���PK4~�[y�?����{
models/fields/appointment.phpnu�[���PK4~�[Oht�
�
Ɉ
models/fields/capital.phpnu�[���PK4~�[*��jj�
models/fields/city.phpnu�[���PK4~�[�c�,����
models/fields/consultant.phpnu�[���PK4~�[&�d���Ĭ
models/fields/doctor.phpnu�[���PK4~�[�#o,,ݸ
models/fields/index.htmlnu�[���PK4~�[���~
~
Q�
models/fields/plan.phpnu�[���PK4~�[�F���
models/fields/reply.phpnu�[���PK4~�[Y�d[44��
models/fields/sick.phpnu�[���PK4~�[�L�C!a�
models/fields/adminjsprovider.phpnu�[���PK4~�[�7N466��
models/forms/appointment.jsnu�[���PK4~�[[j2���P�
models/forms/appointment.xmlnu�[���PK4~�[�S(b�%�%nmodels/forms/bbbclass.xmlnu�[���PK4~�[r@�k22�7models/forms/capital.jsnu�[���PK4~�[~�M���<models/forms/capital.xmlnu�[���PK4~�[M���223Smodels/forms/comment.jsnu�[���PK4~�[:RV�3
3
�Wmodels/forms/comment.xmlnu�[���PK4~�[��	55'xmodels/forms/consultant.jsnu�[���PK4~�[�Y�e<7<7�|models/forms/consultant.xmlnu�[���PK4~�[K�Y(''-�models/forms/doctor.jsnu�[���PK4~�[���-K(K(��models/forms/doctor.xmlnu�[���PK4~�[>�ˢ��$,�models/forms/filter_appointments.xmlnu�[���PK4~�[t�Y�dd"`�models/forms/filter_bbbclasses.xmlnu�[���PK4~�[QP�pp
�models/forms/filter_capitals.xmlnu�[���PK4~�[�>�
 
�models/forms/filter_comments.xmlnu�[���PK4~�[t�@��#Fmodels/forms/filter_consultants.xmlnu�[���PK4~�[$)U??smodels/forms/filter_doctors.xmlnu�[���PK4~�[�{
  models/forms/filter_messages.xmlnu�[���PK4~�[o
�rrqmodels/forms/filter_orders.xmlnu�[���PK4~�[��E		1'models/forms/filter_plans.xmlnu�[���PK4~�[�$�LB	B	
�0models/forms/filter_reserves.xmlnu�[���PK4~�[�93q 

:models/forms/filter_sessions.xmlnu�[���PK4~�[��qi�Amodels/forms/filter_sicks.xmlnu�[���PK4~�[�#o,,�Hmodels/forms/index.htmlnu�[���PK4~�[��922hImodels/forms/message.jsnu�[���PK4~�[p�����Mmodels/forms/message.xmlnu�[���PK4~�[��..�kmodels/forms/order.jsnu�[���PK4~�[J��??jpmodels/forms/order.xmlnu�[���PK4~�[>�O�//�models/forms/plan.jsnu�[���PK4~�[5�JJb�models/forms/plan.xmlnu�[���PK4~�[!�/�22�models/forms/reserve.jsnu�[���PK4~�[����&�&j�models/forms/reserve.xmlnu�[���PK4~�[��Vn22��models/forms/session.jsnu�[���PK4~�[�6
�NN�models/forms/session.xmlnu�[���PK4~�[g�\�33�
models/forms/sick.jsnu�[���PK4~�[@{Y���

models/forms/sick.xmlnu�[���PK4~�[�X�2O2O'*
models/import.phpnu�[���PK4~�[�c�SS�y
models/import_reserves.phpnu�[���PK4~�[�#o,,��
models/index.htmlnu�[���PK4~�[C�qҥS�Sd�
models/message.phpnu�[���PK4~�[3�[-�<�<K!models/messages.phpnu�[���PK4~�[�\�#wWwW^models/order.phpnu�[���PK4~�[��b��/�/еmodels/orders.phpnu�[���PK4~�[��
DVV��models/plan.phpnu�[���PK4~�[�x't66$<models/plans.phpnu�[���PK4~�[����&�&rmodels/reservation.phpnu�[���PK4~�[g[ᙔU�UO�models/reserve.phpnu�[���PK4~�[I�D�8�8%�models/reserves.phpnu�[���PK4~�[�#o,,�'models/rules/index.htmlnu�[���PK4~�[��jݑ�_(models/rules/mobile.phpnu�[���PK4~�[S��$$7.models/rules/planrule.phpnu�[���PK4~�[O�_�$$�Rmodels/rules/eplanrule.phpnu�[���PK4~�[I�j��U�U�vmodels/session.phpnu�[���PK4~�[��S�=�=2�models/sessions.phpnu�[���PK4~�[��F�U�Umodels/sick.phpnu�[���PK4~�[�d�+�+Eamodels/sicks.phpnu�[���PK4~�[�ԡ��}�reservation.phpnu�[���PK4~�[�)kQ����reservation.xmlnu�[���PK4~�[�
wӏ���
j�script.phpnu�[���PK4~�[�#o,,3�sql/index.htmlnu�[���PK4~�[O��N�=�=��sql/install.mysql.utf8.sqlnu�[���PK5~�[������i�sql/uninstall.mysql.utf8.sqlnu�[���PK5~�[�#o,,��sql/updates/index.htmlnu�[���PK5~�[FW�:

�sql/updates/mysql/1.0.0.sqlnu�[���PK5~�[���%PPs�sql/updates/mysql/1.0.1.sqlnu�[���PK5~�[��5�[[�sql/updates/mysql/1.0.10.sqlnu�[���PK5~�[Βy__��sql/updates/mysql/1.0.11.sqlnu�[���PK5~�[����`�sql/updates/mysql/1.0.12.sqlnu�[���PK5~�[���ZZw�sql/updates/mysql/1.0.13.sqlnu�[���PK5~�[�z�,``�sql/updates/mysql/1.0.14.sqlnu�[���PK5~�[X����sql/updates/mysql/1.0.15.sqlnu�[���PK5~�[�"ڎ�$�sql/updates/mysql/1.0.16.sqlnu�[���PK5~�[ڳ��ZZ��sql/updates/mysql/1.0.17.sqlnu�[���PK5~�[S��bb��sql/updates/mysql/1.0.18.sqlnu�[���PK5~�[�+1��R�sql/updates/mysql/1.0.19.sqlnu�[���PK5~�[��G���a�sql/updates/mysql/1.0.2.sqlnu�[���PK5~�[+&iiy�sql/updates/mysql/1.0.20.sqlnu�[���PK5~�[đ���.�sql/updates/mysql/1.0.21.sqlnu�[���PK5~�[Y��q��6�sql/updates/mysql/1.0.22.sqlnu�[���PK5~�[���jju�sql/updates/mysql/1.0.23.sqlnu�[���PK5~�[��
]ff+�sql/updates/mysql/1.0.24.sqlnu�[���PK5~�[�FZpp��sql/updates/mysql/1.0.25.sqlnu�[���PK5~�[��{[��sql/updates/mysql/1.0.26.sqlnu�[���PK5~�[��!!�sql/updates/mysql/1.0.27.sqlnu�[���PK5~�[Z���[[T�sql/updates/mysql/1.0.28.sqlnu�[���PK5~�[��!!��sql/updates/mysql/1.0.29.sqlnu�[���PK5~�[�u�gghsql/updates/mysql/1.0.3.sqlnu�[���PK5~�[a��xTTsql/updates/mysql/1.0.30.sqlnu�[���PK5~�[��ǯ��sql/updates/mysql/1.0.31.sqlnu�[���PK5~�[^������	sql/updates/mysql/1.0.32.sqlnu�[���PK5~�[z��[���
sql/updates/mysql/1.0.33.sqlnu�[���PK5~�[�|����sql/updates/mysql/1.0.34.sqlnu�[���PK5~�[ɨ�����sql/updates/mysql/1.0.35.sqlnu�[���PK5~�[c}�QQ�sql/updates/mysql/1.0.36.sqlnu�[���PK5~�[U��bcc�sql/updates/mysql/1.0.4.sqlnu�[���PK5~�[5�G���/sql/updates/mysql/1.0.5.sqlnu�[���PK5~�[*NJ���>
sql/updates/mysql/1.0.6.sqlnu�[���PK5~�[,J�__i%sql/updates/mysql/1.0.7.sqlnu�[���PK5~�[���JJ&sql/updates/mysql/1.0.8.sqlnu�[���PK5~�[v�z6���(sql/updates/mysql/1.0.9.sqlnu�[���PK5~�[�#o,,�-sql/updates/mysql/index.htmlnu�[���PK5~�[ׇ{�kk*.sql/updates/mysql/1.0.37.sqlnu�[���PK5~�[�j4S]]�.sql/updates/mysql/1.0.38.sqlnu�[���PK5~�[{��,�!�!�/tables/appointment.phpnu�[���PK5~�[���}!}!sQtables/bbbclass.phpnu�[���PK5~�[�˳fo!o!3stables/capital.phpnu�[���PK5~�[���o!o!�tables/comment.phpnu�[���PK5~�[	�8��!�!��tables/consultant.phpnu�[���PK5~�[�Th{!{!��tables/doctor.phpnu�[���PK5~�[�#o,,E�tables/index.htmlnu�[���PK5~�[wҤ�o!o!��tables/message.phpnu�[���PK5~�[ّ"�"ctables/order.phpnu�[���PK5~�[���H!H!4?tables/plan.phpnu�[���PK5~�[�g
o!o!�`tables/reserve.phpnu�[���PK5~�[��Do!o!l�tables/session.phpnu�[���PK5~�[�i�H!H!�tables/sick.phpnu�[���PK5~�[/�;+��!��views/appointment/submitbutton.jsnu�[���PK5~�[õ�����views/appointment/tmpl/edit.phpnu�[���PK5~�[�#o,,!��views/appointment/tmpl/index.htmlnu�[���PK5~�[E�:LXXJ�views/appointment/view.html.phpnu�[���PK5~�[�#o,,�views/appointments/index.htmlnu�[���PK5~�[+m%%#j�views/appointments/tmpl/default.phpnu�[���PK5~�[��{P��.�views/appointments/tmpl/default_batch_body.phpnu�[���PK5~�[GE����0.views/appointments/tmpl/default_batch_footer.phpnu�[���PK5~�[Ќ�d��(uviews/appointments/tmpl/default_body.phpnu�[���PK5~�[}�A{��(�!views/appointments/tmpl/default_foot.phpnu�[���PK5~�[,z
qD
D
(�&views/appointments/tmpl/default_head.phpnu�[���PK5~�[�hJ�99+w1views/appointments/tmpl/default_toolbar.phpnu�[���PK5~�[�#o,,"@views/appointments/tmpl/index.htmlnu�[���PK5~�[���++
�@views/appointments/view.html.phpnu�[���PK5~�[��cK��_views/bbbclass/submitbutton.jsnu�[���PK5~�[1����Aeviews/bbbclass/tmpl/edit.phpnu�[���PK5~�[�#o,,
xviews/bbbclass/tmpl/index.htmlnu�[���PK5~�[�Z�yy�xviews/bbbclass/view.html.phpnu�[���PK5~�[�#o,,_�views/bbbclasses/index.htmlnu�[���PK5~�[�
��!֔views/bbbclasses/tmpl/default.phpnu�[���PK5~�[�S����,@�views/bbbclasses/tmpl/default_batch_body.phpnu�[���PK5~�[��=i��.��views/bbbclasses/tmpl/default_batch_footer.phpnu�[���PK5~�["�&ʬviews/bbbclasses/tmpl/default_body.phpnu�[���PK5~�[�
���&;�views/bbbclasses/tmpl/default_foot.phpnu�[���PK5~�[�MT��
�
&_�views/bbbclasses/tmpl/default_head.phpnu�[���PK5~�[&V77)��views/bbbclasses/tmpl/default_toolbar.phpnu�[���PK5~�[�#o,,
�views/bbbclasses/tmpl/index.htmlnu�[���PK5~�[?D}5))��views/bbbclasses/view.html.phpnu�[���PK5~�[[����views/capital/submitbutton.jsnu�[���PK5~�[��r���@views/capital/tmpl/edit.phpnu�[���PK5~�[�#o,,{views/capital/tmpl/index.htmlnu�[���PK5~�[�%=���views/capital/view.html.phpnu�[���PK5~�[�#o,,30views/capitals/index.htmlnu�[���PK5~�[X5��0views/capitals/tmpl/default.phpnu�[���PK5~�[�(m
��*=views/capitals/tmpl/default_batch_body.phpnu�[���PK5~�[�C��,LBviews/capitals/tmpl/default_batch_footer.phpnu�[���PK5~�[Z(�kOO$�Hviews/capitals/tmpl/default_body.phpnu�[���PK5~�[���+��$.Xviews/capitals/tmpl/default_foot.phpnu�[���PK5~�[�
"A�	�	$P]views/capitals/tmpl/default_head.phpnu�[���PK5~�[��55'�gviews/capitals/tmpl/default_toolbar.phpnu�[���PK5~�[�#o,,$vviews/capitals/tmpl/index.htmlnu�[���PK5~�[(4�vviews/capitals/view.html.phpnu�[���PK5~�[秃����views/comment/submitbutton.jsnu�[���PK5~�[V�.���*�views/comment/tmpl/edit.phpnu�[���PK5~�[�#o,,�views/comment/tmpl/index.htmlnu�[���PK5~�[�G�����views/comment/view.html.phpnu�[���PK5~�[�#o,,��views/comments/index.htmlnu�[���PK5~�[��\�<�views/comments/tmpl/default.phpnu�[���PK5~�[�;�|��*��views/comments/tmpl/default_batch_body.phpnu�[���PK5~�[�SdH��,��views/comments/tmpl/default_batch_footer.phpnu�[���PK5~�[45�oo$�views/comments/tmpl/default_body.phpnu�[���PK5~�[�Ó���$��views/comments/tmpl/default_foot.phpnu�[���PK5~�[5e�>�
�
$�views/comments/tmpl/default_head.phpnu�[���PK5~�[eGg55'views/comments/tmpl/default_toolbar.phpnu�[���PK5~�[�#o,,�views/comments/tmpl/index.htmlnu�[���PK5~�[�얺��views/comments/view.html.phpnu�[���PK5~�[��4��
�0views/consultant/submitbutton.jsnu�[���PK5~�[�d��77%7views/consultant/tmpl/edit.phpnu�[���PK5~�[�#o,,
�Nviews/consultant/tmpl/index.htmlnu�[���PK5~�[D���GG&Oviews/consultant/view.html.phpnu�[���PK5~�[�#o,,�kviews/consultants/index.htmlnu�[���PK5~�[�A�
 
"3lviews/consultants/tmpl/default.phpnu�[���PK5~�[������-�xviews/consultants/tmpl/default_batch_body.phpnu�[���PK5~�[������/�}views/consultants/tmpl/default_batch_footer.phpnu�[���PK5~�[�����'4�views/consultants/tmpl/default_body.phpnu�[���PK5~�[�S���'��views/consultants/tmpl/default_foot.phpnu�[���PK5~�[��{���'��views/consultants/tmpl/default_head.phpnu�[���PK5~�[��v,88*��views/consultants/tmpl/default_toolbar.phpnu�[���PK5~�[�#o,,!��views/consultants/tmpl/index.htmlnu�[���PK5~�[��1PP�views/consultants/view.html.phpnu�[���PK5~�[�������views/doctor/submitbutton.jsnu�[���PK5~�[�Y�����views/doctor/tmpl/edit.phpnu�[���PK5~�[�#o,,�views/doctor/tmpl/index.htmlnu�[���PK5~�[�P'��J�views/doctor/view.html.phpnu�[���PK5~�[�#o,,wviews/doctors/index.htmlnu�[���PK5~�[��t���views/doctors/tmpl/default.phpnu�[���PK5~�[~u����)�views/doctors/tmpl/default_batch_body.phpnu�[���PK5~�[I=����+-%views/doctors/tmpl/default_batch_footer.phpnu�[���PK5~�[�|}�44#j+views/doctors/tmpl/default_body.phpnu�[���PK5~�[�Ay���#�=views/doctors/tmpl/default_foot.phpnu�[���PK5~�[�rߴ��#Cviews/doctors/tmpl/default_head.phpnu�[���PK5~�[z.�A44&DPviews/doctors/tmpl/default_toolbar.phpnu�[���PK5~�[�#o,,�^views/doctors/tmpl/index.htmlnu�[���PK5~�[��(��G_views/doctors/view.html.phpnu�[���PK5~�[�#o,,<~views/import/index.htmlnu�[���PK5~�[�r��$�$�~views/import/tmpl/default.phpnu�[���PK5~�[�#o,,��views/import/tmpl/index.htmlnu�[���PK5~�[��ܘ||p�views/import/view.html.phpnu�[���PK5~�[�#o,,
6�views/import_reserves/index.htmlnu�[���PK5~�[t���s&s&&��views/import_reserves/tmpl/default.phpnu�[���PK5~�[�#o,,%{�views/import_reserves/tmpl/index.htmlnu�[���PK5~�[:�:
:
#��views/import_reserves/view.html.phpnu�[���PK5~�[�#o,,��views/index.htmlnu�[���PK5~�[�d�����views/message/submitbutton.jsnu�[���PK5~�[�g���0�views/message/tmpl/edit.phpnu�[���PK5~�[�#o,,kviews/message/tmpl/index.htmlnu�[���PK5~�[N].H���views/message/view.html.phpnu�[���PK5~�[�#o,,#views/messages/index.htmlnu�[���PK5~�[�;"��views/messages/tmpl/default.phpnu�[���PK5~�[¯���*�(views/messages/tmpl/default_batch_body.phpnu�[���PK5~�[�@���,<.views/messages/tmpl/default_batch_footer.phpnu�[���PK5~�[�n-:��${4views/messages/tmpl/default_body.phpnu�[���PK5~�[�vg��$�Eviews/messages/tmpl/default_foot.phpnu�[���PK5~�[�5�L��$�Jviews/messages/tmpl/default_head.phpnu�[���PK5~�[A�G55'�Vviews/messages/tmpl/default_toolbar.phpnu�[���PK5~�[�#o,,Meviews/messages/tmpl/index.htmlnu�[���PK5~�[8y>���eviews/messages/view.html.phpnu�[���PK5~�[�)rf��views/order/submitbutton.jsnu�[���PK5~�[VZ�
���views/order/tmpl/edit.phpnu�[���PK5~�[�#o,,&�views/order/tmpl/index.htmlnu�[���PK5~�[�R>@@��views/order/view.html.phpnu�[���PK5~�[�#o,,&�views/orders/index.htmlnu�[���PK5~�[��P�##��views/orders/tmpl/default.phpnu�[���PK5~�[�Ir{��(	�views/orders/tmpl/default_batch_body.phpnu�[���PK5~�[��!��*`�views/orders/tmpl/default_batch_footer.phpnu�[���PK5~�[a

A��"��views/orders/tmpl/default_body.phpnu�[���PK5~�[?y�?��"��views/orders/tmpl/default_foot.phpnu�[���PK5~�[5	��WW"��views/orders/tmpl/default_head.phpnu�[���PK5~�[�X�;ee%s�views/orders/tmpl/default_toolbar.phpnu�[���PK5~�[�#o,,-views/orders/tmpl/index.htmlnu�[���PK5~�[:�����views/orders/view.html.phpnu�[���PK5~�[�`�����!views/plan/submitbutton.jsnu�[���PK5~�[���w���'views/plan/tmpl/edit.phpnu�[���PK5~�[�#o,,�:views/plan/tmpl/index.htmlnu�[���PK5~�[F��y��G;views/plan/view.html.phpnu�[���PK5~�[�#o,,8Vviews/plans/index.htmlnu�[���PK5~�[�ă�Vviews/plans/tmpl/default.phpnu�[���PK5~�[�Rz���'�bviews/plans/tmpl/default_batch_body.phpnu�[���PK5~�[&)ZS��)6hviews/plans/tmpl/default_batch_footer.phpnu�[���PK5~�[e��LL!onviews/plans/tmpl/default_body.phpnu�[���PK5~�[�Ó���!views/plans/tmpl/default_foot.phpnu�[���PK5~�[��zuu!+�views/plans/tmpl/default_head.phpnu�[���PK5~�[�pF�22$�views/plans/tmpl/default_toolbar.phpnu�[���PK5~�[�#o,,w�views/plans/tmpl/index.htmlnu�[���PK5~�[6�ؔ�views/plans/view.html.phpnu�[���PK5~�[�#o,,;�views/reservation/index.htmlnu�[���PK5~�[Z!%��"��views/reservation/tmpl/default.phpnu�[���PK5~�[�yj��'��views/reservation/tmpl/default_main.phpnu�[���PK5~�[�lB�V
V
&��views/reservation/tmpl/default_vdm.phpnu�[���PK5~�[�#o,,!A�views/reservation/tmpl/index.htmlnu�[���PK5~�[�{]�����views/reservation/view.html.phpnu�[���PK5~�[�y4�����views/reserve/submitbutton.jsnu�[���PK5~�[D"W����views/reserve/tmpl/edit.phpnu�[���PK5~�[�#o,,�views/reserve/tmpl/index.htmlnu�[���PK5~�["S�Q����views/reserve/view.html.phpnu�[���PK5~�[�#o,,�views/reserves/index.htmlnu�[���PK5~�[�X]�9views/reserves/tmpl/default.phpnu�[���PK5~�[�b���*�&views/reserves/tmpl/default_batch_body.phpnu�[���PK5~�[e��%��,�+views/reserves/tmpl/default_batch_footer.phpnu�[���PK5~�[���n��$2views/reserves/tmpl/default_body.phpnu�[���PK5~�[`9����$�Dviews/reserves/tmpl/default_foot.phpnu�[���PK5~�[*F�6��$Jviews/reserves/tmpl/default_head.phpnu�[���PK5~�[f��?55'kWviews/reserves/tmpl/default_toolbar.phpnu�[���PK5~�[�#o,,�eviews/reserves/tmpl/index.htmlnu�[���PK5~�[.F�|kkqfviews/reserves/view.html.phpnu�[���PK5~�[v�!��(�views/session/submitbutton.jsnu�[���PK5~�[�K�o��c�views/session/tmpl/edit.phpnu�[���PK5~�[�#o,,��views/session/tmpl/index.htmlnu�[���PK5~�[6'3����views/session/view.html.phpnu�[���PK5~�[�#o,,V�views/sessions/index.htmlnu�[���PK5~�[�˺views/sessions/tmpl/default.phpnu�[���PK5~�[|���*+�views/sessions/tmpl/default_batch_body.phpnu�[���PK5~�[�W-r��,o�views/sessions/tmpl/default_batch_footer.phpnu�[���PK5~�[��O''$��views/sessions/tmpl/default_body.phpnu�[���PK5~�[�
���$)�views/sessions/tmpl/default_foot.phpnu�[���PK5~�[v�	D�
�
$K�views/sessions/tmpl/default_head.phpnu�[���PK5~�[N��F55''�views/sessions/tmpl/default_toolbar.phpnu�[���PK5~�[�#o,,�views/sessions/tmpl/index.htmlnu�[���PK5~�[�d����-views/sessions/view.html.phpnu�[���PK5~�[��&)���views/sick/submitbutton.jsnu�[���PK5~�[ǜ2��0&views/sick/tmpl/edit.phpnu�[���PK5~�[�#o,,a=views/sick/tmpl/index.htmlnu�[���PK5~�[���UU�=views/sick/view.html.phpnu�[���PK5~�[�#o,,tZviews/sicks/index.htmlnu�[���PK5~�[Sʼ��Zviews/sicks/tmpl/default.phpnu�[���PK5~�[�W����'4gviews/sicks/tmpl/default_batch_body.phpnu�[���PK5~�[/���)rlviews/sicks/tmpl/default_batch_footer.phpnu�[���PK5~�[�nGE��!�rviews/sicks/tmpl/default_body.phpnu�[���PK5~�[���7��!Ƀviews/sicks/tmpl/default_foot.phpnu�[���PK5~�[�*z"!�views/sicks/tmpl/default_head.phpnu�[���PK5~�[_c�P22$O�views/sicks/tmpl/default_toolbar.phpnu�[���PK5~�[�#o,,բviews/sicks/tmpl/index.htmlnu�[���PK5~�[�[��@@L�views/sicks/view.html.phpnu�[���PK5~�[�W����views/submitbutton.jsnu�[���PK5~�[X��6���views/tmpl/default.phpnu�[���PK5~�[J��!�views/tmpl/default_batch_body.phpnu�[���PK5~�[�	�B#a�views/tmpl/default_batch_footer.phpnu�[���PK5~�[ԧ������views/tmpl/default_body.phpnu�[���PK5~�["�����views/tmpl/default_foot.phpnu�[���PK5~�[�����/�views/tmpl/default_head.phpnu�[���PK5~�[���\\�views/tmpl/default_toolbar.phpnu�[���PK5~�[4��a��views/tmpl/edit.phpnu�[���PK5~�[�#o,,�views/tmpl/index.htmlnu�[���PK5~�[a�ܰ��|�views/view.html.phpnu�[���PK5~�[p���obbb/LICENSEnu�[���PK5~�[�.X���
�bbb/README.mdnu�[���PK5~�[���66�+bbb/autoload.phpnu�[���PK5~�[S�ox>/bbb/codeception.ymlnu�[���PK5~�[T�����0bbb/composer.jsonnu�[���PK5~�[�#o,,�4bbb/index.htmlnu�[���PK5~�[�/hh5bbb/phpunit.xml.distnu�[���PK5~�[O��=�=�9bbb/src/BigBlueButton.phpnu�[���PK5~�[�����wbbb/src/Core/ApiMethod.phpnu�[���PK5~�[q�[
[
�~bbb/src/Core/Attendee.phpnu�[���PK5~�[��	�'	'	��bbb/src/Core/Format.phpnu�[���PK5~�[m	�

�bbb/src/Core/GuestPolicy.phpnu�[���PK5~�[3iSj	j	Z�bbb/src/Core/Hook.phpnu�[���PK5~�[���hh	�bbb/src/Core/Image.phpnu�[���PK5~�[D�=�!�!��bbb/src/Core/Meeting.phpnu�[���PK5~�[���ll��bbb/src/Core/MeetingLayout.phpnu�[���PK5~�[���'RR��bbb/src/Core/Record.phpnu�[���PK5~�[�#o,,=�bbb/src/Core/index.htmlnu�[���PK5~�[N�ܽ�+��bbb/src/Exceptions/BadResponseException.phpnu�[���PK5~�[�#o,,��bbb/src/Exceptions/index.htmlnu�[���PK5~�[՘|���%A�bbb/src/Parameters/BaseParameters.phpnu�[���PK5~�[����vVvV.\�bbb/src/Parameters/CreateMeetingParameters.phpnu�[���PK5~�[�DϿ��10Cbbb/src/Parameters/DeleteRecordingsParameters.phpnu�[���PK5~�['���+xJbbb/src/Parameters/EndMeetingParameters.phpnu�[���PK5~�[3�z��/�Sbbb/src/Parameters/GetMeetingInfoParameters.phpnu�[���PK5~�[x߈G�	�	.[bbb/src/Parameters/GetRecordingsParameters.phpnu�[���PK5~�[D}_�C
C
,ebbb/src/Parameters/HooksCreateParameters.phpnu�[���PK5~�[h�c��-�obbb/src/Parameters/HooksDestroyParameters.phpnu�[���PK5~�[�2�c��1�vbbb/src/Parameters/IsMeetingRunningParameters.phpnu�[���PK5~�[0nx�FF,�}bbb/src/Parameters/JoinMeetingParameters.phpnu�[���PK5~�[/��?%y�bbb/src/Parameters/MetaParameters.phpnu�[���PK5~�[�+]��2֞bbb/src/Parameters/PublishRecordingsParameters.phpnu�[���PK5~�[��ˠAA1�bbb/src/Parameters/UpdateRecordingsParameters.phpnu�[���PK5~�[㻺)��bbb/src/Parameters/UserDataParameters.phpnu�[���PK5~�[�#o,,�bbb/src/Parameters/index.htmlnu�[���PK5~�[�@��xx(��bbb/src/Responses/ApiVersionResponse.phpnu�[���PK5~�[�K8i��"h�bbb/src/Responses/BaseResponse.phpnu�[���PK5~�[^��+++��bbb/src/Responses/CreateMeetingResponse.phpnu�[���PK5~�[h�
�rr.�bbb/src/Responses/DeleteRecordingsResponse.phpnu�[���PK5~�[4��U��(��bbb/src/Responses/EndMeetingResponse.phpnu�[���PK5~�[�D��,�bbb/src/Responses/GetMeetingInfoResponse.phpnu�[���PK5~�[t�����)��bbb/src/Responses/GetMeetingsResponse.phpnu�[���PK5~�[9d0��+x�bbb/src/Responses/GetRecordingsResponse.phpnu�[���PK5~�[�*ؘ�)c�bbb/src/Responses/HooksCreateResponse.phpnu�[���PK5~�[�o�jj*T�bbb/src/Responses/HooksDestroyResponse.phpnu�[���PK5~�[���oo'�bbb/src/Responses/HooksListResponse.phpnu�[���PK5~�[���ss.�bbb/src/Responses/IsMeetingRunningResponse.phpnu�[���PK5~�[���)�
bbb/src/Responses/JoinMeetingResponse.phpnu�[���PK5~�[
9��yy/%	
bbb/src/Responses/PublishRecordingsResponse.phpnu�[���PK5~�[��ss.�
bbb/src/Responses/UpdateRecordingsResponse.phpnu�[���PK5~�[�#o,,�
bbb/src/Responses/index.htmlnu�[���PK5~�[��5 TTF
bbb/src/Util/UrlBuilder.phpnu�[���PK5~�[�#o,,�
bbb/src/Util/index.htmlnu�[���PK5~�[�#o,,X
bbb/src/index.htmlnu�[���PK5~�[�f�v..�
bbb/tests/BigBlueButtonTest.phpnu�[���PK5~�[�n�%%4#K
bbb/tests/Parameters/CreateMeetingParametersTest.phpnu�[���PK5~�[�Y�<��7�p
bbb/tests/Parameters/DeleteRecordingsParametersTest.phpnu�[���PK5~�[�r���1�v
bbb/tests/Parameters/EndMeetingParametersTest.phpnu�[���PK5~�[�Z���5�}
bbb/tests/Parameters/GetMeetingInfoParametersTest.phpnu�[���PK5~�[�@+�42�
bbb/tests/Parameters/GetRecordingsParametersTest.phpnu�[���PK5~�[��\\2��
bbb/tests/Parameters/HooksCreateParametersTest.phpnu�[���PK5~�[^C���3f�
bbb/tests/Parameters/HooksDestroyParametersTest.phpnu�[���PK5~�[R�q���7��
bbb/tests/Parameters/IsMeetingRunningParametersTest.phpnu�[���PK5~�[�"�р�2�
bbb/tests/Parameters/JoinMeetingParametersTest.phpnu�[���PK5~�[�<\c8�
bbb/tests/Parameters/PublishRecordingsParametersTest.phpnu�[���PK5~�[n��zz7X�
bbb/tests/Parameters/UpdateRecordingsParametersTest.phpnu�[���PK5~�[�#o,,9�
bbb/tests/Parameters/index.htmlnu�[���PK5~�[�����.��
bbb/tests/Responses/ApiVersionResponseTest.phpnu�[���PK5~�[B�=.9
9
1��
bbb/tests/Responses/CreateMeetingResponseTest.phpnu�[���PK5~�[G��,cc4^�
bbb/tests/Responses/DeleteRecordingsResponseTest.phpnu�[���PK5~�[PM̦��.%�
bbb/tests/Responses/EndMeetingResponseTest.phpnu�[���PK5~�[\�BCC2m�
bbb/tests/Responses/GetMeetingInfoResponseTest.phpnu�[���PK5~�[��{E��/�
bbb/tests/Responses/GetMeetingsResponseTest.phpnu�[���PK5~�[n�=�""1!bbb/tests/Responses/GetRecordingsResponseTest.phpnu�[���PK5~�[8\�Amm/�$!bbb/tests/Responses/HooksCreateResponseTest.phpnu�[���PK5~�[���
yy0^-!bbb/tests/Responses/HooksDestroyResponseTest.phpnu�[���PK5~�[�3�	�	-75!bbb/tests/Responses/HooksListResponseTest.phpnu�[���PK5~�[�[�''4P?!bbb/tests/Responses/IsMeetingRunningResponseTest.phpnu�[���PK5~�[	Mq�R
R
/�G!bbb/tests/Responses/JoinMeetingResponseTest.phpnu�[���PK5~�[�>�tt5�R!bbb/tests/Responses/PublishRecordingsResponseTest.phpnu�[���PK5~�[���cc4eZ!bbb/tests/Responses/UpdateRecordingsResponseTest.phpnu�[���PK5~�[�#o,,,b!bbb/tests/Responses/index.htmlnu�[���PK5~�[��:�?;?;�b!bbb/tests/TestCase.phpnu�[���PK5~�[��mj22+�!bbb/tests/bootstrap.phpnu�[���PK5~�[�g�i��"��!bbb/tests/fixtures/api_version.xmlnu�[���PK5~�[g��U�U���!bbb/tests/fixtures/bbb_logo.pngnu�[���PK5~�[���%82"bbb/tests/fixtures/create_meeting.xmlnu�[���PK5~�[e�g�XX(�5"bbb/tests/fixtures/delete_recordings.xmlnu�[���PK5~�[��##"[6"bbb/tests/fixtures/end_meeting.xmlnu�[���PK5~�[P��y��'�7"bbb/tests/fixtures/get_meeting_info.xmlnu�[���PK5~�[�W)#H"bbb/tests/fixtures/get_meetings.xmlnu�[���PK5~�[�z�,�,%wZ"bbb/tests/fixtures/get_recordings.xmlnu�[���PK5~�[��D��#X�"bbb/tests/fixtures/hooks_create.xmlnu�[���PK5~�[#_-u��)C�"bbb/tests/fixtures/hooks_create_error.xmlnu�[���PK5~�[�]����,V�"bbb/tests/fixtures/hooks_create_existing.xmlnu�[���PK5~�[�дѮ�.x�"bbb/tests/fixtures/hooks_create_no_hook_id.xmlnu�[���PK5~�[�9	FWW$��"bbb/tests/fixtures/hooks_destroy.xmlnu�[���PK5~�[R�m;��*/�"bbb/tests/fixtures/hooks_destroy_error.xmlnu�[���PK5~�[I�Rɢ�.D�"bbb/tests/fixtures/hooks_destroy_not_found.xmlnu�[���PK5~�[���qq!D�"bbb/tests/fixtures/hooks_list.xmlnu�[���PK5~�[�#o,,�"bbb/tests/fixtures/index.htmlnu�[���PK5~�[���XX)�"bbb/tests/fixtures/is_meeting_running.xmlnu�[���PK5~�[7�J#0�"bbb/tests/fixtures/join_meeting.xmlnu�[���PK5~�[�ĥ�e�e�6��"bbb/tests/fixtures/presentation_with_embedded_file.xmlnu�[���PK5~�[~@��1TS#bbb/tests/fixtures/presentation_with_filename.xmlnu�[���PK5~�[��w
��,�T#bbb/tests/fixtures/presentation_with_url.xmlnu�[���PK5~�[�o�\\)�U#bbb/tests/fixtures/publish_recordings.xmlnu�[���PK5~�[�i*�XX(XV#bbb/tests/fixtures/update_recordings.xmlnu�[���PK5~�[�#o,,W#bbb/tests/index.htmlnu�[���PK,�[BT�=-a-a&xW#bootstraprtl/css/bootstrap.rtl.min.cssnu�[���PK,�[�#o,,��%bootstraprtl/css/index.htmlnu�[���PK,�[�#o,,r�%bootstraprtl/index.htmlnu�[���PK,�[���ˆr�r"�%bootstrapv45/css/bootstrap.min.cssnu�[���PK,�[�#o,,�,(bootstrapv45/css/index.htmlnu�[���PK,�[{�ќ�@6-(bootstrapv45/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2nu�[���PK,�[�#o,,B.(bootstrapv45/index.htmlnu�[���PK,�[���V�H�H'�.(bootstrapv45/js/bootstrap.bundle.min.jsnu�[���PK,�[�#o,,�w)bootstrapv45/js/index.htmlnu�[���PK,�[�#o,,:x)css/index.htmlnu�[���PK,�[�o�+!�!��x)fullCalendar/main.cssnu�[���PK,�[u��q�O
�O

*fullCalendar/main.jsnu�[���PK,�[�#o,,-d4images/index.htmlnu�[���PK,�[h�g�""�d4js/appointment.jsnu�[���PK,�[I�~1�h4js/bbbclass.jsnu�[���PK,�[40oO
Zm4js/capital.jsnu�[���PK,�[1��J
�q4js/comment.jsnu�[���PK,�[�A_�!!v4js/consultant.jsnu�[���PK,�[Ⱦ�qz4js/doctor.jsnu�[���PK,�[�#o,,
��4js/index.htmlnu�[���PK,�[3�-�
)�4js/message.jsnu�[���PK,�[�]�
��4js/plan.jsnu�[���PK,�[6q��
ً4js/reserve.jsnu�[���PK,�[��1�
4�4js/session.jsnu�[���PK,�[n\t�
��4js/sick.jsnu�[���PK,�[�#o,,�4pusher/index.htmlnu�[���PK,�[�#o,,U�4pusher/js/index.htmlnu�[���PK,�[j'μ�ŝ4pusher/js/pusher.min.jsnu�[���PK,�[�#o,,ȟ5vector/index.htmlnu�[���PK__��5�5