HEX
Server: LiteSpeed
System: Linux atali.colombiahosting.com.co 5.14.0-570.12.1.el9_6.x86_64 #1 SMP PREEMPT_DYNAMIC Tue May 13 06:11:55 EDT 2025 x86_64
User: coopserp (1713)
PHP: 8.2.29
Disabled: dl,exec,passthru,proc_open,proc_close,shell_exec,memory_limit,system,popen,curl_multi_exec,show_source,symlink,link,leak,listen,diskfreespace,tmpfile,ignore_user_abord,highlight_file,source,show_source,fpaththru,virtual,posix_ctermid,posix_getcwd,posix_getegid,posix_geteuid,posix_getgid,posix_getgrgid,posix_getgrnam,posix_getgroups,posix_getlogin,posix_getpgid,posix_getpgrp,posix_getpid,posix,posix_getppid,posix_getpwnam,posix_getpwuid,posix_getrlimit,posix_getsid,posix_getuid,posix_isatty,posix_kill,posix_mkfifo,posix_setegid,posix_seteuid,posix_setgid,posix_setpgid,posix_setsid,posix_setid,posix_times,posix_ttyname,posix_uname,proc_get_status,proc_nice,proc_terminate
Upload Files
File: /home/coopserp/www/backuply.tar
index.html000064400000000152151526106630006544 0ustar00<html><body><a href="https://backuply.com" target="_blank">WordPress backups by Backuply</a></body></html>backups-O0BAO2/index.html000064400000000152151526106630011054 0ustar00<html><body><a href="https://backuply.com" target="_blank">WordPress backups by Backuply</a></body></html>backups-O0BAO2/index.php000064400000000020151526106630010671 0ustar00<?php //Backuplybackups-O0BAO2/tmp/index.html000064400000000152151526106630011654 0ustar00<html><body><a href="https://backuply.com" target="_blank">WordPress backups by Backuply</a></body></html>backups-O0BAO2/tmp/index.php000064400000000020151526106630011471 0ustar00<?php //Backuplyindex.php000064400000000020151526106630006361 0ustar00<?php //Backuplyweb.config000064400000000173151526106630006516 0ustar00<configuration>
<system.webServer>
<authorization>
<deny users="*" />
</authorization>
</system.webServer>
</configuration>backups_info-O0BAO2/index.html000064400000000152151526106630012067 0ustar00<html><body><a href="https://backuply.com" target="_blank">WordPress backups by Backuply</a></body></html>backups_info-O0BAO2/index.php000064400000000020151526106630011704 0ustar00<?php //Backuply.htaccess000064400000000015151526106630006343 0ustar00deny from allstatus_key.php000060000000000060151526106630007441 0ustar00<?php exit();?>
nQ86sY4JIVj8GsnZdrCrNhRI3P5puKajassets/css/base-jquery-ui.css000064400000271137151526424650012237 0ustar00/*! jQuery UI - v1.13.1 - 2022-01-20
* http://jqueryui.com
* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Arial%2CHelvetica%2Csans-serif&fsDefault=1em&fwDefault=normal&cornerRadius=3px&bgColorHeader=e9e9e9&bgTextureHeader=flat&borderColorHeader=dddddd&fcHeader=333333&iconColorHeader=444444&bgColorContent=ffffff&bgTextureContent=flat&borderColorContent=dddddd&fcContent=333333&iconColorContent=444444&bgColorDefault=f6f6f6&bgTextureDefault=flat&borderColorDefault=c5c5c5&fcDefault=454545&iconColorDefault=777777&bgColorHover=ededed&bgTextureHover=flat&borderColorHover=cccccc&fcHover=2b2b2b&iconColorHover=555555&bgColorActive=007fff&bgTextureActive=flat&borderColorActive=003eff&fcActive=ffffff&iconColorActive=ffffff&bgColorHighlight=fffa90&bgTextureHighlight=flat&borderColorHighlight=dad55e&fcHighlight=777620&iconColorHighlight=777620&bgColorError=fddfdf&bgTextureError=flat&borderColorError=f1a899&fcError=5f3f3f&iconColorError=cc0000&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=666666&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=5px&offsetTopShadow=0px&offsetLeftShadow=0px&cornerRadiusShadow=8px
* Copyright jQuery Foundation and other contributors; Licensed MIT */

/* Layout helpers
----------------------------------*/
.ui-helper-hidden {
	display: none;
}
.ui-helper-hidden-accessible {
	border: 0;
	clip: rect(0 0 0 0);
	height: 1px;
	margin: -1px;
	overflow: hidden;
	padding: 0;
	position: absolute;
	width: 1px;
}
.ui-helper-reset {
	margin: 0;
	padding: 0;
	border: 0;
	outline: 0;
	line-height: 1.3;
	text-decoration: none;
	font-size: 100%;
	list-style: none;
}
.ui-helper-clearfix:before,
.ui-helper-clearfix:after {
	content: "";
	display: table;
	border-collapse: collapse;
}
.ui-helper-clearfix:after {
	clear: both;
}
.ui-helper-zfix {
	width: 100%;
	height: 100%;
	top: 0;
	left: 0;
	position: absolute;
	opacity: 0;
	-ms-filter: "alpha(opacity=0)"; /* support: IE8 */
}

.ui-front {
	z-index: 100;
}


/* Interaction Cues
----------------------------------*/
.ui-state-disabled {
	cursor: default !important;
	pointer-events: none;
}


/* Icons
----------------------------------*/
.ui-icon {
	display: inline-block;
	vertical-align: middle;
	margin-top: -.25em;
	position: relative;
	text-indent: -99999px;
	overflow: hidden;
	background-repeat: no-repeat;
}

.ui-widget-icon-block {
	left: 50%;
	margin-left: -8px;
	display: block;
}

/* Misc visuals
----------------------------------*/

/* Overlays */
.ui-widget-overlay {
	position: fixed;
	top: 0;
	left: 0;
	width: 100%;
	height: 100%;
}
.ui-accordion .ui-accordion-header {
	display: block;
	cursor: pointer;
	position: relative;
	margin: 2px 0 0 0;
	padding: .5em .5em .5em .7em;
	font-size: 100%;
}
.ui-accordion .ui-accordion-content {
	padding: 1em 2.2em;
	border-top: 0;
	overflow: auto;
}
.ui-autocomplete {
	position: absolute;
	top: 0;
	left: 0;
	cursor: default;
}
.ui-menu {
	list-style: none;
	padding: 0;
	margin: 0;
	display: block;
	outline: 0;
}
.ui-menu .ui-menu {
	position: absolute;
}
.ui-menu .ui-menu-item {
	margin: 0;
	cursor: pointer;
	/* support: IE10, see #8844 */
	list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
}
.ui-menu .ui-menu-item-wrapper {
	position: relative;
	padding: 3px 1em 3px .4em;
}
.ui-menu .ui-menu-divider {
	margin: 5px 0;
	height: 0;
	font-size: 0;
	line-height: 0;
	border-width: 1px 0 0 0;
}
.ui-menu .ui-state-focus,
.ui-menu .ui-state-active {
	margin: -1px;
}

/* icon support */
.ui-menu-icons {
	position: relative;
}
.ui-menu-icons .ui-menu-item-wrapper {
	padding-left: 2em;
}

/* left-aligned */
.ui-menu .ui-icon {
	position: absolute;
	top: 0;
	bottom: 0;
	left: .2em;
	margin: auto 0;
}

/* right-aligned */
.ui-menu .ui-menu-icon {
	left: auto;
	right: 0;
}
.ui-button {
	padding: .4em 1em;
	display: inline-block;
	position: relative;
	line-height: normal;
	margin-right: .1em;
	cursor: pointer;
	vertical-align: middle;
	text-align: center;
	-webkit-user-select: none;
	-moz-user-select: none;
	-ms-user-select: none;
	user-select: none;

	/* Support: IE <= 11 */
	overflow: visible;
}

.ui-button,
.ui-button:link,
.ui-button:visited,
.ui-button:hover,
.ui-button:active {
	text-decoration: none;
}

/* to make room for the icon, a width needs to be set here */
.ui-button-icon-only {
	width: 2em;
	box-sizing: border-box;
	text-indent: -9999px;
	white-space: nowrap;
}

/* no icon support for input elements */
input.ui-button.ui-button-icon-only {
	text-indent: 0;
}

/* button icon element(s) */
.ui-button-icon-only .ui-icon {
	position: absolute;
	top: 50%;
	left: 50%;
	margin-top: -8px;
	margin-left: -8px;
}

.ui-button.ui-icon-notext .ui-icon {
	padding: 0;
	width: 2.1em;
	height: 2.1em;
	text-indent: -9999px;
	white-space: nowrap;

}

input.ui-button.ui-icon-notext .ui-icon {
	width: auto;
	height: auto;
	text-indent: 0;
	white-space: normal;
	padding: .4em 1em;
}

/* workarounds */
/* Support: Firefox 5 - 40 */
input.ui-button::-moz-focus-inner,
button.ui-button::-moz-focus-inner {
	border: 0;
	padding: 0;
}
.ui-controlgroup {
	vertical-align: middle;
	display: inline-block;
}
.ui-controlgroup > .ui-controlgroup-item {
	float: left;
	margin-left: 0;
	margin-right: 0;
}
.ui-controlgroup > .ui-controlgroup-item:focus,
.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {
	z-index: 9999;
}
.ui-controlgroup-vertical > .ui-controlgroup-item {
	display: block;
	float: none;
	width: 100%;
	margin-top: 0;
	margin-bottom: 0;
	text-align: left;
}
.ui-controlgroup-vertical .ui-controlgroup-item {
	box-sizing: border-box;
}
.ui-controlgroup .ui-controlgroup-label {
	padding: .4em 1em;
}
.ui-controlgroup .ui-controlgroup-label span {
	font-size: 80%;
}
.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {
	border-left: none;
}
.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {
	border-top: none;
}
.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {
	border-right: none;
}
.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {
	border-bottom: none;
}

/* Spinner specific style fixes */
.ui-controlgroup-vertical .ui-spinner-input {

	/* Support: IE8 only, Android < 4.4 only */
	width: 75%;
	width: calc( 100% - 2.4em );
}
.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {
	border-top-style: solid;
}

.ui-checkboxradio-label .ui-icon-background {
	box-shadow: inset 1px 1px 1px #ccc;
	border-radius: .12em;
	border: none;
}
.ui-checkboxradio-radio-label .ui-icon-background {
	width: 16px;
	height: 16px;
	border-radius: 1em;
	overflow: visible;
	border: none;
}
.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,
.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {
	background-image: none;
	width: 8px;
	height: 8px;
	border-width: 4px;
	border-style: solid;
}
.ui-checkboxradio-disabled {
	pointer-events: none;
}
.ui-datepicker {
	width: 17em;
	padding: .2em .2em 0;
	display: none;
}
.ui-datepicker .ui-datepicker-header {
	position: relative;
	padding: .2em 0;
}
.ui-datepicker .ui-datepicker-prev,
.ui-datepicker .ui-datepicker-next {
	position: absolute;
	top: 2px;
	width: 1.8em;
	height: 1.8em;
}
.ui-datepicker .ui-datepicker-prev-hover,
.ui-datepicker .ui-datepicker-next-hover {
	top: 1px;
}
.ui-datepicker .ui-datepicker-prev {
	left: 2px;
}
.ui-datepicker .ui-datepicker-next {
	right: 2px;
}
.ui-datepicker .ui-datepicker-prev-hover {
	left: 1px;
}
.ui-datepicker .ui-datepicker-next-hover {
	right: 1px;
}
.ui-datepicker .ui-datepicker-prev span,
.ui-datepicker .ui-datepicker-next span {
	display: block;
	position: absolute;
	left: 50%;
	margin-left: -8px;
	top: 50%;
	margin-top: -8px;
}
.ui-datepicker .ui-datepicker-title {
	margin: 0 2.3em;
	line-height: 1.8em;
	text-align: center;
}
.ui-datepicker .ui-datepicker-title select {
	font-size: 1em;
	margin: 1px 0;
}
.ui-datepicker select.ui-datepicker-month,
.ui-datepicker select.ui-datepicker-year {
	width: 45%;
}
.ui-datepicker table {
	width: 100%;
	font-size: .9em;
	border-collapse: collapse;
	margin: 0 0 .4em;
}
.ui-datepicker th {
	padding: .7em .3em;
	text-align: center;
	font-weight: bold;
	border: 0;
}
.ui-datepicker td {
	border: 0;
	padding: 1px;
}
.ui-datepicker td span,
.ui-datepicker td a {
	display: block;
	padding: .2em;
	text-align: right;
	text-decoration: none;
}
.ui-datepicker .ui-datepicker-buttonpane {
	background-image: none;
	margin: .7em 0 0 0;
	padding: 0 .2em;
	border-left: 0;
	border-right: 0;
	border-bottom: 0;
}
.ui-datepicker .ui-datepicker-buttonpane button {
	float: right;
	margin: .5em .2em .4em;
	cursor: pointer;
	padding: .2em .6em .3em .6em;
	width: auto;
	overflow: visible;
}
.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
	float: left;
}

/* with multiple calendars */
.ui-datepicker.ui-datepicker-multi {
	width: auto;
}
.ui-datepicker-multi .ui-datepicker-group {
	float: left;
}
.ui-datepicker-multi .ui-datepicker-group table {
	width: 95%;
	margin: 0 auto .4em;
}
.ui-datepicker-multi-2 .ui-datepicker-group {
	width: 50%;
}
.ui-datepicker-multi-3 .ui-datepicker-group {
	width: 33.3%;
}
.ui-datepicker-multi-4 .ui-datepicker-group {
	width: 25%;
}
.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
	border-left-width: 0;
}
.ui-datepicker-multi .ui-datepicker-buttonpane {
	clear: left;
}
.ui-datepicker-row-break {
	clear: both;
	width: 100%;
	font-size: 0;
}

/* RTL support */
.ui-datepicker-rtl {
	direction: rtl;
}
.ui-datepicker-rtl .ui-datepicker-prev {
	right: 2px;
	left: auto;
}
.ui-datepicker-rtl .ui-datepicker-next {
	left: 2px;
	right: auto;
}
.ui-datepicker-rtl .ui-datepicker-prev:hover {
	right: 1px;
	left: auto;
}
.ui-datepicker-rtl .ui-datepicker-next:hover {
	left: 1px;
	right: auto;
}
.ui-datepicker-rtl .ui-datepicker-buttonpane {
	clear: right;
}
.ui-datepicker-rtl .ui-datepicker-buttonpane button {
	float: left;
}
.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
.ui-datepicker-rtl .ui-datepicker-group {
	float: right;
}
.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
	border-right-width: 0;
	border-left-width: 1px;
}

/* Icons */
.ui-datepicker .ui-icon {
	display: block;
	text-indent: -99999px;
	overflow: hidden;
	background-repeat: no-repeat;
	left: .5em;
	top: .3em;
}
.ui-dialog {
	position: absolute;
	top: 0;
	left: 0;
	padding: .2em;
	outline: 0;
}
.ui-dialog .ui-dialog-titlebar {
	padding: .4em 1em;
	position: relative;
}
.ui-dialog .ui-dialog-title {
	float: left;
	margin: .1em 0;
	white-space: nowrap;
	width: 90%;
	overflow: hidden;
	text-overflow: ellipsis;
}
.ui-dialog .ui-dialog-titlebar-close {
	position: absolute;
	right: .3em;
	top: 50%;
	width: 20px;
	margin: -10px 0 0 0;
	padding: 1px;
	height: 20px;
}
.ui-dialog .ui-dialog-content {
	position: relative;
	border: 0;
	padding: .5em 1em;
	background: none;
	overflow: auto;
}
.ui-dialog .ui-dialog-buttonpane {
	text-align: left;
	border-width: 1px 0 0 0;
	background-image: none;
	margin-top: .5em;
	padding: .3em 1em .5em .4em;
}
.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
	float: right;
}
.ui-dialog .ui-dialog-buttonpane button {
	margin: .5em .4em .5em 0;
	cursor: pointer;
}
.ui-dialog .ui-resizable-n {
	height: 2px;
	top: 0;
}
.ui-dialog .ui-resizable-e {
	width: 2px;
	right: 0;
}
.ui-dialog .ui-resizable-s {
	height: 2px;
	bottom: 0;
}
.ui-dialog .ui-resizable-w {
	width: 2px;
	left: 0;
}
.ui-dialog .ui-resizable-se,
.ui-dialog .ui-resizable-sw,
.ui-dialog .ui-resizable-ne,
.ui-dialog .ui-resizable-nw {
	width: 7px;
	height: 7px;
}
.ui-dialog .ui-resizable-se {
	right: 0;
	bottom: 0;
}
.ui-dialog .ui-resizable-sw {
	left: 0;
	bottom: 0;
}
.ui-dialog .ui-resizable-ne {
	right: 0;
	top: 0;
}
.ui-dialog .ui-resizable-nw {
	left: 0;
	top: 0;
}
.ui-draggable .ui-dialog-titlebar {
	cursor: move;
}
.ui-draggable-handle {
	-ms-touch-action: none;
	touch-action: none;
}
.ui-resizable {
	position: relative;
}
.ui-resizable-handle {
	position: absolute;
	font-size: 0.1px;
	display: block;
	-ms-touch-action: none;
	touch-action: none;
}
.ui-resizable-disabled .ui-resizable-handle,
.ui-resizable-autohide .ui-resizable-handle {
	display: none;
}
.ui-resizable-n {
	cursor: n-resize;
	height: 7px;
	width: 100%;
	top: -5px;
	left: 0;
}
.ui-resizable-s {
	cursor: s-resize;
	height: 7px;
	width: 100%;
	bottom: -5px;
	left: 0;
}
.ui-resizable-e {
	cursor: e-resize;
	width: 7px;
	right: -5px;
	top: 0;
	height: 100%;
}
.ui-resizable-w {
	cursor: w-resize;
	width: 7px;
	left: -5px;
	top: 0;
	height: 100%;
}
.ui-resizable-se {
	cursor: se-resize;
	width: 12px;
	height: 12px;
	right: 1px;
	bottom: 1px;
}
.ui-resizable-sw {
	cursor: sw-resize;
	width: 9px;
	height: 9px;
	left: -5px;
	bottom: -5px;
}
.ui-resizable-nw {
	cursor: nw-resize;
	width: 9px;
	height: 9px;
	left: -5px;
	top: -5px;
}
.ui-resizable-ne {
	cursor: ne-resize;
	width: 9px;
	height: 9px;
	right: -5px;
	top: -5px;
}
.ui-progressbar {
	height: 2em;
	text-align: left;
	overflow: hidden;
}
.ui-progressbar .ui-progressbar-value {
	margin: -1px;
	height: 100%;
}
.ui-progressbar .ui-progressbar-overlay {
	background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
	height: 100%;
	-ms-filter: "alpha(opacity=25)"; /* support: IE8 */
	opacity: 0.25;
}
.ui-progressbar-indeterminate .ui-progressbar-value {
	background-image: none;
}
.ui-selectable {
	-ms-touch-action: none;
	touch-action: none;
}
.ui-selectable-helper {
	position: absolute;
	z-index: 100;
	border: 1px dotted black;
}
.ui-selectmenu-menu {
	padding: 0;
	margin: 0;
	position: absolute;
	top: 0;
	left: 0;
	display: none;
}
.ui-selectmenu-menu .ui-menu {
	overflow: auto;
	overflow-x: hidden;
	padding-bottom: 1px;
}
.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
	font-size: 1em;
	font-weight: bold;
	line-height: 1.5;
	padding: 2px 0.4em;
	margin: 0.5em 0 0 0;
	height: auto;
	border: 0;
}
.ui-selectmenu-open {
	display: block;
}
.ui-selectmenu-text {
	display: block;
	margin-right: 20px;
	overflow: hidden;
	text-overflow: ellipsis;
}
.ui-selectmenu-button.ui-button {
	text-align: left;
	white-space: nowrap;
	width: 14em;
}
.ui-selectmenu-icon.ui-icon {
	float: right;
	margin-top: 0;
}
.ui-slider {
	position: relative;
	text-align: left;
}
.ui-slider .ui-slider-handle {
	position: absolute;
	z-index: 2;
	width: 1.2em;
	height: 1.2em;
	cursor: pointer;
	-ms-touch-action: none;
	touch-action: none;
}
.ui-slider .ui-slider-range {
	position: absolute;
	z-index: 1;
	font-size: .7em;
	display: block;
	border: 0;
	background-position: 0 0;
}

/* support: IE8 - See #6727 */
.ui-slider.ui-state-disabled .ui-slider-handle,
.ui-slider.ui-state-disabled .ui-slider-range {
	filter: inherit;
}

.ui-slider-horizontal {
	height: .8em;
}
.ui-slider-horizontal .ui-slider-handle {
	top: -.3em;
	margin-left: -.6em;
}
.ui-slider-horizontal .ui-slider-range {
	top: 0;
	height: 100%;
}
.ui-slider-horizontal .ui-slider-range-min {
	left: 0;
}
.ui-slider-horizontal .ui-slider-range-max {
	right: 0;
}

.ui-slider-vertical {
	width: .8em;
	height: 100px;
}
.ui-slider-vertical .ui-slider-handle {
	left: -.3em;
	margin-left: 0;
	margin-bottom: -.6em;
}
.ui-slider-vertical .ui-slider-range {
	left: 0;
	width: 100%;
}
.ui-slider-vertical .ui-slider-range-min {
	bottom: 0;
}
.ui-slider-vertical .ui-slider-range-max {
	top: 0;
}
.ui-sortable-handle {
	-ms-touch-action: none;
	touch-action: none;
}
.ui-spinner {
	position: relative;
	display: inline-block;
	overflow: hidden;
	padding: 0;
	vertical-align: middle;
}
.ui-spinner-input {
	border: none;
	background: none;
	color: inherit;
	padding: .222em 0;
	margin: .2em 0;
	vertical-align: middle;
	margin-left: .4em;
	margin-right: 2em;
}
.ui-spinner-button {
	width: 1.6em;
	height: 50%;
	font-size: .5em;
	padding: 0;
	margin: 0;
	text-align: center;
	position: absolute;
	cursor: default;
	display: block;
	overflow: hidden;
	right: 0;
}
/* more specificity required here to override default borders */
.ui-spinner a.ui-spinner-button {
	border-top-style: none;
	border-bottom-style: none;
	border-right-style: none;
}
.ui-spinner-up {
	top: 0;
}
.ui-spinner-down {
	bottom: 0;
}
.ui-tabs {
	position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
	padding: .2em;
}
.ui-tabs .ui-tabs-nav {
	margin: 0;
	padding: .2em .2em 0;
}
.ui-tabs .ui-tabs-nav li {
	list-style: none;
	float: left;
	position: relative;
	top: 0;
	margin: 1px .2em 0 0;
	border-bottom-width: 0;
	padding: 0;
	white-space: nowrap;
}
.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
	float: left;
	padding: .5em 1em;
	text-decoration: none;
}
.ui-tabs .ui-tabs-nav li.ui-tabs-active {
	margin-bottom: -1px;
	padding-bottom: 1px;
}
.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
	cursor: text;
}
.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
	cursor: pointer;
}
.ui-tabs .ui-tabs-panel {
	display: block;
	border-width: 0;
	padding: 1em 1.4em;
	background: none;
}
.ui-tooltip {
	padding: 8px;
	position: absolute;
	z-index: 9999;
	max-width: 300px;
}
body .ui-tooltip {
	border-width: 2px;
}
/* Component containers
----------------------------------*/
.ui-widget {
	font-family: Arial,Helvetica,sans-serif;
	font-size: 1em;
}
.ui-widget .ui-widget {
	font-size: 1em;
}
.ui-widget input,
.ui-widget select,
.ui-widget textarea,
.ui-widget button {
	font-family: Arial,Helvetica,sans-serif;
	font-size: 1em;
}
.ui-widget.ui-widget-content {
	border: 1px solid #c5c5c5;
}
.ui-widget-content {
	border: 1px solid #dddddd;
	background: #ffffff;
	color: #333333;
}
.ui-widget-content a {
	color: #333333;
}
.ui-widget-header {
	border: 1px solid #dddddd;
	background: #e9e9e9;
	color: #333333;
	font-weight: bold;
}
.ui-widget-header a {
	color: #333333;
}

/* Interaction states
----------------------------------*/
.ui-state-default,
.ui-widget-content .ui-state-default,
.ui-widget-header .ui-state-default,
.ui-button,

/* We use html here because we need a greater specificity to make sure disabled
works properly when clicked or hovered */
html .ui-button.ui-state-disabled:hover,
html .ui-button.ui-state-disabled:active {
	border: 1px solid #c5c5c5;
	background: #f6f6f6;
	font-weight: normal;
	color: #454545;
}
.ui-state-default a,
.ui-state-default a:link,
.ui-state-default a:visited,
a.ui-button,
a:link.ui-button,
a:visited.ui-button,
.ui-button {
	color: #454545;
	text-decoration: none;
}
.ui-state-hover,
.ui-widget-content .ui-state-hover,
.ui-widget-header .ui-state-hover,
.ui-state-focus,
.ui-widget-content .ui-state-focus,
.ui-widget-header .ui-state-focus,
.ui-button:hover,
.ui-button:focus {
	border: 1px solid #cccccc;
	background: #ededed;
	font-weight: normal;
	color: #2b2b2b;
}
.ui-state-hover a,
.ui-state-hover a:hover,
.ui-state-hover a:link,
.ui-state-hover a:visited,
.ui-state-focus a,
.ui-state-focus a:hover,
.ui-state-focus a:link,
.ui-state-focus a:visited,
a.ui-button:hover,
a.ui-button:focus {
	color: #2b2b2b;
	text-decoration: none;
}

.ui-visual-focus {
	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
}
.ui-state-active,
.ui-widget-content .ui-state-active,
.ui-widget-header .ui-state-active,
a.ui-button:active,
.ui-button:active,
.ui-button.ui-state-active:hover {
	border: 1px solid #003eff;
	background: #007fff;
	font-weight: normal;
	color: #ffffff;
}
.ui-icon-background,
.ui-state-active .ui-icon-background {
	border: #003eff;
	background-color: #ffffff;
}
.ui-state-active a,
.ui-state-active a:link,
.ui-state-active a:visited {
	color: #ffffff;
	text-decoration: none;
}

/* Interaction Cues
----------------------------------*/
.ui-state-highlight,
.ui-widget-content .ui-state-highlight,
.ui-widget-header .ui-state-highlight {
	border: 1px solid #dad55e;
	background: #fffa90;
	color: #777620;
}
.ui-state-checked {
	border: 1px solid #dad55e;
	background: #fffa90;
}
.ui-state-highlight a,
.ui-widget-content .ui-state-highlight a,
.ui-widget-header .ui-state-highlight a {
	color: #777620;
}
.ui-state-error,
.ui-widget-content .ui-state-error,
.ui-widget-header .ui-state-error {
	border: 1px solid #f1a899;
	background: #fddfdf;
	color: #5f3f3f;
}
.ui-state-error a,
.ui-widget-content .ui-state-error a,
.ui-widget-header .ui-state-error a {
	color: #5f3f3f;
}
.ui-state-error-text,
.ui-widget-content .ui-state-error-text,
.ui-widget-header .ui-state-error-text {
	color: #5f3f3f;
}
.ui-priority-primary,
.ui-widget-content .ui-priority-primary,
.ui-widget-header .ui-priority-primary {
	font-weight: bold;
}
.ui-priority-secondary,
.ui-widget-content .ui-priority-secondary,
.ui-widget-header .ui-priority-secondary {
	opacity: .7;
	-ms-filter: "alpha(opacity=70)"; /* support: IE8 */
	font-weight: normal;
}
.ui-state-disabled,
.ui-widget-content .ui-state-disabled,
.ui-widget-header .ui-state-disabled {
	opacity: .35;
	-ms-filter: "alpha(opacity=35)"; /* support: IE8 */
	background-image: none;
}
.ui-state-disabled .ui-icon {
	-ms-filter: "alpha(opacity=35)"; /* support: IE8 - See #6059 */
}

/* Icons
----------------------------------*/

/* states and images */
.ui-icon {
	width: 16px;
	height: 16px;
}
.ui-icon,
.ui-widget-content .ui-icon {
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAQAAABFnnJAAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QARNs8prsAAAAHdElNRQfmARQMOyIOGuz/AAAalUlEQVR42u2da4wlR3XHf207sQjx2iHEXuz1rrASbBIw2RlbEY9IWMS5k0ibAPI6dwcFCDg7DoSnyM7gzPiDZzFzh8T4gaNdyybI0jyy6wCxpfgOxhiZsALM7PKMQxJsZnHYhQ8hLB8iB+HOh+pXdderu++de+d2/Ud3bt8+VdVVdU49us6pU8Hv4dFknDXoDHgMFl4AGg4vADLahLQHnYnNhBeALNqsACtNEoFeC8Dg20+bsHLMFWAfOhGIUx58GXsIWQDMHWCY/Jlgaz/6+GH09LY2jO3ZMROrlUCwfzUSAVPKI9RHZAWgFx3gvhopxHHjdlgedeJCQMAqsEpAYEi5ThmHDkGyDhAXMW4HOoRQqJ4sRDpBpfhxK9M93/bssGbeXVO2lXELIe0BzB2gK0xt0D58iKebWGhOpV7bNA1B2ZTr9TNDhqD0SqC5FZnaYFqpVduOPQVz2zTn3dwHpinb+pkthfICYEY48Kpps1JZwMxDUJzy4MvYQ/RaALY62qyMEnvt8ALQcPiVwIbDC0DD4QWg4fAC0HB4AWg4vAA0HF4AGg5vD5CPO+j8bzLK2AO4WQTYlDFtoz2A+Ql29tSxB7Crw0XeR0pIytkDuGnAzFWoZ9A+zbVr2jb221JfyX3rUx8Za4CiPYCAfjU8DmXSt+npttgu9gCm3Jmfbo9vRhilHX+PBGR7ANW1jFWnXkAdxt4+XewBTO3PLW968Qmt1gZlnrQlUEUZZFK4Drs9gEm4bP1PXHKvDjZg8JVT1x5g0PnfZHh1cMPhF4IaDi8ADYcXgIbDC0DD4QWg4fAC0HB4AWg4zhl0BoYO4QBX+euvlZbO/zn1ovelEgaZg9Cag+qqIHvMAZRcHgJCMOr6XfwDhBUoZVH1Gbb8C9YHxlTswlE1tlsJXEKViHuWFMBW/MChAPr4gUMFuRQhNCh7XPIXGGjyd7lnxBR7DZhLaBag0BIbbI1Yyn92CHAtvs5ax15JQQ86+NCoibSNonVyECaxAyU1+3TVU+Lmpc9DaKCb005LZ24G2VwGUHYSGDq0HlsoF+ms1sbdmBs4pG5ikEu6VWvA1ARd0rbXQYFe5jUw7eJcQqlp5i7QLsHmNGxdrFsXbWtBtqe7TCKrwi7idrqUgzI9gFvXWW+WGzj2Mv3KY2DsYN3SDRzCVIV5mDYPgMq452gCDQ6DzsFWfn6FuH4lsOHwAtBweAFoOLwANBxeABoOLwANhxeAhkPeHBo7Sx0c7P7A+wmXGnDRiFaLZ9sb7fqUUkgFIN4Y5eLuvVoF9A7V0rLl3K0GTK5mU21cu3RsoaeM//RlaFeugTCXS0C9OdS8hdNFo91W3OudCOjScnMNoc+/Ww3ontHOba9tl4qdlsDWA9Xbml7YoCtvDXNxp27bgq3bIOpmSWPPgS4duwt3e87dHNKrNQZF1gY5um1jecoc1f7EUErZrDDWKayDYpiyAuBeAUGJuG45MFehy/Pte/v1z7fFtgmAvQ7MDLQLgFmANAJQ7i0grYAqKosgk4Y69VD6Nj2/CtJ8V51DmJ6+L6LGI7jag4Dp+XFM9RzAlnLqu8G0vzmfy5L2AKYKkCcwpuKbM2cqoimNbNHsZl8qFtgF0FSC1ZwDidXSKbjBxN7V5Ngbt1xSdghwM6cKrS4izKNgndhu1asuh9sYXN+kzZRO9UNt7HMAJbx/gCza1hOTRg5eABoOvxTccHgBaDi8ADQcXgAaDi8ADYcXgF5jkOrsCsjbA9hg0le5FL1dU9/db9TPXWBZ7B6yshftAUwwacxdVgljjd0+hw2metTdXGXeHh5Yt7/aGayLb0p9QEgXgrLZsnv7LS42ZrdGVjv923WhGUwaO1vsQBsue1en7TRtHg2dqO4l3RSo5wA6owOzviodGqoYLYiWYzeb0vswCHHV9QUl7qqeq3q+fWfzUCJ/XkBahWVP4M4PIUGJuDHVbQu0ffN2dRcSJjbaegj3lE0+AjYZaQ+QVRRWyZrtJAG7srXu6BhkehB1DyF/q0L0phWrniD3HkPCfnkIWE0yperARQcvzL3UWDXaA7ho++3uIcxIbQHUJhXmqk8HIb13kThkUJKaDVHVoKYvUGsDQ20H7qIs1U0Ce6FsdbNarDrRdJlEAhYBHRrmusCrg2UMTde8WfArgTIaxn4vAI2HF4CGwwtAw+EFoOHwAtBwDJ8AtIZLWzbqyAuAmy7bpLIJnai6EC26m/IqNmg/CEODcu7iXdxJB0zUyE+XWEhaxnBVXdanGKETwOtAFgDzKrV5tTtu1S26ShEIk4VS9d490fVPJCG6mvjxVTWn6tnex+2o+RFHKgCyu/ciUn24zmV6QBCxf035LHPXLrr+NSYMe2fjp6ufL1sU5FNxcx/ROMS+gtMqM3u8tmmyYvZXH8fXnFw567T1OouA2FohpY/QEfB1kDUJC3L/VdCbMrgZROiNymJ63H/oTDLUObS5T5Bb/4gdAV8HqbfwbJXpHYzYT71wPVZCRxciEBbmEbEiWO2VX85Pr9zKNwBl3gLSKtbZ5NmOZDLRJxJqFwgK84gg83TVQGS2J5LdR3gkkM8LsFmqmcwu655ksZak7fIaGTjei7GKn/UrMWwGIaH2HcKjLxi2k0N997zJGD5dgMemwgtAw+EFoOHwAtBwjJIAzCYrDbN9Sf8yxqK/ywZd1N5BCMChqOI2OFQ5pUctmn4bQp6QrAXKMnGW+eR6Xhl7tpZ4XMZTXMs661zLU0oRmLXmfn9E3a95hp5uiwn35v7MT0i4JNYBQh7iSeB8pjKB01eyQ8n9w9yoSTpdJDrKXsPOomLqAks8mWEhLPMmqXLnc+HnOFiCLudQlbv9HJZ+T3GP9HuMa1lgHFhnhkc4rq0B9TNcnEnrT/60HYotQqQ1bytjsuQXC8AiAJ+Tgq9lEi8KyEl2aar3KChFIGQ8uV5XFPGrXJX5LQuA0ARMJrT8FrGQOUkE5pjX7t/VKbPGpd/5HI6xzjg7gJfxIcY1AnAKgBdV3GEUEi9pB86UbAizAORFPIB0IShmfTcfIMKTwAl+zKcM2R+LvvdqQ2wzxF7mSUkA8jgsbf8+LPVVAAchEYE5DuZ6hLQC9RW5jceS62uUedjBRQQ835DLvzTQzD2gWR0fKFIpJ2Ix+/+GD2RvpyuBXUsCJ/hxIYychRdGurxQYc8j8KuG9Cf5qvH5j5OqjA/zeEEAUhEodv4Crdx3MXfXGXM6wz9xJ/BuZpTxTwNPZ66LmGM++WwuYvbfx/NkEXBdClaxP48XAHAWz2lDXACgmaDYeoBYBOAwj2vDBKCd5F2d+85jGx+Prt6moF5CB1gAZuiwpzAE5DWpVbeZ2r0k2EJ8grcW7gn2H+V5wDsBokG/hC6gyP58AS+wpvFLydV4gWbrAeCyiPGPcxlPKeizPMUh4HFmNX2AGb/Mu5OrPNrs4kH2MwOcTcgMzzcYlMxxUMmkXZmPDmPYYAvxFoUATHEY2MvRaB61yLQgVFcGFeX7+dY4d0bf4wqarQcQTBcioHoNm5Xoql5gR+5bVUUwg2jn8hCziwXIvBcsaIYBgfkaXfx6zRBqm457IBIByLDfJABzmetip1Nk/+f4G+lXEeYu0dwDzCle88rQIR6i0u98Fd0DhPwC84VXQCES+TudXOlskzy4IfMpYjl5y4HliiH0iEVAYv8w2QPMAi/N/H6yUjdeFyEo2N/L1AUGo/bez2GZ/cMkAB4DwSjpAjwqwAtAw+EFoOHwAtBweAEYLTyW0Wc4QRaAlsPGbD1cTt50w6xSoz6X0WUX3/IPEUp/ecuGIzn6EcVzs9ry/X2gA3zeUj+d3PpCGbw2+jNjiSWW4h/Z18AWXeaAeYVt/gZviFagHuURXsyUUp37NHuBo7yYq3LKWnB/9411+3L4OW6J7orUblbo+44mv/YW4rvq48UK30Jf6HGYAFiS1N0AHQ4wQReYoJt/X6dFFzjK9RxhLyj3T3yfHcAzXGqo3aVoMWmZz3FfVgAE+4U2rSgCIfss3sBta4ViP+EneSOf5I08xB5NBc1ykENMFXR66ZGr6sNXXY5v/y8u4YdcxDPs0Gw+naFDSMA0C1o6YKB/mTNs43eU9Lj6l4HJkjUYU48m6vYs/UhBCX+U6xXPP8QUy9xPN7a3yKqD4+XUeeYqOWrJbulSaw5v4XtscIJTrPMDZYhZ5tnBjTzTh3XAp7mY73Ih3+USvqcNJdbSZ4x0ZJ26hDMc16pr4tY3qaROSLWm2yCntrb4NYc7AH8AnMebAWixlgrAE9Jq+jxzPKFVm+qwhs2Z8808xB4+w+/zeV6rMC6bZZ7DTPWF/fBi/pXf5D/4Db7BWxUqlXcBsbHUtCJ+TAcM9G2MaQxfliTG59fyOxxI0hdbZBeVT1HjGv6FV2d+f1Fh0vJ2YCewh4y9VSwAVxMbU4jvg31hwS18j//mS5ziS2wUqDH754zPDg368InEPY2qB/o2L+Vb/Drf4rfSSVCCNncS6/unFcqflH42PzfQ0zmAjHTsFfhCybqbyJUp30O8RqqV12ifn2ug2Ulg3HrVNmnj7OdG3h6ZcxSlM5TiFkfYotlmUKCb2J93AaEaI2MBWFPS384HmeE23s+H+Ts+KtEnCyIhq4Tq0lP256d+KVq5IWDNQNdRn0Gou/P0JSajsT9ny+kuAG5e+lvEQ0HZOYRgsL71x28BMVRvAROJixq1gMgovqd8gL815q4OPSA0st8+jU5FQPUGcBvv5QGuB45wHbfzfom6xCQP8VMm83HzTqLSd/myOEpISJcuYWQZrC+iLnVT5z/PzZlfNxf6kylEx9+NyjCloJt+wz4t++rTl63sF0ZaomOfIDHZkrDGBGg20P+Mj0fz/uv5OD9ThNjDJMv5uK7q4OkayxMeZdCBEpM/d4ghqiCC3h6g4fC6gIbDC0DD4QWg4fAC0HA0TwCE2lj1TtNJVLnvckjnPOXdoTse3oasAEwnFVD9NaS6f4C6aBEm27WOa60aPhu9/x8oiMBHOMA93MM7eAd38t5CTFE7D0a/zgPOi/4EbuJjhNzCLYR8jJsK8c3uK/LWDHl7hiLdFqLo6UGmR0hfA6dZ4CQPA2/l3ETtWUzEdso29MvqfYlJZugwzYJiUUU8+QRjHGe3JhfxguwN3EtxpfCVyfUZvq1YCz3BV5hihk6UjrwcbleHx6v3XaUi2bz2qnKf2c2FCBJDmXmFy8+QiUyMRJ2dqoMXolXi45zLs4V9L8OASWCBK5kEJgsCcILdwO6E/ScUKVwUfau3pz7FL/IT4Hz+T0n/CjcyxQsSnX75fvLqaP0yRLXqOct8sqtQ1YTWeDBjRVHs4YQIXpm5LuJP+TkA349vZIeAh4Hj7OYEnyhdNPcjZUyxlZ1UAqFnm8xcZzEWsTxmf1En3+J1xjz8Lz8B4Ce8XkE9xhQh0I7YX1zWHc/8qTGvuRb5nwfmGWOccaVFQYs9wCGEYrcIs7vvgC4z7GAXl3JpajMk7w0U7B9TegoKc1fVlD2mLNrQiVo/LCv7p7FM61exvyvZPOTX2r/NmYwjnGOF+K+mAxxgJzqd3jbOlC5TikuS7weBP1KE+CtA6DCmEHo/GSGpWBWbzyzwA+DnnM0ObuVRcTt7XsCznBtV3QY7K5h8YQzhZvBkekJWS6+ao3w96v6gaBcns1/FwGn+JPPrbu4zPF0lYMI1hhg8zihd4ExIo3Z+jL9Buh9yX2EOkFUWn+CDpecAN0FkhbGU1m46BMxwLs/yFQ6xwU5FF5s6Wle7XM/eVYUIcn9mquoJCxHz0ussYvaLgWBHOsoBqcHbIhMEyvbb4QF2R39F9sMCJ3gIeBQx0yhijc/wec7jXKU51pzFwcYFXMC9XMCvRP/N2K24F88BrkTdoHZxNrvYxS7gpjhEOgQI/xeiE5wZwimg2Bw9Q4dvsKDYHC3Y/wxjkW1s3guAYL9p4nYr1/GfwMUK9gM8wjQh63yELru1ln8PaVI/mHEasb+w//hwtLk+/X84F2JHblN50ctB1lJKbTWl8IxQVhs4yNdAM1p0k47/++zIac3V82517tX5F/OLZ/lj1iLDjG38NBd3lX/nSVa1tRQSJPsFDhe8kP0h85FJ3hz/nOtjDinsF2SXffkQRYd+Sv8FXh2cxR7+GviQphUvcR53R2LV4hivKohYFioByJrF2cVxU+AFoOFoni7AQ4IXgIbDC0DDkReAQ1p/4XfxtWSR9mvcNeiMe/QG8lLwv3E58FquKIT7lLQ+/gpewQ7eMOjMe9RHtge4g8sBuJw7cqHuStifrtC9XtkLnCKMPGar8D9RD2JfZhrGhahTGUXVqfrJDQeyAtACJpigqGp8lTKu6u726KPG+dH3AUuuOgqDDViKKn9JG88WwkYPOZWYaxRZ/CLN9ZZGKgCi/a+xRrEPSBc9s2pau1fbPAICh3NBxT7ZvAikmxsnNQy0hVhikjsY5w5tCrCd+UhI9GI8UkgXgsT4P4HYYPUdaR4ge7g0+bs8wl6NawIBsYh6UuEuuROt08fbpPPr9nZHrCGwzP28mUlliJA7IlOv23mPNoXTCevLnOixZRH3AJ1o/O9GOqvLK47CT5P6zFehC/xI4T8n7vR17HfF/axxv4Eqf6dwMWGZBU5zmtPQp2OpBoC4B8iqQYoqEfcewAaxhze/uTFlu579g+8BTmWGhdOjMgsQPUDa2luZCWB698vKuKq7HcscP1AcDA/TkX2OqfUva67lu5N0Ey88Rfp7uJ0xbuc9Bl/b250oIzNDiA+N0lCj79t4n4L60dwe9DQlfc+gVyfbO3+7kwVbCBs95DR3R1q6U5o2XvUkkCGFEIBTSonOdnMrtHPUVfYp4nQ4YBy/TfYEtrjDgZEUABcs8LvJm/8xvmA8MWOU0VgB8BhJeG1gw+EFoOHwAtBweAFoOLwANBxeAPLoGHUCHavGYIshKwAhGxYVUO+OhBgUnuAJI71jtFXoWC0ZthzkHmAnB6xCoEYqPC1tCh02Ik1Dh42CCMnid0RBPyKlpBJB/dbyON5VXGUonzv7XayatgTyvoIFTrKqXJLVexMOpXgh+TV9UXkB0KHNTvFsQwpH2FugCzsDXXy5BPrTOnRU2Rm1nToiK4JqAQD1iRM2AYDY2ENWCqW/NiLmYUlBJwD6+HIavWCxnhoqtl9vUagngSdZNFj16HGSxYT9i5kKCliM7u5ikZMOKehgi785GAnWCxQFQLCgvE4ujtdig8XCmRvTBCyyQYtpLRPdnjxdWQhMvgcEddEYN0sNDWG3FOQhQDf2pyH0JwoMP8ydvEA6VylP3ZLIbgyxFyxwDjmMcMn1NCajdTN1S8KrgxsOvxLYcHgBaDi8ADQcXgAaDi8ADUdeAEx7bz1GEKkAtPg0ABfyNo2vfaFn+6yG6rElEQtAi27ifvRyukomz7DIMV5H12GhOK+QPZLzBH5kk+keGsQLQcfZzZd4JSGf5VpCpTtkgRb3sNPqTLboqjj/W3aU2G+6hwZCAFp0+REXAY9wnGl+yIWKPbwhcIK7uY8NdmoOMBXhVL6qxyN36ts4w7aCP+2Qa3iMazIO19X0xxJf/Cr6OOvRB4W/bg8FhC7gauCbAFwLwDd5HVcXGDzDlUxyL7CfLu/UCoAaVwAXA7CdsxR7EYVzme2cBTyneDu5OPpcATynSH878JKI/hL/duMKIQBPAC/P3H15dE9GB7ifLjezixPsUaanN5O4UPr10cizfYrtvC8jFkX6hbwv+pjiizDbFXQPJeI5wAY7k03TS0wqnbgIJfAhpriBq5nS+sNWDQFH2Cv9ztsb9ZvuoUEsAOI8jB/xTV7OhahPDEitARaBA8pzrsLRMpgafWSPjfuzyE/Qd/j7UbF59bDB2wM0HH623HB4AWg4vAA0HF4AGo5UAGznAdSlL/DFhP5Fxbl//ab3u3yDpldE/BbwqcJ5uZ+WzgOoS7e5mes3vd/lGzS9Ms6+DOAu3lygXMELeTi6rku/jT8v0F/G+Yk2od/0fpdv0PQaEENA6vk/u23qVYqrLPL01eRo2VVt/MAQ35Z+PoV+xLeV35Z/c/zT0sY0XXwTPZsLdalLIu8qVu0M2uZKNt39uwLsQ707uG76LvHt6avcYbvGD1BvMAtL/A4zqRTpRwHYq62/+O4HuZWe7NBSbQ3LFzNPR0MPo3G3OB7n0wk1983p2wsc90C22IFW5FxS1+XPJf0Qs2eB64w5uIlbM+zvCc6pn0QGz2X+l0do7RHM6A2D9Q3Ann97XJua7AED7SY+zIfpKft7PwQsAW+i+hBQv4vX56+YQrUu3JS+KX/F8xfK0YUIZNnfgyFATAJt5wG40VeASSajqyw9exJ2qLh7PEO10THSUdLl/IeFu1+WKDZ61fqJyxdWpt8qsV/91JIQAnBMykCMY4qrLPL0dlKBbW380BDfln4+hX7Et5Xfln9T/LzzqrJ0QOr81aUuCbEOsMYVvCxHWc2c7FOX/jC/XTiM8tO8ZdPo/S7foOk1IAQA/pHncRaXRnePscxfSOHq0v+BF3JuYvP3dR7IsGcz6P0u36DpleENQhoOrw1sOLwANBxeABoOLwANhxeAhsMLQMORVQbZTucddrpHBcjawPHkal0Zui7dY+hQHALqsW7dmkK9lhvUTsFDQl4AbAxcZ91Ij90z6GBjoM6Xd4ywoq7fQ4O8AIyDkYHjjBvpwkOHHiFmgwnTgS9gN6jwKIniEDBeIRU5tjmFeu3XJkAeJaE/Mmb4Zvn+LaAPKHNewLDTPSrALwQ1HF4AGg4vAA2HF4CGwwtAw+EFoOHYugLQ9gtCvYAsAPXX2UJmCZnte77brEgOIDwqQhaAfdFn0LC1bsH+1UFncxQgC8AK8b6+QcLWuj37ewjXHiCkXfiUQ1j4U0OwVy+GMfv9HKAnkC2CVlhlRdm2AmA19ykHN/ftMfv3Gemrfg7QK8gCYOoB9iWsiT/lhGC+cKd4pEs7k74qdZn9fhDoAeS9gfUdvYfMMa88r6f4ZpAPk2W/Kg+e/X2Aaw9QH/YjnMqxv60J51EKw/QWELAafYpQsd/PAXoAeQhos0p7KDvXMOr0898eNeH9AzQcW1cX4NET/D9rwacZ5YIqyQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMi0wMS0yMFQxMjo1Nzo1MSswMDowMKFdWTsAAAAldEVYdGRhdGU6bW9kaWZ5ADE5ODUtMTAtMjZUMDg6MTU6MDArMDA6MDAizFMHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAABJRU5ErkJggg==");
}
.ui-widget-header .ui-icon {
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAQAAABFnnJAAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QARNs8prsAAAAHdElNRQfmARQMOyIOGuz/AAAalUlEQVR42u2da4wlR3XHf207sQjx2iHEXuz1rrASbBIw2RlbEY9IWMS5k0ibAPI6dwcFCDg7DoSnyM7gzPiDZzFzh8T4gaNdyybI0jyy6wCxpfgOxhiZsALM7PKMQxJsZnHYhQ8hLB8iB+HOh+pXdderu++de+d2/Ud3bt8+VdVVdU49us6pU8Hv4dFknDXoDHgMFl4AGg4vADLahLQHnYnNhBeALNqsACtNEoFeC8Dg20+bsHLMFWAfOhGIUx58GXsIWQDMHWCY/Jlgaz/6+GH09LY2jO3ZMROrlUCwfzUSAVPKI9RHZAWgFx3gvhopxHHjdlgedeJCQMAqsEpAYEi5ThmHDkGyDhAXMW4HOoRQqJ4sRDpBpfhxK9M93/bssGbeXVO2lXELIe0BzB2gK0xt0D58iKebWGhOpV7bNA1B2ZTr9TNDhqD0SqC5FZnaYFqpVduOPQVz2zTn3dwHpinb+pkthfICYEY48Kpps1JZwMxDUJzy4MvYQ/RaALY62qyMEnvt8ALQcPiVwIbDC0DD4QWg4fAC0HB4AWg4vAA0HF4AGg5vD5CPO+j8bzLK2AO4WQTYlDFtoz2A+Ql29tSxB7Crw0XeR0pIytkDuGnAzFWoZ9A+zbVr2jb221JfyX3rUx8Za4CiPYCAfjU8DmXSt+npttgu9gCm3Jmfbo9vRhilHX+PBGR7ANW1jFWnXkAdxt4+XewBTO3PLW968Qmt1gZlnrQlUEUZZFK4Drs9gEm4bP1PXHKvDjZg8JVT1x5g0PnfZHh1cMPhF4IaDi8ADYcXgIbDC0DD4QWg4fAC0HB4AWg4zhl0BoYO4QBX+euvlZbO/zn1ovelEgaZg9Cag+qqIHvMAZRcHgJCMOr6XfwDhBUoZVH1Gbb8C9YHxlTswlE1tlsJXEKViHuWFMBW/MChAPr4gUMFuRQhNCh7XPIXGGjyd7lnxBR7DZhLaBag0BIbbI1Yyn92CHAtvs5ax15JQQ86+NCoibSNonVyECaxAyU1+3TVU+Lmpc9DaKCb005LZ24G2VwGUHYSGDq0HlsoF+ms1sbdmBs4pG5ikEu6VWvA1ARd0rbXQYFe5jUw7eJcQqlp5i7QLsHmNGxdrFsXbWtBtqe7TCKrwi7idrqUgzI9gFvXWW+WGzj2Mv3KY2DsYN3SDRzCVIV5mDYPgMq452gCDQ6DzsFWfn6FuH4lsOHwAtBweAFoOLwANBxeABoOLwANhxeAhkPeHBo7Sx0c7P7A+wmXGnDRiFaLZ9sb7fqUUkgFIN4Y5eLuvVoF9A7V0rLl3K0GTK5mU21cu3RsoaeM//RlaFeugTCXS0C9OdS8hdNFo91W3OudCOjScnMNoc+/Ww3ontHOba9tl4qdlsDWA9Xbml7YoCtvDXNxp27bgq3bIOpmSWPPgS4duwt3e87dHNKrNQZF1gY5um1jecoc1f7EUErZrDDWKayDYpiyAuBeAUGJuG45MFehy/Pte/v1z7fFtgmAvQ7MDLQLgFmANAJQ7i0grYAqKosgk4Y69VD6Nj2/CtJ8V51DmJ6+L6LGI7jag4Dp+XFM9RzAlnLqu8G0vzmfy5L2AKYKkCcwpuKbM2cqoimNbNHsZl8qFtgF0FSC1ZwDidXSKbjBxN7V5Ngbt1xSdghwM6cKrS4izKNgndhu1asuh9sYXN+kzZRO9UNt7HMAJbx/gCza1hOTRg5eABoOvxTccHgBaDi8ADQcXgAaDi8ADYcXgF5jkOrsCsjbA9hg0le5FL1dU9/db9TPXWBZ7B6yshftAUwwacxdVgljjd0+hw2metTdXGXeHh5Yt7/aGayLb0p9QEgXgrLZsnv7LS42ZrdGVjv923WhGUwaO1vsQBsue1en7TRtHg2dqO4l3RSo5wA6owOzviodGqoYLYiWYzeb0vswCHHV9QUl7qqeq3q+fWfzUCJ/XkBahWVP4M4PIUGJuDHVbQu0ffN2dRcSJjbaegj3lE0+AjYZaQ+QVRRWyZrtJAG7srXu6BhkehB1DyF/q0L0phWrniD3HkPCfnkIWE0yperARQcvzL3UWDXaA7ho++3uIcxIbQHUJhXmqk8HIb13kThkUJKaDVHVoKYvUGsDQ20H7qIs1U0Ce6FsdbNarDrRdJlEAhYBHRrmusCrg2UMTde8WfArgTIaxn4vAI2HF4CGwwtAw+EFoOHwAtBwDJ8AtIZLWzbqyAuAmy7bpLIJnai6EC26m/IqNmg/CEODcu7iXdxJB0zUyE+XWEhaxnBVXdanGKETwOtAFgDzKrV5tTtu1S26ShEIk4VS9d490fVPJCG6mvjxVTWn6tnex+2o+RFHKgCyu/ciUn24zmV6QBCxf035LHPXLrr+NSYMe2fjp6ufL1sU5FNxcx/ROMS+gtMqM3u8tmmyYvZXH8fXnFw567T1OouA2FohpY/QEfB1kDUJC3L/VdCbMrgZROiNymJ63H/oTDLUObS5T5Bb/4gdAV8HqbfwbJXpHYzYT71wPVZCRxciEBbmEbEiWO2VX85Pr9zKNwBl3gLSKtbZ5NmOZDLRJxJqFwgK84gg83TVQGS2J5LdR3gkkM8LsFmqmcwu655ksZak7fIaGTjei7GKn/UrMWwGIaH2HcKjLxi2k0N997zJGD5dgMemwgtAw+EFoOHwAtBwjJIAzCYrDbN9Sf8yxqK/ywZd1N5BCMChqOI2OFQ5pUctmn4bQp6QrAXKMnGW+eR6Xhl7tpZ4XMZTXMs661zLU0oRmLXmfn9E3a95hp5uiwn35v7MT0i4JNYBQh7iSeB8pjKB01eyQ8n9w9yoSTpdJDrKXsPOomLqAks8mWEhLPMmqXLnc+HnOFiCLudQlbv9HJZ+T3GP9HuMa1lgHFhnhkc4rq0B9TNcnEnrT/60HYotQqQ1bytjsuQXC8AiAJ+Tgq9lEi8KyEl2aar3KChFIGQ8uV5XFPGrXJX5LQuA0ARMJrT8FrGQOUkE5pjX7t/VKbPGpd/5HI6xzjg7gJfxIcY1AnAKgBdV3GEUEi9pB86UbAizAORFPIB0IShmfTcfIMKTwAl+zKcM2R+LvvdqQ2wzxF7mSUkA8jgsbf8+LPVVAAchEYE5DuZ6hLQC9RW5jceS62uUedjBRQQ835DLvzTQzD2gWR0fKFIpJ2Ix+/+GD2RvpyuBXUsCJ/hxIYychRdGurxQYc8j8KuG9Cf5qvH5j5OqjA/zeEEAUhEodv4Crdx3MXfXGXM6wz9xJ/BuZpTxTwNPZ66LmGM++WwuYvbfx/NkEXBdClaxP48XAHAWz2lDXACgmaDYeoBYBOAwj2vDBKCd5F2d+85jGx+Prt6moF5CB1gAZuiwpzAE5DWpVbeZ2r0k2EJ8grcW7gn2H+V5wDsBokG/hC6gyP58AS+wpvFLydV4gWbrAeCyiPGPcxlPKeizPMUh4HFmNX2AGb/Mu5OrPNrs4kH2MwOcTcgMzzcYlMxxUMmkXZmPDmPYYAvxFoUATHEY2MvRaB61yLQgVFcGFeX7+dY4d0bf4wqarQcQTBcioHoNm5Xoql5gR+5bVUUwg2jn8hCziwXIvBcsaIYBgfkaXfx6zRBqm457IBIByLDfJABzmetip1Nk/+f4G+lXEeYu0dwDzCle88rQIR6i0u98Fd0DhPwC84VXQCES+TudXOlskzy4IfMpYjl5y4HliiH0iEVAYv8w2QPMAi/N/H6yUjdeFyEo2N/L1AUGo/bez2GZ/cMkAB4DwSjpAjwqwAtAw+EFoOHwAtBweAEYLTyW0Wc4QRaAlsPGbD1cTt50w6xSoz6X0WUX3/IPEUp/ecuGIzn6EcVzs9ry/X2gA3zeUj+d3PpCGbw2+jNjiSWW4h/Z18AWXeaAeYVt/gZviFagHuURXsyUUp37NHuBo7yYq3LKWnB/9411+3L4OW6J7orUblbo+44mv/YW4rvq48UK30Jf6HGYAFiS1N0AHQ4wQReYoJt/X6dFFzjK9RxhLyj3T3yfHcAzXGqo3aVoMWmZz3FfVgAE+4U2rSgCIfss3sBta4ViP+EneSOf5I08xB5NBc1ykENMFXR66ZGr6sNXXY5v/y8u4YdcxDPs0Gw+naFDSMA0C1o6YKB/mTNs43eU9Lj6l4HJkjUYU48m6vYs/UhBCX+U6xXPP8QUy9xPN7a3yKqD4+XUeeYqOWrJbulSaw5v4XtscIJTrPMDZYhZ5tnBjTzTh3XAp7mY73Ih3+USvqcNJdbSZ4x0ZJ26hDMc16pr4tY3qaROSLWm2yCntrb4NYc7AH8AnMebAWixlgrAE9Jq+jxzPKFVm+qwhs2Z8808xB4+w+/zeV6rMC6bZZ7DTPWF/fBi/pXf5D/4Db7BWxUqlXcBsbHUtCJ+TAcM9G2MaQxfliTG59fyOxxI0hdbZBeVT1HjGv6FV2d+f1Fh0vJ2YCewh4y9VSwAVxMbU4jvg31hwS18j//mS5ziS2wUqDH754zPDg368InEPY2qB/o2L+Vb/Drf4rfSSVCCNncS6/unFcqflH42PzfQ0zmAjHTsFfhCybqbyJUp30O8RqqV12ifn2ug2Ulg3HrVNmnj7OdG3h6ZcxSlM5TiFkfYotlmUKCb2J93AaEaI2MBWFPS384HmeE23s+H+Ts+KtEnCyIhq4Tq0lP256d+KVq5IWDNQNdRn0Gou/P0JSajsT9ny+kuAG5e+lvEQ0HZOYRgsL71x28BMVRvAROJixq1gMgovqd8gL815q4OPSA0st8+jU5FQPUGcBvv5QGuB45wHbfzfom6xCQP8VMm83HzTqLSd/myOEpISJcuYWQZrC+iLnVT5z/PzZlfNxf6kylEx9+NyjCloJt+wz4t++rTl63sF0ZaomOfIDHZkrDGBGg20P+Mj0fz/uv5OD9ThNjDJMv5uK7q4OkayxMeZdCBEpM/d4ghqiCC3h6g4fC6gIbDC0DD4QWg4fAC0HA0TwCE2lj1TtNJVLnvckjnPOXdoTse3oasAEwnFVD9NaS6f4C6aBEm27WOa60aPhu9/x8oiMBHOMA93MM7eAd38t5CTFE7D0a/zgPOi/4EbuJjhNzCLYR8jJsK8c3uK/LWDHl7hiLdFqLo6UGmR0hfA6dZ4CQPA2/l3ETtWUzEdso29MvqfYlJZugwzYJiUUU8+QRjHGe3JhfxguwN3EtxpfCVyfUZvq1YCz3BV5hihk6UjrwcbleHx6v3XaUi2bz2qnKf2c2FCBJDmXmFy8+QiUyMRJ2dqoMXolXi45zLs4V9L8OASWCBK5kEJgsCcILdwO6E/ScUKVwUfau3pz7FL/IT4Hz+T0n/CjcyxQsSnX75fvLqaP0yRLXqOct8sqtQ1YTWeDBjRVHs4YQIXpm5LuJP+TkA349vZIeAh4Hj7OYEnyhdNPcjZUyxlZ1UAqFnm8xcZzEWsTxmf1En3+J1xjz8Lz8B4Ce8XkE9xhQh0I7YX1zWHc/8qTGvuRb5nwfmGWOccaVFQYs9wCGEYrcIs7vvgC4z7GAXl3JpajMk7w0U7B9TegoKc1fVlD2mLNrQiVo/LCv7p7FM61exvyvZPOTX2r/NmYwjnGOF+K+mAxxgJzqd3jbOlC5TikuS7weBP1KE+CtA6DCmEHo/GSGpWBWbzyzwA+DnnM0ObuVRcTt7XsCznBtV3QY7K5h8YQzhZvBkekJWS6+ao3w96v6gaBcns1/FwGn+JPPrbu4zPF0lYMI1hhg8zihd4ExIo3Z+jL9Buh9yX2EOkFUWn+CDpecAN0FkhbGU1m46BMxwLs/yFQ6xwU5FF5s6Wle7XM/eVYUIcn9mquoJCxHz0ussYvaLgWBHOsoBqcHbIhMEyvbb4QF2R39F9sMCJ3gIeBQx0yhijc/wec7jXKU51pzFwcYFXMC9XMCvRP/N2K24F88BrkTdoHZxNrvYxS7gpjhEOgQI/xeiE5wZwimg2Bw9Q4dvsKDYHC3Y/wxjkW1s3guAYL9p4nYr1/GfwMUK9gM8wjQh63yELru1ln8PaVI/mHEasb+w//hwtLk+/X84F2JHblN50ctB1lJKbTWl8IxQVhs4yNdAM1p0k47/++zIac3V82517tX5F/OLZ/lj1iLDjG38NBd3lX/nSVa1tRQSJPsFDhe8kP0h85FJ3hz/nOtjDinsF2SXffkQRYd+Sv8FXh2cxR7+GviQphUvcR53R2LV4hivKohYFioByJrF2cVxU+AFoOFoni7AQ4IXgIbDC0DDkReAQ1p/4XfxtWSR9mvcNeiMe/QG8lLwv3E58FquKIT7lLQ+/gpewQ7eMOjMe9RHtge4g8sBuJw7cqHuStifrtC9XtkLnCKMPGar8D9RD2JfZhrGhahTGUXVqfrJDQeyAtACJpigqGp8lTKu6u726KPG+dH3AUuuOgqDDViKKn9JG88WwkYPOZWYaxRZ/CLN9ZZGKgCi/a+xRrEPSBc9s2pau1fbPAICh3NBxT7ZvAikmxsnNQy0hVhikjsY5w5tCrCd+UhI9GI8UkgXgsT4P4HYYPUdaR4ge7g0+bs8wl6NawIBsYh6UuEuuROt08fbpPPr9nZHrCGwzP28mUlliJA7IlOv23mPNoXTCevLnOixZRH3AJ1o/O9GOqvLK47CT5P6zFehC/xI4T8n7vR17HfF/axxv4Eqf6dwMWGZBU5zmtPQp2OpBoC4B8iqQYoqEfcewAaxhze/uTFlu579g+8BTmWGhdOjMgsQPUDa2luZCWB698vKuKq7HcscP1AcDA/TkX2OqfUva67lu5N0Ey88Rfp7uJ0xbuc9Bl/b250oIzNDiA+N0lCj79t4n4L60dwe9DQlfc+gVyfbO3+7kwVbCBs95DR3R1q6U5o2XvUkkCGFEIBTSonOdnMrtHPUVfYp4nQ4YBy/TfYEtrjDgZEUABcs8LvJm/8xvmA8MWOU0VgB8BhJeG1gw+EFoOHwAtBweAFoOLwANBxeAPLoGHUCHavGYIshKwAhGxYVUO+OhBgUnuAJI71jtFXoWC0ZthzkHmAnB6xCoEYqPC1tCh02Ik1Dh42CCMnid0RBPyKlpBJB/dbyON5VXGUonzv7XayatgTyvoIFTrKqXJLVexMOpXgh+TV9UXkB0KHNTvFsQwpH2FugCzsDXXy5BPrTOnRU2Rm1nToiK4JqAQD1iRM2AYDY2ENWCqW/NiLmYUlBJwD6+HIavWCxnhoqtl9vUagngSdZNFj16HGSxYT9i5kKCliM7u5ikZMOKehgi785GAnWCxQFQLCgvE4ujtdig8XCmRvTBCyyQYtpLRPdnjxdWQhMvgcEddEYN0sNDWG3FOQhQDf2pyH0JwoMP8ydvEA6VylP3ZLIbgyxFyxwDjmMcMn1NCajdTN1S8KrgxsOvxLYcHgBaDi8ADQcXgAaDi8ADUdeAEx7bz1GEKkAtPg0ABfyNo2vfaFn+6yG6rElEQtAi27ifvRyukomz7DIMV5H12GhOK+QPZLzBH5kk+keGsQLQcfZzZd4JSGf5VpCpTtkgRb3sNPqTLboqjj/W3aU2G+6hwZCAFp0+REXAY9wnGl+yIWKPbwhcIK7uY8NdmoOMBXhVL6qxyN36ts4w7aCP+2Qa3iMazIO19X0xxJf/Cr6OOvRB4W/bg8FhC7gauCbAFwLwDd5HVcXGDzDlUxyL7CfLu/UCoAaVwAXA7CdsxR7EYVzme2cBTyneDu5OPpcATynSH878JKI/hL/duMKIQBPAC/P3H15dE9GB7ifLjezixPsUaanN5O4UPr10cizfYrtvC8jFkX6hbwv+pjiizDbFXQPJeI5wAY7k03TS0wqnbgIJfAhpriBq5nS+sNWDQFH2Cv9ztsb9ZvuoUEsAOI8jB/xTV7OhahPDEitARaBA8pzrsLRMpgafWSPjfuzyE/Qd/j7UbF59bDB2wM0HH623HB4AWg4vAA0HF4AGo5UAGznAdSlL/DFhP5Fxbl//ab3u3yDpldE/BbwqcJ5uZ+WzgOoS7e5mes3vd/lGzS9Ms6+DOAu3lygXMELeTi6rku/jT8v0F/G+Yk2od/0fpdv0PQaEENA6vk/u23qVYqrLPL01eRo2VVt/MAQ35Z+PoV+xLeV35Z/c/zT0sY0XXwTPZsLdalLIu8qVu0M2uZKNt39uwLsQ707uG76LvHt6avcYbvGD1BvMAtL/A4zqRTpRwHYq62/+O4HuZWe7NBSbQ3LFzNPR0MPo3G3OB7n0wk1983p2wsc90C22IFW5FxS1+XPJf0Qs2eB64w5uIlbM+zvCc6pn0QGz2X+l0do7RHM6A2D9Q3Ann97XJua7AED7SY+zIfpKft7PwQsAW+i+hBQv4vX56+YQrUu3JS+KX/F8xfK0YUIZNnfgyFATAJt5wG40VeASSajqyw9exJ2qLh7PEO10THSUdLl/IeFu1+WKDZ61fqJyxdWpt8qsV/91JIQAnBMykCMY4qrLPL0dlKBbW380BDfln4+hX7Et5Xfln9T/LzzqrJ0QOr81aUuCbEOsMYVvCxHWc2c7FOX/jC/XTiM8tO8ZdPo/S7foOk1IAQA/pHncRaXRnePscxfSOHq0v+BF3JuYvP3dR7IsGcz6P0u36DpleENQhoOrw1sOLwANBxeABoOLwANhxeAhsMLQMORVQbZTucddrpHBcjawPHkal0Zui7dY+hQHALqsW7dmkK9lhvUTsFDQl4AbAxcZ91Ij90z6GBjoM6Xd4ywoq7fQ4O8AIyDkYHjjBvpwkOHHiFmgwnTgS9gN6jwKIniEDBeIRU5tjmFeu3XJkAeJaE/Mmb4Zvn+LaAPKHNewLDTPSrALwQ1HF4AGg4vAA2HF4CGwwtAw+EFoOHYugLQ9gtCvYAsAPXX2UJmCZnte77brEgOIDwqQhaAfdFn0LC1bsH+1UFncxQgC8AK8b6+QcLWuj37ewjXHiCkXfiUQ1j4U0OwVy+GMfv9HKAnkC2CVlhlRdm2AmA19ykHN/ftMfv3Gemrfg7QK8gCYOoB9iWsiT/lhGC+cKd4pEs7k74qdZn9fhDoAeS9gfUdvYfMMa88r6f4ZpAPk2W/Kg+e/X2Aaw9QH/YjnMqxv60J51EKw/QWELAafYpQsd/PAXoAeQhos0p7KDvXMOr0898eNeH9AzQcW1cX4NET/D9rwacZ5YIqyQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMi0wMS0yMFQxMjo1Nzo1MSswMDowMKFdWTsAAAAldEVYdGRhdGU6bW9kaWZ5ADE5ODUtMTAtMjZUMDg6MTU6MDArMDA6MDAizFMHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAABJRU5ErkJggg==");
}
.ui-state-hover .ui-icon,
.ui-state-focus .ui-icon,
.ui-button:hover .ui-icon,
.ui-button:focus .ui-icon {
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAQAAABFnnJAAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QAVbGMhkkAAAAHdElNRQfmARQMOyIOGuz/AAAahUlEQVR42u2de4wkR33HP207sQjx2SHEPuzznbASbAKY3K6tiEckLOTMJtIlgHzO3KIAAefWgfAUuV2cXf/hPczOkhg/cHRn2QRZ2kfuHCC2FM9ijJEJJ8DsHc84JMFmD4c7+COE44/IQbjzR7+quuvV3TM7s9P1Pe3NTP+qquvx7arq+v3qV8FePJqMswadAY/BwhOg4fAEkNEmpD3oTGwmPAFEtFkBVppEgV4TYPDPT5uwcswVYB86CiQpD76MPYRMAHMHGKb/TLA9P/r4YXz3tjaM7d5JI1YrQdT8qzEFTCmPUB8hEqAXHeC+GikkcZPnsDzqxIWAgFVglYDAkHKdMg4dgnQdICli8hzoEEKhekRE6QSV4idPme7+tnuHNfPumrKtjFsIWQ9g7gBdYXoG7cNHdHdTE5pTqfdsmoYgMeV6/cyQISi9Emh+ikzPYFapVZ8dewrmZ9Ocd3MfmKVs62e2FMoTwIxw4FXTZqUywcxDUJLy4MvYQ/SaAFsdbVZGqXnt8ARoOPxKYMPhCdBweAI0HJ4ADYcnQMPhCdBweAI0HN4eIB930PnfZJSxB3CzCLApY9pGewDzHezNU8cewK4Oj/I+UiQpZw/gpgEzV6G+gfZpvrumbWt+W+oruU996iNjDVC0B4igXw1PQpn0bXq5LbaLPYApd+a72+ObEcZpJ58jAdkeQPVdxqpTL6AOY38+XewBTM+fW9709Amt1gZl7rQlUEUZZFK4Drs9gIlctv4nKblXBxsw+Mqpaw8w6PxvMrw6uOHwC0ENhydAw+EJ0HB4AjQcngANhydAw+EJ0HCcM+gMDB3CAa7y118rLZ3/c+pF70slDDIHoTUH1VVB9pgDKLk8BIRg1PW7+AcIK0jKouo9bPmPmj4wpmInR9XYbiVwCVUi7llSAFvxA4cC6OMHDhXkUoTQoOxxyV9gkMmf5e6RSOw1YC6hmUChJTbYHmIp/+IQ4Fp8nbWOvZKCHnTwoVETaRtF6+QgTGMHSql4d9VdksdLn4fQIDennZXO/BiIuQyg7CQwdHh6bKFc2FntGXdr3MAhdVMDuaRbtQZMj6BL2vY6KMjLvAZmXZxLKLXM3AXaGWxOw9bFunXRtifIdneXSWRV2Clul0s5KNMDuHWd9Wa5gWMv0688BsYO1i3dwCFMVZiHafMAqIx7jibQ4DDoHGzl+1eI61cCGw5PgIbDE6Dh8ARoODwBGg5PgIbDE6DhkDeHJs5SBwe7P/B+wqUGXDSi1eLZ9ka73qUUMgIkG6Nc3L1Xq4DeoVpatpy71YDJ1WymjWuXjh3pKZN/+jK0K9dAmMsloN4cat7C6aLRbiuu9Y4CurTcXEPo8+9WA7p7tHPba9ulYmclsPVA9bamFzboylvDXNyp27Zg6zaIulnS2HOgS8fuwt2eczeH9GqNQbFpg5zctrE8axzV/sRQStmsMNYprINimLIEcK+AoERctxyYq9Dl/va9/fr722LbCGCvA3MD2glgJpCGAOXeArIKqKKyCIQ01KmH0qfp/lWQ5bvqHMJ0932xNBnB1R4ETPdPYqrnALaUM98Npv3N+VyWtAcwVYA8gTEV35w5UxFNaYhFs5t9qZrATkBTCVZzDiRWS6fgBlPzrqbH3rjlkrJDgJs5VWh1EWEeBevEdqtedTncxuD6Jm2mdKofamOfAyjh/QOIaFtPTBo5eAI0HH4puOHwBGg4PAEaDk+AhsMToOHwBOg1BqnOroC8PYANJn2VS9HbNfXd/Ub93AWWxe4hK3vRHsAEk8bcZZUw0djtc9hgqkfdzVXm7eGBdfurvYF18U2pDwjZQpCYLbu33+Jio7g1strp364LzWDS2NliB9pw4lWdttO0eTR0krqXdFOgngPojA7M+qpsaKhitBA9OXazKb0PgxBXXV9Q4qrqvqr723c2DyUyAsiKwvIHyEcHrCfNVz5+QKbLq7aBOgtT1wVFtfu6hajj46MPyAggKgqrcNh2koBd2Vp3dAyEHkTdQ8ifqhC9eYpVd5B7j6HpJ8QhYDXNlKoDjzr4yNxLjVWjPYCLtt/uHsKMzBZAbVJhrvpsENJ7F0lCBiWlYoiqBjV9gVobqJvGgIuyVDcJ7IWy1c1qsepE02USiSEHW/AwGa8OljE0XfNmwa8EymhY83sCNB6eAA2HJ0DD4QnQcHgCNBzDR4DWsCySNgN5Arjpsk0qm9BJqgvRorspr2KD9oMwNCjnLt5NFTNRIz9dEpK0jOGquqzPMEIngNeBTADzKrV5tTt5qlt0lRQI04VS9d69qOufSEN0NfGTb9Wcqou9T3mN5QgiI4Ds7r2ITB+uc5keEMTNv6a8l7lrj7r+NSYMe2eTu6vvL1sU5FNxcx/ROCS+grMqM3u8tmmykuavPo6vOblyVu/+1ztVT4zZMvkIHQFfBwkBkqo1mUyBeGiCGvWPRNH1H/Ld83mQD0Io5nBFundAw7aA6pF5CxerTO9gxH7qheuxEjp5RIGwMI9IFMFqr/xyfnrlVr4BKPMWkFWxzibPdiSTST6RSrtAUOgHAuHuqoHIbE8ku4/wSCGfF2A7cMRkdln3JIu1NG2X18jA8VqCVfysX4lhMwgxzwE8eo5hOznUd8+bjOHTBXhsKjwBGg5PgIbDE6DhGCUCzKYrDbN9Sf8yxuJ/lw26qL1DRIBDccVtcKhySo9aNP02hDwhWQuUbcRZ5tPv88rYs7XocRlPcS3rrHMtTykpMGvN/f5Yul9zD73cFhPuzf0z3yFtpWgdIOQhngTOZ0oInL2SHUqvH+ZGTdLZItFR9jq4c86HWOJJoQlhmTdLlTufCz/HwRJyOYeq3O3nsPR7inuk32NcywLjwDozPMJxbQ2o7+HiTFp/8qftUOwoRFbztjKmS34JARYB+LwUfE1IvEiQk+zSVO9RUFIgZDz9vq4o4te4SvgtEyDSBEymsvwWsZA5iQJzzGs9GOg2vo1Lv/M5HGOdcXYAL+fDjGsIcAqAF1XcYRSSLGkHzhIxhJkAeYoHkC0EJU3fzQeI8SRwgp/waUP2x+JP/eLiNkPsZZ6UCJDHYaFQIYelvgrgIKQUmONgrkfIKlBfkdt4LP1+jTIPO7iIgOcbcvmXBpm5BzSr4wNFKuUoljT/3/BB8XK2Eti1JHCCnxTCyFl4YazLCxX2PBF+3ZD+JF8z3v9xMmX1YR4vECCjQLHzj9DKfRZzd50xpzP8E3cC72FGGf808LTwvYg55tO/zUXS/PfxPJkCrkvBqubP4wUAnMVz2hAXAGgmKLYeIKEAHOZxbZgAtJO8q3OfeWzjE/G3tyukl9ABFoAZOuwpDAF5TWrVbaZ2Lwm2EJ/kbYVrUfMf5XnAuwDiQb+ELqDY/PkCXmBN41fSb+MFma0HgMvihn+cy3hKIZ/lKQ4BjzOr6QPM+FXek37Lo80uHmQ/M8DZhMzwfINByRwHlY20S/jTYQwbbCHeqiDAFIeBvRyN51GLTEeC6sqgIr+fb41zZ/w5rpDZeoCo0SMKqF7DZiW5qhfYkftUVRHMED3n8hCziwUQ3gsWNMNAhPkaXfx6zRBqm457IKYACM1vIsCc8L3Y6RSb//P8jfSrCHOXaO4B5hSveWXkkAxR2We+iu4BQn6J+cIrYESJ/JVOrnS2SR7cIPwVsZy+5cByxRB6JBSQmn+Y7AFmgZcKv5+s1I3XRQiK5u9l6hEGo/bez2G5+YeJAB4DwSjpAjwqwBOg4fAEaDg8ARoOT4DRwmOCPsMJMgFaDhuz9XA5edMNs0qN+pygyy6+5R8ilP7lLRuO5ORHFPcVteX7+yAH+IKlfjq59YUyeF38z4wlllhKfoivgS26zAHzCtv8Dd4Yr0A9yiO8mCmlOvdp9gJHeTFX5ZS14P7um+j25fBz3BJfjVK7WaHvO5r+2luI76qPj1b4FvoiT8IEwJKk7gbocIAJusAE3fz7Oi26wFGu5wh7Qbl/4gfsAJ7hUkPtLsWLSct8nvtEAkTNH2nTihQI2ZfbWVP29PBoP+GneBOf4k08xB5NBc1ykENMFXR64tZP1R1cjm//Ly7hR1zEM+zQ+DiYoUNIwDQLWjlgkH+FM2zjd5XypPqXgcmSNZhIj6bqdlF+pKCEP8r1ivsfYopl7qeb2FuI6uBkOXWeuUqOWsQtXWrN4S18nw1OcIp1fqgMMcs8O7iRZ/qwDvg0F/M9LuR7XML3taGitfQZoxxZpy7hDMe16prk6ZtUSiekWtNtkFOv3P2GwxWAPwDO4y0AtFjLCPCEtJo+zxxPaNWmOqxhc+Z8Mw+xh8/y+3yB1ymMy2aZ5zBTfWl+eDH/ym/zH/wW3+RtCpXKu4HEWGpaET+RAwb5NsY0hi9LUsPn1/I7HEjTj7bILirvosY1/AuvEX5/SWHS8g5gJ7AHwd4qIcDVJMYU0efBvjTBLXyf/+bLnOLLbBSkSfPPGe8dGvThE6l7GlUP9B1eyrf5Tb7Ny7JJUIo2d5Lo+6cVyp9Mfja/MMizOYCMbOyN8MWSdTeRK1O+h3itVCuv1d4/94CKk8Dk6VXbpI2znxt5R2zOUWRnKMUtjrBFs82gIDc1v3xeUTGPIRkB1pTyd/AhZriND/AR/o6PSfLJAiVklVBdedb8+alfhlZuCFgzyHXSZ4jU3Xn5EpPx2J+z5XQngJuX/hbJUFB2DhE1sP7pT94CEqjeAiZSFzVqgsgovqd8kL815q6OPCA0Nr99Gp1RQPUGcBvv4wGuB45wHbfzAUm6xCQP8TMm83HzTqKyd/myOEpISJcuYWwZrC+iLnVT5z/PzcKvmwv9yRRRx9+NyzClkJt+wz5t89WXL1ubPzLSijr2CVKTLQlrTIBmA/3P+UQ877+eT/BzRYg9TLKcj+uqDp6usTzhUQYdKDH5c0c0RBUo6O0BGg6vC2g4PAEaDk+AhsMToOFoHgEitbHqnaaTqnLf7ZDOecqrQ3c8vA0iAabTCqj+GlLdP0BdtAjT7VrHtVYNn4vf/w8UKPBRDnAP9/BO3smdvK8QM6qdB+Nf5wHnxf8i3MTHCbmFWwj5ODcV4pvdV+StGfL2DEW5LUTR04Msj5G9Bk6zwEkeBt7Guanas5iI7ZRt6JfV+xKTzNBhmgXFokp05xOMcZzdmlwkC7I3cC/FlcJXpd/P8B3FWugJvsoUM3TidOTlcLs6PFm97yoVyea1V5X7zG4uRJAayswrXH6GTAgxUnV2pg5eiFeJj3Muzxb2vQwDJoEFrmQSmCwQ4AS7gd1p859QpHBR/KnenvoUv8xPgfP5P6X8q9zIFC9Idfrl+8mr4/XLENWq5yzz6a5C1SO0xoOCFUWxh4soeKXwvYg/5RcA/CC5IA4BDwPH2c0JPlm6aO5HyphiKzupFJGebVL4LmIsbvKk+Ys6+RavN+bhf/kpAD/lDQrpMaYIgXbc/MVl3XHhnxrzmu9R/ueBecYYZ1xpUdBiD3CISLFbhNndd0CXGXawi0u5NLMZkvcGRs0/pvQUFOa+VVP2mLJoQyd++mFZ2T+NCU+/qvm7ks1Dfq39O5wRHOEcK8R/DR3gADvR6fS2caZ0mTJckn4+CPyRIsRfAZEOY4pI7ycjJKNV8fGZBX4I/IKz2cGtPBpdzuYAIc9yblx1G+ysYPKFMYSbwZPpDqKWXjVH+Ubc/UHRLk5uflUDTvMnwq+7uc9wdxXBItcY0eBxRukCZ0IatfNj/A3S9ZD7CnMAUVl8gg+VngPcBLEVxlJWu9kQMMO5PMtXOcQGOxVdbOZoXe1yXbyqChHk/pmlqjssxI2XfReRNH80EOzIRjkgM3hbZIJA+fx2eIDd8b9i88MCJ3gIeJRoplHEGp/lC5zHuUpzrDmLg40LuIB7uYBfi/83Y7fiWjIHuBL1A7WLs9nFLnYBNyUhsiEg8n8RdYIzQzgFjDZHz9DhmywoNkdHzf8MY7FtbN4LQNT8ponbrVzHfwIXK5of4BGmCVnno3TZrbX8e0iT+kHBacT+wv7jw/Hm+uz/w7kQO3KbyoteDkRLKbXVlMIzQllt4CBfA81o0U07/h+wI6c1V8+71blX5z+aXzzLH7MWG2Zs42e5uKv8O0+yqq2lkCDdL3C44IXsD5mPTfLm+OdcH3NIYb8gu+zLhyg69FP6L/DqYBF7+Gvgw5qneInzuDumVYtjvLpAMREqAohmcXY6bgo8ARqO5ukCPCR4AjQcngANR54Ah7T+wu/i6+ki7de5a9AZ9+gN5KXgf+Ny4HVcUQj3aWl9/JW8kh28cdCZ96gPsQe4g8sBuJw7cqHuSps/W6F7g7IXOEUYe8xW4X/iHsS+zDSMC1GnBEXVqfrJDQdEArSACSYoqhpfrYyruro9/lPj/PjzgCVXHYXBBizFlb+kjWcLYZOHnErNNYpN/CLN9y2NjADR87/GGsU+IFv0FNW0dq+2eQQEDueCRvtk8xTINjdOahrQFmKJSe5gnDu0KcB25mOS6Gk8UsgWgqLxf4Jog9V3pXmA7OHS5O/yCHs1rgkiRIuoJxXukjvxOn2yTTq/bm93xBoCy9zPW5hUhgi5Izb1up33alM4nTZ9mRM9tiySHqATj//dWGd1ecVR+Gkyn/kqdIEfK/znJJ2+rvldcT9r3G+Qyp8ZXExYZoHTnOY09OlYqgEg6QFENUhRJeLeA9gQ7eHNb27Mml3f/IPvAU4Jw8LpUZkFRD1A9rS3hAlgdvUryriqqx3LHD9QHAwP07F9junpX9Z8l69O0k298BTl7+V2xrid9xp8bW93kozMDCE5NEojjT9v4/0K6cdye9CzlPQ9g16dbO/87U4WbCFs8pDT3B1r6U5pnvGqJ4EMKSICnFIyWuzmVmjnpKvsU8TpcMA4fpvsCWxxhwMjSQAXLPB76Zv/Mb5oPDFjlNFYAniMJLw2sOHwBGg4PAEaDk+AhsMToOHwBMijY9QJdKwagy0GkQAhGxYVUO+OhBgUnuAJo7xjtFXoWC0ZthzkHmAnB6wkUCMjT0ubQoeNWNPQYaNAIZl+RxTyI1JKKgrqt5Yn8a7iKkP53JvfxappSyDvKzjCSVaVS7J6b8KhFC8kv6YfVV4AdGizM7q3IYUj7C3IIzsDXXy5BPrTOnRS2Rm1XToiK4JqAoD6xAkbASAx9pCVQtmvjbjxsKSgI4A+vpxGL5pYLw0V26+3KNSTwJMsGqx69DjJYtr8i0IFBSzGV3exyEmHFHSwxd8cjETTRygSIGqC8jq5JF6LDRYLZ25ME7DIBi2mtY3odufpyiQw+R6IpIvGuKI0NITdUpCHAN3Yn4XQnygw/DB38hGyuUp56ZaEuDHEXrDAOeQwwiXX05iM1s3SLQmvDm44/Epgw+EJ0HB4AjQcngANhydAw5EngGnvrccIIiNAi88AcCFv1/jaj/Rsn9NIPbYkEgK06KbuRy+nq2zkGRY5xuvpOiwU5xWyR3KewI9sstxDg2Qh6Di7+TKvIuRzXEuodIccocU97LQ6ky26Ks7/lh0l9lvuoUFEgBZdfsxFwCMcZ5ofcaFiD28InOBu7mODnZoDTKNwKl/V47E79W2cYVvBn3bINTzGNYLDdbX8sdQXv0o+znr8h8Jft4cCkS7gauBbAFwLwLd4PVcXGniGK5nkXmA/Xd6lJYAaVwAXA7CdsxR7ESPnMts5C3hO8XZycfx3BfCcIv3twEti+Uv8240rIgI8AbxCuPqK+JqMDnA/XW5mFyfYo0xPbyZxofTrY7Fn+wzbeb9Ai6L8Qt4f/5niR2G2K+QeSiRzgA12ppuml5hUOnGJlMCHmOIGrmZK6w9bNQQcQdY65e2N+i330CAhQHQexo/5Fq/gQtQnBmTWAIvAAeU5V+FoGUyNPsRj4/4s9hP0Xf5+VGxePWzw9gANh58tNxyeAA2HJ0DD4QnQcGQEsJ0HUFe+wJdS+ZcU5/71W97v8g1aXhHJW8CnC+flfkY6D6Cu3OZmrt/yfpdv0PLKOPtlAHfxloLkCl7Iw/H3uvLb+POC/OWcn2oT+i3vd/kGLa+BaAjIPP+L26ZerfgmIi9fTY+WXdXGDwzxbennU+hHfFv5bfk3xz8tbUzTxTfJxVyoS10SeVexamfQNley2e7fFWAf6t3BddN3iW9PX+UO2zV+gHqDWVjidyikUpQfBWCvtv6Sqx/iVnqyQ0u1NSxfzLwcjTyMx93ieJxPJ9RcN6dvL3DSA9liB1rKuaSuy59L+iFmzwLXGXNwE7cKzd8TnFM/CQHPCf+XR2jtEczoTQPrHwB7/u1xbWqyBwyym/gIH6Gnzd/7IWAJeDPVh4D6Xbw+f8UUqnXhpvRN+Suev1BOHlFAbP4eDAHRJNB2HoCbfAWYZDL+JsrFk7BDxdXjgtQmxyhHKZfzHxaufkWS2ORV6ycpX1hZfqvU/Oq7lkREgGNSBhIcU3wTkZe30wpsa+OHhvi29PMp9CO+rfy2/Jvi551XlZUDUuevLnVJROsAa1zBy3OSVeFkn7ryh/mdwmGUn+Gtmybvd/kGLa+BiADwjzyPs7g0vnqMZf5CCldX/g+8kHNTm79v8IDQPJsh73f5Bi2vDG8Q0nB4bWDD4QnQcHgCNByeAA2HJ0DD4QnQcIjKINvpvMMu96gAWRs4nn5bV4auK/cYOhSHgHpNt25Nod6TG9ROwUNCngC2Blxn3ShP3DPoYGtAnS/vBGFFXb+HBnkCjIOxAccZN8ojDx16hJgNJkwHvoDdoMKjJIpDwHiFVOTY5hTqPb82AnmUhP7ImOGb5fu3gD6gzHkBwy73qAC/ENRweAI0HJ4ADYcnQMPhCdBweAI0HFuXAG2/INQLyASov84WMkvIbN/z3WZFcgDhUREyAfbFf4OG7emOmn910NkcBcgEWCHZ1zdI2J5u3/w9hGsPENIu/JVDWPinRtS8ehomze/nAD2BbBG0wiorymcrAFZzf+Xg5r49af59RvmqnwP0CjIBTD3AvrRpkr9yJJgvXCke6dIW0lelLje/HwR6gGHqAcTmD7Ry3/w9hWsPUB/2I5zKNX9bE86jFIbpLSBgNf4rQtX8fg7QA8jbw9us0h7KzjWMO/38p0dNeP8ADcfW1QV49AT/D5h9nErt27boAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDIyLTAxLTIwVDEyOjU3OjUxKzAwOjAwoV1ZOwAAACV0RVh0ZGF0ZTptb2RpZnkAMTk4NS0xMC0yNlQwODoxNTowMCswMDowMCLMUwcAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAAAElFTkSuQmCC");
}
.ui-state-active .ui-icon,
.ui-button:active .ui-icon {
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAQAAABFnnJAAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAHdElNRQfmARQMOyIOGuz/AAAYOklEQVR42u1dbYxdx1l+jhMpKsHBfLkmcbKSfzQBIUu+SyQUhGQUoWt+BBWVwLUjPhqjdarSqgjIbqy7P8Kadu+CQlIXaV05kD83u1oXpbg/WFObVKYxFu6uA6U4pWratUO35k9p/pAi4Zcf52s+3vk459y79+7OPKPde+95Z+bMzPucOWfed2ZOQogIGbtGXYCI0SISIHBEAsjogNAZdSG2EpEAIjpYArAUEgUGTYDRXz8d1H2uTdV/FCYK5DmPvo6DBImhQ0QdgiGUgDVOxyKHJX2etmOMYz83rGndNbCfvzzqruM2CnoVzZXzIUDH2Tzm9Hlacw4uArjO7lMDd87uOm6jUKX5qyihXnofCsKRd5Oy++bsquM2CnoVmygQzuvXpwepfwX79ABuJXMtEEAP4BvqPwPU74D9c3A/A8CR1qTeAJ4BBhFG3zSdBgSz34I6BQFGXccBhiT6AiR0sISjWB51MbYOkQCBI1oCA0ckQOCIBAgckQCBIxIgcEQCBI5IgMAR5wOoaUdd/q2GZux0edPIaW23G0rNploZfAyXEbbJfACXLzIv+44yBVdvADcB3Dm4crf5E22N3/EqXV1vZV72HeoMcjd/lSaul9pvSorbXVyXnvZAAgF2yGwAdT6Ar8e+XhO7+w/f+QAda9nq3qAC7wH8Q6dmE/vQyx7cObjo6XMDCfYZYBBh9I3TdD7AqMu/xSG6gwNHNAQFjkiAwBEJEDgiAQJHJEDgiAQIHJEAgePuURdg7EBIRnjuHPXLULH8dzdLPpRGGGUJyFmCVEl1yuhOOYKay7cAgshCrgqZAdlZzWqSqqh7Dlf5U9Un1lzc5Kib2q8GPrEqpN0lRXBVP/GogDl94tFAPlUwX6E+vYetDonyWe0cucTdAvYa2glEjtSA6yKWyi/eAnyrTwaJu5GSAXTwNgW476JNSkBF6oSVimfnzpJfXuYykEVuz7usnf0yEEuZAFUfAsnj6nHF8mFnvWvcT7mJR+42BfnkW7cFbJegT97uNtDkVYaBZRfnE4uX2btAN4Ptebi6WL8u2nUFuc7u8xBZF26Ku+VSCVR3cOijgO19/hrDyDgfIHBES2DgiAQIHJEAgSMSIHBEAgSOSIDAEQkQOEQCdEAY9fJol61wuPBpAR+PaL104nqNuqieVloV47N4su7yLr8UfjnXW/vjt6zMtwX49HmMjneqqnXoWFvAvjBOLmXKFq153MV0xWlSfZ9YbgXULbdPC5hiiKsSORL5tK3fXu2dBgTQ1k7Wbf7qG0b7UaA+/dxbuPuowC8PTgE69OZv0gPJOZMzBk8ALY7sCyC4fX0A73RU7z1JhbR+JSjnIpj88a7z29K7zu9Krd97zaV0efzhlHLp01feADDsdqzO5UiAqqOAsgHqeKwSIQ8+d5I+beevg7Lc9R6y7Gc/mknzGUdHK7dBUrirE4PUljOwnElsm12rpax0C6hyH+/UyMP1EObTgbpLZ87H3oX63cHzuO6dlureguwPgfa0cinTK63i6f1O5Noiwq7EJqmrNEU1Avo8QfjTry4BfHKulEecDyAif3FcfF9ARCiIpuDAEQkQOCIBAkckQOCIBAgckQCDxjYbVqnzAVywecx9qt7JDVBjiuals61OGse6K3Ywu93IZivzsT7l5zDZ7HwtjU0tca6cqYZUtsXVSz+CUBqCRGaabGE2f5W4NNKW3uaJ83Hz2D1yrhzSGGTw1NkWuIrntaevk/vIwD8DLBk6ebu/qrw1LNWYWJYuy3R1krY9DMjb15dUOMqdlzu/e2XzWKLsAVI7eNmEtlX4nKz0Rmc5V0ibS/2WQLsXb9ffQsKmRlcP4Z+zbY+ALUbZAywLfuY6RVs2+qnzBnB5+937Z9iRCD0I30PIn1yMwVzF3Bnk3mNM1C/fApaLQnEdeNrBE2wTEmyTFo4y3/RGAuzXrx1JUQJ+SoW96cubkHl3kTxmUlEqxqg7oWY4qPCcbZusIcezvTGk2X78Pr5uqinzeT4nxyhiEDMGtjREd7CMsematwqRAIEjmoIDRyRA4IgECByRAIEjEiBwjB8B2g3tgRGVoBLAz5dtc9mQl9QUo43VLRmJj3ofhLFBte3ifbaTTnCkQXlWkZOkbY1Xd8v6EnU8ljsQMgHsVmq7tTu/qttYZSmQX/MJxKWJJdKu/0gRY9WQPv9Wb1N1sfdZQoS0QYT632Qtt813aRNRm/j183LOxMrTHExlIGsJ2fXvReho8m1mtR+uL8BvdbudSelcmyO4YJWbfPau37ajukSNJ852yOsb1BpAE8QpYQl0NakwT2XwmxBhnlSmEsg0JYMvoWv7BJngCSiqP0X5wgixyUwKLidG+bx2gYPPbvZHcAGkPUfks4n4Xfnl8vi8NiICQLVRAAmjAH7GjW0A6JIfKaSrABLtRpIIZ+ceVu3zicSdMaLyBfi/MEKeFVt+HzTMTxHN0MFSVL2OcZsPMCz1RxgwbgSI2GKMny8gYksRCRA4IgECRyRA4NhJBOgWlobuUPI/gFYWDoy6qgMEgUCLmXNkgxZruxUuNXSyEF2THDXdium7ztTdmjmn4QCBpomIaDr7ZSsBf46pTDplOIdZ7koJOqsE+xkKLeWNf5561CuIoKqxPG4mSLn6fcW6sshEkr6iwr5FvXoTu+RyCV1NwzV1i6aJqEUtIpqmlqUF+HPosLWQv0SMseJdxyJGagcgLAAA/kHqHC4I3cQXcAPAj+BEcewmJpSuJLcSngPwJOvKmSy+rzHumq/g54Tfr+IpSQokOFbI1HXGhFnMCb9nMWdcv2tyZk1Kv9UStrCGSewH8LP4U0xinckhwSYA4KdQb4VRWituDbVZIsY4V7Q7d/4pnJF+S28Pz1W/qkbIcAPAdXwPr1mK38o+nzTGuM+S+lXckAig4gxEV/IZgYopTgEFBWZxSqKD2IDmhrwPrxfff4ktw368HwnutZTy9y0y1SPJy/kXUCdMLtUolqv/z/FH4uHSG7jqyOA6vqfFkYvwE5kvj5j5PCl+3JL/MXzFev7LKF3GZ3BZI0BJgVmcYnNoK5966X7dWtIZ/C0+DeDjmGHTfxfAt4TvOmYxV/xtLXL1v4z3yRS42zMDTv0qfgwAsAt3jDH2AADOsjJXD5BTADiDy8Y4CWAcAzyqfKq4D3+VfXuakT6AHoB5ADPo4QntFqB6UusuM3XvkuCK8Qp+VzuWqv8c3gfgowCQ3fS9CcD1EGoF9zjz+KHi26Qmc/UAwIFM8ZdxAG8z8i7exiKAy+ga+gA7fhgfL76p6GAC5zGFGQB3gTCDey0TSmZxilXShPBnQgsuuGL8DkOAEzgD4Emcy56jFjCdCvwJoELn973ONJ/OPicZmasHSJWeUuBtZiTeleRcL7Bf+eSaCJhBep3Lt5gJzAP4bPF73nAbSDHXoItfaxiDn9PxWSCjACCoH8UwsO0YRrmHMJck+aXK42zVDjDYYWA+SCo/TaXosqNtDtWGuW5531h7nxhiDfn880FgTzw6Pu7gLoCfFn7fqNWNNwUBOCFc6YPPPcVopqZM4Yx09SPOBwgeO8kXEFEDkQCBIxIgcEQCBI5IgJ2F1wV/hhdkArRBcC3MNoMKR0bToUUX3KSOWWH4OqtJF5Vh76IiX1HkK8x5pwT51BDkAPAlR/v00KvdboezYEcfffSLX0KbtImoS11K1/fKYYNamRnhIk3TImsGuZYZIlbomiK3e7LV0GXjzwqebCKiWdYQkgc9vduQk8aZpuls4sfg5Xmc1KijSnqFQa6tmmsy7RCtELLatZm8bxER0S1r6+bGpD4dJ4ivjm1nVjBiKUDCyyJ87GD88nCiv8n+zhsbqEvpBJSuIX/Ty1ddCiYC/SeBbhPoHTItMJ/OJNMWOazyw9SiwwZ53vx96lduwRwrrHxFS73Cnn+RiPrULi2Jojs4d1LOYbbWRi3ick7ec/gn+DY2cB2bWMN32BhdzGE/nsE7Q7ADfgv345vYi2/iAXzbGCu1pc9Y5ZB96hLexbrRXdPPXDHHWOkRqdVM+6zwsy1+0uMIAPwKgN34bQBAGxdQ9ADXtDl11yr3AGIHZ+oBzhPRBSJ6nb1CukTs1T+oHuDfCfQNAv0rtZjzf8zRA+RyWOXmHqAvlU69BfSEUqfoVarflyXZl5kWPE7H9bOrp+hmRNCbfxAEeJ4+TK/QM9lfFfXLs+JMBEj3J2ln90tV/jUi+rfs74Ymz+tnuoeX8pMOOZ++vPem4ZmKBFDddfozgE07Iv2k42oG4qcsa9EioeBQj4lhJ4Dur6uifrV6dgLw8qfpG/Qh2qAP0X/QJxT5Ma10UwOVl+qHMcgqblvlJumt7EFQlfcpv/dv1CUAHCHfI6jtGZ9XsHnK9qzSwNwooF1UnSeImYAp/tBRuiZyONTv43LPKcCNAF6gO9mD3wrdoRcYApynvp7W9/RuhcrPofwzqG3Ssl39KgVmNalrWrddTmR/lUVTed+pftcwsKRA25C6XAtwVktt7IF83cHTDcwTEVXQA2SP/YCQmn6eUg/H+QCBI/oCAkckQOCIBAgckQCBIzwCpG5jbkzTK8ZGH/PIZzd7lLDdnqqFMeF0MUaedoxYXcaMuqmbhDYRrWff142j5YtFHdWR8p8R0Rk6Qx+hjxDRJ7SUaeucz37tFkJ65CR9hoiep+eJ6DN0UktfWkI5a4e8MJ9IXYivy10x9IX8rJ1HruAGLdIivWehgEu9wyRAPyvXNGtUSbGeqZ8vRW4OOc6aun6+CD9DnC10nRazEvQZCrnseLmXok28Gcx+pEzdNuST2hq7mTeH241dTFE4q8QIG8XV855RiaMkQG7L4s+Rq7381HO4aFER0V7aT7tpN+2nvaxCFglE1Ct8+rbriyeAeQ8RorSP6BZtrBMA0iwKnQBpriuFTZYjwG/RsSxkcvEZ4O8ArOMQruOV2vcS/XvlO1ERVKQ++mPCdxEtXAcAHAIAXGd88m08bi3D/+D7AIDv44OM9ApOgAB0cAzq9hUpJoXAY87wPS3/HIA5tDCJSXZGQRtPAFgEcJzN3b7dd4JVzGA/JvAgHsSD+WF5cWiq/pY2nw4QlzXV2ylYVWj1CSc9HMzU/yr7ENfCulX9q9K6/AVF/jW8WywIPYMrWvpfQA/As3gIvPqB+/Bu5TqVeKD4PA/gV5kYfwwgXbR6AsA7mpxQ0kq/fLoAvgPg/3AX9uOTuJQeFt8X8APckzXdBh5y7LgPp1x/H0AVKXeGacwX32cYCvwLDhbf3yk5DkBVP6fAafym8Osv8bLl7BzB0q0x/hcA8C67Bc4RaZ6V+oKL35OOE15W5PJ8oet4Tpm1lW7hn06WnWO28yecBLABIPULZNLyFjCDe/AD/DMWsYGHmC623Gid33JdPMrFSJRgl3JnmM+UV34Xkas/vRHsxy1Jmqt/AUeQsNdvD5/DoSzo6gfmcR1fAHAJwCFmhyDgAv4eX8Ju3MNOx5p1bLCxB3twFnvwo9l/Ow4xx9KL6CAOgr+gJnAXJjCBCQAnldt18WToGgaO+yjgFuVzY7lHpJ7jDOu0QivsdCpkqYl6mct2XZObf6lHp7QYrmEg0XEt8KOAlWyvMP0hcLEIRM/powC/MEoC2EObygnRt0i1A+jP3ebS8+VPRxfvUZvyiRm7tbRL9Dx1LK1EBJrKghqjlY0C0v/qNnRbYAeIAfQEXaWr9IRB2qfzBa3atJuhmG0YCPLZSnLLQ5wPEDjC8wVESIgECByRAIFDJcAiawUEgNN4s3hyeBOnR13wiMFAfgh8Cw8D+Doe0eK9ptnHP49fG3XhI5pD7AFewsMAgIfxkhLrdKH+0kL3QbYX2ARlO2Zz+O+sB3FPMR/HSeibwuhps3l2YwJhTPgWUeZnfksZLa5Jo9sca8y40m4Iso+Sy9BjrXbu5VWuGC450WYxPt9sUP5tFMqvL0kKfslQcZexw908bWeMfJmkTIFm+2jm8hepRS8ac/Cr3Q4lwFtERQ+g9gFyxW3NsEKmZWGi+jcYSa/45NTvVg4yxbczInDyF7NvL1py2AyTAD1SISrAnwB85y3ndJuZr5enM6nflwClpZ6T5xZ2fXeAEmYCdIlokzZpk8bGkDs4AnAKrkMAV8iVpKs/VbtJ/ePQA2wK598k7IwgK6C8BchquMoS4CqToasHMAWxB+LTj/4ZwE3BbRi4qumVfIGVvsBk6Gocs9R29csKHt0oII0zcqUNngCbrILFJljSpEtGNbqeAUyyur3H1oYdRgB/d/A8fhGPZd+v4B+tb8zYyaj7LqAxRZwPEDiiNzBwRAIEjkiAwBEJEDgiAQJHJICKHqi2dBtCJABhwzERgzCoV0KMCtdwzSrv4dna0u0JxUpHtGGxxoneAFWSp2sbc+jRRuYI6tGGJQcQsuVNsnxFyqmOu7bnMDb3PFLnLTD+NkuvwDefSYU2Aojp9GbuFWlS5blyMBPAlN6HADap3dGjS3eISdhUSX5ah4sAqQrL37IUhEJ5rhxMBDCndxOgqorNUm7x5TYN/EPgTSzgN2rcT25iARNIFycvCDbzBAvZ0Qks4KZHDia40m8NdpI3QGP5Tn4GcIXgnwE2HNUyE2A7BPIgSK+BdFuG6A1U0cOzli7eLt2GiAQIHNESGDgiAQJHJEDgiAQIHJEAgUMlAAkvFo8IACUB2vg8AGAvnkabjZtaDi4apBHbEjkB2lgtth99GKuskmewgCt4HKse77VTzQsrigFqZYvlESZkLbZORP9EIKIvUvpyBJPxsE0b5H6niOvNo9x++cOUx2AIuVKJbhMI9EXqEeg2md5OvU7HKXXKto2Z8jvVtugwtbL/h7UF2kSHibIYaeDlZJW3ir/WTrPZDyuk7wt4FMBXAQC/DAD4Kh7Ho7igdBYzOIhjOAtgCqv4qCa34xEA9wMA9mEX9mnyfQD2YR92AbjDjE7uz/4eAXCHyX8fgA9k8g/E0Y0vUl9AG6v4L7y/OHobe3GEVXAbq7iJCazjEOsUoWynen23+j+Qfv8FZnFqC+URJmRdwQaVi6b7xG/ikrpCF4noOC0aZ93wtwD53eL6fKNhy2MwhPxL+q6A23SRbhMZHvLEyRA9hgBEZgLEMKahdAdP48PZPoFfx1+P5T59EUNAnA8QOOLTcuCIBAgckQCBIxIgcJQEcL0PoKl8Hm8U8jeY9/4NWz7s+o1aXhdZnq+Ritek8WJTuWubuWHLh12/Uctrh/TjNHE4XURrKndtNDls+bDrN2p5g5DeAh4rOgTxla2PMd9EqPLl4tWyy8b0iSW9K381h2Gkd9XfVX57+u9KL8U1pbfJxVLwta6I1BBUWoMS7Zcs5woivk98CcBR6cjg8vdJ785fjFE1fcLkBUt+fPoyF11+DgDwpLH98qPP4ZMYzCJVAnE7/MpH/OT5fbe8H6tyUn5XzZ/PDZ6/3fmTNf/m7QPts5o8f+Pvc8wZa4a7B8ChEneE/3W46OoR7BCXo9fJIRE+66Qnj7S6o1zG5yyyk/gUPoX86h8QBn0L6AN4CvVvAc27eHP59BzqdeG2/G3lKxVPteQpBUT1D+wW4HofQCkXocqXKHcZLyly8aVTJdYYOTnlqJH+Kpueq5+r/mL5q6aXby/V5flNQJc3HgVckfiQ4wrzTYQq7yDfQ6xjTE+W9K781RyGkd5Vf1f5bekJck9VVQ5A6vz5WldFxoSdbogZtSFq2PLaofw6T28Umb9B81rUpvLT9GYhf5MxYgxbPuz6jVpeM8QJIYEjegMDRyRA4IgECByRAIEjEiBwRAIEDtEZpDsdZYy7PKIGZG/gZPFtjY3dVB4xdtBvAc1Ut+bModmVmzTOIUKCSgCXAtewZpVPYk3oB3S4FChOieJANX39EQaoBJgErAqcxKRVvoZJK0EI9gkTpPnEZLgmVERUhH4LmKyRi5zankOz69dFoIiKEJ1Bo36Kj6OAESB6AwNHNAQFjkiAwBEJEDgiAQJHJEDgiAQIHNuXAJ1oEBoEZAI0t7MRuiB0h17uDpZwdOhnCQAyAY5mf6OG6+pO1b886mLuBMgEWMr+RgvX1R3VP0D49gCEjvZXDcyqJBapes00zNUfnwEGAnlG0BKWscReWwmAZeWvGma9YuXqP2qVL8dngIFBuig72Z8eiDraHx+vS/zrWnToccT8YZTDcv4YGq0NpMYTLgizmGNf1qCPDNQ45dW/xJZBvvrjM8Bg4NkD+AZzD+CTtsrVb4oXQ6WgqqDpqx6aEMAWOPXHm8DACdC8BxhWyNWtfsbQMMQZQYFj+/oCIgaC/wcZyXzt5t67NgAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMi0wMS0yMFQxMjo1Nzo1MSswMDowMKFdWTsAAAAldEVYdGRhdGU6bW9kaWZ5ADE5ODUtMTAtMjZUMDg6MTU6MDArMDA6MDAizFMHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAABJRU5ErkJggg==");
}
.ui-state-highlight .ui-icon,
.ui-button .ui-state-highlight.ui-icon {
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAMAAADYSUr5AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABEVBMVEV3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diB3diBh/q0oAAAAWnRSTlMAWEd8IjKY4b3Ld2acsomqpVpOeudAZYVTi0aRlGNhTaBobZtzv33AvOOt5enkgY5d393gudbb0sTV1Ndi2nD+Dc6Zafg4KhYcxXnRp8iT0Niv8M2QiLC7x6vji8qEAAAAAWJLR0QAiAUdSAAAAAd0SU1FB+YBFAw7Ig4a7P8AAA9rSURBVHja7V0LY9u2EQbJSKrpmJIbuUubOG69JnM2L8leXdd1bdSma+M6qbuk63r//4cM4AuHOzzEUqZoG59syUeAAO7jAbwDQFmIiIiIESCBZNtN2LL+MHIGejcvAb/+CWZAZR6WEGKBoGASQNtjpKvUBB8BYBWApwJyfvnnoCZBLZATkND2GOn0CjIC6Om8ApY5GZAB1n67Cp50zqAguf2l2zIn3kwbBbNg3kR6gbmFeK8wtwBPA4a3ADsprIk+AtjZwEzEUzoxweHHgDX4uNS7AO1Cw98Fto6b7ghFREREREREjBiX7glu2Q9KWLQG1HlP6Bk0uxHgJ6wC33wAmxCSpQ9KiaUBjACWgWY3w8WEVUAJ8ESXqvQhgyHWfnuLPcmWGZXEc7oITAFCScBg0wHcgoXNZo1obY35gMQszdejtm0BViSeFvefD+A9ZKtjQBjX/S4QEREREREREbE99HP8g65psPzegUfPAoAvp0KH3L3bx7cDsAYFSgP/Ea4eSQaexTwdXGn2CrwNsKT667eV4COIpbPCmAa8OiCJ4EhsGGXlkRPAlbhG/TxchhABfAII/BqET/dkMRWsc5M5KzM7LdDLnzWH14S8HUjYLIQwbjndb6LhGrqoF+zjlj1E4E8PlEguBwQvSKACENY63anbvgtc8vnh22RERERERETETUX/bak93YzEshvdXaTNDw0uVQWq79aAtSrwx/NsbdXSAJQu8OLUGl6dyuwOTsC6vM8byYp012+Jb6kCvrLBelERPwIvT/LWWja7J14CAnvDhdXMfAx4+Uss0z2B6QcjnG3C4eYAWzsnFsTCYUs0zh7ZEGs0wJ5qZZiUTs+32ID7dEYAawFvnplOu1iYAHsDnJdwrWQWMLsJsK6t8xV65wVgXYB0kWAXsPfyxJmDMezdHMDzWAxMmAUItkIfIIAMgiSVDUuhGRxav+Ua+ZPtrXAQuE7wHrAAnnnc8wHbfj4mIiIiIiJi1Ljcuzh3VMijspYzNutYhIuDbtk76g/8CI7+rGdg1tZaLyca08zgFNnKjn/hqzuA7RY3fcdqbdLzdHjA1bdkAKawMKJPLyFgL7MvAe7nu8skz/cD2OYzzPVq1l5fcNCcC67TN05AE266CEgs4TBvuiee4um21WkgqeDPDBukILG0kIW7gE0UvH3YUhqdEPHuWbESQLvExsM7PaipyQQWnZnP91vSiWDr9pgQxk+AkBDh/WHO6LDolDwxEoheQ5uAQvMP/vmja4jrrl9ERERExPVGesVvZBa3A3zLVdQb/jX6j2kpwLrMYnpfaXA1EFJSqFcUYlSLIWzrskDxilI1hRQFQ2Z8l0JlATq/sC6BMwLH0m2ARy90e73U34jODAKgIsGIZ6mI9U1gXARYlt85QSmRKQH4U1hiN3QsabvYWLrAGhbA8ps7NiqCHBZA9ys0dI9Gf6YjGwNIDusMTaqthI4Blg0yozF/3SZDwh+OIR/lT+0KgeUvhQG/K7MDA5yObheJ3gN9SEZIQF900T8iIiIi4mYhU35Ctn7+WxOJW0O1biobN5v6crwT8Nxgp3KVXCpmNDnz83FL5AC5uEUKQGfsSnFXOGSaKG7XICc0KsFeUUyRs1f+bRBSukVzvvu5ERe1hgtD37bFVGYrW7t1etPqSQ6TCeQTowGCBRN0r61VqA7MbTW2QVpRFGkFQsjMIAAxAMpEJ7rGHYMAWfS+ROtKQ2MBrvXuqjhd4AQm7757BzABy+XS/wSGwASIAAG7BoGgVEcHJCEJJqRqoEn4gYLLAmAK6ENVXI8BgBpotPigPP1AE/Due7u/MQi4e/cu2x7vlskBSoDS/31MgGlSIPU3bQw+SNULVXhXwWkB+0p1mO7reYCstP+WAFU+mmKritMFyi5w7x7uAkshL4F8b0/IytevJEDpf/v++24CEnJAHkmS/QSFMHB4eOgeA2BfMiD1xwSUPy0B5SCICHigzn7woDlwVA2CR0QddAIngD2iIQgBH+L5ifnitnwvXATQCuGjEqjC4+Nj0CbKLCDbn07lm+4Cpewm4LhCfSDJ4b08vwM5fkYIdSF54LflC+s7oQRMCAFgWMBc6+8hoC3u4xLE5CYtAdQCsv0SzSViMqgxdgpGn8zz9i6QN/XnTgvgBIS6AE6vxsCizdwSkJn1tcVVfgC8IxwgFhC6DVbtmZtzMJm+dQNXODDoLXD1/AAloGSgEJtDli1KdPD1GIem6xLODr2mlXY3qn9ERERExMjx8KE/PQXvvDaAbesjQabD3UflbepRI9bBdhtjz2t53p5buSa7a8tC/I60p/De12S0dUAOyds21j/LNAMz5UWe5FMU7Mgmz3daR85KRaaPP6pd8YYBebICWWkyPZtcuYJry9X1aDUolDOXtvf2VHE7x9f0McBjor9ylA61/so3b6NfujucOWYCfi9fe7hBmbzOGcpvrA3S2EL8QZyKP+L4NpdCbsjClA8mB0hW7V8sXA2E2tmv5cbgkMXJxi5S7TpWMxZtdMUJqGYHEAFPHjx9dv8BmjbKpH1nuD1eAv4Ef5avv2AFletPZBx8yNh4klPft5VrZz611/ewEdE4MIO9heSgEnaaGZsdFwH1KIAsYA/+Cg91g6T+aMoubAF/E5+Iv+sppWNiAcfEAo6JBSyM2EP2gGqQauNbUt+nlfRp28AymMexA6gxQOsXJuDJgw8/ki+7/rWnjglIoZx1auR/wGfy9U+0Y8Lo46V8h8govey/Eh85CGiiu9RoELEfgWGO8jCZikMjXiQEZIRhon+7I8IkAMmff3J3dvdfX9TyflPc7nrywrx6gnWBWsbi48daVrbfzndaCRAEao9QKtyTkkAmuR/VDdZ3AbXFSLi6hOrupDi/LIj+PIBPsf7i6Zdy+Jt/+bQlQPb/1HM+U3TOBlFzkpVN8hM/gE57E9n2DTA+eUH1p7dBUW3q0snlisDtoj0fWAkGcnEFUXQI8A0fKCIiIiJiC5jiiWnlysExy/Nc/3nJWwtV6AHeux/0aUEKK/m+wrfmE0Cu5vvw1Vdffw1foObsKf1LyD/u3IcnT+D+nSad7Ldophua+YZWpgfa4I36TTnMptMXBgP+LxcLYSHLylG0CZKBFfXGD7Xn9Y3Cv7UruprKAhYsuGnTjdiUPWRdB686j3QdMxns6MXBKkEHV8oxXsELy27ZX0mAcrXQGUr38tc0AE3At989f/7dt7o9UwHFAq/sUAKMLSNQTkahDQ+pqKYqUu1rZ2o+BhHwTK3V4QpXinUXATS85OqS9LJLIYtalbLWPzXzQ2nru+3pL2XSDLmrMCEbMszzy3VQlAFU4CnjOYEtYD7H+9XzszMVXmoCpP4CTYFRxmmwYBeJibftb2wA6V9dwWYM+Ax2JeBlm6EojPPhwE/AkfzzSP00ycrApnCILIBEr8+e7T87g5O2wBeqdbPNEUAt4PtSbmblav21gvmqxKF5uiYM0g8ODg4MAuorW30cSnwuf8iGh5VzDDg7Ux0AD4IvptPZBgdBMgZ8X48BNQNK/8IIR++o9h7q01d7cIIYUAUdoWGvmbxp9Pv44/qHGIhzDJhmZ2dncIYZoLfBTd8FHquJWd0eGrqt5nM9YSVHQPmTagbA+Gj+3G0O0NtgaRElHGMATBUwAbZr2IcAgrS89o8bP8CyR9AcYaW1vEjVSPm8ST1/kphf6yLKUaOWJpma0suaDRvd/YDt4+jVqyMkLvYUV+nzljHaYLZzMiIiIqIXpnh39Osf1BDzw+ttN2pAXABctMKPzaj747abNRjuKXXv1cLr6o6j3rUNLGGJT/iPxZkRm9t5tiz5X/YvaF1cqADqohbeaALetDmI22DzIwpNCVt6oAeoDEt1T196y79E3KsUvocqp64Ha09KDxTaKAIbN5X8dvLWXJ1l1Q1JgBwBVAh9YVRutmGOF8Yq/fXyYmHqb9u6u0gXWL+38u2tkWG5RQKK5noXbgIK0uUBTlOchvW3EZAaJlNuNJ8Y4bRBQAbL5XI4T1cr7CaAn4P0l7obg2JvCxh2ECwNoHpoptThlSbgFcpU+AvA6b3HgGGjNTroPdXiU5yJnEQYMPjpfRcQYsAhcKkVrlpw3ojnWEc6BmCp2Pzu860G6z+paVl4+dM22zCm2YqIiIiIiIhLRgE+8bIBM+LIrPWERB/s7FD9wSNePgFAKDAIKNNSnKGYperNyKBC5kaeV5nc4W1BfOeCJUO5QjYgASYFJgFVWtvm8vJI9WgGgwCczgmgwSKfDDA34w5CAN4MTAkopz/qRpYfM9zmOgMmYGbRKayxIW7y/wesRcCAFrAWAQNbwLBjAMXWx4CB7wJ8vmPLd4ERYLt+QERERETEzYb/ObLrjvS/An7+HO3dlF7KyQ36nlz1HCn8XKDnGfLipeUBisY3od9/0FUeHVbwP0mAQLuTFSszxgB9slTv1+8mjw0pnArxcyFO8dPWq0MZ0ZrP12pFJgcT+dNu34YDcz+7ksGUJ+o1Gal7m9X75k/0FcoXoHbb7zkIKL8aLdlvvl8PEkgSdaCR99VLf/+eSpdHkv2RElBagMQpvuJqXFgZu5MRAV9UaE28ozw6zMp74ALteZHB6BQOpw4Crt0gmAOcnpziYb+ajtAhKWz4P1yODfmFvD4XV/Kp+YiIiIiI3qDPB4Rkuomqq9y1vr5yCPT5gJBMt9F1lbvW11cOXn9o8XodmW6k7Cp3ra+vHAR9PuCNLqCRz5VveF7L1VbaMv1VKwOVhTP9jU5/46xfgDdd7egk6YK2X+DnHXwAXQG0clOIqFeDz8/x6nAoP09n+fUSuS0dr57ZP8Foj/jll1+E2R4hztZcXwP0TK9DVr33nDQYN4jlF0whf35CQLA9ovl1yGeV/psjYIG+g85CgO2zi0LB+i0W4rOAM1HpvzYB4S6gvn2ri4mHugiECPR2KUHyU1kycNbmD4I+H2AZ1JpBUA9idJACKrsHVesgSeung6yZ3vDjklUfaOUghr6N9b2NdpXDGNqR6etIdZXDGNqV7etKd5UjIiIiIiIiPKgdh0uTRw/y/wPD8jUkAPwElC+soPATIOg/PRw3qq8kBI9MCILmzSWTf383dkQLuPFjwE2/C0RERERERERsGsnV8QSCuyAh677RNSH/H2jMSESgrWsQQK/3VdJ/ExZA9b1S+psWUG5vL18OAtq1N1Nfg0N19rUdA7IGpv74ilf6Xx0b6GsBVf6rq39fC7jy+ve9Czj0v7ZjQABa/6tjA0EL6AKld/MbETFy/B+Oi6Z9Ft2HTwAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMi0wMS0yMFQxMjo1Nzo1MSswMDowMKFdWTsAAAAldEVYdGRhdGU6bW9kaWZ5ADE5ODUtMTAtMjZUMDg6MTU6MDArMDA6MDAizFMHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAABJRU5ErkJggg==");
}
.ui-state-error .ui-icon,
.ui-state-error-text .ui-icon {
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAMAAADYSUr5AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABEVBMVEXMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAADMAAAWt1qrAAAAWnRSTlMAWEd8IjKY4b3Ld2acsomqpVpOeudAZYVTi0aRlGNhTaBobZtzv33AvOOt5enkgY5d393gudbb0sTV1Ndi2nD+Dc6Zafg4KhYcxXnRp8iT0Niv8M2QiLC7x6vji8qEAAAAAWJLR0QAiAUdSAAAAAd0SU1FB+YBFAw7Ig4a7P8AAA9rSURBVHja7V0LY9u2EQbJSKrpmJIbuUubOG69JnM2L8leXdd1bdSma+M6qbuk63r//4cM4AuHOzzEUqZoG59syUeAAO7jAbwDQFmIiIiIESCBZNtN2LL+MHIGejcvAb/+CWZAZR6WEGKBoGASQNtjpKvUBB8BYBWApwJyfvnnoCZBLZATkND2GOn0CjIC6Om8ApY5GZAB1n67Cp50zqAguf2l2zIn3kwbBbNg3kR6gbmFeK8wtwBPA4a3ADsprIk+AtjZwEzEUzoxweHHgDX4uNS7AO1Cw98Fto6b7ghFREREREREjBiX7glu2Q9KWLQG1HlP6Bk0uxHgJ6wC33wAmxCSpQ9KiaUBjACWgWY3w8WEVUAJ8ESXqvQhgyHWfnuLPcmWGZXEc7oITAFCScBg0wHcgoXNZo1obY35gMQszdejtm0BViSeFvefD+A9ZKtjQBjX/S4QEREREREREbE99HP8g65psPzegUfPAoAvp0KH3L3bx7cDsAYFSgP/Ea4eSQaexTwdXGn2CrwNsKT667eV4COIpbPCmAa8OiCJ4EhsGGXlkRPAlbhG/TxchhABfAII/BqET/dkMRWsc5M5KzM7LdDLnzWH14S8HUjYLIQwbjndb6LhGrqoF+zjlj1E4E8PlEguBwQvSKACENY63anbvgtc8vnh22RERERERETETUX/bak93YzEshvdXaTNDw0uVQWq79aAtSrwx/NsbdXSAJQu8OLUGl6dyuwOTsC6vM8byYp012+Jb6kCvrLBelERPwIvT/LWWja7J14CAnvDhdXMfAx4+Uss0z2B6QcjnG3C4eYAWzsnFsTCYUs0zh7ZEGs0wJ5qZZiUTs+32ID7dEYAawFvnplOu1iYAHsDnJdwrWQWMLsJsK6t8xV65wVgXYB0kWAXsPfyxJmDMezdHMDzWAxMmAUItkIfIIAMgiSVDUuhGRxav+Ua+ZPtrXAQuE7wHrAAnnnc8wHbfj4mIiIiIiJi1Ljcuzh3VMijspYzNutYhIuDbtk76g/8CI7+rGdg1tZaLyca08zgFNnKjn/hqzuA7RY3fcdqbdLzdHjA1bdkAKawMKJPLyFgL7MvAe7nu8skz/cD2OYzzPVq1l5fcNCcC67TN05AE266CEgs4TBvuiee4um21WkgqeDPDBukILG0kIW7gE0UvH3YUhqdEPHuWbESQLvExsM7PaipyQQWnZnP91vSiWDr9pgQxk+AkBDh/WHO6LDolDwxEoheQ5uAQvMP/vmja4jrrl9ERERExPVGesVvZBa3A3zLVdQb/jX6j2kpwLrMYnpfaXA1EFJSqFcUYlSLIWzrskDxilI1hRQFQ2Z8l0JlATq/sC6BMwLH0m2ARy90e73U34jODAKgIsGIZ6mI9U1gXARYlt85QSmRKQH4U1hiN3QsabvYWLrAGhbA8ps7NiqCHBZA9ys0dI9Gf6YjGwNIDusMTaqthI4Blg0yozF/3SZDwh+OIR/lT+0KgeUvhQG/K7MDA5yObheJ3gN9SEZIQF900T8iIiIi4mYhU35Ctn7+WxOJW0O1biobN5v6crwT8Nxgp3KVXCpmNDnz83FL5AC5uEUKQGfsSnFXOGSaKG7XICc0KsFeUUyRs1f+bRBSukVzvvu5ERe1hgtD37bFVGYrW7t1etPqSQ6TCeQTowGCBRN0r61VqA7MbTW2QVpRFGkFQsjMIAAxAMpEJ7rGHYMAWfS+ROtKQ2MBrvXuqjhd4AQm7757BzABy+XS/wSGwASIAAG7BoGgVEcHJCEJJqRqoEn4gYLLAmAK6ENVXI8BgBpotPigPP1AE/Due7u/MQi4e/cu2x7vlskBSoDS/31MgGlSIPU3bQw+SNULVXhXwWkB+0p1mO7reYCstP+WAFU+mmKritMFyi5w7x7uAkshL4F8b0/IytevJEDpf/v++24CEnJAHkmS/QSFMHB4eOgeA2BfMiD1xwSUPy0B5SCICHigzn7woDlwVA2CR0QddAIngD2iIQgBH+L5ifnitnwvXATQCuGjEqjC4+Nj0CbKLCDbn07lm+4Cpewm4LhCfSDJ4b08vwM5fkYIdSF54LflC+s7oQRMCAFgWMBc6+8hoC3u4xLE5CYtAdQCsv0SzSViMqgxdgpGn8zz9i6QN/XnTgvgBIS6AE6vxsCizdwSkJn1tcVVfgC8IxwgFhC6DVbtmZtzMJm+dQNXODDoLXD1/AAloGSgEJtDli1KdPD1GIem6xLODr2mlXY3qn9ERERExMjx8KE/PQXvvDaAbesjQabD3UflbepRI9bBdhtjz2t53p5buSa7a8tC/I60p/De12S0dUAOyds21j/LNAMz5UWe5FMU7Mgmz3daR85KRaaPP6pd8YYBebICWWkyPZtcuYJry9X1aDUolDOXtvf2VHE7x9f0McBjor9ylA61/so3b6NfujucOWYCfi9fe7hBmbzOGcpvrA3S2EL8QZyKP+L4NpdCbsjClA8mB0hW7V8sXA2E2tmv5cbgkMXJxi5S7TpWMxZtdMUJqGYHEAFPHjx9dv8BmjbKpH1nuD1eAv4Ef5avv2AFletPZBx8yNh4klPft5VrZz611/ewEdE4MIO9heSgEnaaGZsdFwH1KIAsYA/+Cg91g6T+aMoubAF/E5+Iv+sppWNiAcfEAo6JBSyM2EP2gGqQauNbUt+nlfRp28AymMexA6gxQOsXJuDJgw8/ki+7/rWnjglIoZx1auR/wGfy9U+0Y8Lo46V8h8govey/Eh85CGiiu9RoELEfgWGO8jCZikMjXiQEZIRhon+7I8IkAMmff3J3dvdfX9TyflPc7nrywrx6gnWBWsbi48daVrbfzndaCRAEao9QKtyTkkAmuR/VDdZ3AbXFSLi6hOrupDi/LIj+PIBPsf7i6Zdy+Jt/+bQlQPb/1HM+U3TOBlFzkpVN8hM/gE57E9n2DTA+eUH1p7dBUW3q0snlisDtoj0fWAkGcnEFUXQI8A0fKCIiIiJiC5jiiWnlysExy/Nc/3nJWwtV6AHeux/0aUEKK/m+wrfmE0Cu5vvw1Vdffw1foObsKf1LyD/u3IcnT+D+nSad7Ldophua+YZWpgfa4I36TTnMptMXBgP+LxcLYSHLylG0CZKBFfXGD7Xn9Y3Cv7UruprKAhYsuGnTjdiUPWRdB686j3QdMxns6MXBKkEHV8oxXsELy27ZX0mAcrXQGUr38tc0AE3At989f/7dt7o9UwHFAq/sUAKMLSNQTkahDQ+pqKYqUu1rZ2o+BhHwTK3V4QpXinUXATS85OqS9LJLIYtalbLWPzXzQ2nru+3pL2XSDLmrMCEbMszzy3VQlAFU4CnjOYEtYD7H+9XzszMVXmoCpP4CTYFRxmmwYBeJibftb2wA6V9dwWYM+Ax2JeBlm6EojPPhwE/AkfzzSP00ycrApnCILIBEr8+e7T87g5O2wBeqdbPNEUAt4PtSbmblav21gvmqxKF5uiYM0g8ODg4MAuorW30cSnwuf8iGh5VzDDg7Ux0AD4IvptPZBgdBMgZ8X48BNQNK/8IIR++o9h7q01d7cIIYUAUdoWGvmbxp9Pv44/qHGIhzDJhmZ2dncIYZoLfBTd8FHquJWd0eGrqt5nM9YSVHQPmTagbA+Gj+3G0O0NtgaRElHGMATBUwAbZr2IcAgrS89o8bP8CyR9AcYaW1vEjVSPm8ST1/kphf6yLKUaOWJpma0suaDRvd/YDt4+jVqyMkLvYUV+nzljHaYLZzMiIiIqIXpnh39Osf1BDzw+ttN2pAXABctMKPzaj747abNRjuKXXv1cLr6o6j3rUNLGGJT/iPxZkRm9t5tiz5X/YvaF1cqADqohbeaALetDmI22DzIwpNCVt6oAeoDEt1T196y79E3KsUvocqp64Ha09KDxTaKAIbN5X8dvLWXJ1l1Q1JgBwBVAh9YVRutmGOF8Yq/fXyYmHqb9u6u0gXWL+38u2tkWG5RQKK5noXbgIK0uUBTlOchvW3EZAaJlNuNJ8Y4bRBQAbL5XI4T1cr7CaAn4P0l7obg2JvCxh2ECwNoHpoptThlSbgFcpU+AvA6b3HgGGjNTroPdXiU5yJnEQYMPjpfRcQYsAhcKkVrlpw3ojnWEc6BmCp2Pzu860G6z+paVl4+dM22zCm2YqIiIiIiIhLRgE+8bIBM+LIrPWERB/s7FD9wSNePgFAKDAIKNNSnKGYperNyKBC5kaeV5nc4W1BfOeCJUO5QjYgASYFJgFVWtvm8vJI9WgGgwCczgmgwSKfDDA34w5CAN4MTAkopz/qRpYfM9zmOgMmYGbRKayxIW7y/wesRcCAFrAWAQNbwLBjAMXWx4CB7wJ8vmPLd4ERYLt+QERERETEzYb/ObLrjvS/An7+HO3dlF7KyQ36nlz1HCn8XKDnGfLipeUBisY3od9/0FUeHVbwP0mAQLuTFSszxgB9slTv1+8mjw0pnArxcyFO8dPWq0MZ0ZrP12pFJgcT+dNu34YDcz+7ksGUJ+o1Gal7m9X75k/0FcoXoHbb7zkIKL8aLdlvvl8PEkgSdaCR99VLf/+eSpdHkv2RElBagMQpvuJqXFgZu5MRAV9UaE28ozw6zMp74ALteZHB6BQOpw4Crt0gmAOcnpziYb+ajtAhKWz4P1yODfmFvD4XV/Kp+YiIiIiI3qDPB4Rkuomqq9y1vr5yCPT5gJBMt9F1lbvW11cOXn9o8XodmW6k7Cp3ra+vHAR9PuCNLqCRz5VveF7L1VbaMv1VKwOVhTP9jU5/46xfgDdd7egk6YK2X+DnHXwAXQG0clOIqFeDz8/x6nAoP09n+fUSuS0dr57ZP8Foj/jll1+E2R4hztZcXwP0TK9DVr33nDQYN4jlF0whf35CQLA9ovl1yGeV/psjYIG+g85CgO2zi0LB+i0W4rOAM1HpvzYB4S6gvn2ri4mHugiECPR2KUHyU1kycNbmD4I+H2AZ1JpBUA9idJACKrsHVesgSeung6yZ3vDjklUfaOUghr6N9b2NdpXDGNqR6etIdZXDGNqV7etKd5UjIiIiIiIiPKgdh0uTRw/y/wPD8jUkAPwElC+soPATIOg/PRw3qq8kBI9MCILmzSWTf383dkQLuPFjwE2/C0RERERERERsGsnV8QSCuyAh677RNSH/H2jMSESgrWsQQK/3VdJ/ExZA9b1S+psWUG5vL18OAtq1N1Nfg0N19rUdA7IGpv74ilf6Xx0b6GsBVf6rq39fC7jy+ve9Czj0v7ZjQABa/6tjA0EL6AKld/MbETFy/B+Oi6Z9Ft2HTwAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMi0wMS0yMFQxMjo1Nzo1MSswMDowMKFdWTsAAAAldEVYdGRhdGU6bW9kaWZ5ADE5ODUtMTAtMjZUMDg6MTU6MDArMDA6MDAizFMHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAABJRU5ErkJggg==");
}
.ui-button .ui-icon {
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAQAAABFnnJAAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QAd2Tsx60AAAAHdElNRQfmARQMOyIOGuz/AAAaqklEQVR42u2de5BlRX3HPwdIKGNYiDGwwrJbUolgopidgUr5SJWURe4kVZuoxZK7Y0WNkh2iUdEyOyOZ4Q9mxbljgixIapcCY1E1j+wSNVAV7oiIhXFLxdn1GfISHCTu6h8xrn+kiCUnf5xX9zn9OufcO/fOPf2dunPPPb/uPt39+/Xj9O/Xvw6m8Wgyzhp0BjwGCy8ADYcXABltQtqDzsRmwguAiDYrwEqTRKDXAjD49tMmrBxzBdiHTgSSlAdfxh5CFgBzBximfybY2o8+fhg/va0NY3t2wsRqJYjYvxqLgCnlEeojRAHoRQe4r0YKSdykHZZHnbgQELAKrBIQGFKuU8ahQ5CuAyRFTNqBDiEUqkdElE5QKX7SynTPtz07rJl315RtZdxCyHoAcwfoClMbtA8f0dNNLDSnUq9tmoYgMeV6/cyQISi9EmhuRaY2mFVq1bZjT8HcNs15N/eBWcq2fmZL4ZzSMWzM01dN/S7TnsIqpv4rcIirGwLFlEeG/VV6gNFGm5VRYq8dXgAaDr8S2HB4AWg4vAA0HF4AGg4vAA2HF4CGwwtAw+HtAfJxB53/TUYZewA3iwCbMqZttAcwP8HOnjr2AHZ1eJT3kRKScvYAbhowcxXqGbRPc+2ato39ttRXct/61EfGGqBoDxBBvxqehDLp2/R0W2wXewBT7sxPt8c3I4zTTr5HArI9gOpaxqpTL6AOY2+fLvYApvbnlje9+IRWa4MyT9oSqKIMarNibGPDbA9gEi5b/5OUPBwlfWGvtYGDrxyTeLrEHXT+NxleHdxw+IWghsMLQMPhBaDh8ALQcHgBaDi8ADQcXgAajvIbQ0Yd4QBX+euvlZbO/zn1ovelEgaZg9Cag+qqIHvMAZRcHgJCMOr6XfwDhBUoZVH1Gbb8R6wPjKnYhaNqbLcSuIQqEfcsKYCt+IFDAfTxA4cKcilCaFD2uOQvMNDk73LPSCj2GjCX0CxAoSU22BqxlH9xCHAtvs5ax15JQQ86+NCoibSNonVyEKaxAyVVfLrqKUnz0uchNNDNaWelMzcDMZcBlJ0Ehg6txxbKRTqrtXE35gYOqZsY5JJu1RowNUGXtO11UKCXeQ3MujiXUGqauQu0S7A5DVsX69ZF21qQ7ekuk8iqsIu4nS7loEwP4NZ11pvlBo69TL/yGBg7WLd0A4cwVWEeps0DoDLuOZpAg8Ogc7CVn18hrl8JbDi8ADQcXgAaDi8ADYcXgIbDC0DD4QWg4ZA3hybOUgcHuz/wfsKlBlw0otXi2fZGuz6lFDIBSDZGubh7r1YBvUO1tGw5d6sBk6vZTBvXLh070lMmf/oytCvXQJjLJaDeHGrewumi0W4r7vVOBHRpubmG0OffrQZ0z2jntte2S8XOSmDrgeptTS9s0JW3hrm4U7dtwdZtEHWzpLHnQJeO3YW7PeduDunVGoMia4Mc3baxvG30RRxKKZsVxjqFdVAMU1YA3CsgKBHXLQfmKnR5vn1vv/75ttg2AbDXgZmBdgFoW5xZKwWg3FtAVgFVVBaBkIY69VD6Nj2/CrJ8V51DmJ6+L6YmI7jag4Dp+UlM9RzAlnLmu8G0vzmfy5L2AKYKkCcwpuKbM2cqoikNsWh2sy8VC+wCaCrBas6BRL+c5pvYu5oee+OWS8oOAW7mVKHVRYR5FKwT26161eVwG4Prm7SZ0ql+qI19DqCE9w8gwiyAIwkvAA2HXwpuOLwANBxeABoOLwANhxeAhsMLQK8xSHV2BeTtAWww6atcit6uqe/uN+rnLrAsdg9Z2Yv2ACaYNOYuq4SJxm6fwwZTPepurjJvDw+s21/tDNbFN6U+IGQLQWK27N5+i4uN4tbIaqd/uy40g0ljZ4sdaMOJd3XaTtPm0dCJ6l7STYF6DqAzOjDrq7KhoYrRQtRy7GZTeh8GIa66vqDEXdVzVc+372weSmQCICsKyx8gHx2wnrCvfPyATJdXbQN1FqauC4pqz3ULUcfHRx+QCYCoKKwiw7aTBOzK1rqjYyD0IOoeQv5WhehNK1Y9Qe49hqafEIeA1TRTqg486uAjcy81Vo32AC7afrt7CDMyWwC1SYW56rNBSO9dJAkZlKSKIaoa1PQFam2gbhoDLspS3SSwF8pWN6vFqhNNl0kkhhxswcNkvDpYxtB0zZsFvxIoo2Hs9wLQeHgBaDi8ADQcXgAaDi8ADcfwCUBrWBZJm4G8ALjpsk0qm9CJqgvRorspr2KD9oMwNCjnLt5NFTNRIz9dEiFpGcNVdVmfYYROAK8DWQDMq9Tm1e6kVbfoKkUgTBdK1Xv3oq5/Ig3R1cRPrqo5VRd7n/IayxFEJgCyu/ciMn24zmV6QBCzf035LHPXHnX9a0wY9s4mT1c/X7YoyKfi5j6icUh8BWdVZvZ4bdNkJeyvPo6vOblyVu/+1ztVT4zZMvoIHQFfB4kAJFVrMpkC8dAENeofiaLrP+Sn5/MgH4RQzOGK9OyAhm0B1SPzFi5Wmd7BiP3UC9djJXT0SATCwjwiUQSrvfLL+emVW/kGoMxbQFbFOps825FMJvpESu0CQaEfCISnqwYisz2R7D7CI4V8XoDtwBGT2WXdkyzW0rRdXiMDx3sJVvGzfiXyC0Gmzltug/1pR+Y5QB2s+pavwrCdHOqZtMkYPl2Ax6bCC0DD4QWg4fAC0HCMkgDMpisNs31J/zLG4r/LBl3U3iESgMNxxW1wuHJKj1o0/TaEPCFZC5Rl4izz6fW8MvZsLfG4jKe4lnXWuZanlCIwa839/pi6X/MMPd0WE+7N/ZmfkHIp2hgS8hBPAuczJQTOXskOp/ePcKMm6WyR6Bh7DTuLiqlHWOJJgYWwzFukyp3PhZ/jYAm6nENV7vZzRPo9xT3S7zGuZYFxYJ0ZHuGEtgbUz3BxJq0/+dN2KHYUIqt5WxnTJb9EABYB+LwUfE1IvCggz7BLU73HQCkCIePp9bqiiF/jKuG3LACRJmAypeW3iIXMSSIwx7zWg4Fu49u49DufwzHWGWcH8Ao+zLhGAE4B8JKKO4xCkiXtwJkihjALQF7EA8gWghLWd/MBYjwJnOTHfNqQ/bH4e682xDZD7GWelAQgjyNCoUKOSH0VwEFIRWCOg7keIatAfUVu47H0+hplHnZwEQEvNOTyLww0cw9oVscHilTKiVjC/r/mg+LtbCWwa0ngJD8uhJGz8OJYlxcq7Hki/Koh/Um+Znz+42TK6iM8XhCATASKnX+EVu67mLvrjDmd4R+5E3gvM8r4p4Gnhesi5phPP5uLhP338QJZBFyXglXsz+NFAJzF89oQFwBoJii2HiARATjC49owAWgneVfnvvPYxifiq3coqJfQARaAGTrsKQwBeU1q1W2mdi8JthCf5O2FexH7j/EC4N0A8aBfQhdQZH++gBdY0/il9Gq8QLP1AHBZzPjHuYynFPRZnuIw8Dizmj7AjF/mvelVHm128SD7mQHOJmSGFxoMSuY4qGTSLuGjwxg22EK8TSEAUxwB9nIsnkctEm8Lr64MKsr3C61x7oy/xxU0Ww8QMT0SAdVr2KxEV/UCO3LfqiqCGaJ2Lg8xu1gA4b1gQTMMRJiv0cWv1wyhtum4B2IRAIH9JgGYE66LnU6R/Z/nr6VfRZi7RHMPMKd4zStDh2SIyr7zVXQPEPILzBdeASORyN/p5Epnm+TBDcKniOX0LQeWK4bQIxEBif3D5CBiFni58PvJSt14XYSgYH8vU48wGLX3fo7I7B8mAfAYCEZJF+BRAV4AGg4vAA2HF4CGwwvAaOExQZ/hBFkAWg4bs/VwOXnTDbNKjfqcoMsuvuUfJpT+8pYNR3P0o4rnitry/X2gA3zBUj+d3PpCGbw+/jNjiSWWkh/ia2CLLnPAvMI2f4M3xStQj/IIL2VKqc59mr3AMV7KVTllLbi/+ya6fTn8HLfGd6PUblHo+46lv/YW4rvq46MVvoW+0JMwAbAkqbsBOhxggi4wQTf/vk6LLnCM6znKXlDun/g+O4BnudRQu0vxYtIyn+c+UQAi9kfatKIIhOzL7awpe3p4tJ/wU7yZT/FmHmKPpoJmOchhpgo6PXHrp+oJLse3/xeX8EMu4ll2aHwczNAhJGCaBS0dMNC/whm28TtKelL9y8BkyRpMqMdSdbtIP1pQwh/jesXzDzPFMvfTTewtRHVwspw6z1wlRy3ili615vBWvscGJznFOj9Qhphlnh3cyLN9WAd8mov5LhfyXS7he9pQ0Vr6jJGOrFOXcIYTWnVN0vomldQJqdZ0G+TU1ha/5nAH4PeB83grAC3WMgF4QlpNn2eOJ7RqUx3WsDlzvoWH2MNn+T2+wOsVxmWzzHOEqb6wH17Kv/Cb/Ae/wTd5u0Kl8h4gMZZSLZAmdMBA38aYxvBlSWJ8fi2/w4E0/WiL7CLuy7TX8M+8Vvj9JYVJyzuBncAeBHurRACuJjGmiL4P9oUFt/I9/psvc4ovs1GgJuyfMz47NOjDJ1L3NKoe6Du8nG/z63yb38omQSna3Emi759WKH8y+tn83EDP5gAysrE3whdL1t1Erkz5HuJ1Uq28Tvv8XAMVJ4FJ61XbpI2znxt5Z2zOUZTOUIpbHGGLZptBgW5iv3xeUTGPIZkArCnp7+RDzHA7H+Aj/C0fk+iTBZGQVUJ16Rn781O/DK3cELBmoOuozxKpu/P0JSbjsT9ny+kuAG5e+lskQ0HZOUTEYH3rT94CEqjeAiZSFzVqAZFRfE/5IH9jzF0dekBoZL99Gp2JgOoN4HZu4gGuB45yHXfwAYm6xCQP8VMm83HzTqKyd/myOEZISJcuYWwZrC+iLnVT5z/PLcKvWwr9yRRRx9+NyzCloJt+wz4t++rTl63sj4y0oo59gtRkS8IaE6DZQP8zPhHP+6/nE/xMEWIPkyzn47qqg6drLE94lEEHSkz+3BENUQUR9PYADYfXBTQcXgAaDi8ADYcXgIajeQIQqY1V7zSdVJX7Hod0zlPeHbrj4W0QBWA6rYDqrwbV/QPURYsw3a51QmvV8Ln4/f9AQQQ+ygHu4R7exbu4k5sKMaPaeTD+dR5wXvwX4WY+Tsit3ErIx7m5EN/sviJvzZC3ZyjSbSGKnh5keozsNXCaBZ7hYeDtnJuqPYuJ2E7Zhn5ZvS8xyQwdpllQLKpETz7JGCfYrclFsiB7A/dSXCl8dXp9hu8o1kJP8lWmmKETpyMvh9vV4cnqfVepSDavvarcZ3ZzIYLUUGZe4fIzZEKIkaqzM3XwQrxKfIJzea6w72UYMAkscCWTwGRBAE6yG9idsv+kIoWL4m/19tSn+EV+ApzP/ynpX+VGpnhRqtMv309eHa9fhqhWPWeZT3cVqprQGg8KVhTFHi4SwSuF6yL+hJ8D8P3khjgEPAycYDcn+WTporkfKWOKreykUkR6tknhWsRYzPKE/UWdfIs3GPPwv/wEgJ/wRgX1OFOEQDtmf3FZd1z4U2Necx3lfx6YZ4xxxpUWBS32AIeJFLtFmN19B3SZYQe7uJRLM5sheW9gxP4xpaegMHdVTdljyqINnbj1w7KyfxoTWr+K/V3J5iG/1v4dzgiOcI4X4r+WDnCAneh0ets4U7pMGS5Jvx8E/lAR4i+BSIcxRaT3kxGSiVWx+cwCPwB+ztns4DYejW5nc4CQ5zg3rroNdlYw+cIYws3gyfQEUUuvmqN8I+7+oGgXJ7NfxcBp/lj4dTf3GZ6uErDINUY0eJxRusCZkEbt/Bh/g3Q/5L7CHEBUFp/kQ6XnADdDbIWxlNVuNgTMcC7P8VUOs8FORRebOYhWu4q2OZMOcn9mquoJCzHzsmsRCfujgWBHNsoBmcHbIhMEyvbb4QF2x39F9sMCJ3kIeJRoplHEGp/lC5zHuUpzrDmLg40LuIB7uYBfif+bsVtxL5kDXIm6Qe3ibHaxi13AzUmIbAiI/F9EneDMEE4Bo83RM3T4JguKzdER+59lLLaNzXsBiNhvmrjdxnX8J3Cxgv0AjzBNyDofpctureXfQ5rUDwpOI/YX9h8fiTfXZ/+P5ELsyG0qL3o5EC2l1FZTCs8IZbWBg3wNNKNFN+34v8+OnNZcPe9W516d/2h+8Rx/xFpsmLGNn+birvLvPMmqtpZCgnS/wJGCF7I/YD42yZvjn3J9zGGF/YLssi8foujQT+m/wKuDRezhr4APa1rxEudxdyxWLY7zmoKIiVAJgGgWZxfHTYEXgIajeboADwleABoOLwANR14ADmv9hd/F19NF2q9z16Az7tEbyEvB/8rlwOu5ohDu09L6+Kt4FTt406Az71EfYg9wiMsBuJxDuVB3pezPVujeqOwFThHGHrNV+J+4B7EvMw3jQtQpQVF1qn5ywwFRAFrABBMUVY2vUcZV3d0ef9Q4P/4+YMlVR2GwAUtx5S9p49lC2Oghp1JzjSKLX6K53tLIBCBq/2usUewDskVPUU1r92qbR0DgcC5otE82LwLZ5sZJDQNtIZaY5BDjHNKmANuZj4VEL8YjhUwAWvH/lvCrCNuJocdAsy0seUoXeEZB6aTfUf+QX7ef1FzLd5eZiN0vqOiHuIkT3MQhTQqgc/Q+skgEoBOP/91YZ3V5xVH4aTKf+Sp0gR8p/Ocknb6O/a64nzXuN1Dl7wwuJiyzwGlOcxr6dCzVAJAsBYtqkKJKRPZxW8fjbbSHN7+5MWO7nv12V8whsMz9vJVJZYiQQ7Gx5x28T5vC6bTzz4c4JQwLp0dlFhD1AFlrbwmdf3b3K8q4qrsdyxw/UBwMD9OxfY6p9S9rruW7k3RTLzxF+vu4gzHu4H0GX9vbnSgjM0NIDo3SUOPv23m/gvqx3B70LCV9z6BXJ9s7f7uTBVsIGz3kNHfHWrpTmjZe9SSQIUUkAKeUEi12cyu0c9RV9inidDhgHL9N9gS2uMOBkRQAFyzwu+mb/3G+aDwxY5TRWAHwGEl4bWDD4QWg4fAC0HB4AWg4vAA0HF4A8uhYvPlvMQcQNogCELJhUQH17kiIQeEJnjDSO0ZbhY7VkmHLQe4BdnLAKgRqZMLT0qbQYSPWNHTYKIiQLH5HFfSjUkoqEdRvLU/iXcVVhvK5s9/FqmlLIO8rOMIzrCqXZPXehEMpXkh+TT+qvADo0GZn9GxDCkfZW6BHRyDo4ssl0J/WoaPKzqjt1BFZEVQLAKhPnLAJABD7GZGVQtmvjZh5WFLQCYA+vpxGL1isp4aK7ddbFOpJ4DMsKg8cseEZFlP2LwoVFLAY393FotIeKJ+CDrb4m4ORYH2EogBELCivIkjitdhgsXDmxjQBi2zQYlrLRLcnT1cWApPvgYi6aIwrUkND2C0FeQjQjf1ZCP2JAsMPcycfIZurlKduSYgbQ+wFC5xDDiNccj2NyWjdTN2S8OrghsOvBDYcXgAaDi8ADYcXgIbDC0DDkRcA095bjxGEuDn0MwBcyDs0W0MjPdvntBtHPbYgEgFo0U3dj15OV8nkGRY5zhvoOiwU5xWyR3OewI9uMt1Dg2Qh6AS7+TKvJuRzXEuodIccocU97LQ6ky26Ks7/lh0l9pvuoUEkAC26/IiLgEc4wTQ/5ELFHt4QOMnd3McGOzUHmEbhVL6qx2N36ts4w7aCP+2Qa3iMawSH62r6Y6kvfhV9nPX4g8Jft4cCkS7gauBbAFwLwLd4A1cXGDzDlUxyL7CfLu/WCoAaVwAXA7CdsxR7ESPnMts5C3he8XZycfy5Anhekf524GUx/WX+7cYVkQA8AbxSuPvK+J6MDnA/XW5hFyfZo0xPbyZxofTrY7Fn+wzbeb8gFkX6hbw//pjiR2G2K+geSiRzgA12ppuml5jMnzIPJErgw0xxA1czpfWHrRoCjrJX+p23N+o33UODRACi8zB+xLd4JReiPjEgswZYBA4oz7kKR8tgavQhHhv3p7GfoH/j70bF5tXDBm8P0HD42XLD4QWg4fAC0HB4AWg4MgGwnQdQl77Al1L6lxTn/vWb3u/yDZpeEclbwKcL5+V+RjoPoC7d5mau3/R+l2/Q9Mo4+3UAd/HWAuUKXszD8XVd+u38WYH+Cs5PtQn9pve7fIOm10A0BGSe/8VtU69RXInI01fTo2VXtfEDQ3xb+vkU+hHfVn5b/s3xT0sb03TxTXQxF+pSl0TeVazaGbTNlWy2+3cF2Id6d3Dd9F3i29NXucN2jR+g3mAWlvgdCqkU6ZGr/b3a+kvufojb6MkOLdXWsHwx83Q09DAed4vjcT6dUHPfnL69wEkPZIsdaEXOJXVd/lzSDzF7FrjOmIObuU1gf09wTv0kBDwv/C+P0NojmNEbBusbgD3/9rg2NdkDBtrNfISP0FP2934IWALeQvUhoH4Xr89fMYVqXbgpfVP+iucvlKNHIiCyvwdDQDQJtJ0H4EZfASaZjK9EungSdqi4e0Kg2ugY6Sjpcv7Dwt2vSBQbvWr9JOULK9Nvk9ivfmpJRAJwXMpAguOKKxF5ejutwLY2fmiIb0s/n0I/4tvKb8u/KX7eeVVZOiB1/upSl0S0DrDGFbwiR1kVTvapS3+Y3y4cRvkZ3rZp9H6Xb9D0GogEAP6BF3AWl8Z3j7PMn0vh6tL/nhdzbmrz9w0eENizGfR+l2/Q9MrwBiENh9cGNhxeABoOLwANhxeAhsMLQMPhBaDhEJVBttN5h53uUQGyNnA8vVpXhq5L9xg6FIeAeqxbt6ZQr+UGtVPwkJAXABsD11k30hP3DDrYGKjz5Z0grKjr99AgLwDjYGTgOONGeuShQ48Qs8GE6cAXsBtUeJREcQgYr5CKHNucQr32axMgj5LQHxkzfLN8/xbQB5Q5L2DY6R4V4BeCGg4vAA2HF4CGwwtAw+EFoOHwAtBwbF0BaPsFoV5AFoD662whs4TM9j3fbVYkBxAeFSELwL74M2jYWnfE/tVBZ3MUIAvACsm+vkHC1ro9+3sI1x4gpF34lENY+FMjYq9eDBP2+zlATyBbBK2wyoqybQXAau5TDm7u2xP27zPSV/0coFeQBcDUA+xLWZN8ygnBfOFO8UiXtpC+KnWZ/X4Q6AGGqQcQ2R9o6Z79PYVrD1Af9iOcyrG/rQnnUQrD9BYQsBp/ilCx388BegB5e3ibVdpD2bmGcaef//aoCe8foOHYuroAj57g/wHmpJtAXtQQ0AAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMi0wMS0yMFQxMjo1Nzo1MSswMDowMKFdWTsAAAAldEVYdGRhdGU6bW9kaWZ5ADE5ODUtMTAtMjZUMDg6MTU6MDArMDA6MDAizFMHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAABJRU5ErkJggg==");
}

/* positioning */
/* Three classes needed to override `.ui-button:hover .ui-icon` */
.ui-icon-blank.ui-icon-blank.ui-icon-blank {
	background-image: none;
}
.ui-icon-caret-1-n { background-position: 0 0; }
.ui-icon-caret-1-ne { background-position: -16px 0; }
.ui-icon-caret-1-e { background-position: -32px 0; }
.ui-icon-caret-1-se { background-position: -48px 0; }
.ui-icon-caret-1-s { background-position: -65px 0; }
.ui-icon-caret-1-sw { background-position: -80px 0; }
.ui-icon-caret-1-w { background-position: -96px 0; }
.ui-icon-caret-1-nw { background-position: -112px 0; }
.ui-icon-caret-2-n-s { background-position: -128px 0; }
.ui-icon-caret-2-e-w { background-position: -144px 0; }
.ui-icon-triangle-1-n { background-position: 0 -16px; }
.ui-icon-triangle-1-ne { background-position: -16px -16px; }
.ui-icon-triangle-1-e { background-position: -32px -16px; }
.ui-icon-triangle-1-se { background-position: -48px -16px; }
.ui-icon-triangle-1-s { background-position: -65px -16px; }
.ui-icon-triangle-1-sw { background-position: -80px -16px; }
.ui-icon-triangle-1-w { background-position: -96px -16px; }
.ui-icon-triangle-1-nw { background-position: -112px -16px; }
.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
.ui-icon-arrow-1-n { background-position: 0 -32px; }
.ui-icon-arrow-1-ne { background-position: -16px -32px; }
.ui-icon-arrow-1-e { background-position: -32px -32px; }
.ui-icon-arrow-1-se { background-position: -48px -32px; }
.ui-icon-arrow-1-s { background-position: -65px -32px; }
.ui-icon-arrow-1-sw { background-position: -80px -32px; }
.ui-icon-arrow-1-w { background-position: -96px -32px; }
.ui-icon-arrow-1-nw { background-position: -112px -32px; }
.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
.ui-icon-arrow-4 { background-position: 0 -80px; }
.ui-icon-arrow-4-diag { background-position: -16px -80px; }
.ui-icon-extlink { background-position: -32px -80px; }
.ui-icon-newwin { background-position: -48px -80px; }
.ui-icon-refresh { background-position: -64px -80px; }
.ui-icon-shuffle { background-position: -80px -80px; }
.ui-icon-transfer-e-w { background-position: -96px -80px; }
.ui-icon-transferthick-e-w { background-position: -112px -80px; }
.ui-icon-folder-collapsed { background-position: 0 -96px; }
.ui-icon-folder-open { background-position: -16px -96px; }
.ui-icon-document { background-position: -32px -96px; }
.ui-icon-document-b { background-position: -48px -96px; }
.ui-icon-note { background-position: -64px -96px; }
.ui-icon-mail-closed { background-position: -80px -96px; }
.ui-icon-mail-open { background-position: -96px -96px; }
.ui-icon-suitcase { background-position: -112px -96px; }
.ui-icon-comment { background-position: -128px -96px; }
.ui-icon-person { background-position: -144px -96px; }
.ui-icon-print { background-position: -160px -96px; }
.ui-icon-trash { background-position: -176px -96px; }
.ui-icon-locked { background-position: -192px -96px; }
.ui-icon-unlocked { background-position: -208px -96px; }
.ui-icon-bookmark { background-position: -224px -96px; }
.ui-icon-tag { background-position: -240px -96px; }
.ui-icon-home { background-position: 0 -112px; }
.ui-icon-flag { background-position: -16px -112px; }
.ui-icon-calendar { background-position: -32px -112px; }
.ui-icon-cart { background-position: -48px -112px; }
.ui-icon-pencil { background-position: -64px -112px; }
.ui-icon-clock { background-position: -80px -112px; }
.ui-icon-disk { background-position: -96px -112px; }
.ui-icon-calculator { background-position: -112px -112px; }
.ui-icon-zoomin { background-position: -128px -112px; }
.ui-icon-zoomout { background-position: -144px -112px; }
.ui-icon-search { background-position: -160px -112px; }
.ui-icon-wrench { background-position: -176px -112px; }
.ui-icon-gear { background-position: -192px -112px; }
.ui-icon-heart { background-position: -208px -112px; }
.ui-icon-star { background-position: -224px -112px; }
.ui-icon-link { background-position: -240px -112px; }
.ui-icon-cancel { background-position: 0 -128px; }
.ui-icon-plus { background-position: -16px -128px; }
.ui-icon-plusthick { background-position: -32px -128px; }
.ui-icon-minus { background-position: -48px -128px; }
.ui-icon-minusthick { background-position: -64px -128px; }
.ui-icon-close { background-position: -80px -128px; }
.ui-icon-closethick { background-position: -96px -128px; }
.ui-icon-key { background-position: -112px -128px; }
.ui-icon-lightbulb { background-position: -128px -128px; }
.ui-icon-scissors { background-position: -144px -128px; }
.ui-icon-clipboard { background-position: -160px -128px; }
.ui-icon-copy { background-position: -176px -128px; }
.ui-icon-contact { background-position: -192px -128px; }
.ui-icon-image { background-position: -208px -128px; }
.ui-icon-video { background-position: -224px -128px; }
.ui-icon-script { background-position: -240px -128px; }
.ui-icon-alert { background-position: 0 -144px; }
.ui-icon-info { background-position: -16px -144px; }
.ui-icon-notice { background-position: -32px -144px; }
.ui-icon-help { background-position: -48px -144px; }
.ui-icon-check { background-position: -64px -144px; }
.ui-icon-bullet { background-position: -80px -144px; }
.ui-icon-radio-on { background-position: -96px -144px; }
.ui-icon-radio-off { background-position: -112px -144px; }
.ui-icon-pin-w { background-position: -128px -144px; }
.ui-icon-pin-s { background-position: -144px -144px; }
.ui-icon-play { background-position: 0 -160px; }
.ui-icon-pause { background-position: -16px -160px; }
.ui-icon-seek-next { background-position: -32px -160px; }
.ui-icon-seek-prev { background-position: -48px -160px; }
.ui-icon-seek-end { background-position: -64px -160px; }
.ui-icon-seek-start { background-position: -80px -160px; }
/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
.ui-icon-seek-first { background-position: -80px -160px; }
.ui-icon-stop { background-position: -96px -160px; }
.ui-icon-eject { background-position: -112px -160px; }
.ui-icon-volume-off { background-position: -128px -160px; }
.ui-icon-volume-on { background-position: -144px -160px; }
.ui-icon-power { background-position: 0 -176px; }
.ui-icon-signal-diag { background-position: -16px -176px; }
.ui-icon-signal { background-position: -32px -176px; }
.ui-icon-battery-0 { background-position: -48px -176px; }
.ui-icon-battery-1 { background-position: -64px -176px; }
.ui-icon-battery-2 { background-position: -80px -176px; }
.ui-icon-battery-3 { background-position: -96px -176px; }
.ui-icon-circle-plus { background-position: 0 -192px; }
.ui-icon-circle-minus { background-position: -16px -192px; }
.ui-icon-circle-close { background-position: -32px -192px; }
.ui-icon-circle-triangle-e { background-position: -48px -192px; }
.ui-icon-circle-triangle-s { background-position: -64px -192px; }
.ui-icon-circle-triangle-w { background-position: -80px -192px; }
.ui-icon-circle-triangle-n { background-position: -96px -192px; }
.ui-icon-circle-arrow-e { background-position: -112px -192px; }
.ui-icon-circle-arrow-s { background-position: -128px -192px; }
.ui-icon-circle-arrow-w { background-position: -144px -192px; }
.ui-icon-circle-arrow-n { background-position: -160px -192px; }
.ui-icon-circle-zoomin { background-position: -176px -192px; }
.ui-icon-circle-zoomout { background-position: -192px -192px; }
.ui-icon-circle-check { background-position: -208px -192px; }
.ui-icon-circlesmall-plus { background-position: 0 -208px; }
.ui-icon-circlesmall-minus { background-position: -16px -208px; }
.ui-icon-circlesmall-close { background-position: -32px -208px; }
.ui-icon-squaresmall-plus { background-position: -48px -208px; }
.ui-icon-squaresmall-minus { background-position: -64px -208px; }
.ui-icon-squaresmall-close { background-position: -80px -208px; }
.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
.ui-icon-grip-diagonal-se { background-position: -80px -224px; }


/* Misc visuals
----------------------------------*/

/* Corner radius */
.ui-corner-all,
.ui-corner-top,
.ui-corner-left,
.ui-corner-tl {
	border-top-left-radius: 3px;
}
.ui-corner-all,
.ui-corner-top,
.ui-corner-right,
.ui-corner-tr {
	border-top-right-radius: 3px;
}
.ui-corner-all,
.ui-corner-bottom,
.ui-corner-left,
.ui-corner-bl {
	border-bottom-left-radius: 3px;
}
.ui-corner-all,
.ui-corner-bottom,
.ui-corner-right,
.ui-corner-br {
	border-bottom-right-radius: 3px;
}

/* Overlays */
.ui-widget-overlay {
	background: #aaaaaa;
	opacity: .3;
	-ms-filter: Alpha(Opacity=30); /* support: IE8 */
}
.ui-widget-shadow {
	-webkit-box-shadow: 0px 0px 5px #666666;
	box-shadow: 0px 0px 5px #666666;
}
assets/css/jstree.css000064400000062612151526424650010665 0ustar00.jstree-node,.jstree-children,.jstree-container-ul{display:block;margin:0;padding:0;list-style-type:none;list-style-image:none}.jstree-node{white-space:nowrap}.jstree-anchor{display:inline-block;color:#000;white-space:nowrap;padding:0 4px 0 1px;margin:0;vertical-align:top}.jstree-anchor:focus{outline:0}.jstree-anchor,.jstree-anchor:link,.jstree-anchor:visited,.jstree-anchor:hover,.jstree-anchor:active{text-decoration:none;color:inherit}.jstree-icon{display:inline-block;text-decoration:none;margin:0;padding:0;vertical-align:top;text-align:center}.jstree-icon:empty{display:inline-block;text-decoration:none;margin:0;padding:0;vertical-align:top;text-align:center}.jstree-ocl{cursor:pointer}.jstree-leaf>.jstree-ocl{cursor:default}.jstree .jstree-open>.jstree-children{display:block}.jstree .jstree-closed>.jstree-children,.jstree .jstree-leaf>.jstree-children{display:none}.jstree-anchor>.jstree-themeicon{margin-right:2px}.jstree-no-icons .jstree-themeicon,.jstree-anchor>.jstree-themeicon-hidden{display:none}.jstree-hidden{display:none}.jstree-rtl .jstree-anchor{padding:0 1px 0 4px}.jstree-rtl .jstree-anchor>.jstree-themeicon{margin-left:2px;margin-right:0}.jstree-rtl .jstree-node{margin-left:0}.jstree-rtl .jstree-container-ul>.jstree-node{margin-right:0}.jstree-wholerow-ul{position:relative;display:inline-block;min-width:100%}.jstree-wholerow-ul .jstree-leaf>.jstree-ocl{cursor:pointer}.jstree-wholerow-ul .jstree-anchor,.jstree-wholerow-ul .jstree-icon{position:relative}.jstree-wholerow-ul .jstree-wholerow{width:100%;cursor:pointer;position:absolute;left:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.vakata-context{display:none}.vakata-context,.vakata-context ul{margin:0;padding:2px;position:absolute;background:#f5f5f5;border:1px solid #979797;box-shadow:2px 2px 2px #999}.vakata-context ul{list-style:none;left:100%;margin-top:-2.7em;margin-left:-4px}.vakata-context .vakata-context-right ul{left:auto;right:100%;margin-left:auto;margin-right:-4px}.vakata-context li{list-style:none;display:inline}.vakata-context li>a{display:block;padding:0 2em;text-decoration:none;width:auto;color:#000;white-space:nowrap;line-height:2.4em;text-shadow:1px 1px 0 #fff;border-radius:1px}.vakata-context li>a:hover{position:relative;background-color:#e8eff7;box-shadow:0 0 2px #0a6aa1}.vakata-context li>a.vakata-context-parent{background-image:url(data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAIORI4JlrqN1oMSnmmZDQUAOw==);background-position:right center;background-repeat:no-repeat}.vakata-context li>a:focus{outline:0}.vakata-context .vakata-context-hover>a{position:relative;background-color:#e8eff7;box-shadow:0 0 2px #0a6aa1}.vakata-context .vakata-context-separator>a,.vakata-context .vakata-context-separator>a:hover{background:#fff;border:0;border-top:1px solid #e2e3e3;height:1px;min-height:1px;max-height:1px;padding:0;margin:0 0 0 2.4em;border-left:1px solid #e0e0e0;text-shadow:0 0 0 transparent;box-shadow:0 0 0 transparent;border-radius:0}.vakata-context .vakata-contextmenu-disabled a,.vakata-context .vakata-contextmenu-disabled a:hover{color:silver;background-color:transparent;border:0;box-shadow:0 0 0}.vakata-context li>a>i{text-decoration:none;display:inline-block;width:2.4em;height:2.4em;background:0 0;margin:0 0 0 -2em;vertical-align:top;text-align:center;line-height:2.4em}.vakata-context li>a>i:empty{width:2.4em;line-height:2.4em}.vakata-context li>a .vakata-contextmenu-sep{display:inline-block;width:1px;height:2.4em;background:#fff;margin:0 .5em 0 0;border-left:1px solid #e2e3e3}.vakata-context .vakata-contextmenu-shortcut{font-size:.8em;color:silver;opacity:.5;display:none}.vakata-context-rtl ul{left:auto;right:100%;margin-left:auto;margin-right:-4px}.vakata-context-rtl li>a.vakata-context-parent{background-image:url(data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAINjI+AC7rWHIsPtmoxLAA7);background-position:left center;background-repeat:no-repeat}.vakata-context-rtl .vakata-context-separator>a{margin:0 2.4em 0 0;border-left:0;border-right:1px solid #e2e3e3}.vakata-context-rtl .vakata-context-left ul{right:auto;left:100%;margin-left:-4px;margin-right:auto}.vakata-context-rtl li>a>i{margin:0 -2em 0 0}.vakata-context-rtl li>a .vakata-contextmenu-sep{margin:0 0 0 .5em;border-left-color:#fff;background:#e2e3e3}#jstree-marker{position:absolute;top:0;left:0;margin:-5px 0 0 0;padding:0;border-right:0;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid;width:0;height:0;font-size:0;line-height:0}#jstree-dnd{line-height:16px;margin:0;padding:4px}#jstree-dnd .jstree-icon,#jstree-dnd .jstree-copy{display:inline-block;text-decoration:none;margin:0 2px 0 0;padding:0;width:16px;height:16px}#jstree-dnd .jstree-ok{background:green}#jstree-dnd .jstree-er{background:red}#jstree-dnd .jstree-copy{margin:0 2px}.jstree-default .jstree-node,.jstree-default .jstree-icon{background-repeat:no-repeat;background-color:transparent}.jstree-default .jstree-anchor,.jstree-default .jstree-wholerow{transition:background-color .15s,box-shadow .15s}.jstree-default .jstree-hovered{background:#e7f4f9;border-radius:2px;box-shadow:inset 0 0 1px #ccc}.jstree-default .jstree-clicked{background:#beebff;border-radius:2px;box-shadow:inset 0 0 1px #999}.jstree-default .jstree-no-icons .jstree-anchor>.jstree-themeicon{display:none}.jstree-default .jstree-disabled{background:0 0;color:#666}.jstree-default .jstree-disabled.jstree-hovered{background:0 0;box-shadow:none}.jstree-default .jstree-disabled.jstree-clicked{background:#efefef}.jstree-default .jstree-disabled>.jstree-icon{opacity:.8;filter:url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'jstree-grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#jstree-grayscale");filter:gray;-webkit-filter:grayscale(100%)}.jstree-default .jstree-search{font-style:italic;color:#8b0000;font-weight:700}.jstree-default .jstree-no-checkboxes .jstree-checkbox{display:none!important}.jstree-default.jstree-checkbox-no-clicked .jstree-clicked{background:0 0;box-shadow:none}.jstree-default.jstree-checkbox-no-clicked .jstree-clicked.jstree-hovered{background:#e7f4f9}.jstree-default.jstree-checkbox-no-clicked>.jstree-wholerow-ul .jstree-wholerow-clicked{background:0 0}.jstree-default.jstree-checkbox-no-clicked>.jstree-wholerow-ul .jstree-wholerow-clicked.jstree-wholerow-hovered{background:#e7f4f9}.jstree-default>.jstree-striped{min-width:100%;display:inline-block;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAMAAAB/qqA+AAAABlBMVEUAAAAAAAClZ7nPAAAAAnRSTlMNAMM9s3UAAAAXSURBVHjajcEBAQAAAIKg/H/aCQZ70AUBjAATb6YPDgAAAABJRU5ErkJggg==) left top repeat}.jstree-default>.jstree-wholerow-ul .jstree-hovered,.jstree-default>.jstree-wholerow-ul .jstree-clicked{background:0 0;box-shadow:none;border-radius:0}.jstree-default .jstree-wholerow{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.jstree-default .jstree-wholerow-hovered{background:#e7f4f9}.jstree-default .jstree-wholerow-clicked{background:#beebff;background:-webkit-linear-gradient(top,#beebff 0,#a8e4ff 100%);background:linear-gradient(to bottom,#beebff 0,#a8e4ff 100%)}.jstree-default .jstree-node{min-height:24px;line-height:24px;margin-left:24px;min-width:24px}.jstree-default .jstree-anchor{line-height:24px;height:24px}.jstree-default .jstree-icon{width:24px;height:24px;line-height:24px}.jstree-default .jstree-icon:empty{width:24px;height:24px;line-height:24px}.jstree-default.jstree-rtl .jstree-node{margin-right:24px}.jstree-default .jstree-wholerow{height:24px}.jstree-default .jstree-node,.jstree-default .jstree-icon{background-image:url(32px.png)}.jstree-default .jstree-node{background-position:-292px -4px;background-repeat:repeat-y}.jstree-default .jstree-last{background:0 0}.jstree-default .jstree-open>.jstree-ocl{background-position:-132px -4px}.jstree-default .jstree-closed>.jstree-ocl{background-position:-100px -4px}.jstree-default .jstree-leaf>.jstree-ocl{background-position:-68px -4px}.jstree-default .jstree-themeicon{background-position:-260px -4px}.jstree-default>.jstree-no-dots .jstree-node,.jstree-default>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:0 0}.jstree-default>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-36px -4px}.jstree-default>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:-4px -4px}.jstree-default .jstree-disabled{background:0 0}.jstree-default .jstree-disabled.jstree-hovered{background:0 0}.jstree-default .jstree-disabled.jstree-clicked{background:#efefef}.jstree-default .jstree-checkbox{background-position:-164px -4px}.jstree-default .jstree-checkbox:hover{background-position:-164px -36px}.jstree-default.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox,.jstree-default .jstree-checked>.jstree-checkbox{background-position:-228px -4px}.jstree-default.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover,.jstree-default .jstree-checked>.jstree-checkbox:hover{background-position:-228px -36px}.jstree-default .jstree-anchor>.jstree-undetermined{background-position:-196px -4px}.jstree-default .jstree-anchor>.jstree-undetermined:hover{background-position:-196px -36px}.jstree-default .jstree-checkbox-disabled{opacity:.8;filter:url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'jstree-grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#jstree-grayscale");filter:gray;-webkit-filter:grayscale(100%)}.jstree-default>.jstree-striped{background-size:auto 48px}.jstree-default.jstree-rtl .jstree-node{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==);background-position:100% 1px;background-repeat:repeat-y}.jstree-default.jstree-rtl .jstree-last{background:0 0}.jstree-default.jstree-rtl .jstree-open>.jstree-ocl{background-position:-132px -36px}.jstree-default.jstree-rtl .jstree-closed>.jstree-ocl{background-position:-100px -36px}.jstree-default.jstree-rtl .jstree-leaf>.jstree-ocl{background-position:-68px -36px}.jstree-default.jstree-rtl>.jstree-no-dots .jstree-node,.jstree-default.jstree-rtl>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:0 0}.jstree-default.jstree-rtl>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-36px -36px}.jstree-default.jstree-rtl>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:-4px -36px}.jstree-default .jstree-themeicon-custom{background-color:transparent;background-image:none;background-position:0 0}.jstree-default>.jstree-container-ul .jstree-loading>.jstree-ocl{background:url(throbber.gif) center center no-repeat}.jstree-default .jstree-file{background:url(32px.png) -100px -68px no-repeat}.jstree-default .jstree-folder{background:url(32px.png) -260px -4px no-repeat}.jstree-default>.jstree-container-ul>.jstree-node{margin-left:0;margin-right:0}#jstree-dnd.jstree-default{line-height:24px;padding:0 4px}#jstree-dnd.jstree-default .jstree-ok,#jstree-dnd.jstree-default .jstree-er{background-image:url(32px.png);background-repeat:no-repeat;background-color:transparent}#jstree-dnd.jstree-default i{background:0 0;width:24px;height:24px;line-height:24px}#jstree-dnd.jstree-default .jstree-ok{background-position:-4px -68px}#jstree-dnd.jstree-default .jstree-er{background-position:-36px -68px}.jstree-default.jstree-rtl .jstree-node{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==)}.jstree-default.jstree-rtl .jstree-last{background:0 0}.jstree-default-small .jstree-node{min-height:18px;line-height:18px;margin-left:18px;min-width:18px}.jstree-default-small .jstree-anchor{line-height:18px;height:18px}.jstree-default-small .jstree-icon{width:18px;height:18px;line-height:18px}.jstree-default-small .jstree-icon:empty{width:18px;height:18px;line-height:18px}.jstree-default-small.jstree-rtl .jstree-node{margin-right:18px}.jstree-default-small .jstree-wholerow{height:18px}.jstree-default-small .jstree-node,.jstree-default-small .jstree-icon{background-image:url(32px.png)}.jstree-default-small .jstree-node{background-position:-295px -7px;background-repeat:repeat-y}.jstree-default-small .jstree-last{background:0 0}.jstree-default-small .jstree-open>.jstree-ocl{background-position:-135px -7px}.jstree-default-small .jstree-closed>.jstree-ocl{background-position:-103px -7px}.jstree-default-small .jstree-leaf>.jstree-ocl{background-position:-71px -7px}.jstree-default-small .jstree-themeicon{background-position:-263px -7px}.jstree-default-small>.jstree-no-dots .jstree-node,.jstree-default-small>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:0 0}.jstree-default-small>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-39px -7px}.jstree-default-small>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:-7px -7px}.jstree-default-small .jstree-disabled{background:0 0}.jstree-default-small .jstree-disabled.jstree-hovered{background:0 0}.jstree-default-small .jstree-disabled.jstree-clicked{background:#efefef}.jstree-default-small .jstree-checkbox{background-position:-167px -7px}.jstree-default-small .jstree-checkbox:hover{background-position:-167px -39px}.jstree-default-small.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox,.jstree-default-small .jstree-checked>.jstree-checkbox{background-position:-231px -7px}.jstree-default-small.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover,.jstree-default-small .jstree-checked>.jstree-checkbox:hover{background-position:-231px -39px}.jstree-default-small .jstree-anchor>.jstree-undetermined{background-position:-199px -7px}.jstree-default-small .jstree-anchor>.jstree-undetermined:hover{background-position:-199px -39px}.jstree-default-small .jstree-checkbox-disabled{opacity:.8;filter:url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'jstree-grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#jstree-grayscale");filter:gray;-webkit-filter:grayscale(100%)}.jstree-default-small>.jstree-striped{background-size:auto 36px}.jstree-default-small.jstree-rtl .jstree-node{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==);background-position:100% 1px;background-repeat:repeat-y}.jstree-default-small.jstree-rtl .jstree-last{background:0 0}.jstree-default-small.jstree-rtl .jstree-open>.jstree-ocl{background-position:-135px -39px}.jstree-default-small.jstree-rtl .jstree-closed>.jstree-ocl{background-position:-103px -39px}.jstree-default-small.jstree-rtl .jstree-leaf>.jstree-ocl{background-position:-71px -39px}.jstree-default-small.jstree-rtl>.jstree-no-dots .jstree-node,.jstree-default-small.jstree-rtl>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:0 0}.jstree-default-small.jstree-rtl>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-39px -39px}.jstree-default-small.jstree-rtl>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:-7px -39px}.jstree-default-small .jstree-themeicon-custom{background-color:transparent;background-image:none;background-position:0 0}.jstree-default-small>.jstree-container-ul .jstree-loading>.jstree-ocl{background:url(throbber.gif) center center no-repeat}.jstree-default-small .jstree-file{background:url(32px.png) -103px -71px no-repeat}.jstree-default-small .jstree-folder{background:url(32px.png) -263px -7px no-repeat}.jstree-default-small>.jstree-container-ul>.jstree-node{margin-left:0;margin-right:0}#jstree-dnd.jstree-default-small{line-height:18px;padding:0 4px}#jstree-dnd.jstree-default-small .jstree-ok,#jstree-dnd.jstree-default-small .jstree-er{background-image:url(32px.png);background-repeat:no-repeat;background-color:transparent}#jstree-dnd.jstree-default-small i{background:0 0;width:18px;height:18px;line-height:18px}#jstree-dnd.jstree-default-small .jstree-ok{background-position:-7px -71px}#jstree-dnd.jstree-default-small .jstree-er{background-position:-39px -71px}.jstree-default-small.jstree-rtl .jstree-node{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAACAQMAAABv1h6PAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMHBgAAiABBI4gz9AAAAABJRU5ErkJggg==)}.jstree-default-small.jstree-rtl .jstree-last{background:0 0}.jstree-default-large .jstree-node{min-height:32px;line-height:32px;margin-left:32px;min-width:32px}.jstree-default-large .jstree-anchor{line-height:32px;height:32px}.jstree-default-large .jstree-icon{width:32px;height:32px;line-height:32px}.jstree-default-large .jstree-icon:empty{width:32px;height:32px;line-height:32px}.jstree-default-large.jstree-rtl .jstree-node{margin-right:32px}.jstree-default-large .jstree-wholerow{height:32px}.jstree-default-large .jstree-node,.jstree-default-large .jstree-icon{background-image:url(32px.png)}.jstree-default-large .jstree-node{background-position:-288px 0;background-repeat:repeat-y}.jstree-default-large .jstree-last{background:0 0}.jstree-default-large .jstree-open>.jstree-ocl{background-position:-128px 0}.jstree-default-large .jstree-closed>.jstree-ocl{background-position:-96px 0}.jstree-default-large .jstree-leaf>.jstree-ocl{background-position:-64px 0}.jstree-default-large .jstree-themeicon{background-position:-256px 0}.jstree-default-large>.jstree-no-dots .jstree-node,.jstree-default-large>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:0 0}.jstree-default-large>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-32px 0}.jstree-default-large>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:0 0}.jstree-default-large .jstree-disabled{background:0 0}.jstree-default-large .jstree-disabled.jstree-hovered{background:0 0}.jstree-default-large .jstree-disabled.jstree-clicked{background:#efefef}.jstree-default-large .jstree-checkbox{background-position:-160px 0}.jstree-default-large .jstree-checkbox:hover{background-position:-160px -32px}.jstree-default-large.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox,.jstree-default-large .jstree-checked>.jstree-checkbox{background-position:-224px 0}.jstree-default-large.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover,.jstree-default-large .jstree-checked>.jstree-checkbox:hover{background-position:-224px -32px}.jstree-default-large .jstree-anchor>.jstree-undetermined{background-position:-192px 0}.jstree-default-large .jstree-anchor>.jstree-undetermined:hover{background-position:-192px -32px}.jstree-default-large .jstree-checkbox-disabled{opacity:.8;filter:url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'jstree-grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#jstree-grayscale");filter:gray;-webkit-filter:grayscale(100%)}.jstree-default-large>.jstree-striped{background-size:auto 64px}.jstree-default-large.jstree-rtl .jstree-node{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==);background-position:100% 1px;background-repeat:repeat-y}.jstree-default-large.jstree-rtl .jstree-last{background:0 0}.jstree-default-large.jstree-rtl .jstree-open>.jstree-ocl{background-position:-128px -32px}.jstree-default-large.jstree-rtl .jstree-closed>.jstree-ocl{background-position:-96px -32px}.jstree-default-large.jstree-rtl .jstree-leaf>.jstree-ocl{background-position:-64px -32px}.jstree-default-large.jstree-rtl>.jstree-no-dots .jstree-node,.jstree-default-large.jstree-rtl>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:0 0}.jstree-default-large.jstree-rtl>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-32px -32px}.jstree-default-large.jstree-rtl>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:0 -32px}.jstree-default-large .jstree-themeicon-custom{background-color:transparent;background-image:none;background-position:0 0}.jstree-default-large>.jstree-container-ul .jstree-loading>.jstree-ocl{background:url(throbber.gif) center center no-repeat}.jstree-default-large .jstree-file{background:url(32px.png) -96px -64px no-repeat}.jstree-default-large .jstree-folder{background:url(32px.png) -256px 0 no-repeat}.jstree-default-large>.jstree-container-ul>.jstree-node{margin-left:0;margin-right:0}#jstree-dnd.jstree-default-large{line-height:32px;padding:0 4px}#jstree-dnd.jstree-default-large .jstree-ok,#jstree-dnd.jstree-default-large .jstree-er{background-image:url(32px.png);background-repeat:no-repeat;background-color:transparent}#jstree-dnd.jstree-default-large i{background:0 0;width:32px;height:32px;line-height:32px}#jstree-dnd.jstree-default-large .jstree-ok{background-position:0 -64px}#jstree-dnd.jstree-default-large .jstree-er{background-position:-32px -64px}.jstree-default-large.jstree-rtl .jstree-node{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAACAQMAAAAD0EyKAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjgIIGBgABCgCBvVLXcAAAAABJRU5ErkJggg==)}.jstree-default-large.jstree-rtl .jstree-last{background:0 0}@media (max-width:768px){#jstree-dnd.jstree-dnd-responsive{line-height:40px;font-weight:700;font-size:1.1em;text-shadow:1px 1px #fff}#jstree-dnd.jstree-dnd-responsive>i{background:0 0;width:40px;height:40px}#jstree-dnd.jstree-dnd-responsive>.jstree-ok{background-image:url(40px.png);background-position:0 -200px;background-size:120px 240px}#jstree-dnd.jstree-dnd-responsive>.jstree-er{background-image:url(40px.png);background-position:-40px -200px;background-size:120px 240px}#jstree-marker.jstree-dnd-responsive{border-left-width:10px;border-top-width:10px;border-bottom-width:10px;margin-top:-10px}}@media (max-width:768px){.jstree-default-responsive .jstree-icon{background-image:url(40px.png)}.jstree-default-responsive .jstree-node,.jstree-default-responsive .jstree-leaf>.jstree-ocl{background:0 0}.jstree-default-responsive .jstree-node{min-height:40px;line-height:40px;margin-left:40px;min-width:40px;white-space:nowrap}.jstree-default-responsive .jstree-anchor{line-height:40px;height:40px}.jstree-default-responsive .jstree-icon,.jstree-default-responsive .jstree-icon:empty{width:40px;height:40px;line-height:40px}.jstree-default-responsive>.jstree-container-ul>.jstree-node{margin-left:0}.jstree-default-responsive.jstree-rtl .jstree-node{margin-left:0;margin-right:40px}.jstree-default-responsive.jstree-rtl .jstree-container-ul>.jstree-node{margin-right:0}.jstree-default-responsive .jstree-ocl,.jstree-default-responsive .jstree-themeicon,.jstree-default-responsive .jstree-checkbox{background-size:120px 240px}.jstree-default-responsive .jstree-leaf>.jstree-ocl{background:0 0}.jstree-default-responsive .jstree-open>.jstree-ocl{background-position:0 0!important}.jstree-default-responsive .jstree-closed>.jstree-ocl{background-position:0 -40px!important}.jstree-default-responsive.jstree-rtl .jstree-closed>.jstree-ocl{background-position:-40px 0!important}.jstree-default-responsive .jstree-themeicon{background-position:-40px -40px}.jstree-default-responsive .jstree-checkbox,.jstree-default-responsive .jstree-checkbox:hover{background-position:-40px -80px}.jstree-default-responsive.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox,.jstree-default-responsive.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover,.jstree-default-responsive .jstree-checked>.jstree-checkbox,.jstree-default-responsive .jstree-checked>.jstree-checkbox:hover{background-position:0 -80px}.jstree-default-responsive .jstree-anchor>.jstree-undetermined,.jstree-default-responsive .jstree-anchor>.jstree-undetermined:hover{background-position:0 -120px}.jstree-default-responsive .jstree-anchor{font-weight:700;font-size:1.1em;text-shadow:1px 1px #fff}.jstree-default-responsive>.jstree-striped{background:0 0}.jstree-default-responsive .jstree-wholerow{border-top:1px solid rgba(255,255,255,.7);border-bottom:1px solid rgba(64,64,64,.2);background:#ebebeb;height:40px}.jstree-default-responsive .jstree-wholerow-hovered{background:#e7f4f9}.jstree-default-responsive .jstree-wholerow-clicked{background:#beebff}.jstree-default-responsive .jstree-children .jstree-last>.jstree-wholerow{box-shadow:inset 0 -6px 3px -5px #666}.jstree-default-responsive .jstree-children .jstree-open>.jstree-wholerow{box-shadow:inset 0 6px 3px -5px #666;border-top:0}.jstree-default-responsive .jstree-children .jstree-open+.jstree-open{box-shadow:none}.jstree-default-responsive .jstree-node,.jstree-default-responsive .jstree-icon,.jstree-default-responsive .jstree-node>.jstree-ocl,.jstree-default-responsive .jstree-themeicon,.jstree-default-responsive .jstree-checkbox{background-image:url(40px.png);background-size:120px 240px}.jstree-default-responsive .jstree-node{background-position:-80px 0;background-repeat:repeat-y}.jstree-default-responsive .jstree-last{background:0 0}.jstree-default-responsive .jstree-leaf>.jstree-ocl{background-position:-40px -120px}.jstree-default-responsive .jstree-last>.jstree-ocl{background-position:-40px -160px}.jstree-default-responsive .jstree-themeicon-custom{background-color:transparent;background-image:none;background-position:0 0}.jstree-default-responsive .jstree-file{background:url(40px.png) 0 -160px no-repeat;background-size:120px 240px}.jstree-default-responsive .jstree-folder{background:url(40px.png) -40px -40px no-repeat;background-size:120px 240px}.jstree-default-responsive>.jstree-container-ul>.jstree-node{margin-left:0;margin-right:0}}assets/css/40px.png000064400000013647151526424650010164 0ustar00�PNG


IHDR�����	pHYs��
OiCCPPhotoshop ICC profilexڝSgTS�=���BK���KoR RB���&*!	J�!��Q�EEȠ�����Q,�
��!��������{�kּ�����>�����H3Q5��B������.@�
$p�d!s�#�~<<+"��x��M��0���B�\���t�8K�@z�B�@F���&S�`�cb�P-`'������{[�!�� e�Dh;��V�EX0fK�9�-0IWfH�����0Q��){`�##x��F�W<�+��*x��<�$9E�[-qWW.(�I+6aa�@.�y�2�4�������x����6��_-��"bb��ϫp@�t~�,/��;�m��%�h^�u��f�@����W�p�~<<E���������J�B[a�W}�g�_�W�l�~<�����$�2]�G�����L�ϒ	�b��G�����"�Ib�X*�Qq�D���2�"�B�)�%�d��,�>�5�j>{�-�]c�K'Xt���o��(�h���w��?�G�%�fI�q^D$.Tʳ?�D��*�A�,����`6�B$��BB
d�r`)��B(�Ͱ*`/�@4�Qh��p.�U�=p�a��(��	A�a!ڈb�X#����!�H�$ ɈQ"K�5H1R�T UH�=r9�\F��;�2����G1���Q=��C��7�F��dt1�����r�=�6��Ыhڏ>C�0��3�l0.��B�8,	�c˱"����V����cϱw�E�	6wB aAHXLXN�H� $4�	7	�Q�'"��K�&���b21�XH,#��/{�C�7$�C2'��I��T��F�nR#�,��4H#���dk�9�, +ȅ����3��!�[
�b@q��S�(R�jJ��4�e�2AU��Rݨ�T5�ZB���R�Q��4u�9̓IK�����hh�i��t�ݕN��W���G���w
��Ljg(�gw��L�Ӌ�T071���oUX*�*|��
�J�&�*/T����ުU�U�T��^S}�FU3S�	Ԗ�U��P�SSg�;���g�oT?�~Y��Y�L�OC�Q��_�� c�x,!k
��u�5�&���|v*�����=���9C3J3W�R�f?�q��tN	�(���~���)�)�4L�1e\k����X�H�Q�G�6����E�Y��A�J'\'Gg����S�Sݧ
�M=:��.�k���Dw�n��^��Lo��y��}/�T�m���GX�$��<�5qo</���QC]�@C�a�a�ᄑ��<��F�F�i�\�$�m�mƣ&&!&KM�M�RM��)�;L;L���͢�֙5�=1�2��כ߷`ZxZ,����eI��Z�Yn�Z9Y�XUZ]�F���%ֻ�����N�N���gð�ɶ�����ۮ�m�}agbg�Ů��}�}��=
���Z~s�r:V:ޚΜ�?}���/gX���3��)�i�S��Ggg�s�󈋉K��.�>.���Ƚ�Jt�q]�z�������ۯ�6�i�ܟ�4�)�Y3s���C�Q��?��0k߬~OCO�g��#/c/�W�װ��w��a�>�>r��>�<7�2�Y_�7��ȷ�O�o�_��C#�d�z����%g��A�[��z|!��?:�e����A���AA�����!h�쐭!��Α�i�P~���a�a��~'���W�?�p�X�1�5w��Cs�D�D�Dޛg1O9�-J5*>�.j<�7�4�?�.fY��X�XIlK9.*�6nl�������{�/�]py�����.,:�@L�N8��A*��%�w%�
y��g"/�6ш�C\*N�H*Mz�쑼5y$�3�,幄'���L
Lݛ:��v m2=:�1����qB�!M��g�g�fvˬe����n��/��k���Y-
�B��TZ(�*�geWf�͉�9���+��̳�ې7����ᒶ��KW-X潬j9�<qy�
�+�V�<���*m�O��W��~�&zMk�^�ʂ��k�U
�}����]OX/Yߵa���>������(�x��oʿ�ܔ���Ĺd�f�f���-�[����n
�ڴ
�V��E�/��(ۻ��C���<��e����;?T�T�T�T6��ݵa�n��{��4���[���>ɾ�UUM�f�e�I���?�����m]�Nmq����#�׹���=TR��+�G�����w-
6
U����#pDy��	�
:�v�{���vg/jB��F�S��[b[�O�>����z�G��4<YyJ�T�i��ӓg�ό���}~.��`ۢ�{�c��jo�t��E���;�;�\�t���W�W��:_m�t�<���Oǻ�����\k��z��{f���7���y���՞9=ݽ�zo�����~r'��˻�w'O�_�@�A�C݇�?[�����j�w����G�������C���ˆ
��8>99�?r��C�d�&����ˮ/~�����јѡ�򗓿m|�����������x31^�V��w�w��O�| (�h���SЧ�������c3-� cHRMz%������u0�`:�o�_�F�IDATx���=n#����1�����`�<��!O�̱�=��ƌc'����qV+H���~@��5��zU�d��iJ9Ð�7�8N������!��0 `0 `@� `@��q<���=��.Xf�������7{�L�xSJi��~5���X��W�&x�"0����	����q�q�^o��xE,�7cz�^n��xE,�t.��Qվ�^�E�g�)U���=��n�*��|I09��}{�ۀ�	%GT�oO�t�-��U��/�)�"/�Z�7��[�,��tTK�@C�	�p85"�o�,^���#�x)��.�x�K�s���W�T��P�+^
F��p�p"�M<w@��]���v���\��^�
���W�4p�zZ6��&�V��"���K��V"���K���g�EL�nI/��&��_�1M|o�K�HC�4�[Bt���ܐk���i�#u.	S�"�р?
T�"���U��#F�Y"o���X�Y"o���+`�F,^4b�
���W��X�&h��
l��,_�q<O��B���q�r5R�k�-s&>��O��#q	x��΁0 `0 `@� `@�����0 `0 ` n�����_��۬�w��~}���?:
A~oJ)m�ۯ">o�閟;��g	],�W[Ng��ޟE��+��X���1\g��<���a��K��n��Qg�%�[��8�fg���x�0����K�q'+���5^�i�9�{�1���rG{|�������z�����n�9s�fb�u,b����j����I�����s�z������E�1X�<`C�E�1X�<`C����,^�x!h�Ⅰ��,^�x!h�Ⅰ��,^�x!h�Ⅰ�:9/8�{�3��F,^�y	}k��F΁��X��P��D,^h0�K"/4��W��)��-����8��8����E�8N�)�s���o�����{�������� `@���A���00 `@� `@���A����e5�
��8����p�t��?��{н�v�����k]��k쿷nO�΁��w� "���m�@�-�ip�pE�Ѐ[�7��l龉xaG����>1[���5ۉ8���zf�����U���?:��m�}t_�9�x��h�E��5^(��K��񺸄��f^�P��)^��LzI��E�
/��*^h$�kC/4�Ke��oVQ��/]�3p%B/�xpЈs��\)b�"���X�8h��E�
;�x!��	�
U�$���~�RJh@�(�Ox��0-\�I�����(p����_��������~��4���<ù��;=О������cր[9���Ǭ�=z|��j�ZϠ�6��?f
����{0.a����c��0 `0 `@� `@�����0 `0 `@���A������n5�
��8����pN(��-f$�s�'d����ۆ����p�pD���#b<ӛ��~fX����S�e��nC����w�ۂE-�K̈́��\)��عo�^B0 `0О�]з����#Kh@�����m|��%^ژ��a��,"���yE�O�D�f�a���!��%��^B�<Ù}p�Pċ��#^4�"���ޭj�T�h�"��a���,`�A�s`@���A�����00 `0 `@�d�oQ	0 `@� `@���A����Y��x�w�����pp�1��'M ��J)��aD�q�WJ��%����E�86#`����-��)��Ë��_J�O1��Ήp�.y��/)��:�8f�)��O��������h����kJ��5�Ѐ�FK)��ƥ�RJ�p��|���,����w�������/dds8�2 `Db	
0 `0 `@���A�����XR�>V{�Ж�j���00 `@� `@������d�D�i��M���l��������cB������7�-�/"`@� `@����g���:�7|de����~������N,���Czzz����N?��l��v˶^=�)�4����L郗��p���y��������0m6��4�^��[���A��߼����~�N�C�x\���K���/�8���.�8E|��c�ɰ��nu���Axu��"�'������]��Gě��w�`�9B+�m�~|�ۥ�v�7�K_���=�k���0�!�U.	�b���"���pѥ�~9e*�s��gLӽ1��s�,�<�i�m#ઃh�w&�(�/��J�7���I�K/��o��|Õ\C����~c�3p�xo��ϱ�
ez�<���
8{���.��li�3�
x�x����!h��u|�`�9������ω�kvλ��X�K��_<i2�Y�.6� 3�x{
�������F��6�x:�w�p�6B�[�喒�w�t���J�>��8/�%pc�%"�B�������x/�%3$WX	�B�E,���G�����2�"��3���F�����q�>5��]���xkl�F�(����F��~�>�
��{8�����nP"�xΈ�+�EY�ij!�F��)ޗ������g�0�(Ӭ���g&�8�q-mh�}�"�{	]c9}�E�,�Oۼ�J|�U��.��f3�\��f�R3e�wƏ`�b<wt]�>}c�i�t��2_���ۦ��
���l�̲?��ޓo�k�<�z���[�[�m�r��JO�z�x(xlĻ�%�5aQ�R�bY=�o�c"`��L\j�
��%�-K�n�=s���|�C�c#ޥ�zо3�����/_����n�L��zcU�*��4��5�7��ӶOg��~���c��@u3{�"j�_B�fqz?fѫ�H�gt�|*�d B���0�0 `@���A����r�-
ϑ`���IEND�B`�assets/css/throbber.gif000064400000003471151526424650011153 0ustar00GIF89a����������FFFzzzXXX$$$���������666hhh!�NETSCAPE2.0!�Created with ajaxload.info!�	
,w  	!�DB�A��H���¬��a��D���@ ^�A�X��P�@�"U���Q#	��B�\;���1�o�:2$v@
$|,3

�_#
d�53�"s5e!!�	
,v  i@e9�DA�A�����/�`ph$�Ca%@ ���pH���x�F��uS��x#�
�.�݄�Yf�L_"
p
3B�W��]|L
\6�{|z�8�7[7!!�	
,x  �e9�DE"������2r,��qP���j��`�8��@8bH, *��0-�
�mFW��9�LP�E3+
(�B"
f�{�*BW_/�
@_$��~Kr�7Ar7!!�	
,v  �4e9��!H�"�*��Q�/@���-�4�ép4�R+��-��p�ȧ`�P(�6�᠝�U/� 	*,�)(+/]"lO�/�*Ak���K���]A~66�6!!�	
,l  ie9�"���*���-�80H���=N;���T�E�����q��e��UoK2_WZ�݌V��1jgWe@tuH//w`?��f~#���6��#!!�	
,~  �,e9��"���*
�;pR�%��#0��`� �'�c�(��J@@���/1�i4��`�V��B�V
u}�"caNi/]))�-Lel	mi}
me[+!!�	
,y  Ie9��"M�6�*¨"7E͖��@G((L&�pqj@Z����� ��%@�w�Z) �pl(
���ԭ�q�u*R&c	`))(s_J��>_\'Gm7�$+!!�	
,w  Ie9�*,� (�*�(�B5[1� �Z��Iah!G��exz��J0�e�6��@V|U��4��Dm��%$͛�p
	\Gx		
}@+|=+
1�-	Ea5l)+!!�	
,y  )�䨞'A�K����ڍ,�����E\(l���&;5 ��5D���0��3�a�0-���-�����ÃpH4V	%
i
p[R"|	��#
�	6iZwcw*!!�	
,y  )�䨞,K�*�����0�a�;׋аY8�b`4�n�¨Bb�b�x�,������������(	Ƚ� %
>

2*�i*	/:�+$v*!!�	
,u  )�䨞l[�$�
�Jq[��q3�`Q[�5��:���IX!0�rAD8Cv����HPfi��iQ���AP@pC
%D
PQ46�
iciNj0w
�)#!!�	
,y  )��.q��
,G�Jr(�J�8�C��*���B�,����&<
�����h�W~-��`�,	����,�>;

8RN<,�<1T]
�c��'
qk$
@)#!;assets/css/32px.png000064400000021044151526424650010153 0ustar00�PNG


IHDR@`lK�(	pHYs��
OiCCPPhotoshop ICC profilexڝSgTS�=���BK���KoR RB���&*!	J�!��Q�EEȠ�����Q,�
��!��������{�kּ�����>�����H3Q5��B������.@�
$p�d!s�#�~<<+"��x��M��0���B�\���t�8K�@z�B�@F���&S�`�cb�P-`'������{[�!�� e�Dh;��V�EX0fK�9�-0IWfH�����0Q��){`�##x��F�W<�+��*x��<�$9E�[-qWW.(�I+6aa�@.�y�2�4�������x����6��_-��"bb��ϫp@�t~�,/��;�m��%�h^�u��f�@����W�p�~<<E���������J�B[a�W}�g�_�W�l�~<�����$�2]�G�����L�ϒ	�b��G�����"�Ib�X*�Qq�D���2�"�B�)�%�d��,�>�5�j>{�-�]c�K'Xt���o��(�h���w��?�G�%�fI�q^D$.Tʳ?�D��*�A�,����`6�B$��BB
d�r`)��B(�Ͱ*`/�@4�Qh��p.�U�=p�a��(��	A�a!ڈb�X#����!�H�$ ɈQ"K�5H1R�T UH�=r9�\F��;�2����G1���Q=��C��7�F��dt1�����r�=�6��Ыhڏ>C�0��3�l0.��B�8,	�c˱"����V����cϱw�E�	6wB aAHXLXN�H� $4�	7	�Q�'"��K�&���b21�XH,#��/{�C�7$�C2'��I��T��F�nR#�,��4H#���dk�9�, +ȅ����3��!�[
�b@q��S�(R�jJ��4�e�2AU��Rݨ�T5�ZB���R�Q��4u�9̓IK�����hh�i��t�ݕN��W���G���w
��Ljg(�gw��L�Ӌ�T071���oUX*�*|��
�J�&�*/T����ުU�U�T��^S}�FU3S�	Ԗ�U��P�SSg�;���g�oT?�~Y��Y�L�OC�Q��_�� c�x,!k
��u�5�&���|v*�����=���9C3J3W�R�f?�q��tN	�(���~���)�)�4L�1e\k����X�H�Q�G�6����E�Y��A�J'\'Gg����S�Sݧ
�M=:��.�k���Dw�n��^��Lo��y��}/�T�m���GX�$��<�5qo</���QC]�@C�a�a�ᄑ��<��F�F�i�\�$�m�mƣ&&!&KM�M�RM��)�;L;L���͢�֙5�=1�2��כ߷`ZxZ,����eI��Z�Yn�Z9Y�XUZ]�F���%ֻ�����N�N���gð�ɶ�����ۮ�m�}agbg�Ů��}�}��=
���Z~s�r:V:ޚΜ�?}���/gX���3��)�i�S��Ggg�s�󈋉K��.�>.���Ƚ�Jt�q]�z�������ۯ�6�i�ܟ�4�)�Y3s���C�Q��?��0k߬~OCO�g��#/c/�W�װ��w��a�>�>r��>�<7�2�Y_�7��ȷ�O�o�_��C#�d�z����%g��A�[��z|!��?:�e����A���AA�����!h�쐭!��Α�i�P~���a�a��~'���W�?�p�X�1�5w��Cs�D�D�Dޛg1O9�-J5*>�.j<�7�4�?�.fY��X�XIlK9.*�6nl�������{�/�]py�����.,:�@L�N8��A*��%�w%�
y��g"/�6ш�C\*N�H*Mz�쑼5y$�3�,幄'���L
Lݛ:��v m2=:�1����qB�!M��g�g�fvˬe����n��/��k���Y-
�B��TZ(�*�geWf�͉�9���+��̳�ې7����ᒶ��KW-X潬j9�<qy�
�+�V�<���*m�O��W��~�&zMk�^�ʂ��k�U
�}����]OX/Yߵa���>������(�x��oʿ�ܔ���Ĺd�f�f���-�[����n
�ڴ
�V��E�/��(ۻ��C���<��e����;?T�T�T�T6��ݵa�n��{��4���[���>ɾ�UUM�f�e�I���?�����m]�Nmq����#�׹���=TR��+�G�����w-
6
U����#pDy��	�
:�v�{���vg/jB��F�S��[b[�O�>����z�G��4<YyJ�T�i��ӓg�ό���}~.��`ۢ�{�c��jo�t��E���;�;�\�t���W�W��:_m�t�<���Oǻ�����\k��z��{f���7���y���՞9=ݽ�zo�����~r'��˻�w'O�_�@�A�C݇�?[�����j�w����G�������C���ˆ
��8>99�?r��C�d�&����ˮ/~�����јѡ�򗓿m|�����������x31^�V��w�w��O�| (�h���SЧ�������c3-� cHRMz%������u0�`:�o�_�FOIDATx��{xS��ǿi����JՍ�\Z�'8qs���oI@Q@�`��8a��Q,0�x+��ڞ���
h�`A)�{�V�m���M�$-Iڜ$����Bqӝ�]��<��9M��|s��y�>��0�B��j����?�_m\F����O- %0J�T�I�TTT�I���(RQ$RQQQ$R�HE	�HEEE	�H	�?����$I{w��j�'XU~~?����]�\��o�.�HE%B���q�R�Qr�n�R)p�J�Lv+����)��R	��q�v�A�x8�s�ޏ��R�NVre�������s7���n��	K:D�"@‹�Q����P���b��l1�ln@��

fX,
�X��ZͰ4Za�Z��<8����[���찘�0[`l0�h6��`��b�������k�U��c��]��|QZ����C�4p4:tp6��n6�1�=�.��H	�qnC��F�	F�	f�V��+�&;�6/.�	��ZpAw
�e{p��s\�O�Ju1�/qI_��7N�ҍ"\ԝ
��F�m�Ŝ�U⯯G��8r��:nMp�Kx�nK���:2v��r�Add$zR�WI����$������F�<��a0�Dhn��j�������R��y�#�K��P�Vi�;.��qٖ�K7�p����|��͹Ⱥ��zR���*�����ɕ8x9<Ϸ��̧�U�r�v Q�)ڭx�d��򔘲�xrW�x���b8L��7r�����*��,vb"�Q���j�z:�UUU��y�0�0�L0�L��h[����zv�_�=կ"�n%r-�"߲
��m�3o�!s,r�[�?��`��a���?~���A��M�U�"�Q�����.-G|�
�j`�՗���R�[>&t���kp��6􋯣ة	�h4���`dd$b���`O���sU�T�RW	����:�n@�ף���F�	&_"�4�E����:�k
��\:V���Ջ��Y�~	�Լ���?�%���3��ꑲ?�#F�҅��^�kU�Ċ�S���g���,|z�Cʹ$�Q�;�va<�F�/�cqQ4~�4�|+�|Z�a*ƭ��/��]��ф��q�̃�3ؙ	�'��R�tWWנR[�
��Zh���U頯���7���Vk0 ��
��c2�S=�u%Occ�,l(�����kU3���D�o�ϰ {��� �?t���}b�=~/f�⹢���>�W�>�Y�wcr��,�I�Q�@q�WA�9{p]������b$l��	�?���<6m�Eg|]!���+�[���ڿS��}����zh��Дh�)����
Th����P��A��Q[��X��8�#��
�<�مC����XP</���?��'���?´�~����
������FL�3��QY^��8��rB01�abÄ4���Dqɹ�h0�0����]6��!��	�?�t+��o�s���<*�Z���Ujh4_������b���L���F��|S2���Ӳ�bZVL�샨��t Q�� ;�$F���8�g����GS�%3�U2���$1�Nb��>|v���C~u��`������N�~�Օ�Э`W�����8z^�Z
�ʋZ��F�FI�ר(�JP[���6ZD��h�<1�=R��� b/�C{%�0R�02�!">s̄�h]��F+v�&`�xxè=>�l���?	��ҷ��	P�X_��OX`k��?�<��:v�YȞ*���ǁ��Z�V��֨���j��A�,!��`�E�B���P�R� B�e	1�`	P�R���x`� ��X�I1��}*/���Q��B¥�B����������J�!?aI�	����i��Z�j�V��@�.�F��F��J�i#�W�(�*!K�q�c��bܲ����D�V��%ĸs��z!�_�v�=����tL�1SvD�p�6��y>оh�J��OXH|��g�`k�u�H�q��_�a�i���
7mޭ�f�Kp�%!(+A����Ƹue��K��ˍ�y�z>w��O�k�V[)�)�lMg
��=��R�������7���xm�f���fbݸ�7��=�A	� �.IGԝ�Hw�!���3�GI$��޻�H%@ A�I�AP$	� 	� H��I�A�H����>A�H	� %@j� R$�H	� �O�)A�H	��'H��	� R�H�w}��I��Ind.���\*�?&R$ѩػ?1�ץ/���ܺ��.]�rg�Aw�u�.}��o��������Uk�!e*6m�ż�+�is,6m�E�9�&%@j_4�Ch�����9�Q�K_
���f#�&-Zn��X�fk�o���C��A����0Ah��.})�Jp��]��+-D���"�"]���q���S�Ԉ�#G�9�-\I�	Bb��P	g��
^)�����MA`-.�N!�l.U����P�_B��4.�8�U�pAw
BcmPx��ԯ�}=JǑ����٢�g�•h��Z���="v�o�FFF���wV�wP�8jTp6���5p�5h֗���Ns{24�-@OK�
�:j�E�e'.�3pɖ��\\v��%��8p�#8*E`�&ێ-�����k�HPy�S�*y�u;��݌�V�_��WyJl�W.A��h¦ͱ�ʺ��9rz
�2	�s�}v	v6ݹ���E��}�܎�8j�^�8j5h1i�"0�h%A�����0U`�?bw�$���w�o݆|�6�Y�!Ϻ-��zv��̎����� ��&�*z_~�; ���=�vi9�V V�[����T�`Q�`��C�!Qٷ���%��G�;���#�t	vv����b���2z5lga�Q�Q���נ��NS��٬�֊,�en��:�\(�ۥ��Q�|��A�_�
~)Ҍ��v�o���p���t��(��qX��%V\����<�e'f��d�>ۍ7�~��.����(���x,.�FLR4�����+	��`��8��q��:��;���ZŢ�6�ta�����gp��K�o\���*z5�kK��K�b��P�a�g2�Y����)l��il�z6��oi~�%�&���A��	�I'^�?t���a�}b�=~/f�⹢���>�W�>�Y�wcr��,�I����k��2	B	��6ǂ�Tg�b���M~�V�$��n���۾����tI���<n�	k�14]�M�aӞ��ڛ�8jK��^zĺ�*}��^
�����)��G�3c���x��_������B!;�$�
:QO�����!:�!*�+��zaZN&f0LLc���0��Ḡ��fS�`�O��A	�{��V�(�����ʋh*+�Uu�Q4];���/`�<G�eث�p�8M���h�N�,sۍ嘟�4�3� *��d�AtV_De�Ƥ����I����!�u�Kq�\�~8��0�Kf�d�1�Ib��0��Cp�rA`B�`7$zF�k�B*�-n�߸����a���|XTyh�~M׏�fy1���x'F����ػH�I�f���xF)B�`�P0���v;R�en�̠Ph�C��xh�<��a�
�q�����?��S�Z��f���1܁�h�.r�kT>����a4\Ƀ�J̪<4}s�e��TV����4TB���;B���D���o(K�qK��+yH�|[~��K1�#)~��}8y2Me�m�?XB��Z�yW��9���$�}/�^�q�50_�G�T�OE��T��0_=��O�y�#�X	�<��,�y�<1�-K�q�b���,�y�,��8��P`NL��Mh*+@SYr��!j���	8]�H~~�5�cZm%n�����n`��#��#���V��+A����F��n�n��\�3h+An���N���-@�s�5�רq�A��Rp��z
�ʊ;t)\�96n<���`՚u��c�ȑ�?�g$@����_����t���!���T�?��;� At;,J�A�)A�H	� A$@J�A�)A�H	� A$@J�AP�H%@ A�I�AP$A	�H$@J�$@� R$	���o��1v�:c#c}��� R�2`��+t�6U���n�/�
�oڲEsb��g�)@)c}[ӑ}!��aÆM�1e��%@��}��?�������O\$��Uv߾�]���@Ç:�����
��ۓ�����==��O�A�_��p�X$c,R�/$�#%��me���<6lذ�z�`'���A���2�8�#��n��'��[�
?`̿�5\۶���������sm|�Dn.��
�=Gj���?2�"�F�F�R���Ȏ�`{t	�FT*5�	J��ཫ�Ջ9�d��>��bX�N͊�ܺH�nF�v+�/Y��+�<%����O.2��A��BX�����x�]`�N���{��T���{�-�8�J�O�&(�*;\��	���h�Z����
� �	J�b
�ϫC��=;ےay�>��a�C�o�GK���z�����,���/�=�+x.�r� |��$���Ɍe\e<c�g��|�1x֬�g�Z`�z 6�O>�W��e�16<�|�Ov��t
�r
�6Z�R��Ry�J�O�J����G�ݴV�K��8��y��Ұ~2��xte�o�^�0�S���㱸(��#5L6h��c��4Ɔ�0��b�S������~�ŋ��_G�ڵ�/G�NOcl8cLl�*�`�	��-zAp��h��h���
�!(�����8�4�� <{�^�,�sE!;8���O��*��s&g1L�d���u&2A�I�Kfl�!��j�D�1�|t���*Գf]Nflh�f��`k	;N�:Uޞ��I� ��H�%@������v��Dg3Deye7�P/L�	����i����a/+�l-�^��}u�]M���1����14?��K�4��D��	p�n���< �E����;�u��0�Kf�d�1�Ib��0�^�0���WJ��'z�n�0�R�P��e��&�~�–�C��;J�y
<}�t�����Ϗ�����HP�2����+�}xè=>��V�dC��
2ƒCB��H�3��<c���1�k�{�D�or����ǃ�;W8<x��6	2c����v�
�].������K�HP�u��>��{Վ�X�Iq��kl�}QA34cL�׼��EH��E�p>,��=��ء+��ڗ���a�6S�-���h�����Ζ�� @�p:���\N�w�O�HP�в��zd�HӨwF��)��(@Ic���qx�@���dHR���4�Lc�A%c�|�_�ur��i�
�nBO�>]nk�9�6;�v��q	%@�`W�H�l����
fd�I�3vRXXB�P2v�w�����$��`�I�~���e0�����Y�WcS#�p���FX���6Za��)����$���bc�1�-�E�^{�Zw��ԩSeNg�����v�
�͎f-N�.�I� %�nz;,I+��k���,�J�X�f�{����k׻ּ�ך��]�׮w�Z�޳z�:Ϫ5�j�:Z	BP���Nu�/���o����~!�}��ܧ��>w�ܧ��~!���TT�I��o%@ %�.-@***������(RQQQQ�����"	� �;��)I�{�IEND�B`�assets/css/styles.css000064400000036124151526424650010713 0ustar00/*
* BACKUPLY
* https://backuply.com
* ( c ) Backuply Team
*/

.backuply-tab .postbox-header .hndle {
	cursor: default;
}

/* Progress bar inside the status block */
.backuply-upload-progress {
  color: white;
  display:flex;
  flex-direction:row;
  gap: 10px;
}

p.backuply-loc-bak-name, p.backuply-loc-restore-name{
	font-weight: bold;
}

.backuply-upload-progress-bar{
  background-color: #0096FF;
  height: 20px;
}

a .dashicons {
	text-decoration: none;
}


.backuply-grayscale {
	filter : grayscale(100%);
	transform: scale(1);
	transition: filter 0.3s, transform 0.3s;
	cursor: pointer;
}

.backuply-grayscale:hover {
	filter : grayscale(0%);
	transition: filter 0.3s, transform 0.3s;
	transform:  scale(1.1);
}

.backuply-premium-box {
	text-align: center;
	border-top: 1px solid hsl(0, 0%, 90%);
	/* background-color: 	hsl(0, 0%, 96%); */
	/* box-shadow: 0 0 3px #c6c6c6; */
}

.backuply-loc-types-showcase {
	display:flex;
	flex-direction: row;
	align-items:center;
	justify-content: center;
	flex-wrap: wrap;
}

.backuply-loc-types-showcase li {
	margin: 0 10px;
}

/* Check status pulsating ring */
.backuply-ring-wrap {
    position: relative;
	margin-right: 10px;
	height:100%;
}

.backuply-ring-circle {
    width: 8px;
    height: 8px;
    background-color: #dc143c;
    border-radius: 50%;
    position: absolute;
    top: 6px;
    left: -6px;
}

.backuply-ring-outer {
    border: 3px solid #dc143c;
    -webkit-border-radius: 30px;
    height: 16px;
    width: 16px;
    position: absolute;
	left: -13px;
	top: -2px;
    -webkit-animation: backuply-pulsate 1.2s ease-out;
    -webkit-animation-iteration-count: infinite; 
    opacity: 0.0
}
@-webkit-keyframes backuply-pulsate {
    0% {-webkit-transform: scale(0.1, 0.1); opacity: 0.0;}
    50% {opacity: 1.0;}
    100% {-webkit-transform: scale(1.2, 1.2); opacity: 0.0;}
}

/* The Modal (background) */
.modal {
	display: none; /* Hidden by default */
	position: fixed; /* Stay in place */
	z-index: 1; /* Sit on top */
	padding-top: 100px; /* Location of the box */
	left: 0;
	top: 0;
	width: 100%; /* Full width */
	height: 100%; /* Full height */
	overflow: auto; /* Enable scroll if needed */
	background-color: rgb(0,0,0); /* Fallback color */
	background-color: rgba(0,0,0,0.4); /* Black w/ opacity */
}

/* Modal Content */
.modal-content {
	background-color: #fefefe;
	margin: auto;
	padding: 20px;
	border: 1px solid #888;
	width: 80%;
}

.backuply-tab{
	display:none;
}

#add_backup_loc_form{
	display:none;
}

.backuply-progress-bar {
	background-color: #d8d8d8;
	border-radius: 6px;
	position: relative;
	margin: 15px 0;
	height: 25px;
	width: 100%;
}

.backuply-progress-value {
	background-color: #009ffd;
	position:relative;
	border-radius: 6px;
	padding: 0 10px;
	color: #fff;
	display: flex;
	align-items: center;
	justify-content: center;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
	height: 100%;
	opacity: 1;
	transition: 1s ease 0.3s;
}

.backuply-progress-value::after {
	content: "";
	position: absolute;
	top: 0; left: 0; bottom: 0; right: 0;
	background-image: linear-gradient(
	-45deg, 
	rgba(255, 255, 255, .2) 25%, 
	transparent 25%, 
	transparent 50%, 
	rgba(255, 255, 255, .2) 50%, 
	rgba(255, 255, 255, .2) 75%, 
	transparent 75%, 
	transparent
	);
	z-index: 1;
	background-size: 50px 50px;
	animation: backuply-move 2s linear 0s infinite;
	border-top-right-radius: 8px;
	border-bottom-right-radius: 8px;
	border-top-left-radius: 20px;
	border-bottom-left-radius: 20px;
	overflow: hidden;
}

@keyframes backuply-move {
  0% {
    background-position: 0 0;
  }
  100% {
    background-position: 50px 50px;
  }
}

.backuply-heading-2{
	font-weight: 600;
	font-size: 1.1rem;
}

.backuply-option-wrap{
	display:flex;
	flex-direction:column;
	margin: 10px 0;
	padding: 0 10px;
}

.backuply-opt-label {
	margin: 4px;
}

.backuply-opt-label__title {
	display:block;
	font-weight:500;
	font-size: 0.9rem;
}

.backuply-opt-label__helper {
	/*will do something*/
}

.backuply-settings-block {
	position: relative;
	margin:10px 5px 5px 5px;
	padding: 20px;
	border-bottom: 1px solid #e0e0e0;
}

.backuply-settings-block:last-child{
	border-bottom: none;
}

.backuply-pro-block-notice{
	position:absolute;
	width: 100%;
	height: 100%;
	background-color: #FFF;
	z-index:5;
	opacity: 0.4;
}

.backuply-pro-block-badge{
	position:absolute;
	top: -10px;
	right: 20px;
	background-color: #363062;
	font-weight: bold;
	padding: 5px 30px;
	color: #FFF;
	z-index: 6;
	border-radius: 0 0 4px 4px;
}

.backuply-form-wrap {
	display:flex;
	flex-direction:row;
	flex-wrap:wrap;
}

.backuply-form-wrap > .backuply-option-wrap {
	width: 50%;
	box-sizing: border-box;
}

.backuply-cron-time {
	display: inline-flex;
	flex-direction: column;
	width: calc(96%/5);
}

.backuply-code-text-wrap {
	background-color: #000;
	color: #FFF;
	position:relative;
	padding: 10px;
	margin-top:10px;
	border-radius: 3px;
	overflow: hidden;
}

.backuply-code-overflow {
	width: 100%;
	/* overflow-x: scroll; */
	white-space: nowrap;
}

.backuply-code-text::after {
	position: absolute;
	top: 0;
	bottom: 0;
	right: 0;
	width: 15em;
	content: '';
	background: -webkit-gradient(linear, left top, right top, color-stop(0%,rgba(0,0,0,0)), color-stop(100%,rgba(0,0,0,1)));
	background: linear-gradient(left, rgba(0,0,0,0) 0%,rgba(0,0,0,1) 100%); 
}

.backuply-code-copy {
	position: absolute;
	top : 50%;
	transform : translateY(-50%);
	right: 5px;
	background-color: #3b3b3b;
	padding: 5px;
	border-radius: 3px;
	cursor: pointer;
	z-index: 10;
}

.backuply-code-copied {
	display:none;
	position: absolute;
	top: 50%;
	transform : translateY(-50%);
	right: 55px;
	padding: 5px;
	z-index: 20;
	background-color: #eee;
	color: #000;
	border-radius: 3px;
	font-weight: bold;
	animation: backuply-copied 2s cubic-bezier(.19,.97,.33,.76) forwards; 
}

.backuply-code-copied::before{
	content: "";
	position:absolute;
	top: 10px;
	right: -3px;
	width: 7px;
	height: 7px;
	background-color: #eee;
	transform: rotate(45deg);
}


@keyframes backuply-copied {
	0% {
		opacity: 0.8;
	},
	25% {
		opacity : 1;
	},
	100% {
		opacity: 0.6;
	}
}

.backuply-promotion-content {
	padding: 15px;
	border-radius: 3px;
	background-color: #FFF;
}

/* Modal Starts here */
.backuply-modal * {
	box-sizing: border-box;
}

.backuply-modal {
	position: fixed;
	top: 0;
	left: 0;
	display:flex;
	justify-content: center;
	align-items: center;
	z-index: 99999;
	width: 100%;
	height: 100%;
	background-color: rgba(0, 0, 0, 0.35);
}

.backuply-modal__inner {
	border-radius: 2px;
	background-color: #FAF9F6;
	z-index: 1000;
	width: 450px;
	height: auto;
	box-shadow: 0 1.6px 3.6px 0 rgb(0 0 0 / 13%), 0 0.3px 0.9px 0 rgb(0 0 0 / 11%);
	/* backdrop-filter: blur(15px); */
	/* border: 1px solid rgba(255,255,255,.35); */
	padding: 0 20px;
}

.backuply-modal__header {
	display: flex;
	justify-content: space-between;
	align-items: center;
	padding: 10px 0;
	font-size: 1.2em;
	margin-bottom: 10px;
}

.backuply-modal-header__title {
	display:flex;
	align-items: center;
	justify-content: center;
	font-weight: bold;
	column-gap: 5px;
}

.backuply-modal-header__title .dashicons {
	font-size: 1.7rem;
	width: 25px;
	height: 25px;
}

.backuply-modal-header__actions {
	cursor:pointer;
}

.backuply-modal__content {
	height: auto;
	max-height: 600px;
	overflow-y: auto;
	margin : 10px 0 20px 0;
}

.backuply-backup-status {
	background-color: black;
	height: 30vh;
	width: auto;
	max-height: 30vh;
	max-width: 100%;
	border-radius: 2px;
	color: #FAF9F6;
	font-weight: 500;
	padding: 10px;
	overflow-y: auto;
	word-wrap: break-word;
	scroll-behavior: smooth;
}

.backuply-backup-status::-webkit-scrollbar {
	width: 8px;
}

.backuply-backup-status::-webkit-scrollbar-track {
	background: #1b1b1b;
	border-radius: 0 2px 2px 0;
}

.backuply-backup-status::-webkit-scrollbar-thumb {
	background: #333333;
	border-radius: 0 2px 2px 0;
}

.backuply-modal_footer {
	display:flex;
	justify-content: space-between;
	margin: 20px 0;
}
/* Modal Ends here */

.backuply-btn {
	outline: none;
	padding: 5px 20px;
	border-radius: 2px;
	line-height: 1.2;
	font-weight: 500;
	cursor: pointer;
}

.backuply-btn--danger {
	background-color: #dc3545;
	border: 1px solid #dc3545;
	color: #FFF;
}

.backuply-btn--danger:hover {
	background-color: #b81c2b;
}

.backuply-btn--danger:disabled {
	opacity: 0.5;
	cursor: default;
}


.backuply-btn--success {
	background-color: #66bb6a;
	border: 1px solid #66bb6a;
	color: rgba(0, 0, 0, 0.87);
}

.backuply-disabled {
	cursor : default !important;
	color: #a7aaad!important;
	border-color: #dcdcde!important;
	background: #f6f7f7!important;
	box-shadow: none!important;
	cursor: default;
	transform: none!important;
}

.backuply-restore-last-log,
.backuply-backup-last-log{
	text-decoration: underline;
	font-weight: 500;
	color: #2271b1;
	cursor: pointer;
}

.backuply-last-logs-block{
	color: #FFF;
	background-color: #000;
	border-radius: 3px;
	padding: 10px !important;	
}

.backuply-auto-mark{
	background-color: #dc3545;
	color: white;
	border-radius: 50px;
	font-size: 0.8em;
	font-weight:bold;
	padding: 1px 3px;
}

.backuply_exclude_file_block{
	width: 100%;
	border-radius: 20px;
	margin: 6px 0;
}

.backuply_exclude_file_header{
	background-color: #eee;
	font-weight: bold;
	padding: 10px;
	border-radius: 6px;
}

.backuply-exclude-pattern-block{
	display:flex;
	align-items:center;
	justify-content: space-between;
	margin-bottom: 10px;
	padding: 10px;
}

.backuply-exclude-pattern-block:nth-child(1){
	box-shadow: 0 5px 3px #eee;
}

.backuply-exclude-pattern-block:nth-child(even){
	background-color: #eee;
}

.backuply-pattern-insert{
	cursor: pointer;
}

.backuply-pattern-delete{
	cursor: pointer;
	color: #dc3545;
}

.backuply-pattern-edit{
	cursor: pointer;
}

.backuply-exclude-pattern-type{
	width: 40%;
}

.backuply-exclude-pattern-val{
	width: 60%;
}

.backuply-exclude-add-exact {
	margin-top: 7px;
}

.backuply-js-tree::-webkit-scrollbar {
  width: 10px;
}

.backuply-js-tree::-webkit-scrollbar-track {
  background: #f1f1f1;
}

.backuply-js-tree::-webkit-scrollbar-thumb {
  background: #888;
}

.backuply-js-tree::-webkit-scrollbar-thumb:hover {
  background: #555;
}

.backuply-cloud-gtext{
background: #FFB76B;
background: linear-gradient(to right, #FFB76B 0%, #FFA73D 30%, #FF7C00 60%, #FF7F04 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
font-size: 32px;
box-sizing: border-box;
font-weight: 700;
padding: 10px 0;
line-height: 1.0;
}

.backuply-cloud-gtext div:first-child{
font-size:40px;
}

.bcloud-banner-content{
color: #FFF;
font-weight: 500;
}

.backuply-trial-btn {
border: none;
display: inline-block;
border-radius: 5px;
color: white;
position: relative;
z-index: 1;
font-size: 12px;
padding: 10px 15px;
font-weight: 600;
margin: 0 auto;
text-transform: uppercase;
text-decoration:none;
}

.backuply-trial-btn:before, 
.backuply-trial-btn:after {
content: ' ';
position: absolute;
border-radius: 5px;
}

.backuply-trial-btn:before {
top: 0;
left: 0;
bottom: 0;
right: 0;
z-index: -2;
background: #FF7F04;
background: linear-gradient(to right, #FFB76B 0%, #FFA73D 30%, #FF7C00 60%, #FF7F04 100%);
}

.backuply-trial-btn:after {
top: 2px; 
bottom: 2px;
left: 2px;
right: 2px;
background-color: black;
z-index: -1;
opacity: 1;
transition: all 0.6s ease-in-out;
}

.backuply-trial-btn:hover:after {
opacity: 0;
}

.backuply-quota{
line-height: 1.5;
}

.backuply-update-quota{
cursor:pointer;
}

.backuply-placeholder{
display: inline-block;
min-height: 1em;
vertical-align: middle;
width:100%;
cursor: wait;
background: rgb(255,255,255);
background: linear-gradient(61deg, rgba(255,255,255,1) 0%, rgba(246,246,246,1) 100%);
-webkit-animation: backuply-placeholder-glow 2s ease-in-out infinite;
animation: backuply-placeholder-glow 2s ease-in-out infinite;
}

@keyframes backuply-placeholder-glow{
	50% {
		opacity: .2;
	}
}

#backuply-snackbar {
visibility: hidden;
min-width: 250px;
margin-left: -125px;
background-color: #333;
color: #fff;
text-align: center;
border-radius: 2px;
padding: 16px;
position: fixed;
z-index: 1;
left: 50%;
bottom: 30px;
}

#backuply-snackbar.backuply-visible {
visibility: visible;
-webkit-animation: backuply-fadein 0.5s, backuply-fadeout 0.5s 2.5s;
animation: backuply-fadein 0.5s, backuply-fadeout 0.5s 2.5s;
}

@keyframes backuply-fadein {
  from {bottom: 0; opacity: 0;}
  to {bottom: 30px; opacity: 1;}
}

@keyframes backuply-fadeout {
  from {bottom: 30px; opacity: 1;}
  to {bottom: 0; opacity: 0;}
}

.backuply-backup-uploader-selection{
border:4px dashed #d9d9d9;
border-radius:4px;
display:flex;
flex-direction:column;
align-items:center;
justify-content:center;
padding:20px;
}

.backuply-backup-uploader-selection p{
padding:0;
margin: 0;
text-align:center;
}

.backuply-highlight-drop-area{
background-color: rgba(56,120,255, 0.1);
border: 4px dashed #3878ff;
}

.backuply-upload-backup{
display:none;
width:100%;
border:1px solid #dbd8d8;
border-radius:7px;
margin-top:5px;
padding: 10px 15px;
box-sizing:border-box;
}

.backuply-upload-info-row{
display:flex;
justify-content:space-between;
align-items:center;
}

.backuply-upload-info-row img{
padding: 3px;
border: 1px solid #dcdcdc;
border-radius: 7px;
width: 40px;
}

.backuply-upload-stop-upload{
align-self:baseline;
cursor: pointer;
}

.backuply-upload-info{
display:flex;
gap:10px;
}

.backuply-upload-info-text{
display:flex;
flex-direction:column;
gap:7px;
}

.backuply-upload-info-text :first-child{
font-weight:600;
}

.backuply-upload-progress-row{
margin-top:10px;
display:flex;
align-items:center;
gap:5px;
}

.backuply-upload-bar{
width: 97%;
height: 10px;
background-color:#d9d9d9;
border-radius: 5px;
}

#backuply-upload-bar-progress{
width:0%;
background-color: #0096FF;
height:10px;
border-radius: 5px;
}

.backuply-upload-percentage{
font-size:12px;
}

.backuply-upload-alert {
display:none;
padding: 12px 15px;
margin: 5px auto;
line-height: 1.5;
border-radius: 5px;
border:1px solid #d9d9d9;
}

/* Pagination CSS*/
.backuply-tablenav{
height: 30px;
margin: 6px 0 4px;
padding-top: 5px;
}

#backuply-pagination{
display: flex;
justify-content: space-between;
align-items: center;
padding: 10px 0;
}

.backuply-pagination-links{
display:flex;
align-items:center; 
gap:10px;
}

a.button.backuply-prev-page,
a.button.backuply-next-page,
a.button.backuply-prev-first-page,
a.button.backuply-last-next-page{
background-color: #2271b1;
color: #fff;
}

.backuply-total-items,
.backuply-pagination-info,
.backuply-pagination-input{
font-weight: 600;
color:#555 ;
}

/* Input box */
.backuply-pagination-input input{
padding: 0px;
text-align: center;
}
assets/js/backuply.js000064400000153557151526424650010664 0ustar00/*
* BACKUPLY
* https://backuply.com
* (c) Backuply Team
*/


jQuery(document).ready(function(){
	
	backuply_handle_tab();
	
	// To Copy text on click
	jQuery('.backuply-code-copy').click( function() {
		navigator.clipboard.writeText(jQuery(this).parent().find('.backuply-code-text').text().trim());
		jQuery(this).parent().find('.backuply-code-copied').show();
		
		setTimeout(function() {
			jQuery('.backuply-code-copied').hide();
		},1500);
	});
	
	jQuery('[name="backuply_create_backup"]').click(function(e) {
		backuply_create_backup(jQuery(this), e);
	});
	
	jQuery('[name="backuply_stop_backup"], .backuply-stop-backup').click(function(e) {
		backuply_stop_backup(jQuery(this), e);
	});
	
	jQuery('#backuply-kill-process-btn').click(function(e) {
		e.preventDefault();
		let confirmation = confirm('Are you sure you want to kill this process ?');
		
		if(!confirmation){
			return;
		}
		
		backuply_kill_process(jQuery(this));
	});
	
	checkprotocol();
	jQuery('#protocol').change(function(){
		checkprotocol();
	});
	
	backuply_cron_backup_style(backuply_obj.cron_task);

	jQuery("#check_all_edit").on("click", function(event){
		if(this.checked == true){
			jQuery('[name="add_to_fileindex[]"]').prop("checked", true);
		}else{
			jQuery('[name="add_to_fileindex[]"]').prop("checked", false);
		}
	});
	
	jQuery('#backuply-htaccess-fix').click(function() {
		event.preventDefault();
		jQuery('#backuply-htaccess-modal').show();
	});
	
	jQuery('#backuply-index-html-fix').click(function() {
		event.preventDefault();
		jQuery('#backuply-index-html-modal').show();
	});
	
	jQuery('#backuply_retry_htaccess').click(function() {
		event.preventDefault();
		
		backuply_retry_htaccess(jQuery(this));
	});
	
	jQuery('.backuply-download-backup').click(function(){
		event.preventDefault();
		
		backuply_download_backup(jQuery(this));
	});
	
	// Listner to download Backuply Cloud Backups
	jQuery('.backuply-download-bcloud').click(function(){
		event.preventDefault();
		
		backuply_download_bcloud(jQuery(this));
	});
	
	// For Select all button on History tab
	jQuery('#backuply-bak-select-all').click(function() {
		event.preventDefault();
		const checkboxes = jQuery('[name="backuply_selected_bak[]"]');
		
		checkboxes.prop('checked', !checkboxes.prop('checked'));
	});
	
	// For Select all button delete
	jQuery('#backuply-bak-multi-delete').click(function() {
		event.preventDefault();
		backuply_bak_multi_delete(jQuery(this));
	});
	
	if(jQuery('#restore_message').length && jQuery('#restore_message').css('display') != 'none'){
		backuply_update_modal_str(true);
		setTimeout(backuply_backup_progress, 2000);
	}
	
	// Brings up Backup/Restore Status Modal
	jQuery('.backuply-check-status').click(function() {
		let is_restoring = false;
		
		if(jQuery(this).closest('#message').parent().prop('id') == 'restore_message'){
			is_restoring = true;
		}
		
		backuply_update_modal_str(is_restoring);

		jQuery('.backuply-modal').show();
		backuply_backup_progress();
	});
	
	
	// Last log for backup
	jQuery('.backuply-backup-last-log').click(function(){
		
		let file_name = jQuery(this).data('file-name'),
		proto_id = jQuery(this).closest('tr').data('proto-id'),
		log_name = 'Last Backup Log';
		
		if(file_name){
			log_name = 'Logs for ' + file_name.replace('_log.php', '');
		}

		jQuery('#backuply-backup-last-log').dialog({
			autoOpen: true,
			draggable: false,
			height: 600,
			width: 600,
			modal: true,
			title : log_name
		});

		backuply_load_last_logs(false, file_name, proto_id);
	});
	
	// Last Log for restore
	jQuery('.backuply-restore-last-log').click(function(){
		jQuery('#backuply-restore-last-log').dialog({
			autoOpen: true,
			draggable: false,
			height: 600,
			width: 600,
			modal: true,
			title : 'Last Restore Log'
		});
		
		backuply_load_last_logs(true);
	});
	
	
	jQuery('.backuply-update-quota').click(function(){
		let ele = jQuery(this),
		storage = ele.data('storage');
		
		if(!storage){
			return false;
		}
		
		ele.addClass('backuply-placeholder');
		ele.off('click');

		jQuery.ajax(({
			url: backuply_obj.ajax_url,
			method : 'POST',
			data : {
				'security' : backuply_obj.nonce,
				'action' : 'backuply_update_quota',
				'location': storage
			},
			success : function(res){
				if(res.success){
					location.reload();
					return;
				}

				let snackbar = jQuery('#backuply-snackbar');
				snackbar.text('Unable to fetch the Usage data');
				snackbar.addClass('backuply-visible');
				ele.removeClass('backuply-placeholder');
				setTimeout(function(){snackbar.removeClass('backuply-visible');}, 3000);
			}
		}))
	})
	
	
	let messages = jQuery('#restore_message, #process_message');

	messages.each((_, ele) => {
		if(jQuery(ele).css('display') == 'none') {
			return;
		}
		
		if(jQuery(ele).prop('id') == 'restore_message') {
			backuply_progress_init(true);
			return;
		}
	
		backuply_progress_init();
	});

	jQuery(function () {
		let form = jQuery('#add_backup_loc_form form'),
			submit_btn = form.find('button');
	
		form.find('[name="addbackuploc"]').val('true');
		
		jQuery('#add_backup_loc_form').dialog({
			autoOpen: false
		});

		// Add Backup Location listener
		jQuery('#add_backup_loc_btn').click(function() {
			form[0].reset();
			
			form.find('[name="protocol"]').prop('disabled', false);
			submit_btn.text('Add Backup Location');
			backuply_update_labels('ftp');
			checkprotocol();
			
			jQuery('#add_backup_loc_form').dialog({
				autoOpen: true,
				draggable: false,
				height: 600,
				width: 500,
				modal: true,
				title : 'Add Backup Location'
			});
		});
		
		// Edit Backup Listener
		jQuery('[name="backuply_edit_loc"]').click(function() {
			event.preventDefault();
			
			let loc_id = jQuery(this).closest('td').find('[name="edit_loc_id"]').val();

			form[0].reset();
			
			jQuery('#add_backup_loc_form').dialog({
				autoOpen: true,
				draggable: false,
				height: 600,
				width: 500,
				modal: true,
				title : 'Edit Backup Location'
			});

			// Edit Backup Location
			jQuery.ajax({
				url : backuply_obj.ajax_url,
				method : 'POST',
				data : {
					security : backuply_obj.nonce,
					loc_id : loc_id,
					action : 'backuply_get_loc_details'
				},
				success : function(res){
					if(res.message){
						alert(message);
						return;
					}
					
					form.find('[name="backuply_edit_location"]').val('true');
					form.find('[name="addbackuploc"]').val('');
					submit_btn.text('Edit Backup Location');
					
					let data = res.data;
						
					let inputs = {
						'location_name' : data.name ?  data.name : '',
						'protocol' : data.protocol ?  data.protocol : '',
						'aws_endpoint' : data.aws_endpoint ?  data.aws_endpoint : '',
						'aws_region' : data.aws_region ?  data.aws_region : '',
						'aws_accessKey' : data.aws_accessKey ?  data.aws_accessKey : '',
						'aws_secretKey' : data.aws_secretKey ?  data.aws_secretKey : '',
						'aws_bucketname' : data.aws_bucketname ?  data.aws_bucketname : '',
						's3_compatible' : data.s3_compatible ? data.s3_compatible : '',
						'aws_sse' : data.aws_sse ? data.aws_sse : '',
						'access_code' : data.access_code ?  data.access_code : '',
						'server_host' : data.server_host ?  data.server_host : '',
						'port' : data.port ?  data.port : '',
						'ftp_user' : data.ftp_user ?  data.ftp_user : '',
						'ftp_pass' : data.ftp_pass ?  data.ftp_pass : '',
						'backup_loc' : data.backup_loc ?  data.backup_loc : '',
						'edit_loc_id' : data.id ?  data.id : '',
						'bcloud_key' : data.bcloud_key ? data.bcloud_key : ''
					}
					
					for(const i in inputs){
						if(i == 'protocol') {
							// Disables protocol input
							form.find('[name="'+i+'"]').prop('disabled', true);
							
							if(inputs[i] in ['ftp', 'ftps', 'sftp', 'webdav']){
								backuply_update_labels(inputs[i]);
							}
						}
						
						form.find('[name="'+i+'"]').val(inputs[i]);
						
						if(inputs[i] && i == 'aws_sse' && inputs['protocol'] == 'aws'){
							form.find('[name="'+i+'"]').prop('checked', 'checked');
						}
						
					}
					
					jQuery('#edit-protocol').change(() => {
						checkprotocol();
					});
					checkprotocol();
				}
			});
		});
	});
	
	jQuery('#backuply-btn-upload-bak').on('click', function(){
		let title = jQuery('#backuply-upload-backup').attr('title');
		
		jQuery('#backuply-upload-backup').dialog({
			autoOpen: true,
			draggable: false,
			height: 430,
			width: 500,
			modal: true,
			title : title
		});
		
		// Triggers The Select file button
		jQuery('.backuply-upload-select-file-btn').off('click').on('click', function(){
			jQuery('#backuply-upload-backup-input').click();
		});

		jQuery(".backuply-backup-uploader-selection").on('dragenter', function(ev) {
			// Entering drop area. Highlight area
			jQuery(".backuply-backup-uploader-selection").addClass("backuply-highlight-drop-area");
		});

		jQuery(".backuply-backup-uploader-selection").on('dragleave', function(ev) {
			// Going out of drop area. Remove Highlight
			jQuery(".backuply-backup-uploader-selection").removeClass("backuply-highlight-drop-area");
		});

		jQuery('.backuply-upload-stop-upload').off('click').on('click', function(ev){
			backuply_obj.upload_aborted = true;
		});

		jQuery(".backuply-backup-uploader-selection").on('drop', backuply_upload_backup);
		jQuery("#backuply-upload-backup-input").off().on('change', backuply_upload_backup);
		
		jQuery(".backuply-backup-uploader-selection").on('dragover', function(ev) {
			ev.preventDefault();
		});

	});
	

	if(jQuery('.error').length > 0 && window.location.hash == '#backuply-location') {
		jQuery('#add_backup_loc_form').dialog({
			autoOpen: true,
			draggable: false,
			height: 600,
			width: 500,
			modal: true
		});
	}
	
	jQuery('#backuply-btn-sync-bak').click(function() {
		event.preventDefault();
		backuply_sync_backup(jQuery(this));
	});
	
	jQuery('#backuply-exclude-file-pattern').click(function() {
		jQuery('#backuply-exclude-pattern').dialog({
			autoOpen: true,
			draggable: false,
			height: 500,
			width: 490,
			modal: true,
			title : 'Exclude Pattern'
		});

		backuply_handle_exclude_pattern(jQuery('#backuply-exclude-pattern'));
	});

	jQuery('#backuply-exclude-file-specific').click(function() {
		jQuery('#backuply-exclude-specific').dialog({
			autoOpen: true,
			draggable: false,
			height: 600,
			width: 500,
			modal: true,
			title : 'Exclude Specific File/Folder'
		});
		
		backuply_exclude_specific(jQuery('#backuply-exclude-specific'));
	});
	
	jQuery('.backuply-pattern-delete').on('click', backuply_delete_exclude_rule);
	
	jQuery('.backuply-js-tree').jstree({
		'core' : {
			'multiple' : false,
			'data' : function(node, cb){
				jQuery.ajax({
					method : 'POST',
					url : backuply_obj.ajax_url,
					data : {
						action : 'backuply_get_jstree',
						security : backuply_obj.nonce,
						nodeid : node,
					},
					success : function(res){
						cb.call(this, res.nodes);
					}
				})
			},
			
		}
	});
});

// Handles Dashboard Tabs
function backuply_handle_tab() {

	var backuply_tabs = jQuery('.nav-tab-wrapper'),
	backuply_tab;
	
	if(!window.location.hash || jQuery(window.location.hash).length == 0) {
		jQuery('.backuply-tab').hide();
		jQuery('#backuply-dashboard').show();
		backuply_tab = backuply_tabs.find('[href="#backuply-dashboard"]');
	} else {
		jQuery('.backuply-tab').hide();
		jQuery(window.location.hash).show();
		backuply_tab = backuply_tabs.find('[href="'+window.location.hash+'"]');
	}
	
	backuply_tab.addClass('nav-tab-active');
	
	jQuery('.backuply-tab-wrapper .nav-tab').click(function() {
		event.preventDefault();
		history.replaceState({}, '', event.target.href);
		jQuery('.backuply-tab').hide();
		jQuery(window.location.hash).show();
		
		backuply_tab = backuply_tabs.find('[href="'+window.location.hash+'"]');
		backuply_tabs.find('.nav-tab-active').removeClass('nav-tab-active');
		backuply_tab.addClass('nav-tab-active');	
	});
}

function backuply_kill_process(jEle) {
	
	jEle.siblings('button').addClass('backuply-disabled').off('click');
	
	jQuery.ajax({
		method : 'GET',
		url : backuply_obj.ajax_url + '?action=backuply_kill_proccess&security=' + backuply_obj.nonce,
		success : function(res) {
			if(!res.success) {
				alert('Something went wrong unable to kill process');
				return;
			}
			
			alert('The process was killed successfully, Now we will reload the page');
			location.reload();
		}
	});
}

function backuply_update_modal_str(is_restore = false) {
	let modal = jQuery('#backuply-backup-progress');
	
	if(is_restore) {
		modal.find('.backuply-title-restore').show();
		modal.find('.backuply-title-backup').hide();
		modal.find('.backuply-progress-extra-restore').show();
		modal.find('.backuply-progress-extra-backup').hide();
		modal.find('.backuply-loc-restore-name').show();
		modal.find('.backuply-loc-bak-name').hide();
		modal.find('.backuply-stop-backup').hide();
		
		return;
	}
	
	//When we are backing-up
	modal.find('.backuply-title-restore').hide();
	modal.find('.backuply-title-backup').show();
	modal.find('.backuply-progress-extra-restore').hide();
	modal.find('.backuply-progress-extra-backup').show();
	modal.find('.backuply-loc-bak-name').show();
	modal.find('.backuply-loc-restore-name').hide();
}

// Deletes multiple selected backups
function backuply_bak_multi_delete(jEle) {
	event.preventDefault();
	
	const sel_bak = jQuery('[name="backuply_selected_bak[]"]:checked'),
		tab = jEle.closest('#backuply-history'),
		spinner = tab.find('.spinner');
		
	
	if(sel_bak.length < 1) {
		alert('No Backup Selected For Deletion');
		return;
	}
	
	const do_delete = confirm('You are about to delete ' + (sel_bak.length) + ' backup(s)\n\n Are you sure you want to delete?');

	if(!do_delete) {
		return;
	}
	
	sel_bak.each((_, bak) => {
		let bak_name = jQuery(bak).val(),
			row = tab.find('[value="'+ bak_name +'"]').closest('tr');
		
		//AJAX Call
		jQuery.ajax({
			method : 'POST',
			url : backuply_obj.ajax_url,
			data : {
				action : 'backuply_multi_backup_delete',
				security : backuply_obj.nonce,
				backup_name : bak_name
			},
			beforeSend : function() {
				spinner.addClass('is-active');
				row.css('background-color', '#f2c2c2');
			},
			success : function(res) {
				if(!res.success) {
					alert(res.message ? res.message : 'Something went wrong!');
					spinner.removeClass('is-active');
					return;
				}
				
				row.remove();
				spinner.removeClass('is-active');
			}
		});
	});
}

// AJAX Call to retry creation of htaccess
function backuply_retry_htaccess(jEle) {
	
	jQuery.ajax({
		method : 'GET',
		url : backuply_obj.ajax_url,
		data : {
			'action' : 'backuply_retry_htaccess',
			'security' : backuply_obj.nonce
		},
		beforeSend : function() {
			jEle.empty();
			jEle.append('Trying...');
		},
		success : function(res) {
			jEle.empty().text('Click Here');
			
			if(!res.success) {
				if(res.message) {
					alert(res.message);
				} else {
					alert('We are unable to create the htaccess file');
				}
			}
			
			setTimeout(() => {
				location.reload();
			}, 2000);
			
			return;
		}
	});
}

// Event handler for Stop backup
function backuply_stop_backup(jEle) {
	event.preventDefault();
	
	jQuery.ajax({
		method : 'GET',
		url  : backuply_obj.ajax_url,
		data : {
			action : 'backuply_stop_backup',
			security : backuply_obj.nonce
		},
		success : function(res) {
			if(!res.success) {
				alert('Unable to stop the backup');
				return;
			}
			
			jEle.text('Stopping...').prop('disabled', true).off('click');
		}
	});
}

// Event handler for create backup
function backuply_create_backup(jEle) {
	event.preventDefault();
	
	var form = jEle.closest('form'),
		values = form.serializeArray();
		
	var new_obj = {};
	
	for(let val of values) {
		new_obj[val['name']] = val['value'];
	}
	
	if(!new_obj['backup_db'] && !new_obj['backup_dir']) {
		alert('Please select an option to backup');
		return;
	}
	
	backuply_update_modal_str();
	
	let modal = jQuery('#backuply-backup-progress'),
		image = modal.find('.backuply-modal-bak-icon'),
		protocol = jEle.closest('form').find('select option:selected').data('protocol'),
		proto_name = jEle.closest('form').find('select option:selected').text(),
		bak_name = modal.find('.backuply-loc-bak-name');

	proto_name = proto_name.match(/^(.+?)(?=\()/);
	bak_name.text('Backup Location: ' + proto_name[0]);
	image.prop('src', backuply_obj.images + (protocol ? protocol : 'local') + '.svg');
	
	modal.find('.backuply-backup-status').empty();
	modal.find('.backuply-progress-value').css('width', '0%');
	modal.find('.dashicons-no').show();
	modal.data('process', 'backup');

	modal.show();
	
	backuply_progress_init();

	jQuery.ajax({
		method : 'POST',
		url : backuply_obj.ajax_url,
		data : {
			action : 'backuply_create_backup',
			security : backuply_obj.nonce,
			values : JSON.stringify(new_obj)
		},
		success : function(res){
			if(!res.success) {
				alert(res.message ? res.message : 'Something went Wrong!, Try again later');
				return;
			}
			
			backuply_backup_progress();
		}
	})
}

let backuply_status = {
	has_ended : false,
	fail_count : 0,
	has_ended : false
};

// Sets up Progress Modal
function backuply_progress_init(is_restore = false, title = 'Backup') {
	let modal = jQuery('#backuply-backup-progress');
	
	modal.on('click', '.dashicons-no', function() {
		modal.hide();
	});
	modal.find('.backuply-backup-status').empty();
	modal.find('.backuply-progress-value').css('width', '0%').text('0%');
	jQuery('[name="backuply_create_backup"]').addClass('backuply-disabled');
	jQuery('[name="backuply_stop_backup"]').prop('disabled', false);
	
	if(is_restore) {
		modal.find('.backuply-title-restore').show();
		modal.find('.backuply-title-backup').hide();
		modal.find('.backuply-progress-extra-text').text('We are restoring your files it may take some time.');
	} else {
		modal.find('.backuply-title-restore').hide();
		modal.find('.backuply-title-backup').show();
	}
	
	if(!is_restore) {
		jQuery('#process_message').show();
	}
	
	backuply_status.is_restore = is_restore;
	
	// let interval = setInterval(() => {
		// if(backup_status.has_ended) {
			// clearInterval(interval);
			// return;
		// }
		
		// backuply_backup_progress();
	// }, 2000);
}

// Toggles additional file option
function toggle_advoptions(ele){
	
	let target = jQuery('#' + ele);
	
	if (target.is(':hidden')){
		target.slideDown('slow');
		target.prev().attr('class', 'dashicons-before dashicons-minus');
	}
	else{
		target.slideUp('slow');
		target.prev().attr('class', 'dashicons-before dashicons-plus-alt');
	}
}

function conf_del(conf_msg){
	return confirm(conf_msg);
}

function checkprotocol(is_edit = false){
	
	let edit_str = is_edit ? '#edit-' : '#',
		protocol_id = edit_str + 'protocol',
		port_id = edit_str + 'port';
	
	if(jQuery(protocol_id).val() == 'ftp' || jQuery(protocol_id).val() == 'softftpes'){
		//alert('insode ftp');
		if(jQuery(port_id).val() == '' || jQuery(port_id).val() == '22' || jQuery(port_id).val() == '443'){
			jQuery(port_id).val('21');
		}
		
		if(jQuery(protocol_id).val() == 'ftp') {
			backuply_update_labels('ftp');
		} else {
			backuply_update_labels('ftps');
		}
		
		show_ftp();
		hide_aws_s3bucket();
		hide_dropbox();
		backuply_toggle_bcloud();
	}

	if(jQuery(protocol_id).val() == 'softsftp'){
		backuply_update_labels('sftp');
		update_sftp_loc_desc(true);

		if(jQuery(port_id).val() == '' || jQuery(port_id).val() == '21' || jQuery(port_id).val() == '443'){
			jQuery(port_id).val('22');
		}
		
		show_ftp();
		hide_aws_s3bucket();
		hide_dropbox();
		backuply_toggle_bcloud();
	} else {
		update_sftp_loc_desc();
	}

	if(jQuery(protocol_id).val() == 'webdav'){

		backuply_update_labels('webdav');
		
		if(jQuery(port_id).val() == '' || jQuery(port_id).val() == '21'){
			jQuery(port_id).val('443');
		}
		
		show_ftp();
		hide_aws_s3bucket();
		hide_dropbox();
		backuply_toggle_bcloud();
	}

	if(jQuery(protocol_id).val() == 'gdrive' || jQuery(protocol_id).val() == 'onedrive'){
		hide_ftp();
		hide_aws_s3bucket();
		hide_dropbox();
		backuply_toggle_bcloud();
	}	
	
	if(jQuery(protocol_id).val() == 'bcloud'){
		hide_ftp();
		hide_aws_s3bucket();
		hide_dropbox();
		backuply_toggle_bcloud(false);
	}

	if(jQuery(protocol_id).val() == 'aws' || jQuery(protocol_id).val() == 'caws'){
		hide_ftp();
		show_aws_s3bucket();
		hide_dropbox();
		backuply_toggle_bcloud();
		
    // Toggles S3 Compatible Options
		if(jQuery(protocol_id).val() == 'caws'){
			jQuery('.bakuply-s3-compatible').show();
			jQuery('.aws_sse').hide();
		} else {
			jQuery('.bakuply-s3-compatible').hide();
			jQuery('.aws_sse').show();
		}
		
	}

	if(jQuery(protocol_id).val() == 'dropbox'){
		//alert('hide ftp');
		hide_ftp();
		hide_aws_s3bucket();
		show_dropbox();
		backuply_toggle_bcloud();
	}

}

function backuply_toggle_bcloud(show = true){
	
	if(!show){
		jQuery('[for="location_name"]').closest('div').hide();
		jQuery('[for="backup_loc"]').closest('div').hide();
		jQuery('div > [for="backuply-cloud-key"]').closest('div').show();
		
		return;
	}
	
	jQuery('div > [for="location_name"]').closest('div').show();
	jQuery('div > [for="backup_loc"]').closest('div').show();
	jQuery('[for="backuply-cloud-key"]').closest('div').hide();
}

function backuply_update_labels(protocol = 'ftp') {
	let s_host_desc = jQuery('[name="server_host"]').parent().find('.backuply-opt-label__helper'),
		port_desc = jQuery('[name="port"]').parent().find('.backuply-opt-label__helper'),
		uname_label = jQuery('[name="ftp_user"]').parent().find('.backuply-opt-label__title'),
		uname_desc = jQuery('[name="ftp_user"]').parent().find('.backuply-opt-label__helper'),
		pass_label = jQuery('[name="ftp_pass"]').parent().find('.backuply-opt-label__title'),
		pass_desc = jQuery('[name="ftp_pass"]').parent().find('.backuply-opt-label__helper');

	let fileds = {
		'ftp' : {
			's_host' : ['Enter the server host e.g. ftp.mydomain.com'],
			'port' : ['Enter the port to connect (default FTP port is 21)'],
			'u_name' : ['The Username of your FTP Account', 'FTP Username'],
			'pass' : ['The Password of your FTP account', 'FTP Password']
		},
		'ftps' : {
			's_host' : ['Enter the server host e.g. ftps.mydomain.com'],
			'port' : ['Enter the port to connect (default FTPS port is 21)'],
			'u_name' : ['The Username of your FTPS Account', 'FTPS Username'],
			'pass' : ['The Password of your FTPS account', 'FTPS Password']
		},
		'sftp' : {
			's_host' : ['Enter the server host e.g. sftp.mydomain.com'],
			'port' : ['Enter the port to connect (default SFTP port is 22)'],
			'u_name' : ['The Username of your SFTP Account', 'SFTP Username'],
			'pass' : ['The Password of your SFTP account', 'SFTP Password']
		},
		'webdav' : {
			's_host' : ['Enter the server host e.g. webdav.mydomain.com'],
			'port' : ['Enter the port to connect (default WebDAV port is 443)'],
			'u_name' : ['The Username of your WebDAV Account', 'WebDAV Username'],
			'pass' : ['The Password of your WebDAV account', 'WebDAV Password']
		}
	}
	
	s_host_desc.text(fileds[protocol]['s_host'][0]);
	port_desc.text(fileds[protocol]['port'][0]);
	uname_label.text(fileds[protocol]['u_name'][1]);
	uname_desc.text(fileds[protocol]['u_name'][0]);
	pass_label.text(fileds[protocol]['pass'][1]);
	pass_desc.text(fileds[protocol]['pass'][0]);
}

function show_ftp(){
	jQuery('[name="backup_loc"]').parent().find('.backuply-opt-label__title').text('Backup Location (Required)');
	jQuery('.ftp_details').show();
	jQuery('.ftp_credentials').show();
}

function hide_ftp(){
	jQuery('[name="backup_loc"]').parent().find('.backuply-opt-label__title').text('Backup Location (Optional)');
	jQuery('.ftp_details').hide();
	jQuery('.ftp_credentials').hide();
}

// Updates the description of SFTP as it requires ABSOLUTE PATH
function update_sftp_loc_desc(is_sftp = false) {
	let desc_holder = jQuery('[name="backup_loc"]').parent().find('.backuply-opt-label__helper');
	
	if(is_sftp) {
		desc_holder.text('Absolute path to backup directory e.g. /home/USERNAME/backups');
		return;
	}
	
	desc_holder.text('Backup Directory e.g. /backups or you can leave empty to allow Backuply to manage the');
}

function show_aws_s3bucket(){
	jQuery('.aws_s3bucket').show();
}

function hide_aws_s3bucket(){
	jQuery('.aws_s3bucket').hide();
}

function show_dropbox(){
	jQuery('.dropbox_authorize').show();
}

function hide_dropbox(){
	jQuery('.dropbox_authorize').hide();
}

//TOOD:: Not required
if(window.location.href.indexOf('&addbackuploc') > -1){
	var reload_url = window.location.href;
	
	// Truncate unnecessary part of URL
	reload_url_arr = reload_url.split('&addbackuploc=');

	// Try to update url without reloading the window
	if (typeof (history.pushState) != 'undefined') {
		history.pushState({}, null, reload_url_arr[0]);
	} else {
		if(window.location.href != reload_url_arr[0]){
			window.location.href = reload_url_arr[0];
		}
	}
}

// Disabling Buttons when restoring or backingup
function backuply_backup_style(style_for){
	var input_button = jQuery('.button');
	var other_inputs = jQuery('.disable');
	input_button.prop('disabled', true);
	input_button.val('Backup is in process');

	switch(style_for){
		case 1:
			var backup_message = jQuery('#process_message');
			backup_message.show();
			input_button.val('Backingup...');
			break;
		case 2:
			var backup_message = jQuery('#restore_message');
			backup_message.show();
			input_button.val('Restoring...');
			break;
	}
	
	other_inputs.prop('disabled', true);
}

// Updates the Backup status in the Modal
function backuply_backup_progress() {
	const progress = jQuery('.backuply-progress-value'),
	modal = progress.closest('.backuply-modal'),
	status_box = jQuery('.backuply-backup-status'),
	stop_modal = jQuery('.backuply-stop-backup');

	backuply_obj.status_req_url = backuply_obj.ajax_url + '?action=backuply_check_backup_status';
	
	if(backuply_status.hasOwnProperty('is_restore') && backuply_status.is_restore){
		if(!backuply_status.progress){
			backuply_status.progress = 0;
		}

		if(backuply_obj.status_url_code && backuply_obj.status_url_code == 1){
		  backuply_obj.status_req_url = backuply_obj.site_url + '/backuply-restore.php?status_key=' + backuply_obj.status_key;

		} else if(backuply_obj.status_url_code && backuply_obj.status_url_code == 2){
		  backuply_obj.status_req_url = backuply_obj.ajax_url + '?action=backuply_restore_status_log&status_key=' + backuply_obj.status_key;
		}else {
		  // We will first try the status_log option only as, limit users face issue with this version and when using this we dont need to use the ajax method.
		  backuply_obj.status_req_url = backuply_obj.backuply_url + '/status_logs.php?status_key=' + backuply_obj.status_key;
		}
	}

	if(!backuply_status.hasOwnProperty('is_restore')) {
		const stop = progress.closest('.backuply-settings-block').find('[name="backuply_stop_backup"]');
		stop_modal.show();
	}
	
	let ajax_data = {};
	
	backuply_status.last_status = backuply_status.last_status ? backuply_status.last_status : 0;
	
	ajax_data['last_status'] = backuply_status.last_status;
	ajax_data['security'] = backuply_obj.nonce;
	
	if(backuply_status.hasOwnProperty('is_restore')) {
		ajax_data['is_restore'] = backuply_status['is_restore'];
		ajax_data['backup_name'] = backuply_status['backup_name'];
	}

	jQuery.ajax({
		method : 'POST',
		url : backuply_obj.status_req_url,
		data : ajax_data,
		success : function(res) {
			backuply_obj.progress_retry = 0;
			
			if(!res.success) {
				backuply_status.fail_count++;
				
				if(backuply_status.fail_count > 15) {
					alert(res.message ? res.message : 'Something went wrong!');
					backuply_status.has_ended = true;
					return;
				}
			}
			
			if(!res.progress_log) {
				setTimeout(backuply_backup_progress, 2000);
				return;
			}
			
			backuply_status.last_status += res.progress_log.length;

			res.progress_log = res.progress_log.split('\n');
			let html = '';
			
			for(let text of res.progress_log) {
				if(!text){
					continue;
				}
				
				if(!text.includes('|')) {
					continue;
				}
				
				if(backuply_status.has_ended){
					break;
				}
				
				// Splitting the log to extract the data for render
				let [log, status, percent] = text.split('|'),
					color = '';
				percent = parseInt(percent);
				
				// Getting the color of the log
				switch(status) {
					case 'info':
						color = 'yellow';
						break;
					
					case 'error': 
						color = 'red';
						break;
						
					case 'warning':
						color = 'orange';
						break;
						
					case 'success':
						color = 'rgb(102, 187, 106)';
						break;
				}
				
				backuply_status.progress = parseInt(backuply_status.progress);
				
				if(backuply_status.progress && backuply_status.progress > percent) {
					percent = backuply_status.progress;
				}
				
				// Updating Progress Bar
				if(percent < 0 ) {
					progress.css('width', '100%').text('Stopping...');
					
					if(!backuply_status.hasOwnProperty('is_restore')) {
						stop.off('click').text('Stopping...').prop('disabled', true);
					}
				} else if(percent != 0 && backuply_status.progress != percent){
					
					setTimeout(() => {
						progress.css('width', percent + '%').text(percent + '%');
					}, 300); 
				}
				
				if(percent == 100 && stop_modal != 'undefined') {
					stop_modal.off('click').prop('disabled', true).addClass('backuply-disabled');
				}
				
				if(backuply_status.progress != percent){
					backuply_status.progress = percent;
				}
				
				if(status == 'uploading' || status == 'downloading') {
					if(status_box.find('.backuply-upload-progress')) {
						status_box.find('.backuply-upload-progress').remove();
					}
					status_box.append(log);
				} else {
					html += '<p'+ (color ? ' style="color:'+color+'"' : '')+ '>';
					
					if(status == 'success') {
						// This is to show a link to rate plugin only if the restore has been success.
						if(log == 'Restore performed successfully.'){
							jQuery('#backuply-rate-on-restore').show();
						}

						html += '<span class="dashicons dashicons-saved"></span>';
					}

					html += log;
					html += '</p>';

				}
				
				// Toggeling State of buttons on success and error
				if(status == 'success' || status == 'error' || res.progress == '100') {
					let finish_btn = modal.find('.backuply-backup-finish');
					finish_btn.prop('disabled', false).removeClass('backuply-disabled');
					
					if(!backuply_status.hasOwnProperty('is_restore')) {
						stop.off('click').prop('disabled', false).addClass('backuply-disabled');
						stop.parent().prev().find('button').addClass('backuply-disabled').off('click');
						stop_modal.off('click').prop('disabled', false).addClass('backuply-disabled');
					} else {
						let modal = finish_btn.closest('.backuply-modal'),
						modal_header = modal.find('.backuply-title-backup'),
						modal_extra = modal.find('.backuply-progress-extra-backup');
						
						if(status == 'success'){
							modal_header.text('Backup Completed successfully 🎉');
							modal_extra.slideUp();
						}
					}
					
					finish_btn.click( function() {
						modal.hide();
						location.reload();
					});
					
					backuply_status.has_ended = true;
					backuply_obj.process_ended = true;
				}
			}
			
			if(html){
				status_box.append(html);
				status_box.scrollTop(status_box[0].scrollHeight); //Keeps the Scroll at bottom
			}
			
			if(!backuply_status.has_ended){
				setTimeout(backuply_backup_progress, 2000);
			}
		}, error : function(res){
			if(!res){
				return;
			}

			if(res.status == 403 || res.status == 404){
				if(!backuply_obj.status_url_code){
					backuply_obj.status_url_code = 1;
					backuply_backup_progress();
				} else if(backuply_obj.status_url_code && backuply_obj.status_url_code == 1) {
					backuply_obj.status_url_code = 2;
					backuply_backup_progress();
				}
			}

			// If the status check failed we need to retry
			if(res.status > 499 && (!backuply_obj.hasOwnProperty('progress_retry') || backuply_obj.progress_retry < 3)){
				if(typeof backuply_obj.progress_retry == 'undefined'){
					backuply_obj.progress_retry = 0;
				}

				let retry_time_seconds = 2000;
				backuply_obj.progress_retry++;
				
				// 508 response code means server detected our requests as a loop
				// So we will delay our request a little, so we can get over the server detection time frame.
				if(res.status == 508){
					retry_time_seconds = 5000;
				}

				setTimeout(backuply_backup_progress, retry_time_seconds);	
			}
		}
	});
}

// Event handler for restore
function backuply_restorequery(form_id){
	event.preventDefault();
	
	var inputs = jQuery(form_id+' :input');
	var link = backuply_obj.ajax_url;
	
	var cnfm = confirm('Are you sure you want to Restore?');
	if(!cnfm){
		return;
	}
	
	var last_cnfm = confirm('This is the last confirmation!\nRestoration is an irreversible process, do you still want to continue?');
	if(!last_cnfm){
		return;
	}
	
	var failed = false,
	error_message = 'Somethign Went Wrong';

	jQuery.ajax({
		method : 'POST',
		async : false,
		url : backuply_obj.ajax_url,
		data : {
			'action' : 'backuply_get_restore_key',
			'security' : backuply_obj.nonce,
		},
		success : function(res){
			if(res.restore_key){
				backuply_obj.restore_key = res.restore_key;
				backuply_obj.backuply_key = res.backuply_key;
				return;
			}

			if(!res.success){
				error_message = res.message;
				failed = true;
			}
      
      failed = true;
		}
	});
	
	if(failed){
		alert(error_message);
		return;
	}

	backuply_backup_style(2);
	
	var data = new Object();
	data['action'] = 'backuply_restore_curl_query';
	data['sess_key'] = backuply_obj.creating_session;
	
	inputs.each(function(){
		data[this.name] = jQuery(this).val();
		data['security'] = backuply_obj.nonce;
	});
	
	backuply_update_modal_str(true);
	
	let modal = jQuery('#backuply-backup-progress'),
		image = modal.find('.backuply-modal-bak-icon'),
		protocol = inputs.closest('form').data('protocol'),
		proto_name = inputs.closest('form').data('bak-name'),
		restore_name = modal.find('.backuply-loc-restore-name');

	image.prop('src', backuply_obj.images + (protocol ? protocol : 'local') + '.svg');
	restore_name.text('Restoring From: ' + proto_name);
	modal.find('.dashicons-no').hide();
	modal.data('process', 'restore');
	
	
	modal.find('.backuply-backup-status').empty();
	modal.find('.backuply-stop-backup').hide();
	modal.show();	
	
	backuply_progress_init(true, 'Restore');
	
	jQuery.post(link, data, function(res) {								
		backuply_backup_progress();		
		setTimeout(backuply_heartbeat, 2000);
	});
}

function backuply_heartbeat(){
	jQuery.ajax({
		method : 'GET',
		url : backuply_obj.ajax_url + '?action=backuply_creating_session&security='+backuply_obj.restore_key+'&sess_key='+backuply_obj.creating_session,
		success : function(res){
			if(res.success == true){
				return;
			}
			
			if(!backuply_obj.process_ended){
				setTimeout(backuply_heartbeat, 2000);
			}
		},
		error: function(){
			if(!backuply_obj.process_ended){
				setTimeout(backuply_heartbeat, 2000);
			}
		}
	});
}


// Downloads the backup file
function backuply_download_backup(jEle) {
	
	let file_name = jEle.data('name'),
	progress_btn = jEle.next();

	jQuery.ajax({
		method : 'GET',
		url : backuply_obj.ajax_url,
		xhrFields : {
			responseType : 'arraybuffer'
		},
		data : {
			action : 'backuply_download_backup',
			backup_name : file_name,
			security : backuply_obj.nonce
		},
		xhr: function () {
			jEle.hide();
			progress_btn.show();

			var xhr = new window.XMLHttpRequest();
			//Download progress
			xhr.addEventListener('progress', function (evt) {

				if (evt.lengthComputable) {
					var percent_complete = evt.loaded / evt.total;
					progress_btn.text(Math.round(percent_complete * 100) + '% Downloading');
				}
			}, false);
			return xhr;
		},
		success : function(res) {
			
			if(res.hasOwnProperty('success')) {
				alert(res.message);
			}
			
			let a = document.createElement('a'),
				url = URL.createObjectURL(new Blob([res], {type : 'application/octet-stream'}));
			
			a.href = url;
			a.download = file_name;
			
			document.body.append(a);
			a.setAttribute('target', '_blank');
			a.click();
			a.remove();
			window.URL.revokeObjectURL(url);
			
			// Toggle download buttons
			progress_btn.text('0% Downloading');
			progress_btn.hide();
			jEle.show();
		}
	});
}

// Updates state of Auto backup option when Auto Backup is changed
function backuply_cron_backup_style(select_value){
	
	if(typeof select_value == 'object' && select_value.backuply_custom_cron) {
		select_value = 'custom';
	}
	
	jQuery('#backuply-custom-cron').hide();
	jQuery("#backuply_cron_checkbox").show();
	jQuery('#backup_rotation').prop('disabled', false);
	
	if(!select_value) {
		jQuery("#backuply_cron_checkbox").hide();
		jQuery('#backup_rotation').prop('disabled', true);
	}
	
	if(select_value == 'custom') {
		jQuery('#backuply-custom-cron').show();
	}
}

function backuply_close_modal(ele) {
	jQuery(ele).closest('.backuply-modal').hide();
}

function backuply_sync_backup(jEle) {

	let loc_id = jEle.prev().val(),
		tab = jEle.closest('#backuply-history'),
		spinner = tab.find('.spinner');
	
	jQuery.ajax({
		method : 'GET',
		url : backuply_obj.ajax_url + '?action=backuply_sync_backups&id='+loc_id+'&security='+backuply_obj.nonce,
		beforeSend: function() {
			spinner.addClass('is-active');
		},
		success : function(res){
		
			if(!res.success){
				if(!res.message){
					alert('Something went wrong please try later');
				}
				
				alert(res.message);
				return;
			}
			
			location.reload();
			spinner.removeClass('is-active');
			
		}
	});
}

// Loads last logs
function backuply_load_last_logs(is_restore, file_name = '', proto_id = ''){
	
	let id = '#backuply-backup-last-log';
	
	if(is_restore) {
		id = '#backuply-restore-last-log';
	}
	
  let modal = jQuery(id),
	spinner = modal.find('.spinner'),
	inside = modal.find('.backuply-last-logs-block');
	
	modal.find('.backuply-last-logs-block').empty();
	
	let ajax_url = backuply_obj.ajax_url + '?action=backuply_last_logs';
	
	if(is_restore){
		ajax_url += '&is_restore=true'; 
	} else {
		ajax_url += '&file_name=' + file_name;
		ajax_url += '&proto_id=' + proto_id;
	}
	
	ajax_url += '&security='+ backuply_obj.nonce;

	jQuery.ajax({
		method : 'GET',
		url : ajax_url,
		beforeSend: function() {
			spinner.addClass('is-active');
		},
		success: function(res) {
			spinner.removeClass('is-active');
			
			if(!res.success || !res.progress_log){
				inside.append('No log found!');
				return;
			}
			
			res.progress_log = res.progress_log.split('\n');
			
			for(let text of res.progress_log) {
				if(!text){
					continue;
				}
				
				if(!text.includes('|')) {
					continue;
				}
				
				let [log, status] = text.split('|'),
				color = '';
				
				switch(status) {
					case 'info':
						color = 'yellow';
						break;
					
					case 'error': 
						color = 'red';
						break;
						
					case 'success':
						color = 'rgb(102, 187, 106)';
						break;
				}
			
				if(status == 'uploading' || status == 'downloading') {
					if(inside.find('.backuply-upload-progress')) {
						inside.find('.backuply-upload-progress').remove();
					}
					inside.append(log);
				} else {
					let html = '<p'+ (color ? ' style="color:'+color+'"' : '')+ '>';
					
					if(status == 'success') {
						html += '<span class="dashicons dashicons-saved"></span>';
					}
					
					html += log;
					html += '</p>';
					
					inside.append(html);
				}
			}
			
		}
		
	});
}

function backuply_handle_exclude_pattern(jEle){
	
	let add_btn = jEle.find('.backuply-pattern-insert');
	
	// Adds the Exclude pattern using enter
	jQuery('[name="exclude_pattern_val"]').off().on('keypress', function() {
		if(event.key == 'Enter') {
			let block = jQuery(this).closest('.backuply-exclude-pattern-block');
			block.find('.backuply-pattern-insert').trigger('click');
		}
	})
	
	function add_btn_handler() {
		let ele = jQuery(this).closest('.backuply-exclude-pattern-block'),
		type = ele.find('select'),
		pattern = ele.find('input'),
		html = '',
		type_val = type.val(),
		pattern_val = pattern.val();

		if(!pattern_val){
			alert('Add a pattern');
			return;
		}
		
		if(ele.data('type')){
			type_val = ele.data('type');
		}
		
		types = {
			'extension' : 'With specific extension',
			'beginning' : 'At beginning',
			'end' : 'At end',
			'anywhere' : 'Anywhere'
		};
		
		if(!ele.data('type')){
			html = '<div class="backuply-exclude-pattern-block" data-edit="true" data-type="'+type_val+'">'+
				'<span class="backuply-exclude-pattern-type">'+ types[type_val] + '</span>'+
				'<span class="backuply-exclude-pattern-val"><input type="text" name="exclude_pattern_val" style="width:90%;" value="'+ pattern_val + '" disabled/></span>'+
				'<span class="dashicons dashicons-trash backuply-pattern-delete" style="display:none;"></span>'+
				'<span class="dashicons dashicons-edit backuply-pattern-edit"></span>'+
				'<span class="dashicons dashicons-insert backuply-pattern-insert" style="display:none;"></span>'+
				'<span class="spinner is-active"></span>'+
			'</div>';
			
			jEle.append(html);
			
			type.val('extension');
			pattern.val('');
		}
		
		if(ele.data('type')){
			save_ele = ele;
		} else{
			save_ele = jEle.last();
		}

		let data = {pattern: pattern_val, type : type_val}
		
		if(ele.data('key')){
			data['key'] = ele.data('key');
		}

		save_rules(data, save_ele);
		
	}
	
	// Gets triggred when edit it clicked
	function edit_btn_handler() {
		let block = jQuery(this).closest('.backuply-exclude-pattern-block');
		
		change_action_state(block, 'insert');
		block.find('input').prop('disabled', false);
		
	}
	
	// Ajax request to save or update the exclude rule
	function save_rules(data, jEle) {
		
		let request_data = data;
		request_data['action'] = 'backuply_save_excludes';
		request_data['security'] = backuply_obj.nonce;

		jQuery.ajax({
			method : 'POST',
			url : backuply_obj.ajax_url,
			data : request_data,
			success: function(res){

				if(!res.success){

					if(res.message){
						if(jEle.data('type')){
							change_action_state(jEle, 'edit');
							jEle.find('input').prop('disabled', true);
						} else {
							jEle.remove();
							
						}
						alert(res.message);
						return;
					}
					
					alert('Unable to save this Exclude rule');
					return;
				}
				
				if(jEle.data('type')){
					jEle.find('input').prop('disabled', true);
					change_action_state(jEle, 'edit');
				} else {
					let new_ele = jEle.find('.backuply-exclude-pattern-block').last();
					new_ele.find('.is-active').css('display', 'none');
					new_ele.find('.is-active').removeClass('is-active');
					new_ele.find('.backuply-pattern-delete').css('display', 'block');
					new_ele.attr('data-key', res.key);
					
					// Adding event listners to new elements
					new_ele.find('.backuply-pattern-insert').off().on('click', add_btn_handler);
					new_ele.find('.backuply-pattern-edit').off().on('click', edit_btn_handler);
					new_ele.find('.backuply-pattern-delete').off().on('click', backuply_delete_exclude_rule);
				}
				
				return;
			}
		});
	}
	
	// Updates the states of icons of actions of the Exclude rule
	function change_action_state(jEle, state){
		
		if(state == 'loader'){
			jEle.find('.backuply-pattern-delete').css('display', 'none');
			jEle.find('.backuply-pattern-insert').css('display', 'none');
			jEle.find('.backuply-pattern-edit').css('display', 'none');
			jEle.find('.spinner').css('display', '');
			jEle.find('.spinner').addClass('is-active');
		} else if(state == 'edit') {
			jEle.find('.backuply-pattern-delete').css('display', '');
			jEle.find('.backuply-pattern-insert').css('display', 'none');
			jEle.find('.backuply-pattern-edit').css('display', '');
			jEle.find('.spinner').css('display', 'none');
			jEle.find('.spinner').removeClass('is-active');
		} else if(state == 'insert') {
			jEle.find('.backuply-pattern-delete').css('display', 'none');
			jEle.find('.backuply-pattern-edit').css('display', 'none');
			jEle.find('.backuply-pattern-insert').css('display', '');
			jEle.find('.spinner').css('display', 'none');
			jEle.find('.spinner').removeClass('is-active');
		}
	}
	
	
	// Event handlers
	add_btn.off().on('click', add_btn_handler);
	jEle.find('.backuply-pattern-edit').off().on('click', edit_btn_handler);
}

function backuply_delete_exclude_rule() {
	
	let conf = confirm('Are you sure you want to delete this Exclude rule');

	if(!conf){
		return
	}
	
	let jEle = jQuery(this),
	block = jEle.closest('.backuply-exclude-pattern-block'),
	key = block.data('key'),
	type = block.data('type');

	jQuery.ajax({
		method : 'GET',
		url : backuply_obj.ajax_url,
		data : {
			action : 'backuply_exclude_rule_delete',
			security : backuply_obj.nonce,
			key : key,
			type : type
		},
		success : function(res) {
			if(!res.success){
				alert('Unable to delete this Exclude rule');
				return;
			}
			
			block.remove();
		}
	});
	
}

function backuply_exclude_specific(jEle) {

	jEle.find('.backuply-exclude-add-exact').off().on('click', function() {
		event.preventDefault();

		if(jEle.find('.backuply-js-tree').jstree('get_selected', true).length < 1){
			alert('Select a File or Folder Before adding it!');
			return;
		}

		let path = jEle.find('.backuply-js-tree').jstree('get_selected', true)[0]['id'],
		
		html = '<div class="backuply-exclude-pattern-block" data-edit="true" data-type="exact">'+
			'<span class="backuply-exclude-pattern-val" style="width:95%;">'+path+'</span>'+
			'<span class="dashicons dashicons-trash backuply-pattern-delete" style="display:none;"></span>'+
			'<span class="spinner is-active"></span>'+
		'</div>';

		jEle.append(html);
		
		jQuery.ajax({
			method : 'POST',
			url : backuply_obj.ajax_url,
			data : {
				action : 'backuply_save_excludes',
				security : backuply_obj.nonce,
				type : 'exact',
				pattern : path
			},
			success : function(res) {
				if(!res.success){

					if(res.message){
						jEle.remove();
						alert(res.message);
						return;
					}
					jEle.remove();
					alert('Unable to save this Exclude rule');
					return;
				}

				let new_ele = jEle.find('.backuply-exclude-pattern-block').last();
				new_ele.find('.is-active').css('display', 'none');
				new_ele.find('.is-active').removeClass('is-active');
				new_ele.find('.backuply-pattern-delete').css('display', 'block');
				new_ele.attr('data-key', res.key);
				new_ele.find('.backuply-pattern-delete').off().on('click', backuply_delete_exclude_rule);

				return;
			}
		})
		
	});
	
}

function backuply_download_bcloud(ele){

	let filename = ele.data('name');

	if(!filename){
		alert('Could not find the Backup file name');
		return;
	}
	
	jQuery.ajax({
		method : 'POST',
		url : backuply_obj.ajax_url,
		data : {
			"security" : backuply_obj.nonce,
			"filename" : filename,
			"action" : "backuply_download_bcloud"
		},
		success : function(res){
			if(!res.success){
				alert(res.data ?? "Something went wrong");
				return;
			}

			const link = document.createElement('a');
			link.href = res.data.url;
			link.download = res.data.filename;
			document.body.appendChild(link);
			link.click();
			link.remove();
		}
	});
}

function backuply_upload_backup(ev){
	// Dropping files
	ev.preventDefault();
	ev.stopPropagation();

	let files = '';
	if(ev.target.files){
		files = ev.target;
	} else if(ev.originalEvent.dataTransfer){
		files = ev.originalEvent.dataTransfer;
	}
	
	if(backuply_obj.uploading_backup){
		return false;
	}

	backuply_obj.uploading_backup = true;
	
	const show_alert = (ele, msg, type) => {
		
		switch(type){
			case 'error':
				ele.style.borderColor = '#f5c6cb';
				ele.style.backgroundColor = '#f8d7da';
				ele.style.color = '#721c24';
				break;
			
			case 'success':
				ele.style.backgroundColor = '#d4edda';
				ele.style.borderColor = '#c3e6cb';
				ele.style.color = '#155724';
				break;
				
			case 'alert':
				ele.style.backgroundColor = '#fff3cd';
				ele.style.borderColor = '#ffeeba';
				ele.style.color = '#856404';
				break;
		}
		
		if(type !== 'alert'){
			document.querySelector('.backuply-backup-uploader-selection').style.display = 'block'; // Show the select file block.
			backuply_obj.uploading_backup = false;
		}
		
		ele.style.display = 'block';
		ele.innerHTML = msg;
	}

	document.querySelector('.backuply-backup-uploader-selection').style.display = 'none'; // Hiding selector to prevent attempt to upload.
	
	let error_div = document.querySelector('#backuply-upload-alert');
	error_div.style.display = 'none';

	// Clear previous messages
	if(!files){
		// Add message Here
		show_alert(error_div, 'Please select, or drop a file to proceed', 'error');
		return;
	}

	if(!files.files.length || !files.files[0]){
		// Add message Here
		show_alert(error_div, 'Please select, or drop a file to proceed', 'error');
		return;
	}

	let dropped_file = files.files[0];

	// Checking if the file is tar.gz
	let allowed_types = ['application/gzip', 'application/x-gzip'];
	if(!dropped_file.name.indexOf('.tar.gz') === -1 || !allowed_types.includes(dropped_file.type)){
		show_alert(error_div, 'Please select a .tar.gz file, only .tar.gz files are backup files.', 'error');
		return;
	}
	
	const regex = /^wp_.*_\d{4}-\d{2}-\d{2}_.*\.tar\.gz/;
	if(!regex.test(dropped_file.name)){
		show_alert(error_div, 'File name is of unexpected format, it should be of fromat wp_domain_name_YYYY-MM-DD_HH-MM-SS.tar.gz.', 'error');
		return;
	}

	// Updating the UI
	let progress_block = document.querySelector('.backuply-upload-backup'),
	file_name = document.querySelector('.backuply-upload-backup-name'),
	size_placeholder = document.querySelector('.backuply-upload-backup-size'),
	progress_bar = document.querySelector('#backuply-upload-bar-progress'),
	progress_percentage = document.querySelector('.backuply-upload-percentage');

	const chunk_size = 2 * 1024 * 1024; // 2MB
	const total_chunks = Math.ceil(dropped_file.size / chunk_size);
	const reader = new FileReader();
	let chunk_number = 0;

	reader.addEventListener('load', (e) => {
		let chunk_data = e.target.result;
		chunk_data = new Uint8Array(chunk_data);
		chunk_data = new Blob([chunk_data]);
		
		let form = new FormData();
		
		form.append('action', 'backuply_backup_upload');
		form.append('file_name', dropped_file.name);
		form.append('file', chunk_data);
		form.append('security', backuply_obj.nonce);
		form.append('chunk_number', chunk_number);
		form.append('total_chunks', total_chunks);
		
		jQuery.ajax({
			url : backuply_obj.ajax_url,
			method : "POST",
			contentType: false,
			processData: false,
			data : form,
			success: function(res) {
				if(!res.success){
					// Message for upload failed
					show_alert(error_div, res.data, 'error');
					return;
				}

				//let percentage_str = Math.floor(((res.data - 1) * 100) /  dropped_file.size);
				let percentage_str = Math.round((chunk_number * 100) / total_chunks);
				percentage_str += '%';

				progress_bar.style.width = percentage_str;
				progress_percentage.innerHTML = percentage_str;

				if(chunk_number < total_chunks){
					read_file(res.data);
					return;
				}
				
				show_alert(error_div, 'Backup <strong>'+ dropped_file.name + '</strong> of size ' + backuply_size_format(dropped_file.size) + ' successfully uploaded', 'success');
				
				jQuery('#backuply-btn-sync-bak').trigger('click');  // Triggers sync after upload has been completed.
				jQuery(error_div).parent().append('<p style="text-align:center; color:green;">Syncing the backup, please wait for few seconds<span class="spinner is-active"></span></p>');
			}
		});	
	});

	const read_file = (start_byte) =>  {
		if(backuply_obj.upload_aborted){
			backuply_obj.upload_aborted = false; // Setting it back to its initial state.
			show_alert(error_div, 'Attempting to abort the upload please wait for a few seconds', 'alert');

			jQuery.ajax({
				url : backuply_obj.ajax_url,
				method : "POST",
				data : {
					'action' : 'backuply_backup_upload',
					'file_name' : dropped_file.name,
					'security' : backuply_obj.nonce,
					'abort' : true
				},
				success : function(res){
					if(!res.success){
						show_alert(error_div, 'Unable to abort upload, refresh the page to force stop it', 'error');
					}

					show_alert(error_div, (res.data ? res.data : 'Upload aborted successfully, refresh the page'), 'success');
					return;
				}

			})
			
			return;
		}

		let end_byte = start_byte + chunk_size;
		// When its the last chunk
		if(chunk_number === total_chunks){
			end_byte = dropped_file.size;
		}

		const slice = dropped_file.slice(start_byte, end_byte);
		reader.readAsArrayBuffer(slice);
		chunk_number++;
	}

	progress_block.style.display = "block";
	size_placeholder.innerHTML = backuply_size_format(parseInt(dropped_file.size));
	file_name.innerHTML = dropped_file.name;

	read_file(0); // Initiates the reading of file.

	jQuery(".backuply-backup-uploader-selection").removeClass("backuply-highlight-drop-area");
	return false;
	
}

function backuply_size_format(bytes) {
    const sizes = ["B", "KB", "MB", "GB"];
    const i = Math.floor(Math.log(bytes) / Math.log(1024));
    return parseFloat((bytes / Math.pow(1024, i)).toFixed(2)) + " " + sizes[i];
}
assets/js/promo.js000064400000007446151526424650010201 0ustar00(function($){
	let url = window.location.href;
	
	$('#backuply-cloud-trial').click(function(){
		$('#bcloud-dialog').dialog();
	});
	
	if(url.includes('token=') && url.includes('license=BAKLY')){
		let display = $('.backuply-bcloud-trial-verify').css('display');
		
		if(display != 'none'){
			$('#backuply-cloud-trial').click();
		}

	}
	
	$('#backuply_free-trial .backuply_promo-close').click(function(){
		var data;

		// Hide it
		$('#backuply_free-trial').hide();
		
		// Save this preference
		$.post(backuply_promo.ajax + '?action=backuply_trial_promo&security='+backuply_promo.nonce, data, function(response) {
			//alert(response);
		});
	});
	
	$('.backuply-cloud-state').on('click', '#backuply_has_license', function(){
		$(this).closest('div').hide();
		$('.bcloud-trial-license').show();		
	});

	$('.backuply-cloud-state').on('click', '#backuply_no_license', function(){
		$(this).closest('div').hide();
		$('.bcloud-trial-email').show();
	});

	// License Linking to Backuply Cloud
	$('.backuply-cloud-state').on('click', 'button.backuply-license-link', function(){
		let wrapper = $(this).closest('div'),
		input = wrapper.find('input'),
		input_name = input.attr('name'),
		value = input.val();

		if(!value){
			alert('Please Fill the form to proceed');
			return false;
		}

		let spinner = $(this).next();
		spinner.addClass('is-active');

		$.ajax({
			method : 'POST',
			url : backuply_promo.ajax,
			data : {
				action : 'bcloud_trial',
				security : backuply_promo.nonce,
				form_action : input_name,
				value : value,
			},
			success : function(res){
				spinner.removeClass('is-active');
				
				if(res.success){
					let state = wrapper.closest('.backuply-cloud-state');
					state.hide();
					state.next().show();

					return;
				}

				alert(res.data ? res.data : 'Something went wrong, check if you already have Backuply Cloud added');
			}
		})
	});

	$('button.backuply-default-yes').on('click', function(){
		let wrapper = $(this).closest('.backuply-cloud-trial-settings');

		$.ajax({
			method : 'POST',
			url : backuply_promo.ajax,
			data : {
				action : 'backuply_trial_settings',
				security : backuply_promo.nonce
			},
			success : function(res){
				if(!res.success){
					alert('Unable to set Backuply settings')
				}

				wrapper.hide();
				wrapper.next().show();				
			}
		});
	});
	
	$('button.backuply-default-no').on('click', function(){
		let wrapper = $(this).closest('.backuply-cloud-trial-settings');

		wrapper.hide();
		wrapper.next().show();
	});
	
	
	function backuply_trail_confirmation(){
		let wrapper = $(this).closest('div');

		let spinner = $(this).next();
		spinner.addClass('is-active');

		$.ajax({
			method : 'POST',
			url : backuply_promo.ajax,
			data : {
				action : 'backuply_verify_trial',
				security : backuply_promo.nonce,
			},
			success : function(res){
				spinner.removeClass('is-active');

				//if(res.success){
					let state = wrapper.closest('div');
					state.hide();
					state.next().show();
					
					// Add license to it and It will create the keys
					state.next().find('input').val(res.data['license']);
					state.next().find('button').click();

					return;
				//}

				//alert(res.data ? res.data : 'Something went wrong!');
			}
		})
	};

	// Confirming Email Verification
	$('#backuply-verify-checkbox').on('change', function(e){
		if($(this).is(':checked')){
			$('.backuply-cloud-state button.backuply-verify-email').attr('disabled', false);
			$('.backuply-cloud-state').on('click', 'button.backuply-verify-email', backuply_trail_confirmation);
		} else {
			$('.backuply-cloud-state').off('click');
			$('.backuply-cloud-state button.backuply-verify-email').attr('disabled', true);
		}
	});

})(jQuery);assets/js/jstree.min.js000064400000367424151526424650011130 0ustar00/*! jsTree - v3.2.1 - 2015-08-24 - (MIT) */
!function(a){"use strict";"function"==typeof define&&define.amd?define(["jquery"],a):"undefined"!=typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a,b){"use strict";if(!a.jstree){var c=0,d=!1,e=!1,f=!1,g=[],h=a("script:last").attr("src"),i=window.document,j=i.createElement("LI"),k,l;j.setAttribute("role","treeitem"),k=i.createElement("I"),k.className="jstree-icon jstree-ocl",k.setAttribute("role","presentation"),j.appendChild(k),k=i.createElement("A"),k.className="jstree-anchor",k.setAttribute("href","#"),k.setAttribute("tabindex","-1"),l=i.createElement("I"),l.className="jstree-icon jstree-themeicon",l.setAttribute("role","presentation"),k.appendChild(l),j.appendChild(k),k=l=null,a.jstree={version:"3.2.1",defaults:{plugins:[]},plugins:{},path:h&&-1!==h.indexOf("/")?h.replace(/\/[^\/]+$/,""):"",idregex:/[\\:&!^|()\[\]<>@*'+~#";.,=\- \/${}%?`]/g,root:"#"},a.jstree.create=function(b,d){var e=new a.jstree.core(++c),f=d;return d=a.extend(!0,{},a.jstree.defaults,d),f&&f.plugins&&(d.plugins=f.plugins),a.each(d.plugins,function(a,b){"core"!==a&&(e=e.plugin(b,d[b]))}),a(b).data("jstree",e),e.init(b,d),e},a.jstree.destroy=function(){a(".jstree:jstree").jstree("destroy"),a(i).off(".jstree")},a.jstree.core=function(a){this._id=a,this._cnt=0,this._wrk=null,this._data={core:{themes:{name:!1,dots:!1,icons:!1},selected:[],last_error:{},working:!1,worker_queue:[],focused:null}}},a.jstree.reference=function(b){var c=null,d=null;if(!b||!b.id||b.tagName&&b.nodeType||(b=b.id),!d||!d.length)try{d=a(b)}catch(e){}if(!d||!d.length)try{d=a("#"+b.replace(a.jstree.idregex,"\\$&"))}catch(e){}return d&&d.length&&(d=d.closest(".jstree")).length&&(d=d.data("jstree"))?c=d:a(".jstree").each(function(){var d=a(this).data("jstree");return d&&d._model.data[b]?(c=d,!1):void 0}),c},a.fn.jstree=function(c){var d="string"==typeof c,e=Array.prototype.slice.call(arguments,1),f=null;return c!==!0||this.length?(this.each(function(){var g=a.jstree.reference(this),h=d&&g?g[c]:null;return f=d&&h?h.apply(g,e):null,g||d||c!==b&&!a.isPlainObject(c)||a.jstree.create(this,c),(g&&!d||c===!0)&&(f=g||!1),null!==f&&f!==b?!1:void 0}),null!==f&&f!==b?f:this):!1},a.expr[":"].jstree=a.expr.createPseudo(function(c){return function(c){return a(c).hasClass("jstree")&&a(c).data("jstree")!==b}}),a.jstree.defaults.core={data:!1,strings:!1,check_callback:!1,error:a.noop,animation:200,multiple:!0,themes:{name:!1,url:!1,dir:!1,dots:!0,icons:!0,stripes:!1,variant:!1,responsive:!1},expand_selected_onload:!0,worker:!0,force_text:!1,dblclick_toggle:!0},a.jstree.core.prototype={plugin:function(b,c){var d=a.jstree.plugins[b];return d?(this._data[b]={},d.prototype=this,new d(c,this)):this},init:function(b,c){this._model={data:{},changed:[],force_full_redraw:!1,redraw_timeout:!1,default_state:{loaded:!0,opened:!1,selected:!1,disabled:!1}},this._model.data[a.jstree.root]={id:a.jstree.root,parent:null,parents:[],children:[],children_d:[],state:{loaded:!1}},this.element=a(b).addClass("jstree jstree-"+this._id),this.settings=c,this._data.core.ready=!1,this._data.core.loaded=!1,this._data.core.rtl="rtl"===this.element.css("direction"),this.element[this._data.core.rtl?"addClass":"removeClass"]("jstree-rtl"),this.element.attr("role","tree"),this.settings.core.multiple&&this.element.attr("aria-multiselectable",!0),this.element.attr("tabindex")||this.element.attr("tabindex","0"),this.bind(),this.trigger("init"),this._data.core.original_container_html=this.element.find(" > ul > li").clone(!0),this._data.core.original_container_html.find("li").addBack().contents().filter(function(){return 3===this.nodeType&&(!this.nodeValue||/^\s+$/.test(this.nodeValue))}).remove(),this.element.html("<ul class='jstree-container-ul jstree-children' role='group'><li id='j"+this._id+"_loading' class='jstree-initial-node jstree-loading jstree-leaf jstree-last' role='tree-item'><i class='jstree-icon jstree-ocl'></i><a class='jstree-anchor' href='#'><i class='jstree-icon jstree-themeicon-hidden'></i>"+this.get_string("Loading ...")+"</a></li></ul>"),this.element.attr("aria-activedescendant","j"+this._id+"_loading"),this._data.core.li_height=this.get_container_ul().children("li").first().height()||24,this.trigger("loading"),this.load_node(a.jstree.root)},destroy:function(a){if(this._wrk)try{window.URL.revokeObjectURL(this._wrk),this._wrk=null}catch(b){}a||this.element.empty(),this.teardown()},teardown:function(){this.unbind(),this.element.removeClass("jstree").removeData("jstree").find("[class^='jstree']").addBack().attr("class",function(){return this.className.replace(/jstree[^ ]*|$/gi,"")}),this.element=null},bind:function(){var b="",c=null,d=0;this.element.on("dblclick.jstree",function(a){if(a.target.tagName&&"input"===a.target.tagName.toLowerCase())return!0;if(i.selection&&i.selection.empty)i.selection.empty();else if(window.getSelection){var b=window.getSelection();try{b.removeAllRanges(),b.collapse()}catch(c){}}}).on("mousedown.jstree",a.proxy(function(a){a.target===this.element[0]&&(a.preventDefault(),d=+new Date)},this)).on("mousedown.jstree",".jstree-ocl",function(a){a.preventDefault()}).on("click.jstree",".jstree-ocl",a.proxy(function(a){this.toggle_node(a.target)},this)).on("dblclick.jstree",".jstree-anchor",a.proxy(function(a){return a.target.tagName&&"input"===a.target.tagName.toLowerCase()?!0:void(this.settings.core.dblclick_toggle&&this.toggle_node(a.target))},this)).on("click.jstree",".jstree-anchor",a.proxy(function(b){b.preventDefault(),b.currentTarget!==i.activeElement&&a(b.currentTarget).focus(),this.activate_node(b.currentTarget,b)},this)).on("keydown.jstree",".jstree-anchor",a.proxy(function(b){if(b.target.tagName&&"input"===b.target.tagName.toLowerCase())return!0;if(32!==b.which&&13!==b.which&&(b.shiftKey||b.ctrlKey||b.altKey||b.metaKey))return!0;var c=null;switch(this._data.core.rtl&&(37===b.which?b.which=39:39===b.which&&(b.which=37)),b.which){case 32:b.ctrlKey&&(b.type="click",a(b.currentTarget).trigger(b));break;case 13:b.type="click",a(b.currentTarget).trigger(b);break;case 37:b.preventDefault(),this.is_open(b.currentTarget)?this.close_node(b.currentTarget):(c=this.get_parent(b.currentTarget),c&&c.id!==a.jstree.root&&this.get_node(c,!0).children(".jstree-anchor").focus());break;case 38:b.preventDefault(),c=this.get_prev_dom(b.currentTarget),c&&c.length&&c.children(".jstree-anchor").focus();break;case 39:b.preventDefault(),this.is_closed(b.currentTarget)?this.open_node(b.currentTarget,function(a){this.get_node(a,!0).children(".jstree-anchor").focus()}):this.is_open(b.currentTarget)&&(c=this.get_node(b.currentTarget,!0).children(".jstree-children")[0],c&&a(this._firstChild(c)).children(".jstree-anchor").focus());break;case 40:b.preventDefault(),c=this.get_next_dom(b.currentTarget),c&&c.length&&c.children(".jstree-anchor").focus();break;case 106:this.open_all();break;case 36:b.preventDefault(),c=this._firstChild(this.get_container_ul()[0]),c&&a(c).children(".jstree-anchor").filter(":visible").focus();break;case 35:b.preventDefault(),this.element.find(".jstree-anchor").filter(":visible").last().focus()}},this)).on("load_node.jstree",a.proxy(function(b,c){c.status&&(c.node.id!==a.jstree.root||this._data.core.loaded||(this._data.core.loaded=!0,this._firstChild(this.get_container_ul()[0])&&this.element.attr("aria-activedescendant",this._firstChild(this.get_container_ul()[0]).id),this.trigger("loaded")),this._data.core.ready||setTimeout(a.proxy(function(){if(this.element&&!this.get_container_ul().find(".jstree-loading").length){if(this._data.core.ready=!0,this._data.core.selected.length){if(this.settings.core.expand_selected_onload){var b=[],c,d;for(c=0,d=this._data.core.selected.length;d>c;c++)b=b.concat(this._model.data[this._data.core.selected[c]].parents);for(b=a.vakata.array_unique(b),c=0,d=b.length;d>c;c++)this.open_node(b[c],!1,0)}this.trigger("changed",{action:"ready",selected:this._data.core.selected})}this.trigger("ready")}},this),0))},this)).on("keypress.jstree",a.proxy(function(d){if(d.target.tagName&&"input"===d.target.tagName.toLowerCase())return!0;c&&clearTimeout(c),c=setTimeout(function(){b=""},500);var e=String.fromCharCode(d.which).toLowerCase(),f=this.element.find(".jstree-anchor").filter(":visible"),g=f.index(i.activeElement)||0,h=!1;if(b+=e,b.length>1){if(f.slice(g).each(a.proxy(function(c,d){return 0===a(d).text().toLowerCase().indexOf(b)?(a(d).focus(),h=!0,!1):void 0},this)),h)return;if(f.slice(0,g).each(a.proxy(function(c,d){return 0===a(d).text().toLowerCase().indexOf(b)?(a(d).focus(),h=!0,!1):void 0},this)),h)return}if(new RegExp("^"+e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")+"+$").test(b)){if(f.slice(g+1).each(a.proxy(function(b,c){return a(c).text().toLowerCase().charAt(0)===e?(a(c).focus(),h=!0,!1):void 0},this)),h)return;if(f.slice(0,g+1).each(a.proxy(function(b,c){return a(c).text().toLowerCase().charAt(0)===e?(a(c).focus(),h=!0,!1):void 0},this)),h)return}},this)).on("init.jstree",a.proxy(function(){var a=this.settings.core.themes;this._data.core.themes.dots=a.dots,this._data.core.themes.stripes=a.stripes,this._data.core.themes.icons=a.icons,this.set_theme(a.name||"default",a.url),this.set_theme_variant(a.variant)},this)).on("loading.jstree",a.proxy(function(){this[this._data.core.themes.dots?"show_dots":"hide_dots"](),this[this._data.core.themes.icons?"show_icons":"hide_icons"](),this[this._data.core.themes.stripes?"show_stripes":"hide_stripes"]()},this)).on("blur.jstree",".jstree-anchor",a.proxy(function(b){this._data.core.focused=null,a(b.currentTarget).filter(".jstree-hovered").mouseleave(),this.element.attr("tabindex","0")},this)).on("focus.jstree",".jstree-anchor",a.proxy(function(b){var c=this.get_node(b.currentTarget);c&&c.id&&(this._data.core.focused=c.id),this.element.find(".jstree-hovered").not(b.currentTarget).mouseleave(),a(b.currentTarget).mouseenter(),this.element.attr("tabindex","-1")},this)).on("focus.jstree",a.proxy(function(){if(+new Date-d>500&&!this._data.core.focused){d=0;var a=this.get_node(this.element.attr("aria-activedescendant"),!0);a&&a.find("> .jstree-anchor").focus()}},this)).on("mouseenter.jstree",".jstree-anchor",a.proxy(function(a){this.hover_node(a.currentTarget)},this)).on("mouseleave.jstree",".jstree-anchor",a.proxy(function(a){this.dehover_node(a.currentTarget)},this))},unbind:function(){this.element.off(".jstree"),a(i).off(".jstree-"+this._id)},trigger:function(a,b){b||(b={}),b.instance=this,this.element.triggerHandler(a.replace(".jstree","")+".jstree",b)},get_container:function(){return this.element},get_container_ul:function(){return this.element.children(".jstree-children").first()},get_string:function(b){var c=this.settings.core.strings;return a.isFunction(c)?c.call(this,b):c&&c[b]?c[b]:b},_firstChild:function(a){a=a?a.firstChild:null;while(null!==a&&1!==a.nodeType)a=a.nextSibling;return a},_nextSibling:function(a){a=a?a.nextSibling:null;while(null!==a&&1!==a.nodeType)a=a.nextSibling;return a},_previousSibling:function(a){a=a?a.previousSibling:null;while(null!==a&&1!==a.nodeType)a=a.previousSibling;return a},get_node:function(b,c){b&&b.id&&(b=b.id);var d;try{if(this._model.data[b])b=this._model.data[b];else if("string"==typeof b&&this._model.data[b.replace(/^#/,"")])b=this._model.data[b.replace(/^#/,"")];else if("string"==typeof b&&(d=a("#"+b.replace(a.jstree.idregex,"\\$&"),this.element)).length&&this._model.data[d.closest(".jstree-node").attr("id")])b=this._model.data[d.closest(".jstree-node").attr("id")];else if((d=a(b,this.element)).length&&this._model.data[d.closest(".jstree-node").attr("id")])b=this._model.data[d.closest(".jstree-node").attr("id")];else{if(!(d=a(b,this.element)).length||!d.hasClass("jstree"))return!1;b=this._model.data[a.jstree.root]}return c&&(b=b.id===a.jstree.root?this.element:a("#"+b.id.replace(a.jstree.idregex,"\\$&"),this.element)),b}catch(e){return!1}},get_path:function(b,c,d){if(b=b.parents?b:this.get_node(b),!b||b.id===a.jstree.root||!b.parents)return!1;var e,f,g=[];for(g.push(d?b.id:b.text),e=0,f=b.parents.length;f>e;e++)g.push(d?b.parents[e]:this.get_text(b.parents[e]));return g=g.reverse().slice(1),c?g.join(c):g},get_next_dom:function(b,c){var d;if(b=this.get_node(b,!0),b[0]===this.element[0]){d=this._firstChild(this.get_container_ul()[0]);while(d&&0===d.offsetHeight)d=this._nextSibling(d);return d?a(d):!1}if(!b||!b.length)return!1;if(c){d=b[0];do d=this._nextSibling(d);while(d&&0===d.offsetHeight);return d?a(d):!1}if(b.hasClass("jstree-open")){d=this._firstChild(b.children(".jstree-children")[0]);while(d&&0===d.offsetHeight)d=this._nextSibling(d);if(null!==d)return a(d)}d=b[0];do d=this._nextSibling(d);while(d&&0===d.offsetHeight);return null!==d?a(d):b.parentsUntil(".jstree",".jstree-node").nextAll(".jstree-node:visible").first()},get_prev_dom:function(b,c){var d;if(b=this.get_node(b,!0),b[0]===this.element[0]){d=this.get_container_ul()[0].lastChild;while(d&&0===d.offsetHeight)d=this._previousSibling(d);return d?a(d):!1}if(!b||!b.length)return!1;if(c){d=b[0];do d=this._previousSibling(d);while(d&&0===d.offsetHeight);return d?a(d):!1}d=b[0];do d=this._previousSibling(d);while(d&&0===d.offsetHeight);if(null!==d){b=a(d);while(b.hasClass("jstree-open"))b=b.children(".jstree-children").first().children(".jstree-node:visible:last");return b}return d=b[0].parentNode.parentNode,d&&d.className&&-1!==d.className.indexOf("jstree-node")?a(d):!1},get_parent:function(b){return b=this.get_node(b),b&&b.id!==a.jstree.root?b.parent:!1},get_children_dom:function(a){return a=this.get_node(a,!0),a[0]===this.element[0]?this.get_container_ul().children(".jstree-node"):a&&a.length?a.children(".jstree-children").children(".jstree-node"):!1},is_parent:function(a){return a=this.get_node(a),a&&(a.state.loaded===!1||a.children.length>0)},is_loaded:function(a){return a=this.get_node(a),a&&a.state.loaded},is_loading:function(a){return a=this.get_node(a),a&&a.state&&a.state.loading},is_open:function(a){return a=this.get_node(a),a&&a.state.opened},is_closed:function(a){return a=this.get_node(a),a&&this.is_parent(a)&&!a.state.opened},is_leaf:function(a){return!this.is_parent(a)},load_node:function(b,c){var d,e,f,g,h;if(a.isArray(b))return this._load_nodes(b.slice(),c),!0;if(b=this.get_node(b),!b)return c&&c.call(this,b,!1),!1;if(b.state.loaded){for(b.state.loaded=!1,d=0,e=b.children_d.length;e>d;d++){for(f=0,g=b.parents.length;g>f;f++)this._model.data[b.parents[f]].children_d=a.vakata.array_remove_item(this._model.data[b.parents[f]].children_d,b.children_d[d]);this._model.data[b.children_d[d]].state.selected&&(h=!0,this._data.core.selected=a.vakata.array_remove_item(this._data.core.selected,b.children_d[d])),delete this._model.data[b.children_d[d]]}b.children=[],b.children_d=[],h&&this.trigger("changed",{action:"load_node",node:b,selected:this._data.core.selected})}return b.state.failed=!1,b.state.loading=!0,this.get_node(b,!0).addClass("jstree-loading").attr("aria-busy",!0),this._load_node(b,a.proxy(function(a){b=this._model.data[b.id],b.state.loading=!1,b.state.loaded=a,b.state.failed=!b.state.loaded;var d=this.get_node(b,!0),e=0,f=0,g=this._model.data,h=!1;for(e=0,f=b.children.length;f>e;e++)if(g[b.children[e]]&&!g[b.children[e]].state.hidden){h=!0;break}b.state.loaded&&!h&&d&&d.length&&!d.hasClass("jstree-leaf")&&d.removeClass("jstree-closed jstree-open").addClass("jstree-leaf"),d.removeClass("jstree-loading").attr("aria-busy",!1),this.trigger("load_node",{node:b,status:a}),c&&c.call(this,b,a)},this)),!0},_load_nodes:function(a,b,c){var d=!0,e=function(){this._load_nodes(a,b,!0)},f=this._model.data,g,h,i=[];for(g=0,h=a.length;h>g;g++)!f[a[g]]||(f[a[g]].state.loaded||f[a[g]].state.failed)&&c||(this.is_loading(a[g])||this.load_node(a[g],e),d=!1);if(d){for(g=0,h=a.length;h>g;g++)f[a[g]]&&f[a[g]].state.loaded&&i.push(a[g]);b&&!b.done&&(b.call(this,i),b.done=!0)}},load_all:function(b,c){if(b||(b=a.jstree.root),b=this.get_node(b),!b)return!1;var d=[],e=this._model.data,f=e[b.id].children_d,g,h;for(b.state&&!b.state.loaded&&d.push(b.id),g=0,h=f.length;h>g;g++)e[f[g]]&&e[f[g]].state&&!e[f[g]].state.loaded&&d.push(f[g]);d.length?this._load_nodes(d,function(){this.load_all(b,c)}):(c&&c.call(this,b),this.trigger("load_all",{node:b}))},_load_node:function(b,c){var d=this.settings.core.data,e;return d?a.isFunction(d)?d.call(this,b,a.proxy(function(d){d===!1&&c.call(this,!1),this["string"==typeof d?"_append_html_data":"_append_json_data"](b,"string"==typeof d?a(a.parseHTML(d)).filter(function(){return 3!==this.nodeType}):d,function(a){c.call(this,a)})},this)):"object"==typeof d?d.url?(d=a.extend(!0,{},d),a.isFunction(d.url)&&(d.url=d.url.call(this,b)),a.isFunction(d.data)&&(d.data=d.data.call(this,b)),a.ajax(d).done(a.proxy(function(d,e,f){var g=f.getResponseHeader("Content-Type");return g&&-1!==g.indexOf("json")||"object"==typeof d?this._append_json_data(b,d,function(a){c.call(this,a)}):g&&-1!==g.indexOf("html")||"string"==typeof d?this._append_html_data(b,a(a.parseHTML(d)).filter(function(){return 3!==this.nodeType}),function(a){c.call(this,a)}):(this._data.core.last_error={error:"ajax",plugin:"core",id:"core_04",reason:"Could not load node",data:JSON.stringify({id:b.id,xhr:f})},this.settings.core.error.call(this,this._data.core.last_error),c.call(this,!1))},this)).fail(a.proxy(function(a){c.call(this,!1),this._data.core.last_error={error:"ajax",plugin:"core",id:"core_04",reason:"Could not load node",data:JSON.stringify({id:b.id,xhr:a})},this.settings.core.error.call(this,this._data.core.last_error)},this))):(e=a.isArray(d)||a.isPlainObject(d)?JSON.parse(JSON.stringify(d)):d,b.id===a.jstree.root?this._append_json_data(b,e,function(a){c.call(this,a)}):(this._data.core.last_error={error:"nodata",plugin:"core",id:"core_05",reason:"Could not load node",data:JSON.stringify({id:b.id})},this.settings.core.error.call(this,this._data.core.last_error),c.call(this,!1))):"string"==typeof d?b.id===a.jstree.root?this._append_html_data(b,a(a.parseHTML(d)).filter(function(){return 3!==this.nodeType}),function(a){c.call(this,a)}):(this._data.core.last_error={error:"nodata",plugin:"core",id:"core_06",reason:"Could not load node",data:JSON.stringify({id:b.id})},this.settings.core.error.call(this,this._data.core.last_error),c.call(this,!1)):c.call(this,!1):b.id===a.jstree.root?this._append_html_data(b,this._data.core.original_container_html.clone(!0),function(a){c.call(this,a)}):c.call(this,!1)},_node_changed:function(a){a=this.get_node(a),a&&this._model.changed.push(a.id)},_append_html_data:function(b,c,d){b=this.get_node(b),b.children=[],b.children_d=[];var e=c.is("ul")?c.children():c,f=b.id,g=[],h=[],i=this._model.data,j=i[f],k=this._data.core.selected.length,l,m,n;for(e.each(a.proxy(function(b,c){l=this._parse_model_from_html(a(c),f,j.parents.concat()),l&&(g.push(l),h.push(l),i[l].children_d.length&&(h=h.concat(i[l].children_d)))},this)),j.children=g,j.children_d=h,m=0,n=j.parents.length;n>m;m++)i[j.parents[m]].children_d=i[j.parents[m]].children_d.concat(h);this.trigger("model",{nodes:h,parent:f}),f!==a.jstree.root?(this._node_changed(f),this.redraw()):(this.get_container_ul().children(".jstree-initial-node").remove(),this.redraw(!0)),this._data.core.selected.length!==k&&this.trigger("changed",{action:"model",selected:this._data.core.selected}),d.call(this,!0)},_append_json_data:function(b,c,d,e){if(null!==this.element){b=this.get_node(b),b.children=[],b.children_d=[],c.d&&(c=c.d,"string"==typeof c&&(c=JSON.parse(c))),a.isArray(c)||(c=[c]);var f=null,g={df:this._model.default_state,dat:c,par:b.id,m:this._model.data,t_id:this._id,t_cnt:this._cnt,sel:this._data.core.selected},h=function(a,b){a.data&&(a=a.data);var c=a.dat,d=a.par,e=[],f=[],g=[],h=a.df,i=a.t_id,j=a.t_cnt,k=a.m,l=k[d],m=a.sel,n,o,p,q,r=function(a,c,d){d=d?d.concat():[],c&&d.unshift(c);var e=a.id.toString(),f,i,j,l,m={id:e,text:a.text||"",icon:a.icon!==b?a.icon:!0,parent:c,parents:d,children:a.children||[],children_d:a.children_d||[],data:a.data,state:{},li_attr:{id:!1},a_attr:{href:"#"},original:!1};for(f in h)h.hasOwnProperty(f)&&(m.state[f]=h[f]);if(a&&a.data&&a.data.jstree&&a.data.jstree.icon&&(m.icon=a.data.jstree.icon),(m.icon===b||null===m.icon||""===m.icon)&&(m.icon=!0),a&&a.data&&(m.data=a.data,a.data.jstree))for(f in a.data.jstree)a.data.jstree.hasOwnProperty(f)&&(m.state[f]=a.data.jstree[f]);if(a&&"object"==typeof a.state)for(f in a.state)a.state.hasOwnProperty(f)&&(m.state[f]=a.state[f]);if(a&&"object"==typeof a.li_attr)for(f in a.li_attr)a.li_attr.hasOwnProperty(f)&&(m.li_attr[f]=a.li_attr[f]);if(m.li_attr.id||(m.li_attr.id=e),a&&"object"==typeof a.a_attr)for(f in a.a_attr)a.a_attr.hasOwnProperty(f)&&(m.a_attr[f]=a.a_attr[f]);for(a&&a.children&&a.children===!0&&(m.state.loaded=!1,m.children=[],m.children_d=[]),k[m.id]=m,f=0,i=m.children.length;i>f;f++)j=r(k[m.children[f]],m.id,d),l=k[j],m.children_d.push(j),l.children_d.length&&(m.children_d=m.children_d.concat(l.children_d));return delete a.data,delete a.children,k[m.id].original=a,m.state.selected&&g.push(m.id),m.id},s=function(a,c,d){d=d?d.concat():[],c&&d.unshift(c);var e=!1,f,l,m,n,o;do e="j"+i+"_"+ ++j;while(k[e]);o={id:!1,text:"string"==typeof a?a:"",icon:"object"==typeof a&&a.icon!==b?a.icon:!0,parent:c,parents:d,children:[],children_d:[],data:null,state:{},li_attr:{id:!1},a_attr:{href:"#"},original:!1};for(f in h)h.hasOwnProperty(f)&&(o.state[f]=h[f]);if(a&&a.id&&(o.id=a.id.toString()),a&&a.text&&(o.text=a.text),a&&a.data&&a.data.jstree&&a.data.jstree.icon&&(o.icon=a.data.jstree.icon),(o.icon===b||null===o.icon||""===o.icon)&&(o.icon=!0),a&&a.data&&(o.data=a.data,a.data.jstree))for(f in a.data.jstree)a.data.jstree.hasOwnProperty(f)&&(o.state[f]=a.data.jstree[f]);if(a&&"object"==typeof a.state)for(f in a.state)a.state.hasOwnProperty(f)&&(o.state[f]=a.state[f]);if(a&&"object"==typeof a.li_attr)for(f in a.li_attr)a.li_attr.hasOwnProperty(f)&&(o.li_attr[f]=a.li_attr[f]);if(o.li_attr.id&&!o.id&&(o.id=o.li_attr.id.toString()),o.id||(o.id=e),o.li_attr.id||(o.li_attr.id=o.id),a&&"object"==typeof a.a_attr)for(f in a.a_attr)a.a_attr.hasOwnProperty(f)&&(o.a_attr[f]=a.a_attr[f]);if(a&&a.children&&a.children.length){for(f=0,l=a.children.length;l>f;f++)m=s(a.children[f],o.id,d),n=k[m],o.children.push(m),n.children_d.length&&(o.children_d=o.children_d.concat(n.children_d));o.children_d=o.children_d.concat(o.children)}return a&&a.children&&a.children===!0&&(o.state.loaded=!1,o.children=[],o.children_d=[]),delete a.data,delete a.children,o.original=a,k[o.id]=o,o.state.selected&&g.push(o.id),o.id};if(c.length&&c[0].id!==b&&c[0].parent!==b){for(o=0,p=c.length;p>o;o++)c[o].children||(c[o].children=[]),k[c[o].id.toString()]=c[o];for(o=0,p=c.length;p>o;o++)k[c[o].parent.toString()].children.push(c[o].id.toString()),l.children_d.push(c[o].id.toString());for(o=0,p=l.children.length;p>o;o++)n=r(k[l.children[o]],d,l.parents.concat()),f.push(n),k[n].children_d.length&&(f=f.concat(k[n].children_d));for(o=0,p=l.parents.length;p>o;o++)k[l.parents[o]].children_d=k[l.parents[o]].children_d.concat(f);q={cnt:j,mod:k,sel:m,par:d,dpc:f,add:g}}else{for(o=0,p=c.length;p>o;o++)n=s(c[o],d,l.parents.concat()),n&&(e.push(n),f.push(n),k[n].children_d.length&&(f=f.concat(k[n].children_d)));for(l.children=e,l.children_d=f,o=0,p=l.parents.length;p>o;o++)k[l.parents[o]].children_d=k[l.parents[o]].children_d.concat(f);q={cnt:j,mod:k,sel:m,par:d,dpc:f,add:g}}return"undefined"!=typeof window&&"undefined"!=typeof window.document?q:void postMessage(q)},i=function(b,c){if(null!==this.element){if(this._cnt=b.cnt,this._model.data=b.mod,c){var e,f,g=b.add,h=b.sel,i=this._data.core.selected.slice(),j=this._model.data;if(h.length!==i.length||a.vakata.array_unique(h.concat(i)).length!==h.length){for(e=0,f=h.length;f>e;e++)-1===a.inArray(h[e],g)&&-1===a.inArray(h[e],i)&&(j[h[e]].state.selected=!1);for(e=0,f=i.length;f>e;e++)-1===a.inArray(i[e],h)&&(j[i[e]].state.selected=!0)}}b.add.length&&(this._data.core.selected=this._data.core.selected.concat(b.add)),this.trigger("model",{nodes:b.dpc,parent:b.par}),b.par!==a.jstree.root?(this._node_changed(b.par),this.redraw()):this.redraw(!0),b.add.length&&this.trigger("changed",{action:"model",selected:this._data.core.selected}),d.call(this,!0)}};if(this.settings.core.worker&&window.Blob&&window.URL&&window.Worker)try{null===this._wrk&&(this._wrk=window.URL.createObjectURL(new window.Blob(["self.onmessage = "+h.toString()],{type:"text/javascript"}))),!this._data.core.working||e?(this._data.core.working=!0,f=new window.Worker(this._wrk),f.onmessage=a.proxy(function(a){i.call(this,a.data,!0);try{f.terminate(),f=null}catch(b){}this._data.core.worker_queue.length?this._append_json_data.apply(this,this._data.core.worker_queue.shift()):this._data.core.working=!1},this),g.par?f.postMessage(g):this._data.core.worker_queue.length?this._append_json_data.apply(this,this._data.core.worker_queue.shift()):this._data.core.working=!1):this._data.core.worker_queue.push([b,c,d,!0])}catch(j){i.call(this,h(g),!1),this._data.core.worker_queue.length?this._append_json_data.apply(this,this._data.core.worker_queue.shift()):this._data.core.working=!1}else i.call(this,h(g),!1)}},_parse_model_from_html:function(c,d,e){e=e?[].concat(e):[],d&&e.unshift(d);var f,g,h=this._model.data,i={id:!1,text:!1,icon:!0,parent:d,parents:e,children:[],children_d:[],data:null,state:{},li_attr:{id:!1},a_attr:{href:"#"},original:!1},j,k,l;for(j in this._model.default_state)this._model.default_state.hasOwnProperty(j)&&(i.state[j]=this._model.default_state[j]);if(k=a.vakata.attributes(c,!0),a.each(k,function(b,c){return c=a.trim(c),c.length?(i.li_attr[b]=c,void("id"===b&&(i.id=c.toString()))):!0}),k=c.children("a").first(),k.length&&(k=a.vakata.attributes(k,!0),a.each(k,function(b,c){c=a.trim(c),c.length&&(i.a_attr[b]=c)})),k=c.children("a").first().length?c.children("a").first().clone():c.clone(),k.children("ins, i, ul").remove(),k=k.html(),k=a("<div />").html(k),i.text=this.settings.core.force_text?k.text():k.html(),k=c.data(),i.data=k?a.extend(!0,{},k):null,i.state.opened=c.hasClass("jstree-open"),i.state.selected=c.children("a").hasClass("jstree-clicked"),i.state.disabled=c.children("a").hasClass("jstree-disabled"),i.data&&i.data.jstree)for(j in i.data.jstree)i.data.jstree.hasOwnProperty(j)&&(i.state[j]=i.data.jstree[j]);k=c.children("a").children(".jstree-themeicon"),k.length&&(i.icon=k.hasClass("jstree-themeicon-hidden")?!1:k.attr("rel")),i.state.icon!==b&&(i.icon=i.state.icon),(i.icon===b||null===i.icon||""===i.icon)&&(i.icon=!0),k=c.children("ul").children("li");do l="j"+this._id+"_"+ ++this._cnt;while(h[l]);return i.id=i.li_attr.id?i.li_attr.id.toString():l,k.length?(k.each(a.proxy(function(b,c){f=this._parse_model_from_html(a(c),i.id,e),g=this._model.data[f],i.children.push(f),g.children_d.length&&(i.children_d=i.children_d.concat(g.children_d))},this)),i.children_d=i.children_d.concat(i.children)):c.hasClass("jstree-closed")&&(i.state.loaded=!1),i.li_attr["class"]&&(i.li_attr["class"]=i.li_attr["class"].replace("jstree-closed","").replace("jstree-open","")),i.a_attr["class"]&&(i.a_attr["class"]=i.a_attr["class"].replace("jstree-clicked","").replace("jstree-disabled","")),h[i.id]=i,i.state.selected&&this._data.core.selected.push(i.id),i.id},_parse_model_from_flat_json:function(a,c,d){d=d?d.concat():[],c&&d.unshift(c);var e=a.id.toString(),f=this._model.data,g=this._model.default_state,h,i,j,k,l={id:e,text:a.text||"",icon:a.icon!==b?a.icon:!0,parent:c,parents:d,children:a.children||[],children_d:a.children_d||[],data:a.data,state:{},li_attr:{id:!1},a_attr:{href:"#"},original:!1};for(h in g)g.hasOwnProperty(h)&&(l.state[h]=g[h]);if(a&&a.data&&a.data.jstree&&a.data.jstree.icon&&(l.icon=a.data.jstree.icon),(l.icon===b||null===l.icon||""===l.icon)&&(l.icon=!0),a&&a.data&&(l.data=a.data,a.data.jstree))for(h in a.data.jstree)a.data.jstree.hasOwnProperty(h)&&(l.state[h]=a.data.jstree[h]);if(a&&"object"==typeof a.state)for(h in a.state)a.state.hasOwnProperty(h)&&(l.state[h]=a.state[h]);if(a&&"object"==typeof a.li_attr)for(h in a.li_attr)a.li_attr.hasOwnProperty(h)&&(l.li_attr[h]=a.li_attr[h]);if(l.li_attr.id||(l.li_attr.id=e),a&&"object"==typeof a.a_attr)for(h in a.a_attr)a.a_attr.hasOwnProperty(h)&&(l.a_attr[h]=a.a_attr[h]);for(a&&a.children&&a.children===!0&&(l.state.loaded=!1,l.children=[],l.children_d=[]),f[l.id]=l,h=0,i=l.children.length;i>h;h++)j=this._parse_model_from_flat_json(f[l.children[h]],l.id,d),k=f[j],l.children_d.push(j),k.children_d.length&&(l.children_d=l.children_d.concat(k.children_d));return delete a.data,delete a.children,f[l.id].original=a,l.state.selected&&this._data.core.selected.push(l.id),l.id},_parse_model_from_json:function(a,c,d){d=d?d.concat():[],c&&d.unshift(c);var e=!1,f,g,h,i,j=this._model.data,k=this._model.default_state,l;do e="j"+this._id+"_"+ ++this._cnt;while(j[e]);l={id:!1,text:"string"==typeof a?a:"",icon:"object"==typeof a&&a.icon!==b?a.icon:!0,parent:c,parents:d,children:[],children_d:[],data:null,state:{},li_attr:{id:!1},a_attr:{href:"#"},original:!1};for(f in k)k.hasOwnProperty(f)&&(l.state[f]=k[f]);if(a&&a.id&&(l.id=a.id.toString()),a&&a.text&&(l.text=a.text),a&&a.data&&a.data.jstree&&a.data.jstree.icon&&(l.icon=a.data.jstree.icon),(l.icon===b||null===l.icon||""===l.icon)&&(l.icon=!0),a&&a.data&&(l.data=a.data,a.data.jstree))for(f in a.data.jstree)a.data.jstree.hasOwnProperty(f)&&(l.state[f]=a.data.jstree[f]);if(a&&"object"==typeof a.state)for(f in a.state)a.state.hasOwnProperty(f)&&(l.state[f]=a.state[f]);if(a&&"object"==typeof a.li_attr)for(f in a.li_attr)a.li_attr.hasOwnProperty(f)&&(l.li_attr[f]=a.li_attr[f]);if(l.li_attr.id&&!l.id&&(l.id=l.li_attr.id.toString()),l.id||(l.id=e),l.li_attr.id||(l.li_attr.id=l.id),a&&"object"==typeof a.a_attr)for(f in a.a_attr)a.a_attr.hasOwnProperty(f)&&(l.a_attr[f]=a.a_attr[f]);if(a&&a.children&&a.children.length){for(f=0,g=a.children.length;g>f;f++)h=this._parse_model_from_json(a.children[f],l.id,d),i=j[h],l.children.push(h),i.children_d.length&&(l.children_d=l.children_d.concat(i.children_d));l.children_d=l.children_d.concat(l.children)}return a&&a.children&&a.children===!0&&(l.state.loaded=!1,l.children=[],l.children_d=[]),delete a.data,delete a.children,l.original=a,j[l.id]=l,l.state.selected&&this._data.core.selected.push(l.id),l.id},_redraw:function(){var b=this._model.force_full_redraw?this._model.data[a.jstree.root].children.concat([]):this._model.changed.concat([]),c=i.createElement("UL"),d,e,f,g=this._data.core.focused;for(e=0,f=b.length;f>e;e++)d=this.redraw_node(b[e],!0,this._model.force_full_redraw),d&&this._model.force_full_redraw&&c.appendChild(d);this._model.force_full_redraw&&(c.className=this.get_container_ul()[0].className,c.setAttribute("role","group"),this.element.empty().append(c)),null!==g&&(d=this.get_node(g,!0),d&&d.length&&d.children(".jstree-anchor")[0]!==i.activeElement?d.children(".jstree-anchor").focus():this._data.core.focused=null),this._model.force_full_redraw=!1,this._model.changed=[],this.trigger("redraw",{nodes:b})},redraw:function(a){a&&(this._model.force_full_redraw=!0),this._redraw()},draw_children:function(b){var c=this.get_node(b),d=!1,e=!1,f=!1,g=i;if(!c)return!1;if(c.id===a.jstree.root)return this.redraw(!0);if(b=this.get_node(b,!0),!b||!b.length)return!1;if(b.children(".jstree-children").remove(),b=b[0],c.children.length&&c.state.loaded){for(f=g.createElement("UL"),f.setAttribute("role","group"),f.className="jstree-children",d=0,e=c.children.length;e>d;d++)f.appendChild(this.redraw_node(c.children[d],!0,!0));b.appendChild(f)}},redraw_node:function(b,c,d,e){var f=this.get_node(b),g=!1,h=!1,k=!1,l=!1,m=!1,n=!1,o="",p=i,q=this._model.data,r=!1,s=!1,t=null,u=0,v=0,w=!1,x=!1;if(!f)return!1;if(f.id===a.jstree.root)return this.redraw(!0);if(c=c||0===f.children.length,b=i.querySelector?this.element[0].querySelector("#"+(-1!=="0123456789".indexOf(f.id[0])?"\\3"+f.id[0]+" "+f.id.substr(1).replace(a.jstree.idregex,"\\$&"):f.id.replace(a.jstree.idregex,"\\$&"))):i.getElementById(f.id))b=a(b),d||(g=b.parent().parent()[0],g===this.element[0]&&(g=null),h=b.index()),c||!f.children.length||b.children(".jstree-children").length||(c=!0),
c||(k=b.children(".jstree-children")[0]),r=b.children(".jstree-anchor")[0]===i.activeElement,b.remove();else if(c=!0,!d){if(g=f.parent!==a.jstree.root?a("#"+f.parent.replace(a.jstree.idregex,"\\$&"),this.element)[0]:null,!(null===g||g&&q[f.parent].state.opened))return!1;h=a.inArray(f.id,null===g?q[a.jstree.root].children:q[f.parent].children)}b=j.cloneNode(!0),o="jstree-node ";for(l in f.li_attr)if(f.li_attr.hasOwnProperty(l)){if("id"===l)continue;"class"!==l?b.setAttribute(l,f.li_attr[l]):o+=f.li_attr[l]}for(f.a_attr.id||(f.a_attr.id=f.id+"_anchor"),b.setAttribute("aria-selected",!!f.state.selected),b.setAttribute("aria-level",f.parents.length),b.setAttribute("aria-labelledby",f.a_attr.id),f.state.disabled&&b.setAttribute("aria-disabled",!0),l=0,m=f.children.length;m>l;l++)if(!q[f.children[l]].state.hidden){w=!0;break}if(null!==f.parent&&q[f.parent]&&!f.state.hidden&&(l=a.inArray(f.id,q[f.parent].children),x=f.id,-1!==l))for(l++,m=q[f.parent].children.length;m>l;l++)if(q[q[f.parent].children[l]].state.hidden||(x=q[f.parent].children[l]),x!==f.id)break;f.state.hidden&&(o+=" jstree-hidden"),f.state.loaded&&!w?o+=" jstree-leaf":(o+=f.state.opened&&f.state.loaded?" jstree-open":" jstree-closed",b.setAttribute("aria-expanded",f.state.opened&&f.state.loaded)),x===f.id&&(o+=" jstree-last"),b.id=f.id,b.className=o,o=(f.state.selected?" jstree-clicked":"")+(f.state.disabled?" jstree-disabled":"");for(m in f.a_attr)if(f.a_attr.hasOwnProperty(m)){if("href"===m&&"#"===f.a_attr[m])continue;"class"!==m?b.childNodes[1].setAttribute(m,f.a_attr[m]):o+=" "+f.a_attr[m]}if(o.length&&(b.childNodes[1].className="jstree-anchor "+o),(f.icon&&f.icon!==!0||f.icon===!1)&&(f.icon===!1?b.childNodes[1].childNodes[0].className+=" jstree-themeicon-hidden":-1===f.icon.indexOf("/")&&-1===f.icon.indexOf(".")?b.childNodes[1].childNodes[0].className+=" "+f.icon+" jstree-themeicon-custom":(b.childNodes[1].childNodes[0].style.backgroundImage="url("+f.icon+")",b.childNodes[1].childNodes[0].style.backgroundPosition="center center",b.childNodes[1].childNodes[0].style.backgroundSize="auto",b.childNodes[1].childNodes[0].className+=" jstree-themeicon-custom")),this.settings.core.force_text?b.childNodes[1].appendChild(p.createTextNode(f.text)):b.childNodes[1].innerHTML+=f.text,c&&f.children.length&&(f.state.opened||e)&&f.state.loaded){for(n=p.createElement("UL"),n.setAttribute("role","group"),n.className="jstree-children",l=0,m=f.children.length;m>l;l++)n.appendChild(this.redraw_node(f.children[l],c,!0));b.appendChild(n)}if(k&&b.appendChild(k),!d){for(g||(g=this.element[0]),l=0,m=g.childNodes.length;m>l;l++)if(g.childNodes[l]&&g.childNodes[l].className&&-1!==g.childNodes[l].className.indexOf("jstree-children")){t=g.childNodes[l];break}t||(t=p.createElement("UL"),t.setAttribute("role","group"),t.className="jstree-children",g.appendChild(t)),g=t,h<g.childNodes.length?g.insertBefore(b,g.childNodes[h]):g.appendChild(b),r&&(u=this.element[0].scrollTop,v=this.element[0].scrollLeft,b.childNodes[1].focus(),this.element[0].scrollTop=u,this.element[0].scrollLeft=v)}return f.state.opened&&!f.state.loaded&&(f.state.opened=!1,setTimeout(a.proxy(function(){this.open_node(f.id,!1,0)},this),0)),b},open_node:function(c,d,e){var f,g,h,i;if(a.isArray(c)){for(c=c.slice(),f=0,g=c.length;g>f;f++)this.open_node(c[f],d,e);return!0}return c=this.get_node(c),c&&c.id!==a.jstree.root?(e=e===b?this.settings.core.animation:e,this.is_closed(c)?this.is_loaded(c)?(h=this.get_node(c,!0),i=this,h.length&&(e&&h.children(".jstree-children").length&&h.children(".jstree-children").stop(!0,!0),c.children.length&&!this._firstChild(h.children(".jstree-children")[0])&&this.draw_children(c),e?(this.trigger("before_open",{node:c}),h.children(".jstree-children").css("display","none").end().removeClass("jstree-closed").addClass("jstree-open").attr("aria-expanded",!0).children(".jstree-children").stop(!0,!0).slideDown(e,function(){this.style.display="",i.trigger("after_open",{node:c})})):(this.trigger("before_open",{node:c}),h[0].className=h[0].className.replace("jstree-closed","jstree-open"),h[0].setAttribute("aria-expanded",!0))),c.state.opened=!0,d&&d.call(this,c,!0),h.length||this.trigger("before_open",{node:c}),this.trigger("open_node",{node:c}),e&&h.length||this.trigger("after_open",{node:c}),!0):this.is_loading(c)?setTimeout(a.proxy(function(){this.open_node(c,d,e)},this),500):void this.load_node(c,function(a,b){return b?this.open_node(a,d,e):d?d.call(this,a,!1):!1}):(d&&d.call(this,c,!1),!1)):!1},_open_to:function(b){if(b=this.get_node(b),!b||b.id===a.jstree.root)return!1;var c,d,e=b.parents;for(c=0,d=e.length;d>c;c+=1)c!==a.jstree.root&&this.open_node(e[c],!1,0);return a("#"+b.id.replace(a.jstree.idregex,"\\$&"),this.element)},close_node:function(c,d){var e,f,g,h;if(a.isArray(c)){for(c=c.slice(),e=0,f=c.length;f>e;e++)this.close_node(c[e],d);return!0}return c=this.get_node(c),c&&c.id!==a.jstree.root?this.is_closed(c)?!1:(d=d===b?this.settings.core.animation:d,g=this,h=this.get_node(c,!0),h.length&&(d?h.children(".jstree-children").attr("style","display:block !important").end().removeClass("jstree-open").addClass("jstree-closed").attr("aria-expanded",!1).children(".jstree-children").stop(!0,!0).slideUp(d,function(){this.style.display="",h.children(".jstree-children").remove(),g.trigger("after_close",{node:c})}):(h[0].className=h[0].className.replace("jstree-open","jstree-closed"),h.attr("aria-expanded",!1).children(".jstree-children").remove())),c.state.opened=!1,this.trigger("close_node",{node:c}),void(d&&h.length||this.trigger("after_close",{node:c}))):!1},toggle_node:function(b){var c,d;if(a.isArray(b)){for(b=b.slice(),c=0,d=b.length;d>c;c++)this.toggle_node(b[c]);return!0}return this.is_closed(b)?this.open_node(b):this.is_open(b)?this.close_node(b):void 0},open_all:function(b,c,d){if(b||(b=a.jstree.root),b=this.get_node(b),!b)return!1;var e=b.id===a.jstree.root?this.get_container_ul():this.get_node(b,!0),f,g,h;if(!e.length){for(f=0,g=b.children_d.length;g>f;f++)this.is_closed(this._model.data[b.children_d[f]])&&(this._model.data[b.children_d[f]].state.opened=!0);return this.trigger("open_all",{node:b})}d=d||e,h=this,e=this.is_closed(b)?e.find(".jstree-closed").addBack():e.find(".jstree-closed"),e.each(function(){h.open_node(this,function(a,b){b&&this.is_parent(a)&&this.open_all(a,c,d)},c||0)}),0===d.find(".jstree-closed").length&&this.trigger("open_all",{node:this.get_node(d)})},close_all:function(b,c){if(b||(b=a.jstree.root),b=this.get_node(b),!b)return!1;var d=b.id===a.jstree.root?this.get_container_ul():this.get_node(b,!0),e=this,f,g;for(d.length&&(d=this.is_open(b)?d.find(".jstree-open").addBack():d.find(".jstree-open"),a(d.get().reverse()).each(function(){e.close_node(this,c||0)})),f=0,g=b.children_d.length;g>f;f++)this._model.data[b.children_d[f]].state.opened=!1;this.trigger("close_all",{node:b})},is_disabled:function(a){return a=this.get_node(a),a&&a.state&&a.state.disabled},enable_node:function(b){var c,d;if(a.isArray(b)){for(b=b.slice(),c=0,d=b.length;d>c;c++)this.enable_node(b[c]);return!0}return b=this.get_node(b),b&&b.id!==a.jstree.root?(b.state.disabled=!1,this.get_node(b,!0).children(".jstree-anchor").removeClass("jstree-disabled").attr("aria-disabled",!1),void this.trigger("enable_node",{node:b})):!1},disable_node:function(b){var c,d;if(a.isArray(b)){for(b=b.slice(),c=0,d=b.length;d>c;c++)this.disable_node(b[c]);return!0}return b=this.get_node(b),b&&b.id!==a.jstree.root?(b.state.disabled=!0,this.get_node(b,!0).children(".jstree-anchor").addClass("jstree-disabled").attr("aria-disabled",!0),void this.trigger("disable_node",{node:b})):!1},hide_node:function(b,c){var d,e;if(a.isArray(b)){for(b=b.slice(),d=0,e=b.length;e>d;d++)this.hide_node(b[d],!0);return this.redraw(),!0}return b=this.get_node(b),b&&b.id!==a.jstree.root?void(b.state.hidden||(b.state.hidden=!0,this._node_changed(b.parent),c||this.redraw(),this.trigger("hide_node",{node:b}))):!1},show_node:function(b,c){var d,e;if(a.isArray(b)){for(b=b.slice(),d=0,e=b.length;e>d;d++)this.show_node(b[d],!0);return this.redraw(),!0}return b=this.get_node(b),b&&b.id!==a.jstree.root?void(b.state.hidden&&(b.state.hidden=!1,this._node_changed(b.parent),c||this.redraw(),this.trigger("show_node",{node:b}))):!1},hide_all:function(b){var c,d=this._model.data,e=[];for(c in d)d.hasOwnProperty(c)&&c!==a.jstree.root&&!d[c].state.hidden&&(d[c].state.hidden=!0,e.push(c));return this._model.force_full_redraw=!0,b||this.redraw(),this.trigger("hide_all",{nodes:e}),e},show_all:function(b){var c,d=this._model.data,e=[];for(c in d)d.hasOwnProperty(c)&&c!==a.jstree.root&&d[c].state.hidden&&(d[c].state.hidden=!1,e.push(c));return this._model.force_full_redraw=!0,b||this.redraw(),this.trigger("show_all",{nodes:e}),e},activate_node:function(a,c){if(this.is_disabled(a))return!1;if(c&&"object"==typeof c||(c={}),this._data.core.last_clicked=this._data.core.last_clicked&&this._data.core.last_clicked.id!==b?this.get_node(this._data.core.last_clicked.id):null,this._data.core.last_clicked&&!this._data.core.last_clicked.state.selected&&(this._data.core.last_clicked=null),!this._data.core.last_clicked&&this._data.core.selected.length&&(this._data.core.last_clicked=this.get_node(this._data.core.selected[this._data.core.selected.length-1])),this.settings.core.multiple&&(c.metaKey||c.ctrlKey||c.shiftKey)&&(!c.shiftKey||this._data.core.last_clicked&&this.get_parent(a)&&this.get_parent(a)===this._data.core.last_clicked.parent))if(c.shiftKey){var d=this.get_node(a).id,e=this._data.core.last_clicked.id,f=this.get_node(this._data.core.last_clicked.parent).children,g=!1,h,i;for(h=0,i=f.length;i>h;h+=1)f[h]===d&&(g=!g),f[h]===e&&(g=!g),this.is_disabled(f[h])||!g&&f[h]!==d&&f[h]!==e?this.deselect_node(f[h],!0,c):this.select_node(f[h],!0,!1,c);this.trigger("changed",{action:"select_node",node:this.get_node(a),selected:this._data.core.selected,event:c})}else this.is_selected(a)?this.deselect_node(a,!1,c):this.select_node(a,!1,!1,c);else!this.settings.core.multiple&&(c.metaKey||c.ctrlKey||c.shiftKey)&&this.is_selected(a)?this.deselect_node(a,!1,c):(this.deselect_all(!0),this.select_node(a,!1,!1,c),this._data.core.last_clicked=this.get_node(a));this.trigger("activate_node",{node:this.get_node(a),event:c})},hover_node:function(a){if(a=this.get_node(a,!0),!a||!a.length||a.children(".jstree-hovered").length)return!1;var b=this.element.find(".jstree-hovered"),c=this.element;b&&b.length&&this.dehover_node(b),a.children(".jstree-anchor").addClass("jstree-hovered"),this.trigger("hover_node",{node:this.get_node(a)}),setTimeout(function(){c.attr("aria-activedescendant",a[0].id)},0)},dehover_node:function(a){return a=this.get_node(a,!0),a&&a.length&&a.children(".jstree-hovered").length?(a.children(".jstree-anchor").removeClass("jstree-hovered"),void this.trigger("dehover_node",{node:this.get_node(a)})):!1},select_node:function(b,c,d,e){var f,g,h,i;if(a.isArray(b)){for(b=b.slice(),g=0,h=b.length;h>g;g++)this.select_node(b[g],c,d,e);return!0}return b=this.get_node(b),b&&b.id!==a.jstree.root?(f=this.get_node(b,!0),void(b.state.selected||(b.state.selected=!0,this._data.core.selected.push(b.id),d||(f=this._open_to(b)),f&&f.length&&f.attr("aria-selected",!0).children(".jstree-anchor").addClass("jstree-clicked"),this.trigger("select_node",{node:b,selected:this._data.core.selected,event:e}),c||this.trigger("changed",{action:"select_node",node:b,selected:this._data.core.selected,event:e})))):!1},deselect_node:function(b,c,d){var e,f,g;if(a.isArray(b)){for(b=b.slice(),e=0,f=b.length;f>e;e++)this.deselect_node(b[e],c,d);return!0}return b=this.get_node(b),b&&b.id!==a.jstree.root?(g=this.get_node(b,!0),void(b.state.selected&&(b.state.selected=!1,this._data.core.selected=a.vakata.array_remove_item(this._data.core.selected,b.id),g.length&&g.attr("aria-selected",!1).children(".jstree-anchor").removeClass("jstree-clicked"),this.trigger("deselect_node",{node:b,selected:this._data.core.selected,event:d}),c||this.trigger("changed",{action:"deselect_node",node:b,selected:this._data.core.selected,event:d})))):!1},select_all:function(b){var c=this._data.core.selected.concat([]),d,e;for(this._data.core.selected=this._model.data[a.jstree.root].children_d.concat(),d=0,e=this._data.core.selected.length;e>d;d++)this._model.data[this._data.core.selected[d]]&&(this._model.data[this._data.core.selected[d]].state.selected=!0);this.redraw(!0),this.trigger("select_all",{selected:this._data.core.selected}),b||this.trigger("changed",{action:"select_all",selected:this._data.core.selected,old_selection:c})},deselect_all:function(a){var b=this._data.core.selected.concat([]),c,d;for(c=0,d=this._data.core.selected.length;d>c;c++)this._model.data[this._data.core.selected[c]]&&(this._model.data[this._data.core.selected[c]].state.selected=!1);this._data.core.selected=[],this.element.find(".jstree-clicked").removeClass("jstree-clicked").parent().attr("aria-selected",!1),this.trigger("deselect_all",{selected:this._data.core.selected,node:b}),a||this.trigger("changed",{action:"deselect_all",selected:this._data.core.selected,old_selection:b})},is_selected:function(b){return b=this.get_node(b),b&&b.id!==a.jstree.root?b.state.selected:!1},get_selected:function(b){return b?a.map(this._data.core.selected,a.proxy(function(a){return this.get_node(a)},this)):this._data.core.selected.slice()},get_top_selected:function(b){var c=this.get_selected(!0),d={},e,f,g,h;for(e=0,f=c.length;f>e;e++)d[c[e].id]=c[e];for(e=0,f=c.length;f>e;e++)for(g=0,h=c[e].children_d.length;h>g;g++)d[c[e].children_d[g]]&&delete d[c[e].children_d[g]];c=[];for(e in d)d.hasOwnProperty(e)&&c.push(e);return b?a.map(c,a.proxy(function(a){return this.get_node(a)},this)):c},get_bottom_selected:function(b){var c=this.get_selected(!0),d=[],e,f;for(e=0,f=c.length;f>e;e++)c[e].children.length||d.push(c[e].id);return b?a.map(d,a.proxy(function(a){return this.get_node(a)},this)):d},get_state:function(){var b={core:{open:[],scroll:{left:this.element.scrollLeft(),top:this.element.scrollTop()},selected:[]}},c;for(c in this._model.data)this._model.data.hasOwnProperty(c)&&c!==a.jstree.root&&(this._model.data[c].state.opened&&b.core.open.push(c),this._model.data[c].state.selected&&b.core.selected.push(c));return b},set_state:function(c,d){if(c){if(c.core){var e,f,g,h,i;if(c.core.open)return a.isArray(c.core.open)&&c.core.open.length?this._load_nodes(c.core.open,function(a){this.open_node(a,!1,0),delete c.core.open,this.set_state(c,d)},!0):(delete c.core.open,this.set_state(c,d)),!1;if(c.core.scroll)return c.core.scroll&&c.core.scroll.left!==b&&this.element.scrollLeft(c.core.scroll.left),c.core.scroll&&c.core.scroll.top!==b&&this.element.scrollTop(c.core.scroll.top),delete c.core.scroll,this.set_state(c,d),!1;if(c.core.selected)return h=this,this.deselect_all(),a.each(c.core.selected,function(a,b){h.select_node(b,!1,!0)}),delete c.core.selected,this.set_state(c,d),!1;for(i in c)c.hasOwnProperty(i)&&"core"!==i&&-1===a.inArray(i,this.settings.plugins)&&delete c[i];if(a.isEmptyObject(c.core))return delete c.core,this.set_state(c,d),!1}return a.isEmptyObject(c)?(c=null,d&&d.call(this),this.trigger("set_state"),!1):!0}return!1},refresh:function(b,c){this._data.core.state=c===!0?{}:this.get_state(),c&&a.isFunction(c)&&(this._data.core.state=c.call(this,this._data.core.state)),this._cnt=0,this._model.data={},this._model.data[a.jstree.root]={id:a.jstree.root,parent:null,parents:[],children:[],children_d:[],state:{loaded:!1}},this._data.core.selected=[],this._data.core.last_clicked=null,this._data.core.focused=null;var d=this.get_container_ul()[0].className;b||(this.element.html("<ul class='"+d+"' role='group'><li class='jstree-initial-node jstree-loading jstree-leaf jstree-last' role='treeitem' id='j"+this._id+"_loading'><i class='jstree-icon jstree-ocl'></i><a class='jstree-anchor' href='#'><i class='jstree-icon jstree-themeicon-hidden'></i>"+this.get_string("Loading ...")+"</a></li></ul>"),this.element.attr("aria-activedescendant","j"+this._id+"_loading")),this.load_node(a.jstree.root,function(b,c){c&&(this.get_container_ul()[0].className=d,this._firstChild(this.get_container_ul()[0])&&this.element.attr("aria-activedescendant",this._firstChild(this.get_container_ul()[0]).id),this.set_state(a.extend(!0,{},this._data.core.state),function(){this.trigger("refresh")})),this._data.core.state=null})},refresh_node:function(b){if(b=this.get_node(b),!b||b.id===a.jstree.root)return!1;var c=[],d=[],e=this._data.core.selected.concat([]);d.push(b.id),b.state.opened===!0&&c.push(b.id),this.get_node(b,!0).find(".jstree-open").each(function(){c.push(this.id)}),this._load_nodes(d,a.proxy(function(a){this.open_node(c,!1,0),this.select_node(this._data.core.selected),this.trigger("refresh_node",{node:b,nodes:a})},this))},set_id:function(b,c){if(b=this.get_node(b),!b||b.id===a.jstree.root)return!1;var d,e,f=this._model.data;for(c=c.toString(),f[b.parent].children[a.inArray(b.id,f[b.parent].children)]=c,d=0,e=b.parents.length;e>d;d++)f[b.parents[d]].children_d[a.inArray(b.id,f[b.parents[d]].children_d)]=c;for(d=0,e=b.children.length;e>d;d++)f[b.children[d]].parent=c;for(d=0,e=b.children_d.length;e>d;d++)f[b.children_d[d]].parents[a.inArray(b.id,f[b.children_d[d]].parents)]=c;return d=a.inArray(b.id,this._data.core.selected),-1!==d&&(this._data.core.selected[d]=c),d=this.get_node(b.id,!0),d&&(d.attr("id",c).children(".jstree-anchor").attr("id",c+"_anchor").end().attr("aria-labelledby",c+"_anchor"),this.element.attr("aria-activedescendant")===b.id&&this.element.attr("aria-activedescendant",c)),delete f[b.id],b.id=c,b.li_attr.id=c,f[c]=b,!0},get_text:function(b){return b=this.get_node(b),b&&b.id!==a.jstree.root?b.text:!1},set_text:function(b,c){var d,e;if(a.isArray(b)){for(b=b.slice(),d=0,e=b.length;e>d;d++)this.set_text(b[d],c);return!0}return b=this.get_node(b),b&&b.id!==a.jstree.root?(b.text=c,this.get_node(b,!0).length&&this.redraw_node(b.id),this.trigger("set_text",{obj:b,text:c}),!0):!1},get_json:function(b,c,d){if(b=this.get_node(b||a.jstree.root),!b)return!1;c&&c.flat&&!d&&(d=[]);var e={id:b.id,text:b.text,icon:this.get_icon(b),li_attr:a.extend(!0,{},b.li_attr),a_attr:a.extend(!0,{},b.a_attr),state:{},data:c&&c.no_data?!1:a.extend(!0,{},b.data)},f,g;if(c&&c.flat?e.parent=b.parent:e.children=[],!c||!c.no_state)for(f in b.state)b.state.hasOwnProperty(f)&&(e.state[f]=b.state[f]);if(c&&c.no_id&&(delete e.id,e.li_attr&&e.li_attr.id&&delete e.li_attr.id,e.a_attr&&e.a_attr.id&&delete e.a_attr.id),c&&c.flat&&b.id!==a.jstree.root&&d.push(e),!c||!c.no_children)for(f=0,g=b.children.length;g>f;f++)c&&c.flat?this.get_json(b.children[f],c,d):e.children.push(this.get_json(b.children[f],c));return c&&c.flat?d:b.id===a.jstree.root?e.children:e},create_node:function(c,d,e,f,g){if(null===c&&(c=a.jstree.root),c=this.get_node(c),!c)return!1;if(e=e===b?"last":e,!e.toString().match(/^(before|after)$/)&&!g&&!this.is_loaded(c))return this.load_node(c,function(){this.create_node(c,d,e,f,!0)});d||(d={text:this.get_string("New node")}),"string"==typeof d&&(d={text:d}),d.text===b&&(d.text=this.get_string("New node"));var h,i,j,k;switch(c.id===a.jstree.root&&("before"===e&&(e="first"),"after"===e&&(e="last")),e){case"before":h=this.get_node(c.parent),e=a.inArray(c.id,h.children),c=h;break;case"after":h=this.get_node(c.parent),e=a.inArray(c.id,h.children)+1,c=h;break;case"inside":case"first":e=0;break;case"last":e=c.children.length;break;default:e||(e=0)}if(e>c.children.length&&(e=c.children.length),d.id||(d.id=!0),!this.check("create_node",d,c,e))return this.settings.core.error.call(this,this._data.core.last_error),!1;if(d.id===!0&&delete d.id,d=this._parse_model_from_json(d,c.id,c.parents.concat()),!d)return!1;for(h=this.get_node(d),i=[],i.push(d),i=i.concat(h.children_d),this.trigger("model",{nodes:i,parent:c.id}),c.children_d=c.children_d.concat(i),j=0,k=c.parents.length;k>j;j++)this._model.data[c.parents[j]].children_d=this._model.data[c.parents[j]].children_d.concat(i);for(d=h,h=[],j=0,k=c.children.length;k>j;j++)h[j>=e?j+1:j]=c.children[j];return h[e]=d.id,c.children=h,this.redraw_node(c,!0),f&&f.call(this,this.get_node(d)),this.trigger("create_node",{node:this.get_node(d),parent:c.id,position:e}),d.id},rename_node:function(b,c){var d,e,f;if(a.isArray(b)){for(b=b.slice(),d=0,e=b.length;e>d;d++)this.rename_node(b[d],c);return!0}return b=this.get_node(b),b&&b.id!==a.jstree.root?(f=b.text,this.check("rename_node",b,this.get_parent(b),c)?(this.set_text(b,c),this.trigger("rename_node",{node:b,text:c,old:f}),!0):(this.settings.core.error.call(this,this._data.core.last_error),!1)):!1},delete_node:function(b){var c,d,e,f,g,h,i,j,k,l,m,n;if(a.isArray(b)){for(b=b.slice(),c=0,d=b.length;d>c;c++)this.delete_node(b[c]);return!0}if(b=this.get_node(b),!b||b.id===a.jstree.root)return!1;if(e=this.get_node(b.parent),f=a.inArray(b.id,e.children),l=!1,!this.check("delete_node",b,e,f))return this.settings.core.error.call(this,this._data.core.last_error),!1;for(-1!==f&&(e.children=a.vakata.array_remove(e.children,f)),g=b.children_d.concat([]),g.push(b.id),j=0,k=g.length;k>j;j++){for(h=0,i=b.parents.length;i>h;h++)f=a.inArray(g[j],this._model.data[b.parents[h]].children_d),-1!==f&&(this._model.data[b.parents[h]].children_d=a.vakata.array_remove(this._model.data[b.parents[h]].children_d,f));this._model.data[g[j]].state.selected&&(l=!0,f=a.inArray(g[j],this._data.core.selected),-1!==f&&(this._data.core.selected=a.vakata.array_remove(this._data.core.selected,f)))}for(this.trigger("delete_node",{node:b,parent:e.id}),l&&this.trigger("changed",{action:"delete_node",node:b,selected:this._data.core.selected,parent:e.id}),j=0,k=g.length;k>j;j++)delete this._model.data[g[j]];return-1!==a.inArray(this._data.core.focused,g)&&(this._data.core.focused=null,m=this.element[0].scrollTop,n=this.element[0].scrollLeft,e.id===a.jstree.root?this.get_node(this._model.data[a.jstree.root].children[0],!0).children(".jstree-anchor").focus():this.get_node(e,!0).children(".jstree-anchor").focus(),this.element[0].scrollTop=m,this.element[0].scrollLeft=n),this.redraw_node(e,!0),!0},check:function(b,c,d,e,f){c=c&&c.id?c:this.get_node(c),d=d&&d.id?d:this.get_node(d);var g=b.match(/^move_node|copy_node|create_node$/i)?d:c,h=this.settings.core.check_callback;return"move_node"!==b&&"copy_node"!==b||f&&f.is_multi||c.id!==d.id&&a.inArray(c.id,d.children)!==e&&-1===a.inArray(d.id,c.children_d)?(g&&g.data&&(g=g.data),g&&g.functions&&(g.functions[b]===!1||g.functions[b]===!0)?(g.functions[b]===!1&&(this._data.core.last_error={error:"check",plugin:"core",id:"core_02",reason:"Node data prevents function: "+b,data:JSON.stringify({chk:b,pos:e,obj:c&&c.id?c.id:!1,par:d&&d.id?d.id:!1})}),g.functions[b]):h===!1||a.isFunction(h)&&h.call(this,b,c,d,e,f)===!1||h&&h[b]===!1?(this._data.core.last_error={error:"check",plugin:"core",id:"core_03",reason:"User config for core.check_callback prevents function: "+b,data:JSON.stringify({chk:b,pos:e,obj:c&&c.id?c.id:!1,par:d&&d.id?d.id:!1})},!1):!0):(this._data.core.last_error={error:"check",plugin:"core",id:"core_01",reason:"Moving parent inside child",data:JSON.stringify({chk:b,pos:e,obj:c&&c.id?c.id:!1,par:d&&d.id?d.id:!1})},!1)},last_error:function(){return this._data.core.last_error},move_node:function(c,d,e,f,g,h,i){var j,k,l,m,n,o,p,q,r,s,t,u,v,w;if(d=this.get_node(d),e=e===b?0:e,!d)return!1;if(!e.toString().match(/^(before|after)$/)&&!g&&!this.is_loaded(d))return this.load_node(d,function(){this.move_node(c,d,e,f,!0,!1,i)});if(a.isArray(c)){if(1!==c.length){for(j=0,k=c.length;k>j;j++)(r=this.move_node(c[j],d,e,f,g,!1,i))&&(d=r,e="after");return this.redraw(),!0}c=c[0]}if(c=c&&c.id?c:this.get_node(c),!c||c.id===a.jstree.root)return!1;if(l=(c.parent||a.jstree.root).toString(),n=e.toString().match(/^(before|after)$/)&&d.id!==a.jstree.root?this.get_node(d.parent):d,o=i?i:this._model.data[c.id]?this:a.jstree.reference(c.id),p=!o||!o._id||this._id!==o._id,m=o&&o._id&&l&&o._model.data[l]&&o._model.data[l].children?a.inArray(c.id,o._model.data[l].children):-1,o&&o._id&&(c=o._model.data[c.id]),p)return(r=this.copy_node(c,d,e,f,g,!1,i))?(o&&o.delete_node(c),r):!1;switch(d.id===a.jstree.root&&("before"===e&&(e="first"),"after"===e&&(e="last")),e){case"before":e=a.inArray(d.id,n.children);break;case"after":e=a.inArray(d.id,n.children)+1;break;case"inside":case"first":e=0;break;case"last":e=n.children.length;break;default:e||(e=0)}if(e>n.children.length&&(e=n.children.length),!this.check("move_node",c,n,e,{core:!0,origin:i,is_multi:o&&o._id&&o._id!==this._id,is_foreign:!o||!o._id}))return this.settings.core.error.call(this,this._data.core.last_error),!1;if(c.parent===n.id){for(q=n.children.concat(),r=a.inArray(c.id,q),-1!==r&&(q=a.vakata.array_remove(q,r),e>r&&e--),r=[],s=0,t=q.length;t>s;s++)r[s>=e?s+1:s]=q[s];r[e]=c.id,n.children=r,this._node_changed(n.id),this.redraw(n.id===a.jstree.root)}else{for(r=c.children_d.concat(),r.push(c.id),s=0,t=c.parents.length;t>s;s++){for(q=[],w=o._model.data[c.parents[s]].children_d,u=0,v=w.length;v>u;u++)-1===a.inArray(w[u],r)&&q.push(w[u]);o._model.data[c.parents[s]].children_d=q}for(o._model.data[l].children=a.vakata.array_remove_item(o._model.data[l].children,c.id),s=0,t=n.parents.length;t>s;s++)this._model.data[n.parents[s]].children_d=this._model.data[n.parents[s]].children_d.concat(r);for(q=[],s=0,t=n.children.length;t>s;s++)q[s>=e?s+1:s]=n.children[s];for(q[e]=c.id,n.children=q,n.children_d.push(c.id),n.children_d=n.children_d.concat(c.children_d),c.parent=n.id,r=n.parents.concat(),r.unshift(n.id),w=c.parents.length,c.parents=r,r=r.concat(),s=0,t=c.children_d.length;t>s;s++)this._model.data[c.children_d[s]].parents=this._model.data[c.children_d[s]].parents.slice(0,-1*w),Array.prototype.push.apply(this._model.data[c.children_d[s]].parents,r);(l===a.jstree.root||n.id===a.jstree.root)&&(this._model.force_full_redraw=!0),this._model.force_full_redraw||(this._node_changed(l),this._node_changed(n.id)),h||this.redraw()}return f&&f.call(this,c,n,e),this.trigger("move_node",{node:c,parent:n.id,position:e,old_parent:l,old_position:m,is_multi:o&&o._id&&o._id!==this._id,is_foreign:!o||!o._id,old_instance:o,new_instance:this}),c.id},copy_node:function(c,d,e,f,g,h,i){var j,k,l,m,n,o,p,q,r,s,t;if(d=this.get_node(d),e=e===b?0:e,!d)return!1;if(!e.toString().match(/^(before|after)$/)&&!g&&!this.is_loaded(d))return this.load_node(d,function(){this.copy_node(c,d,e,f,!0,!1,i)});if(a.isArray(c)){if(1!==c.length){for(j=0,k=c.length;k>j;j++)(m=this.copy_node(c[j],d,e,f,g,!0,i))&&(d=m,e="after");return this.redraw(),!0}c=c[0]}if(c=c&&c.id?c:this.get_node(c),!c||c.id===a.jstree.root)return!1;switch(q=(c.parent||a.jstree.root).toString(),r=e.toString().match(/^(before|after)$/)&&d.id!==a.jstree.root?this.get_node(d.parent):d,s=i?i:this._model.data[c.id]?this:a.jstree.reference(c.id),t=!s||!s._id||this._id!==s._id,s&&s._id&&(c=s._model.data[c.id]),d.id===a.jstree.root&&("before"===e&&(e="first"),"after"===e&&(e="last")),e){case"before":e=a.inArray(d.id,r.children);break;case"after":e=a.inArray(d.id,r.children)+1;break;case"inside":case"first":e=0;break;case"last":e=r.children.length;break;default:e||(e=0)}if(e>r.children.length&&(e=r.children.length),!this.check("copy_node",c,r,e,{core:!0,origin:i,is_multi:s&&s._id&&s._id!==this._id,is_foreign:!s||!s._id}))return this.settings.core.error.call(this,this._data.core.last_error),!1;if(p=s?s.get_json(c,{no_id:!0,no_data:!0,no_state:!0}):c,!p)return!1;if(p.id===!0&&delete p.id,p=this._parse_model_from_json(p,r.id,r.parents.concat()),!p)return!1;for(m=this.get_node(p),c&&c.state&&c.state.loaded===!1&&(m.state.loaded=!1),l=[],l.push(p),l=l.concat(m.children_d),this.trigger("model",{nodes:l,parent:r.id}),n=0,o=r.parents.length;o>n;n++)this._model.data[r.parents[n]].children_d=this._model.data[r.parents[n]].children_d.concat(l);for(l=[],n=0,o=r.children.length;o>n;n++)l[n>=e?n+1:n]=r.children[n];return l[e]=m.id,r.children=l,r.children_d.push(m.id),r.children_d=r.children_d.concat(m.children_d),r.id===a.jstree.root&&(this._model.force_full_redraw=!0),this._model.force_full_redraw||this._node_changed(r.id),h||this.redraw(r.id===a.jstree.root),f&&f.call(this,m,r,e),this.trigger("copy_node",{node:m,original:c,parent:r.id,position:e,old_parent:q,old_position:s&&s._id&&q&&s._model.data[q]&&s._model.data[q].children?a.inArray(c.id,s._model.data[q].children):-1,is_multi:s&&s._id&&s._id!==this._id,is_foreign:!s||!s._id,old_instance:s,new_instance:this}),m.id},cut:function(b){if(b||(b=this._data.core.selected.concat()),a.isArray(b)||(b=[b]),!b.length)return!1;var c=[],g,h,i;for(h=0,i=b.length;i>h;h++)g=this.get_node(b[h]),g&&g.id&&g.id!==a.jstree.root&&c.push(g);return c.length?(d=c,f=this,e="move_node",void this.trigger("cut",{node:b})):!1},copy:function(b){if(b||(b=this._data.core.selected.concat()),a.isArray(b)||(b=[b]),!b.length)return!1;var c=[],g,h,i;for(h=0,i=b.length;i>h;h++)g=this.get_node(b[h]),g&&g.id&&g.id!==a.jstree.root&&c.push(g);return c.length?(d=c,f=this,e="copy_node",void this.trigger("copy",{node:b})):!1},get_buffer:function(){return{mode:e,node:d,inst:f}},can_paste:function(){return e!==!1&&d!==!1},paste:function(a,b){return a=this.get_node(a),a&&e&&e.match(/^(copy_node|move_node)$/)&&d?(this[e](d,a,b,!1,!1,!1,f)&&this.trigger("paste",{parent:a.id,node:d,mode:e}),d=!1,e=!1,void(f=!1)):!1},clear_buffer:function(){d=!1,e=!1,f=!1,this.trigger("clear_buffer")},edit:function(b,c,d){var e,f,g,h,i,j,k,l,m,n=!1;return(b=this.get_node(b))?this.settings.core.check_callback===!1?(this._data.core.last_error={error:"check",plugin:"core",id:"core_07",reason:"Could not edit node because of check_callback"},this.settings.core.error.call(this,this._data.core.last_error),!1):(m=b,c="string"==typeof c?c:b.text,this.set_text(b,""),b=this._open_to(b),m.text=c,e=this._data.core.rtl,f=this.element.width(),this._data.core.focused=m.id,g=b.children(".jstree-anchor").focus(),h=a("<span>"),i=c,j=a("<div />",{css:{position:"absolute",top:"-200px",left:e?"0px":"-1000px",visibility:"hidden"}}).appendTo("body"),k=a("<input />",{value:i,"class":"jstree-rename-input",css:{padding:"0",border:"1px solid silver","box-sizing":"border-box",display:"inline-block",height:this._data.core.li_height+"px",lineHeight:this._data.core.li_height+"px",width:"150px"},blur:a.proxy(function(c){c.stopImmediatePropagation(),c.preventDefault();var e=h.children(".jstree-rename-input"),f=e.val(),k=this.settings.core.force_text,l;""===f&&(f=i),j.remove(),h.replaceWith(g),h.remove(),i=k?i:a("<div></div>").append(a.parseHTML(i)).html(),this.set_text(b,i),l=!!this.rename_node(b,k?a("<div></div>").text(f).text():a("<div></div>").append(a.parseHTML(f)).html()),l||this.set_text(b,i),this._data.core.focused=m.id,setTimeout(a.proxy(function(){var a=this.get_node(m.id,!0);a.length&&(this._data.core.focused=m.id,a.children(".jstree-anchor").focus())},this),0),d&&d.call(this,m,l,n)},this),keydown:function(a){var b=a.which;27===b&&(n=!0,this.value=i),(27===b||13===b||37===b||38===b||39===b||40===b||32===b)&&a.stopImmediatePropagation(),(27===b||13===b)&&(a.preventDefault(),this.blur())},click:function(a){a.stopImmediatePropagation()},mousedown:function(a){a.stopImmediatePropagation()},keyup:function(a){k.width(Math.min(j.text("pW"+this.value).width(),f))},keypress:function(a){return 13===a.which?!1:void 0}}),l={fontFamily:g.css("fontFamily")||"",fontSize:g.css("fontSize")||"",fontWeight:g.css("fontWeight")||"",fontStyle:g.css("fontStyle")||"",fontStretch:g.css("fontStretch")||"",fontVariant:g.css("fontVariant")||"",letterSpacing:g.css("letterSpacing")||"",wordSpacing:g.css("wordSpacing")||""},h.attr("class",g.attr("class")).append(g.contents().clone()).append(k),g.replaceWith(h),j.css(l),void k.css(l).width(Math.min(j.text("pW"+k[0].value).width(),f))[0].select()):!1},set_theme:function(b,c){if(!b)return!1;if(c===!0){var d=this.settings.core.themes.dir;d||(d=a.jstree.path+"/themes"),c=d+"/"+b+"/style.css"}c&&-1===a.inArray(c,g)&&(a("head").append('<link rel="stylesheet" href="'+c+'" type="text/css" />'),g.push(c)),this._data.core.themes.name&&this.element.removeClass("jstree-"+this._data.core.themes.name),
this._data.core.themes.name=b,this.element.addClass("jstree-"+b),this.element[this.settings.core.themes.responsive?"addClass":"removeClass"]("jstree-"+b+"-responsive"),this.trigger("set_theme",{theme:b})},get_theme:function(){return this._data.core.themes.name},set_theme_variant:function(a){this._data.core.themes.variant&&this.element.removeClass("jstree-"+this._data.core.themes.name+"-"+this._data.core.themes.variant),this._data.core.themes.variant=a,a&&this.element.addClass("jstree-"+this._data.core.themes.name+"-"+this._data.core.themes.variant)},get_theme_variant:function(){return this._data.core.themes.variant},show_stripes:function(){this._data.core.themes.stripes=!0,this.get_container_ul().addClass("jstree-striped")},hide_stripes:function(){this._data.core.themes.stripes=!1,this.get_container_ul().removeClass("jstree-striped")},toggle_stripes:function(){this._data.core.themes.stripes?this.hide_stripes():this.show_stripes()},show_dots:function(){this._data.core.themes.dots=!0,this.get_container_ul().removeClass("jstree-no-dots")},hide_dots:function(){this._data.core.themes.dots=!1,this.get_container_ul().addClass("jstree-no-dots")},toggle_dots:function(){this._data.core.themes.dots?this.hide_dots():this.show_dots()},show_icons:function(){this._data.core.themes.icons=!0,this.get_container_ul().removeClass("jstree-no-icons")},hide_icons:function(){this._data.core.themes.icons=!1,this.get_container_ul().addClass("jstree-no-icons")},toggle_icons:function(){this._data.core.themes.icons?this.hide_icons():this.show_icons()},set_icon:function(c,d){var e,f,g,h;if(a.isArray(c)){for(c=c.slice(),e=0,f=c.length;f>e;e++)this.set_icon(c[e],d);return!0}return c=this.get_node(c),c&&c.id!==a.jstree.root?(h=c.icon,c.icon=d===!0||null===d||d===b||""===d?!0:d,g=this.get_node(c,!0).children(".jstree-anchor").children(".jstree-themeicon"),d===!1?this.hide_icon(c):d===!0||null===d||d===b||""===d?(g.removeClass("jstree-themeicon-custom "+h).css("background","").removeAttr("rel"),h===!1&&this.show_icon(c)):-1===d.indexOf("/")&&-1===d.indexOf(".")?(g.removeClass(h).css("background",""),g.addClass(d+" jstree-themeicon-custom").attr("rel",d),h===!1&&this.show_icon(c)):(g.removeClass(h).css("background",""),g.addClass("jstree-themeicon-custom").css("background","url('"+d+"') center center no-repeat").attr("rel",d),h===!1&&this.show_icon(c)),!0):!1},get_icon:function(b){return b=this.get_node(b),b&&b.id!==a.jstree.root?b.icon:!1},hide_icon:function(b){var c,d;if(a.isArray(b)){for(b=b.slice(),c=0,d=b.length;d>c;c++)this.hide_icon(b[c]);return!0}return b=this.get_node(b),b&&b!==a.jstree.root?(b.icon=!1,this.get_node(b,!0).children(".jstree-anchor").children(".jstree-themeicon").addClass("jstree-themeicon-hidden"),!0):!1},show_icon:function(b){var c,d,e;if(a.isArray(b)){for(b=b.slice(),c=0,d=b.length;d>c;c++)this.show_icon(b[c]);return!0}return b=this.get_node(b),b&&b!==a.jstree.root?(e=this.get_node(b,!0),b.icon=e.length?e.children(".jstree-anchor").children(".jstree-themeicon").attr("rel"):!0,b.icon||(b.icon=!0),e.children(".jstree-anchor").children(".jstree-themeicon").removeClass("jstree-themeicon-hidden"),!0):!1}},a.vakata={},a.vakata.attributes=function(b,c){b=a(b)[0];var d=c?{}:[];return b&&b.attributes&&a.each(b.attributes,function(b,e){-1===a.inArray(e.name.toLowerCase(),["style","contenteditable","hasfocus","tabindex"])&&null!==e.value&&""!==a.trim(e.value)&&(c?d[e.name]=e.value:d.push(e.name))}),d},a.vakata.array_unique=function(a){var c=[],d,e,f,g={};for(d=0,f=a.length;f>d;d++)g[a[d]]===b&&(c.push(a[d]),g[a[d]]=!0);return c},a.vakata.array_remove=function(a,b,c){var d=a.slice((c||b)+1||a.length);return a.length=0>b?a.length+b:b,a.push.apply(a,d),a},a.vakata.array_remove_item=function(b,c){var d=a.inArray(c,b);return-1!==d?a.vakata.array_remove(b,d):b},a.jstree.plugins.changed=function(a,b){var c=[];this.trigger=function(a,d){var e,f;if(d||(d={}),"changed"===a.replace(".jstree","")){d.changed={selected:[],deselected:[]};var g={};for(e=0,f=c.length;f>e;e++)g[c[e]]=1;for(e=0,f=d.selected.length;f>e;e++)g[d.selected[e]]?g[d.selected[e]]=2:d.changed.selected.push(d.selected[e]);for(e=0,f=c.length;f>e;e++)1===g[c[e]]&&d.changed.deselected.push(c[e]);c=d.selected.slice()}b.trigger.call(this,a,d)},this.refresh=function(a,d){return c=[],b.refresh.apply(this,arguments)}};var m=i.createElement("I");m.className="jstree-icon jstree-checkbox",m.setAttribute("role","presentation"),a.jstree.defaults.checkbox={visible:!0,three_state:!0,whole_node:!0,keep_selected_style:!0,cascade:"",tie_selection:!0},a.jstree.plugins.checkbox=function(c,d){this.bind=function(){d.bind.call(this),this._data.checkbox.uto=!1,this._data.checkbox.selected=[],this.settings.checkbox.three_state&&(this.settings.checkbox.cascade="up+down+undetermined"),this.element.on("init.jstree",a.proxy(function(){this._data.checkbox.visible=this.settings.checkbox.visible,this.settings.checkbox.keep_selected_style||this.element.addClass("jstree-checkbox-no-clicked"),this.settings.checkbox.tie_selection&&this.element.addClass("jstree-checkbox-selection")},this)).on("loading.jstree",a.proxy(function(){this[this._data.checkbox.visible?"show_checkboxes":"hide_checkboxes"]()},this)),-1!==this.settings.checkbox.cascade.indexOf("undetermined")&&this.element.on("changed.jstree uncheck_node.jstree check_node.jstree uncheck_all.jstree check_all.jstree move_node.jstree copy_node.jstree redraw.jstree open_node.jstree",a.proxy(function(){this._data.checkbox.uto&&clearTimeout(this._data.checkbox.uto),this._data.checkbox.uto=setTimeout(a.proxy(this._undetermined,this),50)},this)),this.settings.checkbox.tie_selection||this.element.on("model.jstree",a.proxy(function(a,b){var c=this._model.data,d=c[b.parent],e=b.nodes,f,g;for(f=0,g=e.length;g>f;f++)c[e[f]].state.checked=c[e[f]].state.checked||c[e[f]].original&&c[e[f]].original.state&&c[e[f]].original.state.checked,c[e[f]].state.checked&&this._data.checkbox.selected.push(e[f])},this)),(-1!==this.settings.checkbox.cascade.indexOf("up")||-1!==this.settings.checkbox.cascade.indexOf("down"))&&this.element.on("model.jstree",a.proxy(function(b,c){var d=this._model.data,e=d[c.parent],f=c.nodes,g=[],h,i,j,k,l,m,n=this.settings.checkbox.cascade,o=this.settings.checkbox.tie_selection;if(-1!==n.indexOf("down"))if(e.state[o?"selected":"checked"]){for(i=0,j=f.length;j>i;i++)d[f[i]].state[o?"selected":"checked"]=!0;this._data[o?"core":"checkbox"].selected=this._data[o?"core":"checkbox"].selected.concat(f)}else for(i=0,j=f.length;j>i;i++)if(d[f[i]].state[o?"selected":"checked"]){for(k=0,l=d[f[i]].children_d.length;l>k;k++)d[d[f[i]].children_d[k]].state[o?"selected":"checked"]=!0;this._data[o?"core":"checkbox"].selected=this._data[o?"core":"checkbox"].selected.concat(d[f[i]].children_d)}if(-1!==n.indexOf("up")){for(i=0,j=e.children_d.length;j>i;i++)d[e.children_d[i]].children.length||g.push(d[e.children_d[i]].parent);for(g=a.vakata.array_unique(g),k=0,l=g.length;l>k;k++){e=d[g[k]];while(e&&e.id!==a.jstree.root){for(h=0,i=0,j=e.children.length;j>i;i++)h+=d[e.children[i]].state[o?"selected":"checked"];if(h!==j)break;e.state[o?"selected":"checked"]=!0,this._data[o?"core":"checkbox"].selected.push(e.id),m=this.get_node(e,!0),m&&m.length&&m.attr("aria-selected",!0).children(".jstree-anchor").addClass(o?"jstree-clicked":"jstree-checked"),e=this.get_node(e.parent)}}}this._data[o?"core":"checkbox"].selected=a.vakata.array_unique(this._data[o?"core":"checkbox"].selected)},this)).on(this.settings.checkbox.tie_selection?"select_node.jstree":"check_node.jstree",a.proxy(function(b,c){var d=c.node,e=this._model.data,f=this.get_node(d.parent),g=this.get_node(d,!0),h,i,j,k,l=this.settings.checkbox.cascade,m=this.settings.checkbox.tie_selection;if(-1!==l.indexOf("down"))for(this._data[m?"core":"checkbox"].selected=a.vakata.array_unique(this._data[m?"core":"checkbox"].selected.concat(d.children_d)),h=0,i=d.children_d.length;i>h;h++)k=e[d.children_d[h]],k.state[m?"selected":"checked"]=!0,k&&k.original&&k.original.state&&k.original.state.undetermined&&(k.original.state.undetermined=!1);if(-1!==l.indexOf("up"))while(f&&f.id!==a.jstree.root){for(j=0,h=0,i=f.children.length;i>h;h++)j+=e[f.children[h]].state[m?"selected":"checked"];if(j!==i)break;f.state[m?"selected":"checked"]=!0,this._data[m?"core":"checkbox"].selected.push(f.id),k=this.get_node(f,!0),k&&k.length&&k.attr("aria-selected",!0).children(".jstree-anchor").addClass(m?"jstree-clicked":"jstree-checked"),f=this.get_node(f.parent)}-1!==l.indexOf("down")&&g.length&&g.find(".jstree-anchor").addClass(m?"jstree-clicked":"jstree-checked").parent().attr("aria-selected",!0)},this)).on(this.settings.checkbox.tie_selection?"deselect_all.jstree":"uncheck_all.jstree",a.proxy(function(b,c){var d=this.get_node(a.jstree.root),e=this._model.data,f,g,h;for(f=0,g=d.children_d.length;g>f;f++)h=e[d.children_d[f]],h&&h.original&&h.original.state&&h.original.state.undetermined&&(h.original.state.undetermined=!1)},this)).on(this.settings.checkbox.tie_selection?"deselect_node.jstree":"uncheck_node.jstree",a.proxy(function(b,c){var d=c.node,e=this.get_node(d,!0),f,g,h,i=this.settings.checkbox.cascade,j=this.settings.checkbox.tie_selection;if(d&&d.original&&d.original.state&&d.original.state.undetermined&&(d.original.state.undetermined=!1),-1!==i.indexOf("down"))for(f=0,g=d.children_d.length;g>f;f++)h=this._model.data[d.children_d[f]],h.state[j?"selected":"checked"]=!1,h&&h.original&&h.original.state&&h.original.state.undetermined&&(h.original.state.undetermined=!1);if(-1!==i.indexOf("up"))for(f=0,g=d.parents.length;g>f;f++)h=this._model.data[d.parents[f]],h.state[j?"selected":"checked"]=!1,h&&h.original&&h.original.state&&h.original.state.undetermined&&(h.original.state.undetermined=!1),h=this.get_node(d.parents[f],!0),h&&h.length&&h.attr("aria-selected",!1).children(".jstree-anchor").removeClass(j?"jstree-clicked":"jstree-checked");for(h=[],f=0,g=this._data[j?"core":"checkbox"].selected.length;g>f;f++)-1!==i.indexOf("down")&&-1!==a.inArray(this._data[j?"core":"checkbox"].selected[f],d.children_d)||-1!==i.indexOf("up")&&-1!==a.inArray(this._data[j?"core":"checkbox"].selected[f],d.parents)||h.push(this._data[j?"core":"checkbox"].selected[f]);this._data[j?"core":"checkbox"].selected=a.vakata.array_unique(h),-1!==i.indexOf("down")&&e.length&&e.find(".jstree-anchor").removeClass(j?"jstree-clicked":"jstree-checked").parent().attr("aria-selected",!1)},this)),-1!==this.settings.checkbox.cascade.indexOf("up")&&this.element.on("delete_node.jstree",a.proxy(function(b,c){var d=this.get_node(c.parent),e=this._model.data,f,g,h,i,j=this.settings.checkbox.tie_selection;while(d&&d.id!==a.jstree.root&&!d.state[j?"selected":"checked"]){for(h=0,f=0,g=d.children.length;g>f;f++)h+=e[d.children[f]].state[j?"selected":"checked"];if(!(g>0&&h===g))break;d.state[j?"selected":"checked"]=!0,this._data[j?"core":"checkbox"].selected.push(d.id),i=this.get_node(d,!0),i&&i.length&&i.attr("aria-selected",!0).children(".jstree-anchor").addClass(j?"jstree-clicked":"jstree-checked"),d=this.get_node(d.parent)}},this)).on("move_node.jstree",a.proxy(function(b,c){var d=c.is_multi,e=c.old_parent,f=this.get_node(c.parent),g=this._model.data,h,i,j,k,l,m=this.settings.checkbox.tie_selection;if(!d){h=this.get_node(e);while(h&&h.id!==a.jstree.root&&!h.state[m?"selected":"checked"]){for(i=0,j=0,k=h.children.length;k>j;j++)i+=g[h.children[j]].state[m?"selected":"checked"];if(!(k>0&&i===k))break;h.state[m?"selected":"checked"]=!0,this._data[m?"core":"checkbox"].selected.push(h.id),l=this.get_node(h,!0),l&&l.length&&l.attr("aria-selected",!0).children(".jstree-anchor").addClass(m?"jstree-clicked":"jstree-checked"),h=this.get_node(h.parent)}}h=f;while(h&&h.id!==a.jstree.root){for(i=0,j=0,k=h.children.length;k>j;j++)i+=g[h.children[j]].state[m?"selected":"checked"];if(i===k)h.state[m?"selected":"checked"]||(h.state[m?"selected":"checked"]=!0,this._data[m?"core":"checkbox"].selected.push(h.id),l=this.get_node(h,!0),l&&l.length&&l.attr("aria-selected",!0).children(".jstree-anchor").addClass(m?"jstree-clicked":"jstree-checked"));else{if(!h.state[m?"selected":"checked"])break;h.state[m?"selected":"checked"]=!1,this._data[m?"core":"checkbox"].selected=a.vakata.array_remove_item(this._data[m?"core":"checkbox"].selected,h.id),l=this.get_node(h,!0),l&&l.length&&l.attr("aria-selected",!1).children(".jstree-anchor").removeClass(m?"jstree-clicked":"jstree-checked")}h=this.get_node(h.parent)}},this))},this._undetermined=function(){if(null!==this.element){var c,d,e,f,g={},h=this._model.data,i=this.settings.checkbox.tie_selection,j=this._data[i?"core":"checkbox"].selected,k=[],l=this;for(c=0,d=j.length;d>c;c++)if(h[j[c]]&&h[j[c]].parents)for(e=0,f=h[j[c]].parents.length;f>e;e++)g[h[j[c]].parents[e]]===b&&h[j[c]].parents[e]!==a.jstree.root&&(g[h[j[c]].parents[e]]=!0,k.push(h[j[c]].parents[e]));for(this.element.find(".jstree-closed").not(":has(.jstree-children)").each(function(){var i=l.get_node(this),j;if(i.state.loaded){for(c=0,d=i.children_d.length;d>c;c++)if(j=h[i.children_d[c]],!j.state.loaded&&j.original&&j.original.state&&j.original.state.undetermined&&j.original.state.undetermined===!0)for(g[j.id]===b&&j.id!==a.jstree.root&&(g[j.id]=!0,k.push(j.id)),e=0,f=j.parents.length;f>e;e++)g[j.parents[e]]===b&&j.parents[e]!==a.jstree.root&&(g[j.parents[e]]=!0,k.push(j.parents[e]))}else if(i.original&&i.original.state&&i.original.state.undetermined&&i.original.state.undetermined===!0)for(g[i.id]===b&&i.id!==a.jstree.root&&(g[i.id]=!0,k.push(i.id)),e=0,f=i.parents.length;f>e;e++)g[i.parents[e]]===b&&i.parents[e]!==a.jstree.root&&(g[i.parents[e]]=!0,k.push(i.parents[e]))}),this.element.find(".jstree-undetermined").removeClass("jstree-undetermined"),c=0,d=k.length;d>c;c++)h[k[c]].state[i?"selected":"checked"]||(j=this.get_node(k[c],!0),j&&j.length&&j.children(".jstree-anchor").children(".jstree-checkbox").addClass("jstree-undetermined"))}},this.redraw_node=function(b,c,e,f){if(b=d.redraw_node.apply(this,arguments)){var g,h,i=null,j=null;for(g=0,h=b.childNodes.length;h>g;g++)if(b.childNodes[g]&&b.childNodes[g].className&&-1!==b.childNodes[g].className.indexOf("jstree-anchor")){i=b.childNodes[g];break}i&&(!this.settings.checkbox.tie_selection&&this._model.data[b.id].state.checked&&(i.className+=" jstree-checked"),j=m.cloneNode(!1),this._model.data[b.id].state.checkbox_disabled&&(j.className+=" jstree-checkbox-disabled"),i.insertBefore(j,i.childNodes[0]))}return e||-1===this.settings.checkbox.cascade.indexOf("undetermined")||(this._data.checkbox.uto&&clearTimeout(this._data.checkbox.uto),this._data.checkbox.uto=setTimeout(a.proxy(this._undetermined,this),50)),b},this.show_checkboxes=function(){this._data.core.themes.checkboxes=!0,this.get_container_ul().removeClass("jstree-no-checkboxes")},this.hide_checkboxes=function(){this._data.core.themes.checkboxes=!1,this.get_container_ul().addClass("jstree-no-checkboxes")},this.toggle_checkboxes=function(){this._data.core.themes.checkboxes?this.hide_checkboxes():this.show_checkboxes()},this.is_undetermined=function(b){b=this.get_node(b);var c=this.settings.checkbox.cascade,d,e,f=this.settings.checkbox.tie_selection,g=this._data[f?"core":"checkbox"].selected,h=this._model.data;if(!b||b.state[f?"selected":"checked"]===!0||-1===c.indexOf("undetermined")||-1===c.indexOf("down")&&-1===c.indexOf("up"))return!1;if(!b.state.loaded&&b.original.state.undetermined===!0)return!0;for(d=0,e=b.children_d.length;e>d;d++)if(-1!==a.inArray(b.children_d[d],g)||!h[b.children_d[d]].state.loaded&&h[b.children_d[d]].original.state.undetermined)return!0;return!1},this.disable_checkbox=function(b){var c,d,e;if(a.isArray(b)){for(b=b.slice(),c=0,d=b.length;d>c;c++)this.disable_checkbox(b[c]);return!0}return b=this.get_node(b),b&&b.id!==a.jstree.root?(e=this.get_node(b,!0),void(b.state.checkbox_disabled||(b.state.checkbox_disabled=!0,e&&e.length&&e.children(".jstree-anchor").children(".jstree-checkbox").addClass("jstree-checkbox-disabled"),this.trigger("disable_checkbox",{node:b})))):!1},this.enable_checkbox=function(b){var c,d,e;if(a.isArray(b)){for(b=b.slice(),c=0,d=b.length;d>c;c++)this.enable_checkbox(b[c]);return!0}return b=this.get_node(b),b&&b.id!==a.jstree.root?(e=this.get_node(b,!0),void(b.state.checkbox_disabled&&(b.state.checkbox_disabled=!1,e&&e.length&&e.children(".jstree-anchor").children(".jstree-checkbox").removeClass("jstree-checkbox-disabled"),this.trigger("enable_checkbox",{node:b})))):!1},this.activate_node=function(b,c){return a(c.target).hasClass("jstree-checkbox-disabled")?!1:(this.settings.checkbox.tie_selection&&(this.settings.checkbox.whole_node||a(c.target).hasClass("jstree-checkbox"))&&(c.ctrlKey=!0),this.settings.checkbox.tie_selection||!this.settings.checkbox.whole_node&&!a(c.target).hasClass("jstree-checkbox")?d.activate_node.call(this,b,c):this.is_disabled(b)?!1:(this.is_checked(b)?this.uncheck_node(b,c):this.check_node(b,c),void this.trigger("activate_node",{node:this.get_node(b)})))},this.check_node=function(b,c){if(this.settings.checkbox.tie_selection)return this.select_node(b,!1,!0,c);var d,e,f,g;if(a.isArray(b)){for(b=b.slice(),e=0,f=b.length;f>e;e++)this.check_node(b[e],c);return!0}return b=this.get_node(b),b&&b.id!==a.jstree.root?(d=this.get_node(b,!0),void(b.state.checked||(b.state.checked=!0,this._data.checkbox.selected.push(b.id),d&&d.length&&d.children(".jstree-anchor").addClass("jstree-checked"),this.trigger("check_node",{node:b,selected:this._data.checkbox.selected,event:c})))):!1},this.uncheck_node=function(b,c){if(this.settings.checkbox.tie_selection)return this.deselect_node(b,!1,c);var d,e,f;if(a.isArray(b)){for(b=b.slice(),d=0,e=b.length;e>d;d++)this.uncheck_node(b[d],c);return!0}return b=this.get_node(b),b&&b.id!==a.jstree.root?(f=this.get_node(b,!0),void(b.state.checked&&(b.state.checked=!1,this._data.checkbox.selected=a.vakata.array_remove_item(this._data.checkbox.selected,b.id),f.length&&f.children(".jstree-anchor").removeClass("jstree-checked"),this.trigger("uncheck_node",{node:b,selected:this._data.checkbox.selected,event:c})))):!1},this.check_all=function(){if(this.settings.checkbox.tie_selection)return this.select_all();var b=this._data.checkbox.selected.concat([]),c,d;for(this._data.checkbox.selected=this._model.data[a.jstree.root].children_d.concat(),c=0,d=this._data.checkbox.selected.length;d>c;c++)this._model.data[this._data.checkbox.selected[c]]&&(this._model.data[this._data.checkbox.selected[c]].state.checked=!0);this.redraw(!0),this.trigger("check_all",{selected:this._data.checkbox.selected})},this.uncheck_all=function(){if(this.settings.checkbox.tie_selection)return this.deselect_all();var a=this._data.checkbox.selected.concat([]),b,c;for(b=0,c=this._data.checkbox.selected.length;c>b;b++)this._model.data[this._data.checkbox.selected[b]]&&(this._model.data[this._data.checkbox.selected[b]].state.checked=!1);this._data.checkbox.selected=[],this.element.find(".jstree-checked").removeClass("jstree-checked"),this.trigger("uncheck_all",{selected:this._data.checkbox.selected,node:a})},this.is_checked=function(b){return this.settings.checkbox.tie_selection?this.is_selected(b):(b=this.get_node(b),b&&b.id!==a.jstree.root?b.state.checked:!1)},this.get_checked=function(b){return this.settings.checkbox.tie_selection?this.get_selected(b):b?a.map(this._data.checkbox.selected,a.proxy(function(a){return this.get_node(a)},this)):this._data.checkbox.selected},this.get_top_checked=function(b){if(this.settings.checkbox.tie_selection)return this.get_top_selected(b);var c=this.get_checked(!0),d={},e,f,g,h;for(e=0,f=c.length;f>e;e++)d[c[e].id]=c[e];for(e=0,f=c.length;f>e;e++)for(g=0,h=c[e].children_d.length;h>g;g++)d[c[e].children_d[g]]&&delete d[c[e].children_d[g]];c=[];for(e in d)d.hasOwnProperty(e)&&c.push(e);return b?a.map(c,a.proxy(function(a){return this.get_node(a)},this)):c},this.get_bottom_checked=function(b){if(this.settings.checkbox.tie_selection)return this.get_bottom_selected(b);var c=this.get_checked(!0),d=[],e,f;for(e=0,f=c.length;f>e;e++)c[e].children.length||d.push(c[e].id);return b?a.map(d,a.proxy(function(a){return this.get_node(a)},this)):d},this.load_node=function(b,c){var e,f,g,h,i,j;if(!a.isArray(b)&&!this.settings.checkbox.tie_selection&&(j=this.get_node(b),j&&j.state.loaded))for(e=0,f=j.children_d.length;f>e;e++)this._model.data[j.children_d[e]].state.checked&&(i=!0,this._data.checkbox.selected=a.vakata.array_remove_item(this._data.checkbox.selected,j.children_d[e]));return d.load_node.apply(this,arguments)},this.get_state=function(){var a=d.get_state.apply(this,arguments);return this.settings.checkbox.tie_selection?a:(a.checkbox=this._data.checkbox.selected.slice(),a)},this.set_state=function(b,c){var e=d.set_state.apply(this,arguments);if(e&&b.checkbox){if(!this.settings.checkbox.tie_selection){this.uncheck_all();var f=this;a.each(b.checkbox,function(a,b){f.check_node(b)})}return delete b.checkbox,this.set_state(b,c),!1}return e},this.refresh=function(a,b){return this.settings.checkbox.tie_selection||(this._data.checkbox.selected=[]),d.refresh.apply(this,arguments)}},a.jstree.defaults.conditionalselect=function(){return!0},a.jstree.plugins.conditionalselect=function(a,b){this.activate_node=function(a,c){this.settings.conditionalselect.call(this,this.get_node(a),c)&&b.activate_node.call(this,a,c)}},a.jstree.defaults.contextmenu={select_node:!0,show_at_node:!0,items:function(b,c){return{create:{separator_before:!1,separator_after:!0,_disabled:!1,label:"Create",action:function(b){var c=a.jstree.reference(b.reference),d=c.get_node(b.reference);c.create_node(d,{},"last",function(a){setTimeout(function(){c.edit(a)},0)})}},rename:{separator_before:!1,separator_after:!1,_disabled:!1,label:"Rename",action:function(b){var c=a.jstree.reference(b.reference),d=c.get_node(b.reference);c.edit(d)}},remove:{separator_before:!1,icon:!1,separator_after:!1,_disabled:!1,label:"Delete",action:function(b){var c=a.jstree.reference(b.reference),d=c.get_node(b.reference);c.is_selected(d)?c.delete_node(c.get_selected()):c.delete_node(d)}},ccp:{separator_before:!0,icon:!1,separator_after:!1,label:"Edit",action:!1,submenu:{cut:{separator_before:!1,separator_after:!1,label:"Cut",action:function(b){var c=a.jstree.reference(b.reference),d=c.get_node(b.reference);c.is_selected(d)?c.cut(c.get_top_selected()):c.cut(d)}},copy:{separator_before:!1,icon:!1,separator_after:!1,label:"Copy",action:function(b){var c=a.jstree.reference(b.reference),d=c.get_node(b.reference);c.is_selected(d)?c.copy(c.get_top_selected()):c.copy(d)}},paste:{separator_before:!1,icon:!1,_disabled:function(b){return!a.jstree.reference(b.reference).can_paste()},separator_after:!1,label:"Paste",action:function(b){var c=a.jstree.reference(b.reference),d=c.get_node(b.reference);c.paste(d)}}}}}}},a.jstree.plugins.contextmenu=function(c,d){this.bind=function(){d.bind.call(this);var b=0,c=null,e,f;this.element.on("contextmenu.jstree",".jstree-anchor",a.proxy(function(a,d){a.preventDefault(),b=a.ctrlKey?+new Date:0,(d||c)&&(b=+new Date+1e4),c&&clearTimeout(c),this.is_loading(a.currentTarget)||this.show_contextmenu(a.currentTarget,a.pageX,a.pageY,a)},this)).on("click.jstree",".jstree-anchor",a.proxy(function(c){this._data.contextmenu.visible&&(!b||+new Date-b>250)&&a.vakata.context.hide(),b=0},this)).on("touchstart.jstree",".jstree-anchor",function(b){b.originalEvent&&b.originalEvent.changedTouches&&b.originalEvent.changedTouches[0]&&(e=b.pageX,f=b.pageY,c=setTimeout(function(){a(b.currentTarget).trigger("contextmenu",!0)},750))}).on("touchmove.vakata.jstree",function(a){c&&a.originalEvent&&a.originalEvent.changedTouches&&a.originalEvent.changedTouches[0]&&(Math.abs(e-a.pageX)>50||Math.abs(f-a.pageY)>50)&&clearTimeout(c)}).on("touchend.vakata.jstree",function(a){c&&clearTimeout(c)}),a(i).on("context_hide.vakata.jstree",a.proxy(function(){this._data.contextmenu.visible=!1},this))},this.teardown=function(){this._data.contextmenu.visible&&a.vakata.context.hide(),d.teardown.call(this)},this.show_contextmenu=function(c,d,e,f){if(c=this.get_node(c),!c||c.id===a.jstree.root)return!1;var g=this.settings.contextmenu,h=this.get_node(c,!0),i=h.children(".jstree-anchor"),j=!1,k=!1;(g.show_at_node||d===b||e===b)&&(j=i.offset(),d=j.left,e=j.top+this._data.core.li_height),this.settings.contextmenu.select_node&&!this.is_selected(c)&&this.activate_node(c,f),k=g.items,a.isFunction(k)&&(k=k.call(this,c,a.proxy(function(a){this._show_contextmenu(c,d,e,a)},this))),a.isPlainObject(k)&&this._show_contextmenu(c,d,e,k)},this._show_contextmenu=function(b,c,d,e){var f=this.get_node(b,!0),g=f.children(".jstree-anchor");a(i).one("context_show.vakata.jstree",a.proxy(function(b,c){var d="jstree-contextmenu jstree-"+this.get_theme()+"-contextmenu";a(c.element).addClass(d)},this)),this._data.contextmenu.visible=!0,a.vakata.context.show(g,{x:c,y:d},e),this.trigger("show_contextmenu",{node:b,x:c,y:d})}},function(a){var b=!1,c={element:!1,reference:!1,position_x:0,position_y:0,items:[],html:"",is_visible:!1};a.vakata.context={settings:{hide_onmouseleave:0,icons:!0},_trigger:function(b){a(i).triggerHandler("context_"+b+".vakata",{reference:c.reference,element:c.element,position:{x:c.position_x,y:c.position_y}})},_execute:function(b){return b=c.items[b],b&&(!b._disabled||a.isFunction(b._disabled)&&!b._disabled({item:b,reference:c.reference,element:c.element}))&&b.action?b.action.call(null,{item:b,reference:c.reference,element:c.element,position:{x:c.position_x,y:c.position_y}}):!1},_parse:function(b,d){if(!b)return!1;d||(c.html="",c.items=[]);var e="",f=!1,g;return d&&(e+="<ul>"),a.each(b,function(b,d){return d?(c.items.push(d),!f&&d.separator_before&&(e+="<li class='vakata-context-separator'><a href='#' "+(a.vakata.context.settings.icons?"":'style="margin-left:0px;"')+">&#160;</a></li>"),f=!1,e+="<li class='"+(d._class||"")+(d._disabled===!0||a.isFunction(d._disabled)&&d._disabled({item:d,reference:c.reference,element:c.element})?" vakata-contextmenu-disabled ":"")+"' "+(d.shortcut?" data-shortcut='"+d.shortcut+"' ":"")+">",e+="<a href='#' rel='"+(c.items.length-1)+"'>",a.vakata.context.settings.icons&&(e+="<i ",d.icon&&(e+=-1!==d.icon.indexOf("/")||-1!==d.icon.indexOf(".")?" style='background:url(\""+d.icon+"\") center center no-repeat' ":" class='"+d.icon+"' "),e+="></i><span class='vakata-contextmenu-sep'>&#160;</span>"),e+=(a.isFunction(d.label)?d.label({item:b,reference:c.reference,element:c.element}):d.label)+(d.shortcut?' <span class="vakata-contextmenu-shortcut vakata-contextmenu-shortcut-'+d.shortcut+'">'+(d.shortcut_label||"")+"</span>":"")+"</a>",d.submenu&&(g=a.vakata.context._parse(d.submenu,!0),g&&(e+=g)),e+="</li>",void(d.separator_after&&(e+="<li class='vakata-context-separator'><a href='#' "+(a.vakata.context.settings.icons?"":'style="margin-left:0px;"')+">&#160;</a></li>",f=!0))):!0}),e=e.replace(/<li class\='vakata-context-separator'\><\/li\>$/,""),d&&(e+="</ul>"),d||(c.html=e,a.vakata.context._trigger("parse")),e.length>10?e:!1},_show_submenu:function(c){if(c=a(c),c.length&&c.children("ul").length){var d=c.children("ul"),e=c.offset().left+c.outerWidth(),f=c.offset().top,g=d.width(),h=d.height(),i=a(window).width()+a(window).scrollLeft(),j=a(window).height()+a(window).scrollTop();b?c[e-(g+10+c.outerWidth())<0?"addClass":"removeClass"]("vakata-context-left"):c[e+g+10>i?"addClass":"removeClass"]("vakata-context-right"),f+h+10>j&&d.css("bottom","-1px"),d.show()}},show:function(d,e,f){var g,h,i,j,k,l,m,n,o=!0;switch(c.element&&c.element.length&&c.element.width(""),o){case!e&&!d:return!1;case!!e&&!!d:c.reference=d,c.position_x=e.x,c.position_y=e.y;break;case!e&&!!d:c.reference=d,g=d.offset(),c.position_x=g.left+d.outerHeight(),c.position_y=g.top;break;case!!e&&!d:c.position_x=e.x,c.position_y=e.y}d&&!f&&a(d).data("vakata_contextmenu")&&(f=a(d).data("vakata_contextmenu")),a.vakata.context._parse(f)&&c.element.html(c.html),c.items.length&&(c.element.appendTo("body"),h=c.element,i=c.position_x,j=c.position_y,k=h.width(),l=h.height(),m=a(window).width()+a(window).scrollLeft(),n=a(window).height()+a(window).scrollTop(),b&&(i-=h.outerWidth()-a(d).outerWidth(),i<a(window).scrollLeft()+20&&(i=a(window).scrollLeft()+20)),i+k+20>m&&(i=m-(k+20)),j+l+20>n&&(j=n-(l+20)),c.element.css({left:i,top:j}).show().find("a").first().focus().parent().addClass("vakata-context-hover"),c.is_visible=!0,a.vakata.context._trigger("show"))},hide:function(){c.is_visible&&(c.element.hide().find("ul").hide().end().find(":focus").blur().end().detach(),c.is_visible=!1,a.vakata.context._trigger("hide"))}},a(function(){b="rtl"===a("body").css("direction");var d=!1;c.element=a("<ul class='vakata-context'></ul>"),c.element.on("mouseenter","li",function(b){b.stopImmediatePropagation(),a.contains(this,b.relatedTarget)||(d&&clearTimeout(d),c.element.find(".vakata-context-hover").removeClass("vakata-context-hover").end(),a(this).siblings().find("ul").hide().end().end().parentsUntil(".vakata-context","li").addBack().addClass("vakata-context-hover"),a.vakata.context._show_submenu(this))}).on("mouseleave","li",function(b){a.contains(this,b.relatedTarget)||a(this).find(".vakata-context-hover").addBack().removeClass("vakata-context-hover")}).on("mouseleave",function(b){a(this).find(".vakata-context-hover").removeClass("vakata-context-hover"),a.vakata.context.settings.hide_onmouseleave&&(d=setTimeout(function(b){return function(){a.vakata.context.hide()}}(this),a.vakata.context.settings.hide_onmouseleave))}).on("click","a",function(b){b.preventDefault(),a(this).blur().parent().hasClass("vakata-context-disabled")||a.vakata.context._execute(a(this).attr("rel"))===!1||a.vakata.context.hide()}).on("keydown","a",function(b){var d=null;switch(b.which){case 13:case 32:b.type="mouseup",b.preventDefault(),a(b.currentTarget).trigger(b);break;case 37:c.is_visible&&(c.element.find(".vakata-context-hover").last().closest("li").first().find("ul").hide().find(".vakata-context-hover").removeClass("vakata-context-hover").end().end().children("a").focus(),b.stopImmediatePropagation(),b.preventDefault());break;case 38:c.is_visible&&(d=c.element.find("ul:visible").addBack().last().children(".vakata-context-hover").removeClass("vakata-context-hover").prevAll("li:not(.vakata-context-separator)").first(),d.length||(d=c.element.find("ul:visible").addBack().last().children("li:not(.vakata-context-separator)").last()),d.addClass("vakata-context-hover").children("a").focus(),b.stopImmediatePropagation(),b.preventDefault());break;case 39:c.is_visible&&(c.element.find(".vakata-context-hover").last().children("ul").show().children("li:not(.vakata-context-separator)").removeClass("vakata-context-hover").first().addClass("vakata-context-hover").children("a").focus(),b.stopImmediatePropagation(),b.preventDefault());break;case 40:c.is_visible&&(d=c.element.find("ul:visible").addBack().last().children(".vakata-context-hover").removeClass("vakata-context-hover").nextAll("li:not(.vakata-context-separator)").first(),d.length||(d=c.element.find("ul:visible").addBack().last().children("li:not(.vakata-context-separator)").first()),d.addClass("vakata-context-hover").children("a").focus(),b.stopImmediatePropagation(),b.preventDefault());break;case 27:a.vakata.context.hide(),b.preventDefault()}}).on("keydown",function(a){a.preventDefault();var b=c.element.find(".vakata-contextmenu-shortcut-"+a.which).parent();b.parent().not(".vakata-context-disabled")&&b.click()}),a(i).on("mousedown.vakata.jstree",function(b){c.is_visible&&!a.contains(c.element[0],b.target)&&a.vakata.context.hide()}).on("context_show.vakata.jstree",function(a,d){c.element.find("li:has(ul)").children("a").addClass("vakata-context-parent"),b&&c.element.addClass("vakata-context-rtl").css("direction","rtl"),c.element.find("ul").hide().end()})})}(a),a.jstree.defaults.dnd={copy:!0,open_timeout:500,is_draggable:!0,check_while_dragging:!0,always_copy:!1,inside_pos:0,drag_selection:!0,touch:!0,large_drop_target:!1,large_drag_target:!1},a.jstree.plugins.dnd=function(b,c){this.bind=function(){c.bind.call(this),this.element.on("mousedown.jstree touchstart.jstree",this.settings.dnd.large_drag_target?".jstree-node":".jstree-anchor",a.proxy(function(b){
if(this.settings.dnd.large_drag_target&&a(b.target).closest(".jstree-node")[0]!==b.currentTarget)return!0;if("touchstart"===b.type&&(!this.settings.dnd.touch||"selected"===this.settings.dnd.touch&&!a(b.currentTarget).closest(".jstree-node").children(".jstree-anchor").hasClass("jstree-clicked")))return!0;var c=this.get_node(b.target),d=this.is_selected(c)&&this.settings.dnd.drag_selection?this.get_top_selected().length:1,e=d>1?d+" "+this.get_string("nodes"):this.get_text(b.currentTarget);return this.settings.core.force_text&&(e=a.vakata.html.escape(e)),c&&c.id&&c.id!==a.jstree.root&&(1===b.which||"touchstart"===b.type)&&(this.settings.dnd.is_draggable===!0||a.isFunction(this.settings.dnd.is_draggable)&&this.settings.dnd.is_draggable.call(this,d>1?this.get_top_selected(!0):[c],b))?(this.element.trigger("mousedown.jstree"),a.vakata.dnd.start(b,{jstree:!0,origin:this,obj:this.get_node(c,!0),nodes:d>1?this.get_top_selected():[c.id]},'<div id="jstree-dnd" class="jstree-'+this.get_theme()+" jstree-"+this.get_theme()+"-"+this.get_theme_variant()+" "+(this.settings.core.themes.responsive?" jstree-dnd-responsive":"")+'"><i class="jstree-icon jstree-er"></i>'+e+'<ins class="jstree-copy" style="display:none;">+</ins></div>')):void 0},this))}},a(function(){var b=!1,c=!1,d=!1,e=!1,f=a('<div id="jstree-marker">&#160;</div>').hide();a(i).on("dnd_start.vakata.jstree",function(a,c){b=!1,d=!1,c&&c.data&&c.data.jstree&&f.appendTo("body")}).on("dnd_move.vakata.jstree",function(g,h){if(e&&clearTimeout(e),h&&h.data&&h.data.jstree&&(!h.event.target.id||"jstree-marker"!==h.event.target.id)){d=h.event;var i=a.jstree.reference(h.event.target),j=!1,k=!1,l=!1,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A;if(i&&i._data&&i._data.dnd)if(f.attr("class","jstree-"+i.get_theme()+(i.settings.core.themes.responsive?" jstree-dnd-responsive":"")),h.helper.children().attr("class","jstree-"+i.get_theme()+" jstree-"+i.get_theme()+"-"+i.get_theme_variant()+" "+(i.settings.core.themes.responsive?" jstree-dnd-responsive":"")).find(".jstree-copy").first()[h.data.origin&&(h.data.origin.settings.dnd.always_copy||h.data.origin.settings.dnd.copy&&(h.event.metaKey||h.event.ctrlKey))?"show":"hide"](),h.event.target!==i.element[0]&&h.event.target!==i.get_container_ul()[0]||0!==i.get_container_ul().children().length){if(j=i.settings.dnd.large_drop_target?a(h.event.target).closest(".jstree-node").children(".jstree-anchor"):a(h.event.target).closest(".jstree-anchor"),j&&j.length&&j.parent().is(".jstree-closed, .jstree-open, .jstree-leaf")&&(k=j.offset(),l=h.event.pageY-k.top,p=j.outerHeight(),s=p/3>l?["b","i","a"]:l>p-p/3?["a","i","b"]:l>p/2?["i","a","b"]:["i","b","a"],a.each(s,function(d,g){switch(g){case"b":n=k.left-6,o=k.top,q=i.get_parent(j),r=j.parent().index();break;case"i":z=i.settings.dnd.inside_pos,A=i.get_node(j.parent()),n=k.left-2,o=k.top+p/2+1,q=A.id,r="first"===z?0:"last"===z?A.children.length:Math.min(z,A.children.length);break;case"a":n=k.left-6,o=k.top+p,q=i.get_parent(j),r=j.parent().index()+1}for(t=!0,u=0,v=h.data.nodes.length;v>u;u++)if(w=h.data.origin&&(h.data.origin.settings.dnd.always_copy||h.data.origin.settings.dnd.copy&&(h.event.metaKey||h.event.ctrlKey))?"copy_node":"move_node",x=r,"move_node"===w&&"a"===g&&h.data.origin&&h.data.origin===i&&q===i.get_parent(h.data.nodes[u])&&(y=i.get_node(q),x>a.inArray(h.data.nodes[u],y.children)&&(x-=1)),t=t&&(i&&i.settings&&i.settings.dnd&&i.settings.dnd.check_while_dragging===!1||i.check(w,h.data.origin&&h.data.origin!==i?h.data.origin.get_node(h.data.nodes[u]):h.data.nodes[u],q,x,{dnd:!0,ref:i.get_node(j.parent()),pos:g,origin:h.data.origin,is_multi:h.data.origin&&h.data.origin!==i,is_foreign:!h.data.origin})),!t){i&&i.last_error&&(c=i.last_error());break}return"i"===g&&j.parent().is(".jstree-closed")&&i.settings.dnd.open_timeout&&(e=setTimeout(function(a,b){return function(){a.open_node(b)}}(i,j),i.settings.dnd.open_timeout)),t?(b={ins:i,par:q,pos:"i"!==g||"last"!==z||0!==r||i.is_loaded(A)?r:"last"},f.css({left:n+"px",top:o+"px"}).show(),h.helper.find(".jstree-icon").first().removeClass("jstree-er").addClass("jstree-ok"),c={},s=!0,!1):void 0}),s===!0))return}else{for(t=!0,u=0,v=h.data.nodes.length;v>u;u++)if(t=t&&i.check(h.data.origin&&(h.data.origin.settings.dnd.always_copy||h.data.origin.settings.dnd.copy&&(h.event.metaKey||h.event.ctrlKey))?"copy_node":"move_node",h.data.origin&&h.data.origin!==i?h.data.origin.get_node(h.data.nodes[u]):h.data.nodes[u],a.jstree.root,"last",{dnd:!0,ref:i.get_node(a.jstree.root),pos:"i",origin:h.data.origin,is_multi:h.data.origin&&h.data.origin!==i,is_foreign:!h.data.origin}),!t)break;if(t)return b={ins:i,par:a.jstree.root,pos:"last"},f.hide(),void h.helper.find(".jstree-icon").first().removeClass("jstree-er").addClass("jstree-ok")}b=!1,h.helper.find(".jstree-icon").removeClass("jstree-ok").addClass("jstree-er"),f.hide()}}).on("dnd_scroll.vakata.jstree",function(a,c){c&&c.data&&c.data.jstree&&(f.hide(),b=!1,d=!1,c.helper.find(".jstree-icon").first().removeClass("jstree-ok").addClass("jstree-er"))}).on("dnd_stop.vakata.jstree",function(g,h){if(e&&clearTimeout(e),h&&h.data&&h.data.jstree){f.hide().detach();var i,j,k=[];if(b){for(i=0,j=h.data.nodes.length;j>i;i++)k[i]=h.data.origin?h.data.origin.get_node(h.data.nodes[i]):h.data.nodes[i];b.ins[h.data.origin&&(h.data.origin.settings.dnd.always_copy||h.data.origin.settings.dnd.copy&&(h.event.metaKey||h.event.ctrlKey))?"copy_node":"move_node"](k,b.par,b.pos,!1,!1,!1,h.data.origin)}else i=a(h.event.target).closest(".jstree"),i.length&&c&&c.error&&"check"===c.error&&(i=i.jstree(!0),i&&i.settings.core.error.call(this,c));d=!1,b=!1}}).on("keyup.jstree keydown.jstree",function(b,c){c=a.vakata.dnd._get(),c&&c.data&&c.data.jstree&&(c.helper.find(".jstree-copy").first()[c.data.origin&&(c.data.origin.settings.dnd.always_copy||c.data.origin.settings.dnd.copy&&(b.metaKey||b.ctrlKey))?"show":"hide"](),d&&(d.metaKey=b.metaKey,d.ctrlKey=b.ctrlKey,a.vakata.dnd._trigger("move",d)))})}),function(a){a.vakata.html={div:a("<div />"),escape:function(b){return a.vakata.html.div.text(b).html()},strip:function(b){return a.vakata.html.div.empty().append(a.parseHTML(b)).text()}};var b={element:!1,target:!1,is_down:!1,is_drag:!1,helper:!1,helper_w:0,data:!1,init_x:0,init_y:0,scroll_l:0,scroll_t:0,scroll_e:!1,scroll_i:!1,is_touch:!1};a.vakata.dnd={settings:{scroll_speed:10,scroll_proximity:20,helper_left:5,helper_top:10,threshold:5,threshold_touch:50},_trigger:function(b,c){var d=a.vakata.dnd._get();d.event=c,a(i).triggerHandler("dnd_"+b+".vakata",d)},_get:function(){return{data:b.data,element:b.element,helper:b.helper}},_clean:function(){b.helper&&b.helper.remove(),b.scroll_i&&(clearInterval(b.scroll_i),b.scroll_i=!1),b={element:!1,target:!1,is_down:!1,is_drag:!1,helper:!1,helper_w:0,data:!1,init_x:0,init_y:0,scroll_l:0,scroll_t:0,scroll_e:!1,scroll_i:!1,is_touch:!1},a(i).off("mousemove.vakata.jstree touchmove.vakata.jstree",a.vakata.dnd.drag),a(i).off("mouseup.vakata.jstree touchend.vakata.jstree",a.vakata.dnd.stop)},_scroll:function(c){if(!b.scroll_e||!b.scroll_l&&!b.scroll_t)return b.scroll_i&&(clearInterval(b.scroll_i),b.scroll_i=!1),!1;if(!b.scroll_i)return b.scroll_i=setInterval(a.vakata.dnd._scroll,100),!1;if(c===!0)return!1;var d=b.scroll_e.scrollTop(),e=b.scroll_e.scrollLeft();b.scroll_e.scrollTop(d+b.scroll_t*a.vakata.dnd.settings.scroll_speed),b.scroll_e.scrollLeft(e+b.scroll_l*a.vakata.dnd.settings.scroll_speed),(d!==b.scroll_e.scrollTop()||e!==b.scroll_e.scrollLeft())&&a.vakata.dnd._trigger("scroll",b.scroll_e)},start:function(c,d,e){"touchstart"===c.type&&c.originalEvent&&c.originalEvent.changedTouches&&c.originalEvent.changedTouches[0]&&(c.pageX=c.originalEvent.changedTouches[0].pageX,c.pageY=c.originalEvent.changedTouches[0].pageY,c.target=i.elementFromPoint(c.originalEvent.changedTouches[0].pageX-window.pageXOffset,c.originalEvent.changedTouches[0].pageY-window.pageYOffset)),b.is_drag&&a.vakata.dnd.stop({});try{c.currentTarget.unselectable="on",c.currentTarget.onselectstart=function(){return!1},c.currentTarget.style&&(c.currentTarget.style.MozUserSelect="none")}catch(f){}return b.init_x=c.pageX,b.init_y=c.pageY,b.data=d,b.is_down=!0,b.element=c.currentTarget,b.target=c.target,b.is_touch="touchstart"===c.type,e!==!1&&(b.helper=a("<div id='vakata-dnd'></div>").html(e).css({display:"block",margin:"0",padding:"0",position:"absolute",top:"-2000px",lineHeight:"16px",zIndex:"10000"})),a(i).on("mousemove.vakata.jstree touchmove.vakata.jstree",a.vakata.dnd.drag),a(i).on("mouseup.vakata.jstree touchend.vakata.jstree",a.vakata.dnd.stop),!1},drag:function(c){if("touchmove"===c.type&&c.originalEvent&&c.originalEvent.changedTouches&&c.originalEvent.changedTouches[0]&&(c.pageX=c.originalEvent.changedTouches[0].pageX,c.pageY=c.originalEvent.changedTouches[0].pageY,c.target=i.elementFromPoint(c.originalEvent.changedTouches[0].pageX-window.pageXOffset,c.originalEvent.changedTouches[0].pageY-window.pageYOffset)),b.is_down){if(!b.is_drag){if(!(Math.abs(c.pageX-b.init_x)>(b.is_touch?a.vakata.dnd.settings.threshold_touch:a.vakata.dnd.settings.threshold)||Math.abs(c.pageY-b.init_y)>(b.is_touch?a.vakata.dnd.settings.threshold_touch:a.vakata.dnd.settings.threshold)))return;b.helper&&(b.helper.appendTo("body"),b.helper_w=b.helper.outerWidth()),b.is_drag=!0,a.vakata.dnd._trigger("start",c)}var d=!1,e=!1,f=!1,g=!1,h=!1,j=!1,k=!1,l=!1,m=!1,n=!1;return b.scroll_t=0,b.scroll_l=0,b.scroll_e=!1,a(a(c.target).parentsUntil("body").addBack().get().reverse()).filter(function(){return/^auto|scroll$/.test(a(this).css("overflow"))&&(this.scrollHeight>this.offsetHeight||this.scrollWidth>this.offsetWidth)}).each(function(){var d=a(this),e=d.offset();return this.scrollHeight>this.offsetHeight&&(e.top+d.height()-c.pageY<a.vakata.dnd.settings.scroll_proximity&&(b.scroll_t=1),c.pageY-e.top<a.vakata.dnd.settings.scroll_proximity&&(b.scroll_t=-1)),this.scrollWidth>this.offsetWidth&&(e.left+d.width()-c.pageX<a.vakata.dnd.settings.scroll_proximity&&(b.scroll_l=1),c.pageX-e.left<a.vakata.dnd.settings.scroll_proximity&&(b.scroll_l=-1)),b.scroll_t||b.scroll_l?(b.scroll_e=a(this),!1):void 0}),b.scroll_e||(d=a(i),e=a(window),f=d.height(),g=e.height(),h=d.width(),j=e.width(),k=d.scrollTop(),l=d.scrollLeft(),f>g&&c.pageY-k<a.vakata.dnd.settings.scroll_proximity&&(b.scroll_t=-1),f>g&&g-(c.pageY-k)<a.vakata.dnd.settings.scroll_proximity&&(b.scroll_t=1),h>j&&c.pageX-l<a.vakata.dnd.settings.scroll_proximity&&(b.scroll_l=-1),h>j&&j-(c.pageX-l)<a.vakata.dnd.settings.scroll_proximity&&(b.scroll_l=1),(b.scroll_t||b.scroll_l)&&(b.scroll_e=d)),b.scroll_e&&a.vakata.dnd._scroll(!0),b.helper&&(m=parseInt(c.pageY+a.vakata.dnd.settings.helper_top,10),n=parseInt(c.pageX+a.vakata.dnd.settings.helper_left,10),f&&m+25>f&&(m=f-50),h&&n+b.helper_w>h&&(n=h-(b.helper_w+2)),b.helper.css({left:n+"px",top:m+"px"})),a.vakata.dnd._trigger("move",c),!1}},stop:function(c){if("touchend"===c.type&&c.originalEvent&&c.originalEvent.changedTouches&&c.originalEvent.changedTouches[0]&&(c.pageX=c.originalEvent.changedTouches[0].pageX,c.pageY=c.originalEvent.changedTouches[0].pageY,c.target=i.elementFromPoint(c.originalEvent.changedTouches[0].pageX-window.pageXOffset,c.originalEvent.changedTouches[0].pageY-window.pageYOffset)),b.is_drag)a.vakata.dnd._trigger("stop",c);else if("touchend"===c.type&&c.target===b.target){var d=setTimeout(function(){a(c.target).click()},100);a(c.target).one("click",function(){d&&clearTimeout(d)})}return a.vakata.dnd._clean(),!1}}}(a),a.jstree.defaults.massload=null,a.jstree.plugins.massload=function(b,c){this.init=function(a,b){c.init.call(this,a,b),this._data.massload={}},this._load_nodes=function(b,d,e){var f=this.settings.massload;return e&&!a.isEmptyObject(this._data.massload)?c._load_nodes.call(this,b,d,e):a.isFunction(f)?f.call(this,b,a.proxy(function(a){if(a)for(var f in a)a.hasOwnProperty(f)&&(this._data.massload[f]=a[f]);c._load_nodes.call(this,b,d,e)},this)):"object"==typeof f&&f&&f.url?(f=a.extend(!0,{},f),a.isFunction(f.url)&&(f.url=f.url.call(this,b)),a.isFunction(f.data)&&(f.data=f.data.call(this,b)),a.ajax(f).done(a.proxy(function(a,f,g){if(a)for(var h in a)a.hasOwnProperty(h)&&(this._data.massload[h]=a[h]);c._load_nodes.call(this,b,d,e)},this)).fail(a.proxy(function(a){c._load_nodes.call(this,b,d,e)},this))):c._load_nodes.call(this,b,d,e)},this._load_node=function(b,d){var e=this._data.massload[b.id];return e?this["string"==typeof e?"_append_html_data":"_append_json_data"](b,"string"==typeof e?a(a.parseHTML(e)).filter(function(){return 3!==this.nodeType}):e,function(a){d.call(this,a),delete this._data.massload[b.id]}):c._load_node.call(this,b,d)}},a.jstree.defaults.search={ajax:!1,fuzzy:!1,case_sensitive:!1,show_only_matches:!1,show_only_matches_children:!1,close_opened_onclear:!0,search_leaves_only:!1,search_callback:!1},a.jstree.plugins.search=function(c,d){this.bind=function(){d.bind.call(this),this._data.search.str="",this._data.search.dom=a(),this._data.search.res=[],this._data.search.opn=[],this._data.search.som=!1,this._data.search.smc=!1,this._data.search.hdn=[],this.element.on("search.jstree",a.proxy(function(b,c){if(this._data.search.som&&c.res.length){var d=this._model.data,e,f,g=[];for(e=0,f=c.res.length;f>e;e++)d[c.res[e]]&&!d[c.res[e]].state.hidden&&(g.push(c.res[e]),g=g.concat(d[c.res[e]].parents),this._data.search.smc&&(g=g.concat(d[c.res[e]].children_d)));g=a.vakata.array_remove_item(a.vakata.array_unique(g),a.jstree.root),this._data.search.hdn=this.hide_all(!0),this.show_node(g)}},this)).on("clear_search.jstree",a.proxy(function(a,b){this._data.search.som&&b.res.length&&this.show_node(this._data.search.hdn)},this))},this.search=function(c,d,e,f,g,h){if(c===!1||""===a.trim(c.toString()))return this.clear_search();f=this.get_node(f),f=f&&f.id?f.id:null,c=c.toString();var i=this.settings.search,j=i.ajax?i.ajax:!1,k=this._model.data,l=null,m=[],n=[],o,p;if(this._data.search.res.length&&!g&&this.clear_search(),e===b&&(e=i.show_only_matches),h===b&&(h=i.show_only_matches_children),!d&&j!==!1)return a.isFunction(j)?j.call(this,c,a.proxy(function(b){b&&b.d&&(b=b.d),this._load_nodes(a.isArray(b)?a.vakata.array_unique(b):[],function(){this.search(c,!0,e,f,g)},!0)},this),f):(j=a.extend({},j),j.data||(j.data={}),j.data.str=c,f&&(j.data.inside=f),a.ajax(j).fail(a.proxy(function(){this._data.core.last_error={error:"ajax",plugin:"search",id:"search_01",reason:"Could not load search parents",data:JSON.stringify(j)},this.settings.core.error.call(this,this._data.core.last_error)},this)).done(a.proxy(function(b){b&&b.d&&(b=b.d),this._load_nodes(a.isArray(b)?a.vakata.array_unique(b):[],function(){this.search(c,!0,e,f,g)},!0)},this)));if(g||(this._data.search.str=c,this._data.search.dom=a(),this._data.search.res=[],this._data.search.opn=[],this._data.search.som=e,this._data.search.smc=h),l=new a.vakata.search(c,!0,{caseSensitive:i.case_sensitive,fuzzy:i.fuzzy}),a.each(k[f?f:a.jstree.root].children_d,function(a,b){var d=k[b];d.text&&(!i.search_leaves_only||d.state.loaded&&0===d.children.length)&&(i.search_callback&&i.search_callback.call(this,c,d)||!i.search_callback&&l.search(d.text).isMatch)&&(m.push(b),n=n.concat(d.parents))}),m.length){for(n=a.vakata.array_unique(n),o=0,p=n.length;p>o;o++)n[o]!==a.jstree.root&&k[n[o]]&&this.open_node(n[o],null,0)===!0&&this._data.search.opn.push(n[o]);g?(this._data.search.dom=this._data.search.dom.add(a(this.element[0].querySelectorAll("#"+a.map(m,function(b){return-1!=="0123456789".indexOf(b[0])?"\\3"+b[0]+" "+b.substr(1).replace(a.jstree.idregex,"\\$&"):b.replace(a.jstree.idregex,"\\$&")}).join(", #")))),this._data.search.res=a.vakata.array_unique(this._data.search.res.concat(m))):(this._data.search.dom=a(this.element[0].querySelectorAll("#"+a.map(m,function(b){return-1!=="0123456789".indexOf(b[0])?"\\3"+b[0]+" "+b.substr(1).replace(a.jstree.idregex,"\\$&"):b.replace(a.jstree.idregex,"\\$&")}).join(", #"))),this._data.search.res=m),this._data.search.dom.children(".jstree-anchor").addClass("jstree-search")}this.trigger("search",{nodes:this._data.search.dom,str:c,res:this._data.search.res,show_only_matches:e})},this.clear_search=function(){this.settings.search.close_opened_onclear&&this.close_node(this._data.search.opn,0),this.trigger("clear_search",{nodes:this._data.search.dom,str:this._data.search.str,res:this._data.search.res}),this._data.search.res.length&&(this._data.search.dom=a(this.element[0].querySelectorAll("#"+a.map(this._data.search.res,function(b){return-1!=="0123456789".indexOf(b[0])?"\\3"+b[0]+" "+b.substr(1).replace(a.jstree.idregex,"\\$&"):b.replace(a.jstree.idregex,"\\$&")}).join(", #"))),this._data.search.dom.children(".jstree-anchor").removeClass("jstree-search")),this._data.search.str="",this._data.search.res=[],this._data.search.opn=[],this._data.search.dom=a()},this.redraw_node=function(b,c,e,f){if(b=d.redraw_node.apply(this,arguments),b&&-1!==a.inArray(b.id,this._data.search.res)){var g,h,i=null;for(g=0,h=b.childNodes.length;h>g;g++)if(b.childNodes[g]&&b.childNodes[g].className&&-1!==b.childNodes[g].className.indexOf("jstree-anchor")){i=b.childNodes[g];break}i&&(i.className+=" jstree-search")}return b}},function(a){a.vakata.search=function(b,c,d){d=d||{},d=a.extend({},a.vakata.search.defaults,d),d.fuzzy!==!1&&(d.fuzzy=!0),b=d.caseSensitive?b:b.toLowerCase();var e=d.location,f=d.distance,g=d.threshold,h=b.length,i,j,k,l;return h>32&&(d.fuzzy=!1),d.fuzzy&&(i=1<<h-1,j=function(){var a={},c=0;for(c=0;h>c;c++)a[b.charAt(c)]=0;for(c=0;h>c;c++)a[b.charAt(c)]|=1<<h-c-1;return a}(),k=function(a,b){var c=a/h,d=Math.abs(e-b);return f?c+d/f:d?1:c}),l=function(a){if(a=d.caseSensitive?a:a.toLowerCase(),b===a||-1!==a.indexOf(b))return{isMatch:!0,score:0};if(!d.fuzzy)return{isMatch:!1,score:1};var c,f,l=a.length,m=g,n=a.indexOf(b,e),o,p,q=h+l,r,s,t,u,v,w=1,x=[];for(-1!==n&&(m=Math.min(k(0,n),m),n=a.lastIndexOf(b,e+h),-1!==n&&(m=Math.min(k(0,n),m))),n=-1,c=0;h>c;c++){o=0,p=q;while(p>o)k(c,e+p)<=m?o=p:q=p,p=Math.floor((q-o)/2+o);for(q=p,s=Math.max(1,e-p+1),t=Math.min(e+p,l)+h,u=new Array(t+2),u[t+1]=(1<<c)-1,f=t;f>=s;f--)if(v=j[a.charAt(f-1)],0===c?u[f]=(u[f+1]<<1|1)&v:u[f]=(u[f+1]<<1|1)&v|((r[f+1]|r[f])<<1|1)|r[f+1],u[f]&i&&(w=k(c,f-1),m>=w)){if(m=w,n=f-1,x.push(n),!(n>e))break;s=Math.max(1,2*e-n)}if(k(c+1,e)>m)break;r=u}return{isMatch:n>=0,score:w}},c===!0?{search:l}:l(c)},a.vakata.search.defaults={location:0,distance:100,threshold:.6,fuzzy:!1,caseSensitive:!1}}(a),a.jstree.defaults.sort=function(a,b){return this.get_text(a)>this.get_text(b)?1:-1},a.jstree.plugins.sort=function(b,c){this.bind=function(){c.bind.call(this),this.element.on("model.jstree",a.proxy(function(a,b){this.sort(b.parent,!0)},this)).on("rename_node.jstree create_node.jstree",a.proxy(function(a,b){this.sort(b.parent||b.node.parent,!1),this.redraw_node(b.parent||b.node.parent,!0)},this)).on("move_node.jstree copy_node.jstree",a.proxy(function(a,b){this.sort(b.parent,!1),this.redraw_node(b.parent,!0)},this))},this.sort=function(b,c){var d,e;if(b=this.get_node(b),b&&b.children&&b.children.length&&(b.children.sort(a.proxy(this.settings.sort,this)),c))for(d=0,e=b.children_d.length;e>d;d++)this.sort(b.children_d[d],!1)}};var n=!1;a.jstree.defaults.state={key:"jstree",events:"changed.jstree open_node.jstree close_node.jstree check_node.jstree uncheck_node.jstree",ttl:!1,filter:!1},a.jstree.plugins.state=function(b,c){this.bind=function(){c.bind.call(this);var b=a.proxy(function(){this.element.on(this.settings.state.events,a.proxy(function(){n&&clearTimeout(n),n=setTimeout(a.proxy(function(){this.save_state()},this),100)},this)),this.trigger("state_ready")},this);this.element.on("ready.jstree",a.proxy(function(a,c){this.element.one("restore_state.jstree",b),this.restore_state()||b()},this))},this.save_state=function(){var b={state:this.get_state(),ttl:this.settings.state.ttl,sec:+new Date};a.vakata.storage.set(this.settings.state.key,JSON.stringify(b))},this.restore_state=function(){var b=a.vakata.storage.get(this.settings.state.key);if(b)try{b=JSON.parse(b)}catch(c){return!1}return b&&b.ttl&&b.sec&&+new Date-b.sec>b.ttl?!1:(b&&b.state&&(b=b.state),b&&a.isFunction(this.settings.state.filter)&&(b=this.settings.state.filter.call(this,b)),b?(this.element.one("set_state.jstree",function(c,d){d.instance.trigger("restore_state",{state:a.extend(!0,{},b)})}),this.set_state(b),!0):!1)},this.clear_state=function(){return a.vakata.storage.del(this.settings.state.key)}},function(a,b){a.vakata.storage={set:function(a,b){return window.localStorage.setItem(a,b)},get:function(a){return window.localStorage.getItem(a)},del:function(a){return window.localStorage.removeItem(a)}}}(a),a.jstree.defaults.types={"default":{}},a.jstree.defaults.types[a.jstree.root]={},a.jstree.plugins.types=function(c,d){this.init=function(c,e){var f,g;if(e&&e.types&&e.types["default"])for(f in e.types)if("default"!==f&&f!==a.jstree.root&&e.types.hasOwnProperty(f))for(g in e.types["default"])e.types["default"].hasOwnProperty(g)&&e.types[f][g]===b&&(e.types[f][g]=e.types["default"][g]);d.init.call(this,c,e),this._model.data[a.jstree.root].type=a.jstree.root},this.refresh=function(b,c){d.refresh.call(this,b,c),this._model.data[a.jstree.root].type=a.jstree.root},this.bind=function(){this.element.on("model.jstree",a.proxy(function(c,d){var e=this._model.data,f=d.nodes,g=this.settings.types,h,i,j="default";for(h=0,i=f.length;i>h;h++)j="default",e[f[h]].original&&e[f[h]].original.type&&g[e[f[h]].original.type]&&(j=e[f[h]].original.type),e[f[h]].data&&e[f[h]].data.jstree&&e[f[h]].data.jstree.type&&g[e[f[h]].data.jstree.type]&&(j=e[f[h]].data.jstree.type),e[f[h]].type=j,e[f[h]].icon===!0&&g[j].icon!==b&&(e[f[h]].icon=g[j].icon);e[a.jstree.root].type=a.jstree.root},this)),d.bind.call(this)},this.get_json=function(b,c,e){var f,g,h=this._model.data,i=c?a.extend(!0,{},c,{no_id:!1}):{},j=d.get_json.call(this,b,i,e);if(j===!1)return!1;if(a.isArray(j))for(f=0,g=j.length;g>f;f++)j[f].type=j[f].id&&h[j[f].id]&&h[j[f].id].type?h[j[f].id].type:"default",c&&c.no_id&&(delete j[f].id,j[f].li_attr&&j[f].li_attr.id&&delete j[f].li_attr.id,j[f].a_attr&&j[f].a_attr.id&&delete j[f].a_attr.id);else j.type=j.id&&h[j.id]&&h[j.id].type?h[j.id].type:"default",c&&c.no_id&&(j=this._delete_ids(j));return j},this._delete_ids=function(b){if(a.isArray(b)){for(var c=0,d=b.length;d>c;c++)b[c]=this._delete_ids(b[c]);return b}return delete b.id,b.li_attr&&b.li_attr.id&&delete b.li_attr.id,b.a_attr&&b.a_attr.id&&delete b.a_attr.id,b.children&&a.isArray(b.children)&&(b.children=this._delete_ids(b.children)),b},this.check=function(c,e,f,g,h){if(d.check.call(this,c,e,f,g,h)===!1)return!1;e=e&&e.id?e:this.get_node(e),f=f&&f.id?f:this.get_node(f);var i=e&&e.id?h&&h.origin?h.origin:a.jstree.reference(e.id):null,j,k,l,m;switch(i=i&&i._model&&i._model.data?i._model.data:null,c){case"create_node":case"move_node":case"copy_node":if("move_node"!==c||-1===a.inArray(e.id,f.children)){if(j=this.get_rules(f),j.max_children!==b&&-1!==j.max_children&&j.max_children===f.children.length)return this._data.core.last_error={error:"check",plugin:"types",id:"types_01",reason:"max_children prevents function: "+c,data:JSON.stringify({chk:c,pos:g,obj:e&&e.id?e.id:!1,par:f&&f.id?f.id:!1})},!1;if(j.valid_children!==b&&-1!==j.valid_children&&-1===a.inArray(e.type||"default",j.valid_children))return this._data.core.last_error={error:"check",plugin:"types",id:"types_02",reason:"valid_children prevents function: "+c,data:JSON.stringify({chk:c,pos:g,obj:e&&e.id?e.id:!1,par:f&&f.id?f.id:!1})},!1;if(i&&e.children_d&&e.parents){for(k=0,l=0,m=e.children_d.length;m>l;l++)k=Math.max(k,i[e.children_d[l]].parents.length);k=k-e.parents.length+1}(0>=k||k===b)&&(k=1);do{if(j.max_depth!==b&&-1!==j.max_depth&&j.max_depth<k)return this._data.core.last_error={error:"check",plugin:"types",id:"types_03",reason:"max_depth prevents function: "+c,data:JSON.stringify({chk:c,pos:g,obj:e&&e.id?e.id:!1,par:f&&f.id?f.id:!1})},!1;f=this.get_node(f.parent),j=this.get_rules(f),k++}while(f)}}return!0},this.get_rules=function(a){if(a=this.get_node(a),!a)return!1;var c=this.get_type(a,!0);return c.max_depth===b&&(c.max_depth=-1),c.max_children===b&&(c.max_children=-1),c.valid_children===b&&(c.valid_children=-1),c},this.get_type=function(b,c){return b=this.get_node(b),b?c?a.extend({type:b.type},this.settings.types[b.type]):b.type:!1},this.set_type=function(c,d){var e,f,g,h,i;if(a.isArray(c)){for(c=c.slice(),f=0,g=c.length;g>f;f++)this.set_type(c[f],d);return!0}return e=this.settings.types,c=this.get_node(c),e[d]&&c?(h=c.type,i=this.get_icon(c),c.type=d,(i===!0||e[h]&&e[h].icon!==b&&i===e[h].icon)&&this.set_icon(c,e[d].icon!==b?e[d].icon:!0),!0):!1}},a.jstree.defaults.unique={case_sensitive:!1,duplicate:function(a,b){return a+" ("+b+")"}},a.jstree.plugins.unique=function(c,d){this.check=function(b,c,e,f,g){if(d.check.call(this,b,c,e,f,g)===!1)return!1;if(c=c&&c.id?c:this.get_node(c),e=e&&e.id?e:this.get_node(e),!e||!e.children)return!0;var h="rename_node"===b?f:c.text,i=[],j=this.settings.unique.case_sensitive,k=this._model.data,l,m;for(l=0,m=e.children.length;m>l;l++)i.push(j?k[e.children[l]].text:k[e.children[l]].text.toLowerCase());switch(j||(h=h.toLowerCase()),b){case"delete_node":return!0;case"rename_node":return l=-1===a.inArray(h,i)||c.text&&c.text[j?"toString":"toLowerCase"]()===h,l||(this._data.core.last_error={error:"check",plugin:"unique",id:"unique_01",reason:"Child with name "+h+" already exists. Preventing: "+b,data:JSON.stringify({chk:b,pos:f,obj:c&&c.id?c.id:!1,par:e&&e.id?e.id:!1})}),l;case"create_node":return l=-1===a.inArray(h,i),l||(this._data.core.last_error={error:"check",plugin:"unique",id:"unique_04",reason:"Child with name "+h+" already exists. Preventing: "+b,data:JSON.stringify({chk:b,pos:f,obj:c&&c.id?c.id:!1,par:e&&e.id?e.id:!1})}),l;case"copy_node":return l=-1===a.inArray(h,i),l||(this._data.core.last_error={error:"check",plugin:"unique",id:"unique_02",reason:"Child with name "+h+" already exists. Preventing: "+b,data:JSON.stringify({chk:b,pos:f,obj:c&&c.id?c.id:!1,par:e&&e.id?e.id:!1})}),l;case"move_node":return l=c.parent===e.id&&(!g||!g.is_multi)||-1===a.inArray(h,i),l||(this._data.core.last_error={error:"check",plugin:"unique",id:"unique_03",reason:"Child with name "+h+" already exists. Preventing: "+b,data:JSON.stringify({chk:b,pos:f,obj:c&&c.id?c.id:!1,par:e&&e.id?e.id:!1})}),l}return!0},this.create_node=function(c,e,f,g,h){if(!e||e.text===b){if(null===c&&(c=a.jstree.root),c=this.get_node(c),!c)return d.create_node.call(this,c,e,f,g,h);if(f=f===b?"last":f,!f.toString().match(/^(before|after)$/)&&!h&&!this.is_loaded(c))return d.create_node.call(this,c,e,f,g,h);e||(e={});var i,j,k,l,m,n=this._model.data,o=this.settings.unique.case_sensitive,p=this.settings.unique.duplicate;for(j=i=this.get_string("New node"),k=[],l=0,m=c.children.length;m>l;l++)k.push(o?n[c.children[l]].text:n[c.children[l]].text.toLowerCase());l=1;while(-1!==a.inArray(o?j:j.toLowerCase(),k))j=p.call(this,i,++l).toString();e.text=j}return d.create_node.call(this,c,e,f,g,h)}};var o=i.createElement("DIV");if(o.setAttribute("unselectable","on"),o.setAttribute("role","presentation"),o.className="jstree-wholerow",o.innerHTML="&#160;",a.jstree.plugins.wholerow=function(b,c){this.bind=function(){c.bind.call(this),this.element.on("ready.jstree set_state.jstree",a.proxy(function(){this.hide_dots()},this)).on("init.jstree loading.jstree ready.jstree",a.proxy(function(){this.get_container_ul().addClass("jstree-wholerow-ul")},this)).on("deselect_all.jstree",a.proxy(function(a,b){this.element.find(".jstree-wholerow-clicked").removeClass("jstree-wholerow-clicked")},this)).on("changed.jstree",a.proxy(function(a,b){this.element.find(".jstree-wholerow-clicked").removeClass("jstree-wholerow-clicked");var c=!1,d,e;for(d=0,e=b.selected.length;e>d;d++)c=this.get_node(b.selected[d],!0),c&&c.length&&c.children(".jstree-wholerow").addClass("jstree-wholerow-clicked")},this)).on("open_node.jstree",a.proxy(function(a,b){this.get_node(b.node,!0).find(".jstree-clicked").parent().children(".jstree-wholerow").addClass("jstree-wholerow-clicked")},this)).on("hover_node.jstree dehover_node.jstree",a.proxy(function(a,b){"hover_node"===a.type&&this.is_disabled(b.node)||this.get_node(b.node,!0).children(".jstree-wholerow")["hover_node"===a.type?"addClass":"removeClass"]("jstree-wholerow-hovered")},this)).on("contextmenu.jstree",".jstree-wholerow",a.proxy(function(b){b.preventDefault();var c=a.Event("contextmenu",{metaKey:b.metaKey,ctrlKey:b.ctrlKey,altKey:b.altKey,shiftKey:b.shiftKey,pageX:b.pageX,pageY:b.pageY});a(b.currentTarget).closest(".jstree-node").children(".jstree-anchor").first().trigger(c)},this)).on("click.jstree",".jstree-wholerow",function(b){b.stopImmediatePropagation();var c=a.Event("click",{metaKey:b.metaKey,ctrlKey:b.ctrlKey,altKey:b.altKey,shiftKey:b.shiftKey});a(b.currentTarget).closest(".jstree-node").children(".jstree-anchor").first().trigger(c).focus()}).on("click.jstree",".jstree-leaf > .jstree-ocl",a.proxy(function(b){b.stopImmediatePropagation();var c=a.Event("click",{metaKey:b.metaKey,ctrlKey:b.ctrlKey,altKey:b.altKey,shiftKey:b.shiftKey});a(b.currentTarget).closest(".jstree-node").children(".jstree-anchor").first().trigger(c).focus()},this)).on("mouseover.jstree",".jstree-wholerow, .jstree-icon",a.proxy(function(a){return a.stopImmediatePropagation(),this.is_disabled(a.currentTarget)||this.hover_node(a.currentTarget),!1},this)).on("mouseleave.jstree",".jstree-node",a.proxy(function(a){this.dehover_node(a.currentTarget)},this))},this.teardown=function(){this.settings.wholerow&&this.element.find(".jstree-wholerow").remove(),c.teardown.call(this)},this.redraw_node=function(b,d,e,f){if(b=c.redraw_node.apply(this,arguments)){var g=o.cloneNode(!0);-1!==a.inArray(b.id,this._data.core.selected)&&(g.className+=" jstree-wholerow-clicked"),this._data.core.focused&&this._data.core.focused===b.id&&(g.className+=" jstree-wholerow-hovered"),b.insertBefore(g,b.childNodes[0])}return b}},i.registerElement&&Object&&Object.create){var p=Object.create(HTMLElement.prototype);p.createdCallback=function(){var b={core:{},plugins:[]},c;for(c in a.jstree.plugins)a.jstree.plugins.hasOwnProperty(c)&&this.attributes[c]&&(b.plugins.push(c),this.getAttribute(c)&&JSON.parse(this.getAttribute(c))&&(b[c]=JSON.parse(this.getAttribute(c))));for(c in a.jstree.defaults.core)a.jstree.defaults.core.hasOwnProperty(c)&&this.attributes[c]&&(b.core[c]=JSON.parse(this.getAttribute(c))||this.getAttribute(c));a(this).jstree(b)};try{i.registerElement("vakata-jstree",{prototype:p})}catch(q){}}}});assets/images/onedrive.svg000064400000002131151526424650011656 0ustar00<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 5.5 32 20.5"><title>OfficeCore10_32x_24x_20x_16x_01-22-2019</title><g id="STYLE_COLOR"><path d="M12.20245,11.19292l.00031-.0011,6.71765,4.02379,4.00293-1.68451.00018.00068A6.4768,6.4768,0,0,1,25.5,13c.14764,0,.29358.0067.43878.01639a10.00075,10.00075,0,0,0-18.041-3.01381C7.932,10.00215,7.9657,10,8,10A7.96073,7.96073,0,0,1,12.20245,11.19292Z" fill="#0364b8"/><path d="M12.20276,11.19182l-.00031.0011A7.96073,7.96073,0,0,0,8,10c-.0343,0-.06805.00215-.10223.00258A7.99676,7.99676,0,0,0,1.43732,22.57277l5.924-2.49292,2.63342-1.10819,5.86353-2.46746,3.06213-1.28859Z" fill="#0078d4"/><path d="M25.93878,13.01639C25.79358,13.0067,25.64764,13,25.5,13a6.4768,6.4768,0,0,0-2.57648.53178l-.00018-.00068-4.00293,1.68451,1.16077.69528L23.88611,18.19l1.66009.99438,5.67633,3.40007a6.5002,6.5002,0,0,0-5.28375-9.56805Z" fill="#1490df"/><path d="M25.5462,19.18437,23.88611,18.19l-3.80493-2.2791-1.16077-.69528L15.85828,16.5042,9.99475,18.97166,7.36133,20.07985l-5.924,2.49292A7.98889,7.98889,0,0,0,8,26H25.5a6.49837,6.49837,0,0,0,5.72253-3.41556Z" fill="#28a8ea"/></g></svg>assets/images/icon.svg000064400000132722151526424650011005 0ustar00<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->

<svg
   version="1.1"
   id="svg824"
   width="21.623335"
   height="16.999998"
   viewBox="0 0 21.623335 16.999998"
   sodipodi:docname="icon.svg"
   inkscape:version="1.1.2 (b8e25be833, 2022-02-05)"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:svg="http://www.w3.org/2000/svg">
  <defs
     id="defs828" />
  <sodipodi:namedview
     id="namedview826"
     pagecolor="#ffffff"
     bordercolor="#666666"
     borderopacity="1.0"
     inkscape:pageshadow="2"
     inkscape:pageopacity="0.0"
     inkscape:pagecheckerboard="0"
     showgrid="false"
     inkscape:zoom="34.689826"
     inkscape:cx="15.278255"
     inkscape:cy="8.5039343"
     inkscape:window-width="1920"
     inkscape:window-height="1001"
     inkscape:window-x="-9"
     inkscape:window-y="-9"
     inkscape:window-maximized="1"
     inkscape:current-layer="g830" />
  <g
     inkscape:groupmode="layer"
     inkscape:label="Image"
     id="g830"
     transform="translate(-269.29211,-191.56552)">
    <g
       id="g968"
       transform="matrix(0.03364745,0,0,0.03972553,268.93389,191.09588)">
      <path
         style="fill:#f5f8fd;stroke-width:1.33333"
         d="m 141.10898,438.13217 c -1.95672,-1.02352 -6.14244,-2.29764 -9.3016,-2.83138 -9.35915,-1.58121 -28.94772,-9.74152 -41.845421,-17.43218 -11.025194,-6.57411 -26.710514,-18.89486 -33.29529,-26.15328 -1.466667,-1.61672 -5.427914,-5.96404 -8.802771,-9.66074 -7.584254,-8.3075 -15.943268,-21.09869 -21.818917,-33.38792 -5.160556,-10.79357 -12.711647,-33.0608 -12.711647,-37.48508 0,-1.66331 -0.6,-3.39503 -1.333334,-3.84825 -1.80488,-1.11548 -1.80488,-58.88452 0,-60 0.733334,-0.45323 1.333334,-1.9132 1.333334,-3.2444 0,-4.03048 9.985556,-32.26746 14.124428,-39.9408 4.054648,-7.51722 4.452734,-8.18242 10.062749,-16.8148 8.018955,-12.33914 29.951935,-34.03006 43.812825,-43.32928 18.647886,-12.51081 53.584974,-26.60342 66.078494,-26.65416 5.34788,-0.0217 7.51774,-1.85651 12.63426,-10.68323 12.00046,-20.70255 34.50082,-45.121832 55.00898,-59.700384 19.91439,-14.156452 45.6745,-25.648892 73.69907,-32.87961 11.89731,-3.069664 73.09041,-3.000365 85.6937,0.09704 17.77343,4.368035 42.98333,13.2827 49.92109,17.652972 2.36376,1.488991 7.29775,4.236018 10.96442,6.104505 3.66667,1.868486 9.36667,5.493088 12.66667,8.054669 3.3,2.561583 8.1,6.07636 10.66666,7.810616 5.46851,3.694983 28.67506,26.680505 31.83002,31.526851 1.19349,1.833334 5.00786,7.153 8.4764,11.821482 11.55256,15.549229 27.28865,50.299969 30.95371,68.356519 0.64233,3.16461 1.4711,3.59968 8.39296,4.40593 15.84841,1.84603 36.33398,10.06548 52.2501,20.9644 4.64644,3.18175 10.31904,7.06047 12.60578,8.61938 2.28673,1.5589 7.7577,6.69904 12.1577,11.4225 7.37557,7.91779 10.86573,12.57551 20.28918,27.07646 3.76971,5.80088 13.68467,30.13957 13.75323,33.76068 0.0233,1.23163 0.92333,3.404 2,4.82749 1.57022,2.07602 1.94865,7.74864 1.91236,28.66667 -0.0399,22.98613 -0.35072,26.71092 -2.62143,31.41183 -1.41691,2.93333 -2.59655,6.31005 -2.62143,7.50384 -0.16908,8.1117 -14.50721,34.02932 -27.81453,50.27754 -11.02356,13.45975 -33.71459,29.28655 -52.23071,36.43047 -24.29409,9.3732 0.49587,8.39631 -222.66667,8.77451 -169.59756,0.28741 -201.21752,0.052 -204.22437,-1.52087 z M 380.31787,302.33334 380.66668,250 l 37.10401,-0.35461 c 22.53758,-0.21539 36.93234,-0.84892 36.66667,-1.61375 C 453.82342,246.26407 333.3159,124 332.18768,124 c -1.16371,0 -123.36518,122.23764 -123.95835,123.99504 -0.27431,0.81267 13.3959,1.42795 36.66667,1.65035 L 282.00001,250 l 0.34881,52.33334 0.3488,52.33333 h 48.63572 48.63573 z M 452.5828,86.572683 c -2.31566,-2.420848 -3.73806,-5.190064 -3.48045,-6.775972 0.60373,-3.71671 -15.16995,-19.128247 -27.10234,-26.48009 -29.39708,-18.112276 -51.43024,-24.735666 -87.33333,-26.253277 -28.42336,-1.201445 -58.2474,3.477895 -78.08634,12.25161 -12.25732,5.420771 -34.9568,19.335822 -38.93667,23.868643 -2.01237,2.291959 -6.23237,6.23534 -9.3778,8.763069 -4.14064,3.327508 -5.61125,5.417639 -5.32874,7.573522 0.24309,1.855065 -1.08506,4.517489 -3.52291,7.062065 l -3.91312,4.084415 h 130.49891 130.49891 z"
         id="path982" />
      <path
         style="fill:#f1f5fd;stroke-width:1.33333"
         d="m 140,437.31118 c -1.1,-0.66469 -7.4,-2.78549 -14,-4.71292 -12.85812,-3.755 -28.832519,-11.04884 -40.616204,-18.54519 -18.287235,-11.63368 -41.703309,-35.9392 -51.933388,-53.90606 -9.02679,-15.85355 -18.783741,-40.96674 -18.783741,-48.34703 0,-1.40826 -0.945324,-4.00322 -2.100721,-5.76658 -1.783726,-2.7223 -2.013405,-7.09126 -1.522086,-28.95308 0.318249,-14.16084 1.227259,-27.54698 2.020021,-29.74698 0.792762,-2.2 3.657064,-10.9 6.365114,-19.33334 4.397806,-13.69552 6.75493,-19.0821 13.940221,-31.85668 8.714445,-15.49324 31.032637,-39.21486 47.297453,-50.27166 19.617071,-13.33566 54.160691,-27.20499 67.758031,-27.20499 5.22163,0 6.98707,-1.67199 13.98423,-13.24406 11.12449,-18.397942 29.65392,-39.264709 46.2546,-52.089276 23.18088,-17.907973 42.14176,-26.843518 80.48959,-37.931696 9.96084,-2.88015 71.77065,-2.972818 85.09305,-0.127574 14.07547,3.006071 32.12548,9.270264 45.75384,15.878707 22.84525,11.077743 32.56175,17.947426 53.05983,37.513898 28.30339,27.017051 44.69759,55.658881 56.09387,98.000001 0.80507,2.99112 1.92122,3.48328 10.87175,4.79387 23.62161,3.45882 49.02345,16.29914 69.64784,35.20613 15.57119,14.27457 31.23923,39.28128 37.17518,59.3328 1.51973,5.13363 3.32404,10.02368 4.00958,10.86678 0.71744,0.8823 1.05508,13.33188 0.79554,29.33333 L 651.20269,334 l -4.79371,12.99673 c -8.43578,22.87116 -17.24808,37.07362 -32.67313,52.65814 -15.49556,15.65576 -29.35699,24.35626 -53.06916,33.3103 l -13.33334,5.03484 -202.66667,0.25984 C 225.35873,438.41282 141.17739,438.02262 140,437.31118 Z M 381.01592,303.38423 c 0.26569,-39.49532 0.74411,-52.16396 2,-52.96161 0.90792,-0.57664 18.00076,-1.05764 37.98409,-1.06887 19.98334,-0.0107 36.33334,-0.52813 36.33334,-1.14868 0,-0.62055 -2.55,-3.52321 -5.66667,-6.45037 -3.11666,-2.92715 -31.33329,-31.11578 -62.70363,-62.64138 l -57.03696,-57.31928 -62.29637,62.49474 c -34.26301,34.3721 -62.49319,63.05888 -62.73373,63.74837 -0.26432,0.75763 14.24324,1.39395 36.66667,1.60824 L 280.66668,250 l 0.66666,52 0.66667,52.00001 47.33333,0.70321 c 26.03334,0.38677 48.23334,0.67868 49.33334,0.64869 1.73645,-0.0473 2.04603,-6.89541 2.34924,-51.96768 z m -126.20363,-139.132 c 3.21991,-2.79461 7.95439,-5.92884 10.52105,-6.96493 2.56667,-1.03611 8.11146,-5.0496 12.32175,-8.9189 4.21029,-3.86928 8.24905,-7.03506 8.97501,-7.03506 0.72596,0 5.38118,-3.78026 10.34492,-8.40056 26.55274,-24.71558 31.49724,-24.71558 58.04998,0 4.96375,4.6203 9.61896,8.40056 10.34492,8.40056 0.72596,0 4.76472,3.16578 8.97501,7.03506 4.2103,3.8693 9.75508,7.88279 12.32175,8.9189 2.56667,1.03609 7.30115,4.17032 10.52105,6.96493 l 5.85439,5.08111 h 49.14562 c 53.10794,0 50.73154,0.34492 47.95413,-6.96022 -0.81649,-2.14754 -0.63832,-3.89029 0.56613,-5.53746 1.46038,-1.9972 1.43639,-3.31406 -0.14186,-7.7873 -1.0447,-2.961 -1.89946,-6.82814 -1.89946,-8.59365 0,-1.76551 -1.5,-6.17013 -3.33333,-9.78804 -1.83333,-3.61791 -3.33333,-7.23131 -3.33333,-8.02979 0,-3.515 -15.42956,-27.186327 -24.38952,-37.417305 C 443.78452,58.0138 421.90985,43.065289 388.93319,31.453808 366.85836,23.681 359.49579,22.663166 325.5795,22.695523 290.83862,22.728667 281.55852,24.184239 258.42664,33.228352 217.12713,49.375657 189.86299,73.236602 166.13486,114 c -8.13424,13.9741 -11.73829,16.83997 -25.10979,19.96683 -5.33045,1.24651 -17.98467,6.2552 -28.12047,11.13045 -16.07553,7.73222 -18.359551,9.22606 -17.886861,11.69878 0.407654,2.1325 -0.582346,3.44013 -3.996552,5.2788 -2.496141,1.34426 -5.118165,3.52734 -5.826723,4.85129 -1.235544,2.30864 2.090204,2.40719 81.237586,2.40719 h 82.52585 z"
         id="path980" />
      <path
         style="fill:#ebf1fd;stroke-width:1.33333"
         d="M 141.33334,436.77754 C 139.5,435.79199 134.7763,434.30439 130.83621,433.47177 105.68161,428.15606 70.675853,406.81645 54.000002,386.63218 51.066668,383.08171 45.841287,376.71711 42.388043,372.48863 31.710888,359.41451 14.666667,320.87064 14.666667,309.7994 c 0,-1.63644 -0.6,-3.34617 -1.333333,-3.7994 -1.629498,-1.00708 -1.843669,-55.54989 -0.225391,-57.4 0.609369,-0.69666 2.169838,-5.16666 3.467708,-9.93333 1.297871,-4.76667 2.969546,-10.16667 3.714832,-12 0.745286,-1.83333 2.497628,-6.61449 3.894094,-10.62481 7.807713,-22.42188 32.925036,-52.83307 57.815426,-70.00092 8.364596,-5.76938 28.249017,-16.30949 34.820727,-18.45738 1.38194,-0.45166 4.8011,-1.68527 7.59814,-2.74134 4.6387,-1.75142 13.71948,-3.6495 26.42083,-5.52254 5.06179,-0.74645 5.75039,-1.51645 15.69533,-17.55053 4.12778,-6.655135 8.13164,-11.143359 8.13164,-9.11533 0,0.539187 -2.16993,4.362653 -4.82208,8.49659 -2.65214,4.13394 -6.70214,10.46797 -9,14.07562 -5.84512,9.17689 -8.99637,11.0747 -27.00109,16.26116 -35.818234,10.31784 -62.754968,28.81555 -80.353509,55.17948 -6.455536,9.67088 -7.901356,12.94713 -8.53186,19.33333 -0.289605,2.93334 -0.987852,6.38334 -1.55166,7.66667 C 42.43652,215.87446 46.716732,216 122.95827,216 h 80.5769 l 3.23242,-3.46309 c 1.77783,-1.90469 5.63242,-4.67412 8.56575,-6.15425 10.6012,-5.34931 27.93651,-19.55204 67.20399,-55.05992 35.24381,-31.86946 36.0354,-32.51761 40.80681,-33.41273 5.95624,-1.1174 7.76251,0.069 5.84266,3.83758 -0.8179,1.60549 -29.01952,30.52767 -62.67027,64.27151 -33.65076,33.74382 -61.18319,62.08449 -61.18319,62.97924 0,1.23344 9.10788,1.71242 37.66667,1.9809 l 37.66667,0.3541 0.66666,52 0.66667,52 h 49.64988 49.64988 l 0.49883,-52 0.49883,-52 38.80862,-0.66667 L 459.91468,250 398.62401,187.43295 c -33.70986,-34.41188 -61.29066,-63.12544 -61.29066,-63.80793 0,-1.20818 4.3569,2.57488 38.05365,33.04165 32.72,29.58364 51.34081,44.73615 60.61302,49.32321 2.56666,1.26976 6.50118,4.04727 8.74338,6.17223 l 4.07672,3.86356 65.25662,-0.34616 65.25661,-0.34617 -5,-3.13171 c -2.75,-1.72243 -5,-4.17944 -5,-5.46001 0,-4.74731 -14.41573,-13.13587 -29.68072,-17.2713 -11.8818,-3.21889 -21.19235,-7.31094 -24.0196,-10.55681 -2.05757,-2.36221 -5.50607,-12.35357 -6.98816,-20.24684 -2.50293,-13.33 -11.77927,-36.79639 -19.72176,-49.89022 C 471.08046,79.361428 437.88966,49.038565 409.79,36.48105 398.57067,31.467212 376.80445,24.199954 366.24617,21.942726 c -12.70549,-2.71628 -67.74081,-2.713543 -80.65961,0.004 -25.3115,5.324436 -51.80299,17.539156 -76.37683,35.215894 -1.59751,1.149144 -2.54306,1.290525 -2.54306,0.380256 0,-0.796979 1.27108,-2.12931 2.82462,-2.960737 1.55353,-0.831426 6.20353,-4.068937 10.33333,-7.194466 9.82848,-7.438435 36.70095,-20.871011 50.17539,-25.080874 25.57409,-7.990192 28.28111,-8.338528 63.33333,-8.149631 24.14058,0.130094 35.10683,0.718194 42.01586,2.253226 11.96767,2.658953 42.23359,13.31396 47.75031,16.81032 2.32861,1.47582 7.53384,4.463375 11.56717,6.639012 7.51679,4.054661 10.38579,6.03014 22.83222,15.721356 29.90008,23.281223 54.37608,58.011218 65.72592,93.261188 2.56621,7.97008 4.98435,16.07117 5.37361,18.0024 0.63804,3.16545 1.46431,3.59947 8.388,4.40593 9.91408,1.1548 26.52515,6.54914 38.34692,12.45292 29.46836,14.71648 53.27987,39.74676 66.03463,69.41452 2.73074,6.35175 5.41674,13.64863 5.96888,16.2153 0.55214,2.56666 1.82723,5.85017 2.83352,7.29668 2.64759,3.80574 2.63908,53.61932 -0.009,57.40664 -1.01168,1.4465 -2.80595,6.40605 -3.98723,11.02121 -2.78562,10.8831 -7.79746,21.25042 -16.12974,33.3654 -13.35262,19.41448 -16.23913,22.87259 -22.87239,27.4016 -2.28918,1.56299 -7.52919,5.40336 -11.6445,8.53415 -6.62333,5.03847 -24.46146,14.97432 -26.8843,14.97432 -0.49859,0 -2.7972,0.79499 -5.10803,1.76664 -17.81655,7.49148 1.64855,6.85145 -218.20151,7.17456 -165.89541,0.24381 -201.24428,-0.0156 -204.00001,-1.497 z m 36,-350.110872 c 0.78493,-1.466667 2.02716,-2.666667 2.76049,-2.666667 0.85762,0 0.82414,0.951438 -0.0939,2.666667 -0.78494,1.466667 -2.02716,2.666667 -2.7605,2.666667 -0.85761,0 -0.82413,-0.951438 0.0939,-2.666667 z m 6.66667,-7.735304 c 0,-1.486383 17.14949,-18.226311 17.90166,-17.474139 0.3527,0.352689 -3.5309,4.655543 -8.6302,9.561896 -5.0993,4.906352 -9.27146,8.466862 -9.27146,7.912243 z"
         id="path978" />
      <path
         style="fill:#e3ecfd;stroke-width:1.33333"
         d="m 140,436.01674 c -1.1,-0.63788 -7.4,-2.76679 -14,-4.73091 -19.11593,-5.68878 -26.88617,-9.6967 -51.884287,-26.76216 -2.263641,-1.54532 -9.404751,-8.12336 -15.869132,-14.61785 -11.009299,-11.0606 -18.532122,-21.02083 -26.615647,-35.23915 -4.842049,-8.51681 -15.650573,-38.29863 -15.637528,-43.08765 0.0036,-1.33155 -0.711161,-3.73155 -1.588417,-5.33334 -1.906551,-3.48118 -1.553412,-55.98164 0.381321,-56.69012 0.667529,-0.24445 1.210723,-1.74445 1.207096,-3.33333 -0.0071,-3.07247 3.143221,-13.58964 6.057215,-20.22223 0.966558,-2.2 2.543788,-6.4 3.504956,-9.33333 0.961168,-2.93333 3.371763,-8.03333 5.35688,-11.33333 1.985116,-3.3 5.40916,-9 7.608986,-12.66667 4.244486,-7.07471 18.729322,-24.01963 23.317482,-27.27771 2.704888,-1.92074 2.704,-1.89645 -0.07316,2 -1.546214,2.16942 -4.149159,5.14438 -5.784323,6.61104 -8.945378,8.02359 -22.071331,29.60971 -27.16063,44.66667 -8.192405,24.23765 -9.970199,51.36488 -3.994588,60.95309 1.01224,1.6242 1.840437,5.0742 1.840437,7.66667 l 7e-6,4.71357 H 140.52402 c 123.32715,0 115.47599,0.45334 115.47599,-6.66766 0,-1.34726 1.02492,-4.23539 2.2776,-6.41806 3.08801,-5.38056 0.97565,-10.19696 -4.99593,-11.39128 -2.35492,-0.47098 -15.67726,-0.85633 -29.60521,-0.85633 h -25.32352 l -5.17648,-5.17647 c -10.19493,-10.19493 -7.3772,-15.39328 23.36326,-43.10202 13.25396,-11.94683 33.7046,-30.73383 45.44587,-41.74887 56.58454,-53.08475 63.34774,-58.75223 63.34774,-53.08476 0,1.08436 -27.3,29.62923 -60.66666,63.43305 -33.36667,33.80382 -60.66667,61.96044 -60.66667,62.57028 0,0.60983 16.76458,1.10879 37.25464,1.10879 20.49005,0 37.55307,0.48284 37.91779,1.07299 0.36473,0.59013 1.09298,24.29013 1.61834,52.66666 l 0.9552,51.59369 47.79368,0.22222 c 26.28653,0.12227 48.84369,0.27222 50.12702,0.33334 2.17403,0.10346 2.37885,-3.48462 3,-52.55557 l 0.66667,-52.66666 h 39.88856 c 30.62027,0 40.01709,-0.38535 40.44171,-1.65847 0.30424,-0.91215 -0.84562,-2.2022 -2.55523,-2.86677 -1.7096,-0.66458 -11.95837,-10.19539 -22.77504,-21.17959 -19.6733,-19.97801 -25.97615,-27.77627 -12.51847,-15.48859 3.93151,3.58971 13.3104,11.92675 20.84198,18.52675 16.80497,14.72639 20.397,19.81928 18.59122,26.35925 -0.8369,3.03102 -3.02753,5.84458 -6.33532,8.13688 -5.02698,3.48371 -5.20238,3.50387 -30.48441,3.50387 -13.98559,0 -27.35508,0.38535 -29.71,0.85633 -5.97159,1.19432 -8.08395,6.01072 -4.99594,11.39128 1.25268,2.18267 2.2776,5.0708 2.2776,6.41806 0,7.12002 -7.77948,6.66766 114.66667,6.66766 122.13416,0 115.14486,0.43595 113.70578,-7.09217 -0.37744,-1.9744 0.0475,-4.47384 0.94414,-5.55431 1.23372,-1.48653 1.27189,-2.99284 0.1569,-6.19129 -0.81041,-2.32476 -1.47553,-5.78729 -1.47805,-7.69452 -0.005,-4.09056 -6.35584,-20.14488 -11.52436,-29.13428 -14.5722,-25.34488 -42.5001,-45.84811 -73.95363,-54.29296 -6.3154,-1.6956 -12.72368,-3.74715 -14.24061,-4.55897 -4.70371,-2.51736 -7.97462,-8.5202 -10.91258,-20.02706 C 504.963,124.54992 489.9691,98.097265 465.41476,72.860626 450.30006,57.325908 435.64286,45.941138 419.86175,37.47795 c -10.75732,-5.769 -36.0145,-16.144616 -39.30056,-16.144616 -1.12854,0 -1.7305,-0.520022 -1.33768,-1.155604 0.78277,-1.266566 20.79494,4.725676 33.39948,10.000801 10.94348,4.579964 32.08272,16.581332 40.03677,22.730056 3.62246,2.800278 13.09615,11.391414 21.05266,19.091414 15.94369,15.429726 28.68834,32.814919 38.60858,52.666669 6.31326,12.63365 14.34569,34.69345 14.34569,39.39812 0,5.88104 2.23984,7.62747 10.97532,8.55751 38.2154,4.06872 80.95588,35.55062 99.61904,73.3777 2.89451,5.86667 6.52689,14.56667 8.07197,19.33334 1.5451,4.76666 3.37724,9.70852 4.07146,10.9819 1.58432,2.90608 1.67806,56.03079 0.10186,57.75143 -0.63816,0.69667 -2.47349,5.67612 -4.0785,11.06546 -3.9901,13.39797 -8.31254,22.4665 -16.48679,34.58941 -17.49967,25.95307 -46.4724,46.74481 -74.94107,53.78008 -2.93333,0.72489 -5.90333,1.88357 -6.6,2.57485 -1.62376,1.6112 -404.62044,1.55212 -407.40002,-0.0597 z M 71.249457,156.23987 c 3.855591,-4.17433 6.753855,-5.58313 5.838871,-2.83817 -0.256976,0.77092 -2.556976,2.67886 -5.111111,4.23986 l -4.643881,2.83818 z M 86.66667,145.28866 c 5.337524,-4.2466 36.52554,-19.24089 42.66667,-20.51288 1.83333,-0.37974 5.73333,-1.29532 8.66666,-2.03463 6.84047,-1.72405 10.93514,-1.79992 9.26667,-0.1717 -0.69666,0.67986 -6.32671,2.52073 -12.5112,4.09082 -13.95561,3.54299 -31.47569,10.53524 -41.784529,16.67619 -8.67777,5.16932 -11.412054,6.01602 -6.304271,1.9522 z M 360.00001,16.809319 c 0,-1.294656 3.75647,-1.781153 5.45424,-0.706376 1.36756,0.865732 0.88095,1.195115 -1.78757,1.209973 -2.01667,0.0112 -3.66667,-0.215389 -3.66667,-0.503597 z"
         id="path976" />
      <path
         style="fill:#dee8fd;stroke-width:1.33333"
         d="m 140.87703,435.38735 c -1.35097,-1.02364 -4.95097,-2.27644 -8,-2.78398 C 122.16295,430.81989 106.2127,424.14925 91.323535,415.22506 71.578008,403.3901 49.180028,381.9097 39.300592,365.33334 36.45968,360.56667 33.447929,355.76667 32.607814,354.66667 31.145685,352.75225 29.399938,348.68647 23.734037,334 c -3.29955,-8.55269 -6.400703,-19.99989 -6.400703,-23.62673 0,-1.55648 -0.879415,-3.80171 -1.954256,-4.98939 -1.61954,-1.78957 -1.766336,-4.77632 -0.857077,-17.43832 0.603446,-8.40338 1.182861,-12.4723 1.287588,-9.04204 0.704168,23.0647 11.12466,53.63152 22.957535,67.34221 2.015328,2.33516 4.048155,5.45536 4.517394,6.9338 0.469238,1.47844 3.072184,4.01834 5.784322,5.64422 2.712139,1.62587 6.652357,4.65567 8.756038,6.73287 l 3.824877,3.77672 h 98.415385 98.41539 l -1.07447,-3.74643 c -0.7378,-2.57258 -0.48772,-4.54881 0.79818,-6.30738 1.02994,-1.40854 1.57234,-4.07264 1.20534,-5.92024 -0.36701,-1.8476 -0.0969,-7.25928 0.60018,-12.02595 3.21692,-21.99675 6.91392,-68.60755 5.87917,-74.12316 -1.22535,-6.53166 -4.31628,-7.2015 -33.61832,-7.28543 -29.5634,-0.0847 -34.78352,-1.08223 -36.8756,-7.04668 -2.02535,-5.77424 1.60314,-10.69857 21.52094,-29.2066 9.67044,-8.98597 34.27045,-31.88891 54.66667,-50.8954 20.39623,-19.00649 39.4606,-36.70649 42.36526,-39.33333 l 5.2812,-4.77607 -5.87354,6.66667 C 310.1251,139 284.04856,165.90755 255.40768,195.1279 c -28.64089,29.22033 -52.26834,53.97033 -52.50543,55 -0.36251,1.57421 5.73718,1.8721 38.33333,1.8721 h 38.76443 v 51.9746 51.97461 l 3,0.73021 c 1.65,0.40163 25.08929,0.56305 52.08732,0.35873 l 49.08731,-0.37148 -0.0306,-34 c -0.0168,-18.7 0.47488,-36.4 1.09268,-39.33333 L 386.36001,278 l 0.18206,6.66667 c 0.28506,10.43881 3.97786,46.61872 6.26016,61.33334 1.13742,7.33333 2.08218,15.58333 2.09946,18.33333 l 0.0315,5 H 499.5568 604.18043 l 7.5765,-7.83532 c 8.48151,-8.77127 12.26833,-14.60884 16.95155,-26.13163 6.71004,-16.50968 7.68913,-52.19836 1.9396,-70.69972 -8.91146,-28.67604 -27.72611,-53.36823 -53.20759,-69.82915 -12.80939,-8.27481 -20.5881,-11.66542 -36.74955,-16.01857 -16.20104,-4.36379 -19.42198,-6.80128 -22.2248,-16.81895 -8.8834,-31.7504 -17.22996,-50.20467 -31.56379,-69.78764 -10.74576,-14.680919 -10.69812,-14.592119 -5.569,-10.380145 2.56667,2.107717 5.22773,4.807717 5.91349,6 0.68575,1.192282 4.13411,5.846 7.663,10.341594 12.47131,15.887631 28.41972,50.468651 31.06525,67.358891 1.00314,6.40454 2.40705,7.33468 12.6916,8.40853 19.11501,1.99589 36.25252,9.64591 63.22386,28.22252 4.86998,3.35421 16.83858,16.2284 23.56299,25.34588 7.76311,10.5258 14.10495,22.97291 18.59194,36.49037 2.31252,6.96667 4.74832,13.23667 5.41289,13.93334 0.66457,0.69666 1.20832,13.24942 1.20832,27.89501 0,20.90196 -0.40052,27.08101 -1.86244,28.73333 -1.02433,1.15775 -2.8186,5.88103 -3.98723,10.49619 -3.50869,13.85643 -8.96226,23.78571 -26.52877,48.30071 -2.04148,2.849 -5.51355,6.55881 -7.7157,8.24404 -2.20214,1.68523 -5.93185,4.63596 -8.28822,6.55719 -9.31118,7.5917 -23.9981,16.06402 -34.53804,19.92368 -6.09378,2.23149 -14.0912,5.2256 -17.77204,6.65356 -6.52734,2.53224 -11.62572,2.59525 -206.66668,2.55389 -169.01594,-0.0359 -200.3545,-0.33055 -202.43054,-1.90359 z M 384.90307,265.33334 c -0.5012,-1.83334 -1.05943,-5.43334 -1.2405,-8 l -0.32922,-4.66667 32.66666,-0.38796 c 34.12187,-0.40524 41.85866,0.12293 40.98547,2.79777 -1.17834,3.60974 -9.9581,4.77387 -36.56533,4.84827 -14.80227,0.0413 -28.4063,0.64292 -30.23119,1.33675 -1.89147,0.71913 -3.54512,2.58218 -3.84629,4.33333 l -0.52832,3.07184 z"
         id="path974" />
      <path
         style="fill:#dae5fc;stroke-width:1.33333"
         d="m 340.79801,436.33335 c -111.93576,-0.19288 -199.17422,-0.85464 -200.00001,-1.5171 -0.80556,-0.64624 -3.56466,-1.5947 -6.13133,-2.1077 -7.15261,-1.42956 -29.39713,-9.75525 -34.944857,-13.07917 -2.719672,-1.62949 -8.119672,-4.8582 -12.000001,-7.17492 -6.004077,-3.58469 -21.968191,-16.47865 -27.349963,-22.09013 -12.437425,-12.96831 -22.36537,-26.92847 -29.045117,-40.84178 -3.900507,-8.12438 -1.313108,-5.60352 6.354783,6.19138 8.580857,13.19925 24.91001,29.81805 39.578054,40.2801 14.832364,10.57926 37.542101,21.02518 52.354351,24.08171 11.87678,2.4508 20.45553,2.55663 208.63225,2.57341 223.20828,0.0199 206.0958,0.86695 230.42052,-11.4052 26.82246,-13.5323 44.8873,-31.58056 57.29656,-57.24394 9.18371,-18.99271 11.24824,-28.46446 11.62491,-53.33334 0.31566,-20.84123 0.22174,-21.65628 -4.07166,-35.33333 -9.72098,-30.9672 -26.88947,-54.02147 -53.41185,-71.72276 -11.0497,-7.37468 -30.27771,-16.21087 -35.3713,-16.25482 -1.61056,-0.0139 -2.11797,-0.4886 -1.33333,-1.24742 0.77495,-0.74947 5.8382,0.26372 13.043,2.61 35.32983,11.50528 64.42956,36.43826 80.08182,68.615 3.21054,6.6 6.8487,15.3 8.08481,19.33333 1.23609,4.03333 2.75956,8.53333 3.38547,10 0.6259,1.46667 1.50126,14.06667 1.94524,28 0.75601,23.72624 0.63549,25.66841 -1.8999,30.61525 -1.4889,2.90506 -2.7071,6.28179 -2.7071,7.50385 0,5.12148 -9.34871,24.69228 -17.74474,37.14722 -11.58765,17.1895 -28.66607,32.40391 -46.92193,41.80066 -10.5007,5.40497 -22.12606,10.26636 -24.55066,10.26636 -1.22036,0 -4.57256,1.2 -7.44934,2.66666 -2.87679,1.46667 -6.15364,2.51866 -7.28192,2.33774 -1.12828,-0.18091 -91.39231,-0.48288 -200.58676,-0.67106 z m -64.67312,-70.04338 c -2.49797,-0.89282 -5.79797,-3.3173 -7.33333,-5.38774 -3.41923,-4.61086 -3.62208,-16.39124 -1.08695,-63.12141 1.81072,-33.3769 1.47808,-36.2064 -4.58103,-38.96712 -2.02268,-0.92159 -12.96405,-1.48036 -28.98735,-1.48036 -15.35317,0 -27.44389,-0.59458 -29.96541,-1.47358 -5.78928,-2.01816 -7.45228,-5.46996 -4.95859,-10.29222 1.63428,-3.16035 39.57486,-39.62828 67.45445,-64.83622 l 7.33333,-6.63058 -7.98441,8.61629 c -4.39144,4.73897 -20.81518,21.59511 -36.49721,37.45807 -16.35648,16.54521 -28.25738,29.60789 -27.91378,30.6387 0.48364,1.45094 8.02474,1.80234 39.16385,1.82491 l 38.56488,0.028 0.66667,52 0.66667,52 51.33333,0.75256 c 28.23334,0.4139 51.48334,0.8639 51.66667,1 1.41933,1.05362 -0.30109,4.37102 -3.33333,6.42743 -3.3889,2.29831 -7.3029,2.50864 -51.66667,2.77664 -34.98926,0.21137 -49.23108,-0.15004 -52.54179,-1.33333 z M 384.8904,352.35509 c -0.34496,-0.56196 -0.19564,-5.82175 0.33181,-11.68842 L 386.18124,330 l 0.57605,11.13149 c 0.52011,10.05036 -0.14234,14.03297 -1.86689,11.2236 z m -0.35513,-94.21675 C 382.34821,252.43898 384.05657,252 408.42367,252 c 28.94219,0 44.27949,1.1622 42.24519,3.20119 -0.93052,0.93265 -12.22542,1.71667 -31.06549,2.15635 -16.28185,0.37997 -30.6483,1.19222 -31.92545,1.805 -1.63333,0.78368 -2.56548,0.47988 -3.14265,-1.0242 z m 138.639,-91.58498 c -0.82083,-1.03768 -3.43787,-8.78669 -5.81565,-17.22002 -2.37778,-8.43334 -5.45619,-17.55944 -6.84092,-20.28022 -4.04202,-7.94197 -2.85067,-7.73633 1.62333,0.28022 7.87129,14.10381 16.93559,44.6817 11.03324,37.22002 z"
         id="path972" />
      <path
         style="fill:#cfddfa;stroke-width:1.33333"
         d="m 142.61906,434.18142 c -1.07382,-1.00021 -5.25239,-2.45339 -9.28572,-3.22927 -7.46803,-1.43658 -20.83979,-6.5568 -19.8108,-7.5858 0.31165,-0.31164 6.24657,1.03394 13.18872,2.99019 l 12.62208,3.55681 196.00001,0.40427 196,0.40427 13.1302,-3.38072 c 44.79767,-11.53435 77.5629,-42.77392 92.91091,-88.58467 3.52386,-10.51802 4.0566,-14.26504 4.78144,-33.63002 0.66331,-17.72093 0.4047,-23.53714 -1.38401,-31.12648 -2.65488,-11.26437 -9.42903,-30.03488 -13.06087,-36.1904 -1.498,-2.5389 -2.00698,-4.47626 -1.17604,-4.47626 0.80578,0 1.46504,0.51626 1.46504,1.14726 0,0.631 1.60316,3.481 3.56258,6.33334 4.30516,6.26705 11.95549,23.9279 13.17041,30.40402 0.48361,2.57787 1.71653,5.38188 2.73983,6.23114 2.83685,2.35437 2.67777,51.16965 -0.18547,56.90916 -1.12529,2.25569 -2.93003,7.49531 -4.01051,11.64356 -2.5744,9.88376 -7.75196,20.48655 -15.62541,31.99819 -10.27867,15.02826 -13.35191,18.64645 -21.72762,25.58026 -16.44513,13.61412 -28.77368,20.52108 -47.25714,26.47544 -6.23334,2.00804 -11.90334,4.16698 -12.6,4.79763 -0.69667,0.63067 -91.3181,1.14667 -201.38096,1.14667 -167.16386,0 -200.43578,-0.29944 -202.06667,-1.81859 z m -36.69755,-13.44843 c -2.49699,-1.86556 -2.48175,-1.90686 0.43261,-1.1724 1.66142,0.41872 3.34683,1.28888 3.74535,1.9337 1.12776,1.82473 -1.31156,1.38025 -4.17796,-0.7613 z m 171.55859,-59.927 c -7.23296,-4.00892 -7.98165,-11.26665 -5.44738,-52.80599 0.7382,-12.1 1.41138,-26.93612 1.49594,-32.96916 C 273.67542,264.56042 271.71553,256 269.17158,256 c -0.64436,0 -1.17157,-0.6 -1.17157,-1.33333 0,-0.73333 2.39304,-1.33333 5.31785,-1.33333 h 5.31787 l 0.3488,52.33333 0.34881,52.33334 48.33334,0.34996 c 43.69091,0.31636 52.74891,1.00365 46.22428,3.50738 -1.15997,0.44514 -22.60997,0.78806 -47.66667,0.76207 -35.251,-0.0365 -46.27852,-0.44681 -48.74419,-1.81343 z"
         id="path970" />
    </g>
    <path
       style="fill:#f5f8fd;fill-opacity:1;stroke-width:0.0288269"
       d="M 6.3198097,3.0196173 C 6.4281705,2.8770647 6.4860516,2.7504926 6.4860516,2.6560857 c 0,-0.1233857 0.5287891,-0.6908951 0.912974,-0.979826 0.9725282,-0.73140174 1.7464262,-1.00979133 2.9498304,-1.06112451 1.267103,-0.0540504 2.253725,0.20775034 3.222289,0.85503641 0.568874,0.3801755 1.135415,0.9785229 1.177865,1.2439931 0.0099,0.062053 0.0527,0.16103 0.09506,0.2199484 0.04236,0.058918 0.0868,0.1233395 0.09875,0.143158 0.01735,0.028764 -0.857481,0.036034 -4.336244,0.036034 H 6.2485935 Z"
       id="path5653"
       transform="translate(269.29211,191.56552)" />
    <path
       style="fill:#f5f8fd;fill-opacity:1;stroke-width:0.0288269"
       d="M 2.5872139,6.2347891 C 2.4666068,6.2165187 2.4880364,6.1311556 2.6448677,6.005131 2.81436,5.8689323 2.8240478,5.8557512 2.8245944,5.7605948 2.8251562,5.6627667 2.9397646,5.5709876 3.3552259,5.3356615 3.7499103,5.1121041 4.0818804,4.9554498 4.3955703,4.8447311 4.5301564,4.7972282 4.6761387,4.7395401 4.7199753,4.7165356 4.8743633,4.6355156 5.014509,4.4495089 5.2328974,4.0357654 5.5475179,3.4397071 5.6054741,3.3400978 5.8534785,2.9691703 6.1377293,2.5440308 6.5508714,2.0656806 6.8867146,1.7728541 7.559613,1.1861443 8.5732586,0.65544219 9.3164567,0.50074389 9.5104501,0.46036369 9.740125,0.44939153 10.521817,0.4431607 c 0.992357,-0.00791 1.212117,0.007004 1.585479,0.10759799 0.464179,0.12506255 1.198454,0.46483161 1.657547,0.76699191 0.878436,0.5781595 1.658308,1.4974424 2.252927,2.6556648 0.10062,0.1959915 0.182945,0.3796592 0.182945,0.4081505 0,0.028491 0.03896,0.1471942 0.08657,0.2637843 0.04761,0.1165898 0.101483,0.2898144 0.119711,0.3849431 0.01823,0.095129 0.05544,0.2788187 0.08269,0.4082001 0.04494,0.2133758 0.04542,0.2437481 0.0052,0.3267993 -0.03795,0.078366 -0.03901,0.112375 -0.0073,0.2359948 0.06545,0.2553654 0.179275,0.2385409 -1.67703,0.2478762 l -1.618784,0.00814 -0.17468,-0.1711954 C 12.920988,5.9919508 12.765293,5.8615653 12.671073,5.7963626 12.465029,5.6537747 12.106633,5.3245799 11.520067,4.7391379 11.280198,4.4997285 11.019081,4.2597446 10.939807,4.2058404 c -0.127393,-0.086624 -0.165899,-0.098008 -0.331509,-0.098008 -0.166795,0 -0.203148,0.010947 -0.330981,0.099667 C 10.198334,4.2623163 9.9379674,4.5023002 9.6987244,4.7407972 8.999805,5.4375375 8.7494264,5.6678419 8.5411602,5.8055535 8.4334845,5.8767519 8.2744829,6.0071019 8.1878232,6.0952206 L 8.03026,6.2554364 5.3483739,6.2511173 C 3.8733366,6.2487416 2.6308146,6.241394 2.5872139,6.2347891 Z M 14.989986,3.1168345 c 0,-0.013914 -0.02195,-0.043101 -0.04877,-0.064861 -0.02683,-0.02176 -0.04031,-0.025415 -0.02996,-0.00812 0.03141,0.052509 -1.203448,0.069453 -5.0615935,0.069453 H 6.2465006 l 0.054915,-0.064861 0.054915,-0.06486 -0.06486,0.054915 c -0.035673,0.030203 -0.06486,0.065876 -0.06486,0.079274 0,0.013397 1.9717597,0.024359 4.3816884,0.024359 2.494324,0 4.381688,-0.010897 4.381688,-0.025297 z M 6.5885505,2.4867128 c 0.066645,-0.08914 0.069353,-0.098221 0.015183,-0.050908 -0.085001,0.074242 -0.1473008,0.1956222 -0.1435585,0.2796988 0.00224,0.050324 0.00829,0.04382 0.025106,-0.027002 C 6.497466,2.6371896 6.543938,2.5463849 6.5885505,2.4867128 Z M 14.759371,2.686411 c 0,-0.028679 -0.01849,-0.077325 -0.04108,-0.1081009 -0.03638,-0.049553 -0.03722,-0.043586 -0.0074,0.052144 0.03756,0.1204019 0.04844,0.1329736 0.04844,0.055957 z M 14.534368,2.3133584 c -0.135477,-0.1708651 -0.611182,-0.6197063 -0.769525,-0.726069 -0.183991,-0.123591 -0.143038,-0.081245 0.129721,0.1341304 0.118911,0.093895 0.326464,0.2893131 0.46123,0.4342631 0.134766,0.1449501 0.249362,0.2640475 0.254658,0.264661 0.0053,6.134e-4 -0.02894,-0.04753 -0.07608,-0.1069855 z M 7.415719,1.6741757 c 0.091165,-0.068448 0.1657546,-0.130966 0.1657546,-0.1389299 0,-0.017985 -0.012657,-0.00862 -0.3315093,0.2453915 -0.1426931,0.1136738 -0.2774715,0.2362581 -0.2995077,0.2724096 -0.022036,0.036151 0.036339,-0.0063 0.129721,-0.094345 0.093383,-0.088042 0.2443763,-0.2160781 0.3355414,-0.2845262 z m 0.338716,-0.251574 c 0,-0.020853 -0.111098,0.046264 -0.1316648,0.079542 -0.010763,0.017414 0.014459,0.00937 0.056048,-0.017884 0.041589,-0.02725 0.075616,-0.054996 0.075617,-0.061658 z M 8.4141123,1.0584103 C 8.5470403,0.99597496 8.7416218,0.91486593 8.8465157,0.87816803 8.9514096,0.84147009 9.020181,0.81047896 8.9993409,0.80929881 8.8575662,0.80127024 7.8648267,1.2750377 7.7984805,1.3823884 7.7890621,1.3976275 7.8693468,1.3565083 7.9768907,1.2910124 8.0844346,1.2255165 8.2811842,1.1208456 8.4141123,1.0584103 Z M 13.37568,1.3261017 c -0.216249,-0.168959 -1.180557,-0.57984059 -1.350257,-0.57533088 -0.02632,6.9934e-4 0.101331,0.0511405 0.283662,0.11209148 0.37395,0.12500749 0.682376,0.2614996 0.936874,0.4146078 0.19326,0.1162672 0.237528,0.1328629 0.129721,0.048632 z M 9.1957798,0.77832619 c 0.057934,-0.0185538 0.060761,-0.0232461 0.014413,-0.0239273 -0.03171,-4.6613e-4 -0.083598,0.0103013 -0.1153076,0.0239273 -0.073457,0.0315657 0.00233,0.0315657 0.1008946,0 z M 11.905508,0.7206724 c -0.03964,-0.012694 -0.104498,-0.0228382 -0.144134,-0.0225428 -0.06473,4.8256e-4 -0.06327,0.002777 0.01441,0.0225428 0.04756,0.0121031 0.112425,0.0222473 0.144134,0.0225428 0.04518,4.2088e-4 0.04206,-0.004457 -0.01441,-0.0225428 z M 9.5050684,0.70325614 c -0.00958,-0.009579 -0.034442,-0.0106031 -0.055252,-0.002276 -0.022996,0.009202 -0.016166,0.016033 0.017416,0.0174163 0.030388,0.001252 0.047414,-0.005562 0.037835,-0.0151405 z m 0.2017883,-0.0288269 c -0.00958,-0.009579 -0.034442,-0.010603 -0.055252,-0.002276 -0.022996,0.009202 -0.016166,0.016033 0.017416,0.0174162 0.030388,0.001252 0.047414,-0.005561 0.037835,-0.0151404 z m 1.9469643,-0.001492 c -0.01952,-0.007896 -0.05843,-0.008377 -0.08648,-0.001068 -0.02805,0.007309 -0.01208,0.0137695 0.03548,0.014357 0.04756,5.8749e-4 0.07051,-0.005393 0.051,-0.013289 z m -1.7154125,-0.029725 c -0.027561,-0.007215 -0.079449,-0.007477 -0.1153076,-5.8176e-4 -0.035858,0.006895 -0.013308,0.0127985 0.050111,0.0131185 0.063419,3.1995e-4 0.092758,-0.005322 0.065197,-0.0125367 z m 0.4176535,-0.0301277 c -0.06738,-0.006069 -0.177645,-0.006069 -0.245028,0 -0.06738,0.006069 -0.01225,0.0110347 0.122514,0.0110347 0.134766,0 0.189897,-0.004966 0.122514,-0.0110347 z m 0.634741,0.002199 c -0.01952,-0.007896 -0.05843,-0.008377 -0.08648,-0.001068 -0.02805,0.007309 -0.01208,0.0137695 0.03548,0.014357 0.04756,5.8749e-4 0.07051,-0.005393 0.051,-0.013289 z m 0.186826,-9.6249e-4 c -0.02775,-0.007251 -0.07315,-0.007251 -0.100894,0 -0.02775,0.007251 -0.005,0.0131832 0.05045,0.0131832 0.05549,0 0.07819,-0.005932 0.05045,-0.0131832 z m -0.577139,-0.026372 c -0.0096,-0.009579 -0.03444,-0.010603 -0.05525,-0.002276 -0.023,0.009202 -0.01617,0.016033 0.01742,0.0174162 0.03039,0.001252 0.04741,-0.005561 0.03784,-0.0151405 z"
       id="path6222"
       transform="translate(269.29211,191.56552)" />
    <path
       style="fill:#f5f8fd;fill-opacity:1;stroke-width:0.0288269"
       d="M 13.039605,6.1148926 C 12.946987,6.0296662 12.767432,5.8807802 12.640594,5.7840345 12.389355,5.5924025 12.202765,5.4208813 11.458936,4.6978054 11.18927,4.4356631 10.921271,4.1989222 10.863383,4.1717145 c -0.06286,-0.029544 -0.174895,-0.049468 -0.278168,-0.049468 -0.15673,0 -0.187177,0.010715 -0.32526,0.1144684 C 10.176166,4.2996722 9.9056928,4.549708 9.6589026,4.7923495 8.9738585,5.4658778 8.7337829,5.6864503 8.546102,5.8147501 8.451563,5.8793774 8.2943403,6.0049702 8.196718,6.0938452 L 8.0192224,6.2554364 H 5.3091792 c -1.4905237,0 -2.7305623,-0.00787 -2.7556412,-0.017498 -0.083475,-0.032033 -0.047214,-0.1165417 0.1129499,-0.26324 0.1090991,-0.099926 0.1585479,-0.1671326 0.1585479,-0.215484 0,-0.038646 0.029187,-0.097041 0.06486,-0.1297663 C 3.080518,5.4545817 3.7884587,5.0770116 4.3312928,4.8607001 4.5479569,4.7743624 4.7530915,4.684206 4.7871475,4.6603523 4.8993962,4.5817301 5.0646093,4.3320004 5.3190684,3.8563209 5.7629442,3.0265509 6.1193876,2.5281057 6.644302,2.0031342 7.4302019,1.2171488 8.6251459,0.57632475 9.5128756,0.46477649 c 0.2751885,-0.034579 1.9382124,-0.0356613 2.2052574,-0.001435 0.379867,0.0486861 0.923263,0.241008 1.484585,0.52543304 0.868853,0.44025237 1.603105,1.09596057 2.24175,2.00194757 0.123723,0.1755132 0.472219,0.7664884 0.589213,0.9991788 0.259015,0.5151536 0.548108,1.5662281 0.4794,1.7429802 -0.01633,0.04201 -0.02165,0.1542507 -0.01195,0.2520396 0.01427,0.1438243 0.0087,0.183651 -0.03051,0.2162017 -0.0515,0.042808 -0.198628,0.04685 -2.234699,0.061388 l -1.02792,0.00734 z M 6.4644314,3.1230401 c -0.019818,-0.008 -0.052249,-0.008 -0.072067,0 -0.019819,0.008 -0.0036,0.01454 0.036034,0.01454 0.039637,0 0.055852,-0.00654 0.036034,-0.01454 z m 8.3886266,1.3e-6 c 0.05946,-0.00941 0.108101,-0.029185 0.108101,-0.043949 0,-0.014764 -0.01622,-0.016349 -0.03603,-0.00352 -0.01982,0.012827 -1.89753,0.030426 -4.172693,0.039108 l -4.1366594,0.015787 4.0645924,0.00484 c 2.235526,0.00266 4.113238,-0.00286 4.172693,-0.012265 z M 6.5837742,2.4777003 c 0.017599,-0.024559 0.00281,-0.014107 -0.032862,0.023228 -0.035673,0.037334 -0.064466,0.083373 -0.063984,0.102307 4.814e-4,0.018934 0.01527,0.00848 0.032862,-0.023228 0.017592,-0.03171 0.046385,-0.077748 0.063984,-0.102307 z M 14.269313,2.0322962 c -0.118117,-0.118911 -0.221244,-0.2162018 -0.229172,-0.2162018 -0.0079,0 0.08223,0.097291 0.200346,0.2162018 0.118117,0.1189109 0.221244,0.2162017 0.229172,0.2162017 0.0079,0 -0.08223,-0.097291 -0.200346,-0.2162017 z m -7.1616697,-0.1081009 0.084667,-0.093687 -0.093687,0.084667 c -0.08733,0.078922 -0.1069377,0.1027076 -0.084667,0.1027076 0.00496,0 0.047121,-0.042159 0.093687,-0.093688 z M 13.981044,1.777879 c 0,-0.00516 -0.03567,-0.040837 -0.07927,-0.079274 l -0.07927,-0.069886 0.06988,0.079274 c 0.06532,0.074093 0.08866,0.092494 0.08866,0.069885 z M 7.9273964,1.3095953 c 0,-0.00793 -0.025944,-5.284e-4 -0.057654,0.016442 -0.03171,0.016971 -0.057654,0.037341 -0.057654,0.045269 0,0.00793 0.025944,5.284e-4 0.057654,-0.016442 0.03171,-0.01697 0.057654,-0.037341 0.057654,-0.045269 z m 0.1441344,-0.086481 c 0,-0.00793 -0.025944,-5.284e-4 -0.057654,0.016442 -0.03171,0.016971 -0.057654,0.037342 -0.057654,0.045269 0,0.00793 0.025944,5.284e-4 0.057654,-0.016442 0.031709,-0.01697 0.057654,-0.037341 0.057654,-0.045269 z M 8.405101,1.0446335 C 8.39215,1.0316835 8.1003577,1.1770849 8.1003577,1.1964886 c 0,0.00749 0.070984,-0.021199 0.1577423,-0.063749 0.086758,-0.04255 0.1529088,-0.082198 0.147001,-0.088106 z M 8.5191105,0.9856817 c -0.00888,-0.008875 -0.032136,-1.828e-5 -0.05169,0.0196826 -0.028258,0.02847 -0.024947,0.031781 0.016137,0.016137 0.02843,-0.010825 0.044429,-0.0269442 0.035553,-0.0358196 z m 4.2512045,0.0232597 c -0.02378,-0.0153693 -0.05621,-0.0279441 -0.07207,-0.0279441 -0.01586,0 -0.0094,0.0125748 0.01441,0.0279441 0.02378,0.015369 0.05621,0.027944 0.07207,0.027944 0.01586,0 0.0094,-0.012575 -0.01441,-0.027944 z M 12.568527,0.9224607 c -0.02378,-0.0153692 -0.05621,-0.0279441 -0.07207,-0.0279441 -0.01585,0 -0.0094,0.0125748 0.01441,0.0279441 0.02378,0.0153692 0.05621,0.027944 0.07207,0.027944 0.01586,0 0.0094,-0.0125748 -0.01441,-0.027944 z M 12.366738,0.8503935 c -0.131615,-0.0506847 -0.183398,-0.0499366 -0.07207,0.001041 0.04756,0.0217793 0.105939,0.039197 0.129721,0.038706 0.02378,-4.9122e-4 -0.0022,-0.0183773 -0.05765,-0.0397471 z"
       id="path6261"
       transform="translate(269.29211,191.56552)" />
    <path
       style="fill:#f5f8fd;fill-opacity:1;stroke-width:0.0288269"
       d="M 13.04286,6.1350337 C 12.948452,6.0486253 12.773918,5.9012882 12.655007,5.8076175 12.404795,5.6105159 12.187368,5.4122405 11.646066,4.8875466 11.432026,4.6800739 11.164181,4.4309196 11.050853,4.3338704 10.86393,4.1737967 10.829139,4.1555994 10.676038,4.1378302 10.386533,4.1042296 10.359844,4.1232493 9.4307366,5.0252639 9.1069656,5.3395935 8.7328853,5.679123 8.5994467,5.7797736 8.4660085,5.8804241 8.2853639,6.0286887 8.1980146,6.10925 L 8.0391977,6.2557255 5.2811691,6.2483741 c -2.66846,-0.00711 -2.7583657,-0.0091 -2.7684129,-0.061279 -0.00667,-0.034644 0.041493,-0.1068025 0.1346879,-0.2017883 0.07979,-0.081323 0.1537604,-0.1833936 0.1643791,-0.226823 C 2.847938,5.6107765 3.1000729,5.4388246 3.7619099,5.1105411 3.9521674,5.0161696 4.247415,4.8834376 4.4180157,4.8155811 4.5886163,4.7477246 4.7608316,4.6665368 4.8007163,4.6351634 4.9046704,4.553393 5.057196,4.3174826 5.3466725,3.7907368 5.8002909,2.9653098 6.2139822,2.3998581 6.7116808,1.9249829 7.4005093,1.2677428 8.4101339,0.7013482 9.2534336,0.49907157 9.5009549,0.43970028 11.348996,0.41070688 11.72665,0.46026997 c 0.348426,0.0457272 0.864512,0.22439358 1.375174,0.47607869 0.677462,0.33389414 1.12431,0.66242724 1.667864,1.22625514 0.637034,0.6607938 1.233916,1.610631 1.503172,2.3920457 0.178443,0.5178643 0.251078,0.8898855 0.247202,1.2661177 -0.0019,0.1810836 -0.01657,0.345121 -0.03268,0.3645273 -0.01611,0.019406 -0.07098,0.042583 -0.121944,0.051505 -0.05096,0.00892 -0.780771,0.025023 -1.621796,0.03578 l -1.529135,0.01956 z M 12.404928,3.1205221 c -0.652824,-0.00432 -1.729509,-0.00432 -2.392632,-3.7e-6 -0.6631237,0.00432 -0.1289948,0.00785 1.186953,0.00785 1.315948,2.1e-6 1.858503,-0.00353 1.205679,-0.00785 z m 1.481786,5.717e-4 c -0.05981,-0.00624 -0.150614,-0.00614 -0.201788,2.335e-4 -0.05118,0.00637 -0.0022,0.011474 0.108744,0.011346 0.110983,-1.268e-4 0.152853,-0.00534 0.09304,-0.011579 z m 0.987964,-0.018027 c 0.05549,-0.00489 -0.03856,-0.011077 -0.208995,-0.013743 -0.170439,-0.00267 -0.309918,0.00488 -0.309954,0.016774 -5.7e-5,0.019889 0.277405,0.018268 0.518949,-0.00303 z"
       id="path6300"
       transform="translate(269.29211,191.56552)" />
    <path
       style="fill:#f5f8fd;fill-opacity:1;stroke-width:0.0288269"
       d="M 13.168615,6.2628357 C 13.147735,6.237315 12.974986,6.0872286 12.784728,5.9293102 12.384659,5.5972434 12.297835,5.5187017 11.617239,4.8731971 10.893551,4.1868224 10.871299,4.1702809 10.652912,4.1563751 10.371331,4.1384454 10.377921,4.13387 9.5417025,4.9278036 8.8597957,5.5752283 8.7134012,5.7089105 8.5615881,5.8228096 8.4902415,5.8763376 8.3453359,5.9956421 8.2395755,6.0879302 L 8.047284,6.2557267 5.2852124,6.248375 C 2.1433915,6.2400123 2.3977452,6.2649066 2.6318252,5.9886775 2.7023105,5.9055004 2.7809025,5.7963205 2.8064742,5.7460554 2.9051433,5.5521063 3.3584266,5.2727973 4.1089008,4.9435126 4.3461352,4.8394215 4.6026505,4.726212 4.6789348,4.6919359 4.8404713,4.6193547 4.9256183,4.512229 5.1890246,4.0501789 5.8817064,2.8351216 6.1357097,2.4800778 6.7060328,1.9297165 7.4889854,1.174168 8.6808248,0.54896836 9.5102025,0.45874175 c 0.1639671,-0.0178377 0.6960025,-0.025982 1.2869665,-0.0197006 0.983623,0.0104549 1.01392,0.0125055 1.2813,0.0867222 0.902614,0.25053834 1.860145,0.80431905 2.536767,1.46712005 1.157217,1.1335785 1.963132,2.7922921 1.902837,3.9163732 -0.01392,0.2594787 -0.01853,0.2754375 -0.08931,0.3092397 -0.05388,0.025731 -0.414579,0.04004 -1.29721,0.051463 -0.672416,0.0087 -1.380613,0.021099 -1.573773,0.02755 -0.297393,0.00993 -0.357015,0.00462 -0.389163,-0.034673 z m 1.597962,-3.1703842 c -0.05153,-0.00639 -0.135846,-0.00639 -0.187374,0 -0.05153,0.00639 -0.0094,0.011626 0.09369,0.011626 0.103056,0 0.145215,-0.00523 0.09369,-0.011626 z"
       id="path6339"
       transform="translate(269.29211,191.56552)" />
    <path
       style="fill:#f5f8fd;fill-opacity:1;stroke-width:0.0288269"
       d="M 13.041699,6.1610989 C 12.94793,6.07768 12.756844,5.9142269 12.617064,5.7978703 12.477284,5.6815137 12.064303,5.3055429 11.699329,4.9623803 11.334354,4.6192175 10.985302,4.3043113 10.923658,4.2625887 10.797494,4.1771965 10.544248,4.1324598 10.433648,4.1760273 10.302763,4.2275856 10.185376,4.3275994 9.5849429,4.8991263 9.0179908,5.438784 8.8171048,5.6198114 8.4395632,5.9312788 L 8.046288,6.2557267 5.2847143,6.2483747 C 2.6829285,6.2414484 2.5225797,6.2381097 2.5134451,6.1906719 2.499565,6.1185899 2.8936876,5.6060936 3.0524318,5.4898021 3.2254089,5.3630843 3.7923816,5.0731754 4.3472291,4.8277365 4.8763726,4.5936679 4.8495791,4.6214703 5.3049246,3.8339772 5.6745955,3.194653 5.9232203,2.8078192 6.1386638,2.5367668 6.349208,2.2718786 6.7776953,1.8401466 7.0444626,1.6241096 7.749644,1.0530298 8.6927986,0.58367846 9.3543277,0.47462849 c 0.292034,-0.0481404 2.1712313,-0.0578367 2.4567153,-0.0126762 0.687931,0.10882349 1.851078,0.68522361 2.486319,1.23210071 1.317456,1.1341943 2.285711,2.9660058 2.228199,4.2154607 -0.0074,0.1614343 -0.02543,0.2594305 -0.05276,0.2872424 -0.0513,0.052206 -0.538398,0.074794 -2.133893,0.098953 l -1.12672,0.017061 z"
       id="path6378"
       transform="translate(269.29211,191.56552)" />
    <path
       style="fill:#f5f8fd;fill-opacity:1;stroke-width:0.0288269"
       d="M 13.072293,6.2070614 C 13.008486,6.1464664 12.800932,5.9623554 12.611062,5.7979262 12.421192,5.6334967 12.110179,5.3534858 11.919921,5.1756792 11.401302,4.6910002 11.018917,4.3481048 10.913,4.2727433 10.81396,4.202275 10.555424,4.157709 10.430693,4.1896039 10.351485,4.209858 10.159402,4.3644459 9.8587984,4.6498633 8.9949486,5.4700718 8.8619436,5.5912915 8.4606939,5.9240825 8.2704364,6.0818795 8.1104472,6.2209874 8.1051623,6.2332112 c -0.00529,0.012224 -1.2607431,0.022225 -2.789907,0.022225 -3.0451364,0 -2.8688694,0.01033 -2.7762633,-0.1627056 C 2.6283583,5.9257484 2.9662716,5.5449344 3.1133048,5.4455047 3.2955241,5.322281 3.7962926,5.0687228 4.3384478,4.8251683 4.8186819,4.609431 4.8842015,4.5427688 5.2728103,3.8745115 5.5868352,3.3345097 5.9804333,2.7187982 6.1371876,2.5223534 6.3077598,2.3085915 6.931283,1.6969337 7.1346567,1.5438655 7.9135185,0.9576592 8.7864073,0.54568636 9.4293682,0.46084254 9.592036,0.4393772 10.058225,0.4320286 10.784232,0.43948565 c 1.246094,0.012799 1.190661,0.004808 1.837429,0.26488401 0.840339,0.33791414 1.438691,0.72779594 2.036835,1.32718624 0.5787,0.5799064 0.972793,1.1308257 1.340889,1.8744885 0.38071,0.7691448 0.571031,1.4871501 0.531765,2.0061386 -0.01031,0.1362339 -0.02911,0.2644718 -0.04178,0.2849729 -0.03322,0.053759 -0.569996,0.080507 -2.044255,0.1018682 l -1.256812,0.01821 z"
       id="path6417"
       transform="translate(269.29211,191.56552)" />
    <path
       style="fill:#f5f8fd;fill-opacity:1;stroke-width:0.0288269"
       d="M 13.020825,6.1746314 C 12.938536,6.0984789 12.75446,5.9342022 12.611767,5.8095717 12.469074,5.6849415 12.216118,5.4576858 12.049642,5.304559 11.883167,5.1514326 11.643183,4.9306927 11.516345,4.8140259 10.915683,4.2615328 10.788407,4.1796644 10.530672,4.1800077 10.385946,4.1802095 10.253345,4.2862769 9.4523092,5.0426655 9.1764522,5.3031471 8.8354107,5.6144776 8.6944391,5.734511 8.5534672,5.8545448 8.3589814,6.0208575 8.2622479,6.1040952 L 8.0863686,6.2554364 H 5.3150973 c -2.3087828,0 -2.7767307,-0.00658 -2.8039859,-0.039419 C 2.4706223,6.167231 2.6245274,5.9264685 2.867935,5.6578177 3.0365597,5.4717052 3.3187482,5.2940401 3.8195637,5.0586751 4.7354493,4.628242 4.7444809,4.6230932 4.8839577,4.4518707 4.9571106,4.362068 5.1581891,4.0520696 5.3307987,3.7629857 5.9396597,2.7432753 6.1477498,2.4631215 6.6878398,1.9359879 6.9882389,1.6427953 7.1480676,1.5135288 7.4977243,1.2809677 7.8407274,1.0528321 8.50929,0.70984917 8.8066167,0.60948576 9.2998382,0.44299747 9.2571969,0.44681689 10.622711,0.44681689 c 1.41738,0 1.357005,-0.006895 1.926567,0.22001761 0.45718,0.18213992 0.896282,0.4123013 1.302045,0.6824851 0.615869,0.4100853 1.275579,1.1027299 1.75506,1.8426753 0.632238,0.9756844 1.012707,2.1362959 0.923287,2.816461 -0.02483,0.1889021 -0.031,0.2011365 -0.112753,0.2235993 -0.117309,0.032234 -1.588489,0.079458 -2.502459,0.080327 l -0.744018,7.077e-4 z"
       id="path6456"
       transform="translate(269.29211,191.56552)" />
    <path
       style="fill:#f5f8fd;fill-opacity:1;stroke-width:0.0288269"
       d="M 13.056235,6.2210217 C 12.999452,6.1686032 12.727037,5.9224108 12.45087,5.6739276 12.174703,5.4254443 11.754167,5.04417 11.516345,4.8266515 10.847824,4.2152039 10.652015,4.1117292 10.397042,4.2351593 10.276632,4.293449 10.141972,4.410697 9.3687412,5.1305025 8.9168323,5.5511873 8.7948888,5.6608477 8.4125772,5.9903564 l -0.307559,0.26508 h -2.780596 c -2.2492856,0 -2.786551,-0.00718 -2.8117616,-0.037552 C 2.4602439,6.1547259 2.587773,5.9518232 2.8672233,5.653764 3.0664097,5.4413136 3.2258608,5.3446809 3.9929791,4.9715173 4.3578891,4.7940073 4.6988259,4.6131165 4.7506164,4.5695378 4.8776474,4.4626482 5.0392866,4.2299737 5.3917803,3.6466023 5.9002461,2.8051001 6.0877616,2.5430211 6.4714499,2.1376146 6.6923965,1.9041616 7.1380889,1.5178689 7.3796853,1.3504241 7.7992095,1.0596618 8.5102217,0.69621517 8.9219243,0.56208098 9.2891789,0.44242809 9.5341951,0.42636907 10.790973,0.43957852 c 1.299451,0.013658 1.258974,0.008215 1.820115,0.24475095 0.94645,0.39895353 1.560727,0.81611143 2.212314,1.50238993 0.765567,0.8063277 1.35284,1.8444138 1.627963,2.8776511 0.06337,0.2379934 0.0758,0.3481384 0.07811,0.6923448 0.0019,0.2819575 -0.008,0.4200352 -0.03165,0.4437419 -0.06051,0.060535 -0.480071,0.082148 -1.925829,0.099205 l -1.412518,0.016665 z"
       id="path6495"
       transform="translate(269.29211,191.56552)" />
  </g>
</svg>
assets/images/bar.gif000064400000572165151526424650010600 0ustar00GIF89a�$��u��#F�7W�h���銛� e�f��j�(D��%P�U��&N���w����d��!_�������#;�6k����H��Ls�s�����c�c�f|�������'H�(B����(G�Q��W|�a�*>�_�W�ɶ��Im���ٙ�� f�*<�o����7�p����Dc����I������h�4H�:_���₪�$V����`�l�"B����&I������.T� m��������<z������n����DY�������&a�-{�Ug�%[� `�):����.J��������$]�!j�~�� 4�/i�������ޕ�ڑ��}��%O���ݪ��"d�r����勮���#b�m���'T� t�<p�0[�)@������ً��?�!i����&N�/O�%Y�'R����$h�r�)A�g�!H�%L�&W�$^�"^�&n�����2o����"g�i�$J� p�@S�$`�$d�)e�t�i�'O�&J�+G�)h�*H�&L�#Z�"]�#Y�$V�%R�$T�$U�#X�%Q�"\�$U�!b�&M�%S�#[�!a�!c�"]�#Z�$S�#X�'J�%R�!`�'K�!`�&M� d� g�'I�&K�#Y�"\�$W�(E�k� c�"[�)C�i�$T���� o�"f�&U����l�#a�a�(S�#w����q����3��m�p�k����3s�0}�b�����������)O�Vp�$K�)B�&Q�g�1@�_����/~�&q�(r�)t�@P�%M����#I��&J�%N����!�NETSCAPE2.0!�XMP DataXMP<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c061 64.140949, 2010/12/07-10:57:01        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:02D809591D7CE311B39982F74D5A7523" xmpMM:DocumentID="xmp.did:E71737A47C3B11E3932CE13243210110" xmpMM:InstanceID="xmp.iid:E71737A37C3B11E3932CE13243210110" xmp:CreatorTool="Adobe Photoshop CS5.1 Windows"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:02D809591D7CE311B39982F74D5A7523" stRef:documentID="xmp.did:02D809591D7CE311B39982F74D5A7523"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>�������������������������������������������������������������������������������������������������������������������������������~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"! 

	!��,�$���H����*4���!l��L����!CZ2j#�GN�숄G��K�	�R�K%�4i����O�����`�C�H�hcF�!�9��4�*Y�y	3&M��08�ɵ��#���ƍI9�i��I�R�œy5�',���J'lĉd�j�qmӷ)�R�Z�n���u����/ѲF�Vʴ��Ƞ6��ժ^�X�j�
2W����u�H�$�eK֭e�x1l�g(��[�1hHW�mC���	>h��4-]�Y#���T.f�q�櫷��Çw�|9�(ϥ�P�Hk��x���*߅�y��WKz�I�^o���W�r��7�"�4!���U�i�v`y�,��z8��{VH�r:݆~"d��0"j��l�ن�n/�܎���㏩�(dl��v�zI'\��%W�s7���#0Yؔ�]��!hz+�מ,�m)���
q����c���1�Awk�f��� ���x!s6���:��
O���'&�h��&)a��=�a���A��^�c�P���E^�$�Z��6���Q�7+�V���q�\���x����UI�:`�R
'������g�z�!-W���&������,����̗a�A@��*�������6�h�1ڋ�~���/B]��i��6l�Fb��+�	
����jl���%�6F7��H�X[h�(n+��)۫�s|�p]�	�k3�������֋罐j��`���!��+
*�����4����V�A�I��z�o��=�&�����m��t�lܲ��pG7[�m����]{��ns����JGڊ�qAz�m�^�{0���ut�A�}�G?{s����:o�c�NC�e�>���N��~��+�A(��vߴ*k�v���w����~<��:�<~3�'�-��^�����N8�+��8.z�
.}:�3�کv��h	O8��,�ǿO�NT4���Q@�A��֎���e�z�S2��
N�b��ܘ�,
��ŧ�Y�o�{��*�>�`h��ؐG�p]��T���?��K����6��mk`�:�E
_H(��M�X*DY��$�eD�����F�B,8	4�64�p�>P��r>|�}�1�	UHB&�CB.�s�wP�?	/�{#�C��T]s8�H��p4�Kf�֍h5H�>L˶�2�tܘ	ǜj�T�:`
@r���!{x��l?h%��!Ig
2���P�'2��r��B�^��v�4�:�ӂg�.{�7��d���PwƱ�h&���=c�S�@~�LJ"����a��$NxH�*���)Q�\���0��X��0BA�	O�]�,�v�R"B5�,�P�b�hs*/f�NR����C��p�~vS�D�@QoVҦ��!��>��|��(I���q洞��=d`Ay�Le`)��D�҈�t���ס"4nF
a��`��b�B�%QU��.���4���f<3:V�����
l@�Ϯ��'�+9뉉z� |j�cQ�,�խ�Wm?`�	4�����)�[��, 1�Y��2��TVr����1!�.hK:H���}�#0�Z�-!��}�E��ن��X�]�[�&���n��_����t!KS����]R�@��@���
>�r���uI���#�^��hŊ^���{�L`b�֤��<�(P�	$@j��������@!	 8�fpS5|]�*VZZ�p��Le`&V����aG�Ξص)�yY��j2B�_��<@��ژ��$���x�t�DC����8�(���8�o���Vv��R��@�N���p-�ȥ�؂�B:}��5�l�fq��2!�H���|����oUY!��	��n5��
l%�Y8�iO�����Y2��[u�-��v�	��8��;�zņ�(Y%�
^��޵�a�h���?�.�(�d����fv�y\���؊����Og���6��D
o����>�S3N�a�[�<��}�}�x��.-q^�h���(�[._5�z�]B n7+0��-_6�q����ǫ-e�?��eU
��s�Sz��p8��
�	6�u�[�sk+�ɢ9^'�Ԁ"X�����f�8 z��$@�ϰ™�w>mA���I�v�aW#�Q��w=�����qXx�H{2VOy}��׈>���ǃw�;�]��~�yB�w��Oݷ^�	_�����[��f}�~��g�L� A<�z�_[�����RA�_��_��]8 ���p��iv{�?*�v��w��t��o��T^@�}V'j�we;R�����}�7z�3~t`~0�~Ƿw/wR��-�Gw�c=�}�v�{}t�p8��C
j���3Xh��|)�;��<��r�wu��f�K�%�y�U�eː? �3�W�~5�~��-����9:���C�kx�x�w�@\�C
i�
L���|�g'�k�8P�W�}Y��he�@��$` ��8}�qQx�pU`A�b�yd�kf�C1�>jhA7���G�`s� ��R�
���W��Vx�hY����u�~VF�� ���؄�'Y~�p�oP�8�&���Ql6�1&<9���H��h��r
�P~���H���{��E��(<�3�����������#�p��`��H}����q���8�'(��sh��P	(>u��B��(�{7�S�@
	;��,���s2Y�|D�Y�����X��w�	�3��9��X�P8zH	>������ �w�s�`�>Pe��X�s(������C,�j����E���ey@Ly����eS���dPv�V8�˘�t8�Q�s`�[ٕl�*�C[`j`A��Z�-ٙ`)NL�
	>2�����^��S&����Ti)��z�y2�i�������X�Rو�R��P\����ɕI�m	o�"�`s�U������y���	�)<r��9�x�t�ȓ-"�iA�阃ɜ�In�� 2A��ԩ��ɁFi+%y����Թ���zeh���v ��3n���X�F��L�J�����5vP����B���؟�� @����ȟ�Œ�	f@����j��X�"����e5#(���P�|/NQ��"��y��-/ ���E�7:���G��H����5�uj
�	s`�Kڧ���H�^�*��`
P�DC
���4������*{pVH�Z���	�{��,��i7]p��sz�Zh��
"]0Y�����		W����Z��٥���qxVi	<P�w����k	{��l��
����1y����@�}��P)���eW� B
�
򊨾���:n	�	l�@�ݪ��i��i.؃���ʥӺ��d<�8]��0���:ɢ7�3Ԫ+��i�9����;b*��j� �	�tA���Ǻ�){�2a `A�0�J��Qj���VIг�+Z������1{�@��*���
!��,�$��H�������6ly�M{Dѐ!-���#'kvB#��K��Y����h�4m�CSϧp
s��Y0�!�y"N�x�Ǝ�>�IR�ɔ+Ǹ|	sf�O��ʵ��R|d1�F��>��3��ӨS_ʴ�
]�n��ıe3r�[�p�V�k����9A�p�w(٢F']ʶ�SȠ6��ժ^�X�j�
2W����u�H�$�eK֭e�x1l�g(��[�1hHW�mC���>h��4-]�Y#���T.f�q�櫷��Çw�|9�(ϥ�P�(k��x���*߅�y��WKz�I�^o���W�r��7�"�4A���U�i�v`y�,��z8��{VH�r:݆~"d��0"j��l�ن�n/��;�U��?�f����V�m�%	�p�\���H�7��$d`S�w%���y譸^{��ǥ|*7�}�7�g>�Dݱ�)2��0'��٨��(W+@iZ/m��`�r.�����i�b*�G��vU�
D��kU�%�n9\�;A`C�n*�x�y呻�dq^��w�\��8%�q�Ȟ{�i��|���n5h(k��x(�Ȣ��J�ʀ)�X��BhX��"*o��F#���w���"�ů��6lk�Zid��r�A����N����j��q�9kctd*�qN�$���n�b�s��,�{:ק�͌к8�{h�����y���;���}`A$oZ0ӡ:�p�Q7L�>��A�\1�&����+�k�`B(n��L��(sl������h��AG����~�)Ϻ�ig|@�+j/.�𝴶n�=o�>J��ѹ��/�G?}{���Z��e�N��f�>���n�+����A(��ߵ*���w��%�w����=��:�@�s�+�m��bu���N8�{��<>��
6�:�3��v��i�O8��,��?P�nT<���Q@�	D�^׎��m�z���ؐ�npzK���.�Lո�� >}̢|����g��'sB�`�dž$8��"������-�`„�,���!&|[s'��1lj���PB�]�J�Z�ʚ73@$�X4#�<H�5�G{.��0�Iؠ��������j}�����A�|ШB2!�����%��
|��H0:a�����G��o��	�x2��nF�A�a
Y���*�c��X8�Tc���S��3%��C<0h;��+���I>s�J��J�A�9��
~���)u�4�	0�3<�x�K����)&�"V��r�`��=b�p��4���™�Lb��ß-r*P���#`��[�<���a9��a���3���$*5iNH��3D���Y�q�m�@�5���¦�� �����1���7�8T���%sz�L\�:-�)���[$'O�L�C3��
U���N�)�^�W>��}5�B��F
6/�Z�_��U%�1��.N/š�hʓ�gu_�=�D�[ǪR���Ӟ��G2-�>H����_�ZO|�3�@d'\�� �e�>�"���un-�(Ы&G��C����$+j���1���k��jt�M��A����5osqZ[�M����A��@\��7��?��%�,Dy�a>7pΞ��p�O�/^1�+��֬�E+}��G.�*fqiS*N���E=�0C� ǣ0����Z� ��aG���e�cy�U
WY�Xfc��2�Xx(�e�bӪ�Ɖ�&#$�.�D(���N�؋�@\0C4d@��.�{���h��G�/?�hf�(h�$ �-��Ҏ]�@�g�/$ �k>/\�	�jg�>�!"�d��;No��;Wfu`C������X�9��v���1��Ԣ��3M�[Z�R C�C�eR�Y�!�c��6԰��_|Ȏ�Uܘ�0�_˚���m���
�`v��lnh7�����90�;�u��
]oszG���3��N��ƺu0�#La�����\�����/�R`<�u��E!T�⋳�g3y����']�@�<�V6��Q.�K��?�:�/b��N�-��`�^�=�A�1�j�$�v�@
H ����~�6�S����@���;�����
,�$ϺbO^vT
�X|�˽q��z����珶'��w܅��^�������3^�B��'D����D�}����^��<�Z�j�g~��<�τ�A�'���M�]�q i�!4`��~�}�݅Á2�	����f���Bx�%<�ɷ��t�$p�"�3T^@(~Zgj��<��$E0
}��q�}�78�G�3��|7s*e{�Bxx>��߇�p��xD''�;Ԡ��	����x��R)����%�y[�}$�&"�͠����ec���'8��遼�gH��QM_��=P����g��|' �>Ԑ��x\ͷ�vN ��3\����Th�Z��P�;�6Pi��gng��@'P3dqh������ֆ;Ts��3tu���{(6'P	R`A] ��wh}	x�dŀ����0C ���b��e� �" ���ЉR�y�%��'���������׊g�Xc�,p��H�9ȎK�(�P	�gA_��8�����H\�؏�Y0	�8�b(8�x;2	θ
ٍ��y#x
�Mg�}��jȂy8o4�����rT��y��؂�ǃ;�u
����3�8��H�C����G���H���Y~	���0#��J)�LY����D
-P}0�쐎5y��'5f@hPUY�����h[�	�>�(�i������_wɖ4�~�X�]b�1\�@eЗHم)��XG�"%<GP})�d9�(��<�f�3�o��I��y���DwI�$��@Y��ye����L��y����)���� �(@�V��S����,,�
�u��cY��H���-�@
:>P���r	�����`��#��Mg�C�"�3������ɘ��	"#���j�!ؔ�’.	> p\���靲dž�*[`y)<#�0���y���[�}`��9��)|ac,jA`��0����Ja
"`�ʠ��*,ӈ�`�hA�	j�ݹ�왢�6�YX3a�%
�1z��8���J aZ��	�BI��i*<]PEZ��J����B�`��FʣHʧ���0��)��
�U��Z�)	�\j4�@	����9��Y���kE�k�b���)���"{����G�������� �s��
�����	��pYh���ʝ�I��j�rRx]i	<��~���Y�r	{���l��z���8٭���j�W���*fW� B
�
������zn�	lp������ٞ�i3(� ��:��*��dA�9]�����z�A9�<H�3t����ɯ����;b���ڠ&���3�=���V�.X{�a 0C�0����=˃��VIP�{�p�`���[��ڣ'K�4�!��,�$��H����?�9�
[�i�I4dH�E-b�@��ɚ��p�Hy� AcR*Y�$�&M�����)›8s����<#N�h1�FH=�)��ɔcX�ts�'vj݊p�B�A%>�x�QN?�	I�)T�-aV��	�x����X�5rL���ɷR�έ['�� z0�+t,Ѣ��*]˴���9��Y�jU/Z�b�R���T�N�:U�H�ٲ%��2a�6`�3�
��-J�4�+������{U���ԫ��z}*�ڸp�Ż7p�È;;�|y��i(R����x��*ށ��x��Wz�I�o���G�r��'�"�4A���E�iߩv y�,�Jz8��{V8_r6݆~�u��0�i��Zl��v[n/��^�;T��?�f����F�m�%�[p�\���H�7���u`CZw%��`y筨{���e|&7�}�7�g��Dܱ�)2��0
'��٘��(^+@YZ/m��`�r.�����i�b*�G���U�
D��kU�%�n	�gB`C�n*ex�y呺�$q^��wO�y��8%�q��^{�i��|����5h(kةx(�Ȣ��J�ʀ)�X��NhX��"*o��F#���w�����ů��6,k�Zid���������N����j�lq�9k#td*�V�$���n�b�s��,�{6ק�͜Ӻ8�{h�����y���;���9}`A$oZ0ӡ:�p�Q7L�>��M�\1�&����+� �`B(n��L��(sl������d��MG����~�)Ϲ�i'|@�j/^�𝴶n�=o�>J��й������ҟ,j���:
���A�c�ų~��Jz���8r<�׺<��{\8�w�s��=��:�@�s�+�m��bu���N8����<>��
6�z�3��v��i�o 
�>f1=���t��l�� H���Yoc�kޮ@�
2���Ø�@X7v�e`��].8��c����>˵o8�Z��GC6$�9l�<տ���l&�EC?( m�	��@݉-u�&,X��pz���X�2�I(�ј�ҭ���s���&T���A#L�C�)Mg��.�����
�Q�$d��:Dd!�;(Np%
�:9n�`;| �"���1�����8G��d�k�݈�$A����n��;v,�0\N5v@�?*@0!��TRn�?�S������4
�Dx����Z�J9TQ?�y��iR��{����?�A���Thǔo��Y�AO:zp���2�4�e���@~!ML*с�����(��H�:J��1�_���0�����0CjO�mr��T'�vP�?"Bm�-�Q�J���Ry��zv�zMe�.Y�%p���4j��3�>5O}&��՝U��FYJ�.�3��T&�!�?ʃe�jS��'
�F4�k�0U�.��ss�y�4� ���R����j�p0Ą�:<
 �0�G�yϐ��}$�h��!�tE�K��}b�ͬ����_8�����>���q���q�Fφp����@�n���d�A��2!�jeA��ږ2��e�Hg���K�.{s���:���b=V�G�����n�;��
��U�:�]�����uW�� ��SX�mX{��DI� x!���Y��ڵʷ������Xƫu�9��?
�@�	Ѓ�6�$�/'�k!PHB��p�-lU�7���W�
�-C��Ŕ�V��b_�ŧ�1ng�Z�ژ��d�$���%x���{�i0��8�������U�ajX
|��<P�
�������
��t�1\�\�KX����Z��5�M���dB��@�9��]��ʬ��l4���3�u�TN�<�82�:�"�2�5�Kod 6�ͼj4��Ļ�S�Ɲ�ւ�u�)ҶJ����m�\�vҼev���R ����}�)�8����t'cݪ�[�Q��5���P����Ð��x�)�[�������ἠۮ�Q��㜿uV��(�*l|xV`@�qnm)u�p������-����ہ�Ԡ�F���;k��N.
�`b��H2�x���v4�@
H ����ƶ�S�����@?�W����c�
L�+�c]�WÝf��|��-r�����i菺'�/xޓ=�^��|�1��S>�IG��'�x���D0~�Mq��^�߼�ZPk܇~�-=��e�D����=���z�f��H�������'����H�"�~GGgzg:�G*��Xl}XpUwO	�(�GE�D��v��~��E0
}�r�~�78�G�3���7}��s/�{��x�GC����xg���xK''�x@Ԡ��	 ��fy�S)���'��,7zb'~.�0����@�����ej���18쀆�G���H�"RWx_�=P((��6h�w}' �ECԐذ���h\�G��vN���3f��꧆^��`���;�6Ps����n#��@'P�qr8��W��v�<�s쳇tH����(6'P	RPE] �`���}�iU��P���G �̈�j���f� �� P��p�\(z�ł�'���P��X�x� ug��c4�,���Ch�U�(�P	#HC_���،�7�Ѩ\�x��Y0��؉l(8�x;1	ظy��Gz-x
�M�} �th���o;����0sU�T`��y��g�@u
� �$�ؓ��J7��G ɓ����&�~(���0-9�TɉV�����UD
-P}В�0�?���<f�hUP_���H�i[�	�HC�(��	��H���_�i�44V^)�S��]8��hPf�@ep��y�$ɍ�xG�'uAGP�ɖnٗ2��=�f��y���铰���D��U$���J����e����L�����b	^i�%������	�����n��`���\����ٖ/Y�~�o�"�t4U��ɗ�)��	�ICr��y��Iu�ؔ-"��G����y��In�#���:��W�Gb�8IC p\������g��*[`�yA#�0@���(Z�[�} ��ِ�|ac8ZE``�<Z����ҍz�:p��I
�Kʡ�a�XE�	#*��Y��Y��BJZ�3a�1ڠ=:�٘��5J m*����L	��uzA]PR*�j�������O��lʝS�����W�%�0
ꥐڠaJ�'�3	�h�8�@	�z������pՀwڦn��ʘ��"{����G��j����z��]0lJ��)��H�di$W0���\���pڪ�)'�w���؊�{ʞ�駑��IC`��0�3��}*�ꊌO��
���J��ivnpr�
���9�kXL�����
������ЃLH^
�oj���I����iP��五?j��G[��*�����Q�VO ����%������[�bʱ8�{�a �G�0[��ڛIk��WI�&;�|��`ô���˳�Y�@�!��,
�$��H����?�9�
[�i�I4dH�E-b�@��ɚ��p�Hy� AcR*Y�$�&M�����)›8s����<#N�h1�FH=�)��ɔcX�ts�'vj݊p�B�A%>�x�QN?�	I�)T�-aV��	�x����X�5rL���ɷR�έ['�� z0�+t,Ѣ��*]˴�I��s6��ժ^�X�j�
2W����u�H�$�eK֭e�x1l�g(��[�1hHW�mC���>h��4-]�Y#���T.f�q�櫷��Çw�|9�(ϥ�P�k����Cw�|^k�b^-��&A{��"Lp/w\}�5��t�d�5��Wi������� *�I� o�Qh!}�e�\tzb�ء����l��fn���|��@�dj'�l�ݶ���	�$r�1w#�4|s�ObW6�yg�x	����'�{^�wa��m��<V�t禐q�ؠ��8܌��g��((^+HiZ/o����t2�䄏���d*�G���U�
L�)�kW�e�v�qΤ	�
mĺ)���Zd�H�+�������x��WIK��U&:g��'a���霟z�a-^���f�����-�!����d�A���ꄆ�o��:ب�2�˯~�0N]+�iĶf,�Gn�l��>	�	
+k�ۚ,���Еy�k�H�h{h�)~[����;D�d�p]�9��3��λ�����0K��` ���a�;*��:��4����Z��A��2�ߪ�o�~��&�����ҭ��x��l���pG7Y�}����a�nv���DKGێtA~/�-�b׻0���X�;k@�A����`7�i¢���ٯ����y���*8��/	��!j�#��x���Z��`�{�8w_�=�C��;�n����9��S}n����<���W��ӫ�����l�Z��p��YT��Rݨx���	$��A��%on����+�
t������n$���4T
�dp ���,��?�ɉ}�{q�8w��lH�#x���y�c��-LP�~P@��
��#�&)L`�Ha�2f�c��e� �P�.�Qy!�K�=1yM��&a�F�b��c����in��;A�B�
I�"{�H(J�wS��J�ƃtu�|A�M0��k�(+y�3�ю+dcʲü5�W٩A�a
\�M�.���8�j��T�:`�C2�r���#����o?�e�Ik&҉��_)5*2g�r��
~S���d+{�����<��iL��0�+[�ްs��w���=f�ə>��<=�_Ts�M��6��H�@��!z`��^3}Oܧ)�:L` ���!��Ђ�S}�t%(���T���C!�K<N4�]�c�T^����S��K�);���������$P�D��+~F�'3�Q�����?��	{�@����Y��@V�Q�D��M���'T��M�hݠ�_�
6/���c:u�\5\�0ႱO/�
Rl�s�n�������DX�]��òӟ��4��>h����a��O}���@f7�\���#�	�����uw�F��29B@������/U�Za뾒҈�m����6�ˍ�o��z�@�.0�{����2�l�-�u���iV����1 `A �^
���0� ���A�B��ߴ��m��[�S�@bq	&�q�[�t���(�A�B^-�K�O6�B��D�)lag�'&/E+2��u�^�r��IY�:���/�`�SKc��ص���#��I|A�K��;�a�q�
����`#��3���x�V32�8rE 	�jJoż�c�:�bA��	Xu��{�lꙛ��Ʉ"��3���`�Y�i" {�jƫ���hyrdP5�K�Qw����W @�c�:ͮ^3�U��8�1X���u]�^㸑$}�$�!�<����5o-��g3��� 2`m~K9�ڶr��ӁL[|`hw2��j������B�v��䎨VQ.�a�[�<��mq��8��-q^�oc��(��{�_<7[�cB>N<+0��=�v����L�����e�s���Vj ���]ԟMqʇ�'��O���ݾ��[�f� �^�$��pDo;�)`�g� ����3�u�`�B0O��=�3����~w� ��w;�M�X/���
���d���	�;�-M_����"4�����O4�"��V��>�1�u$�+�]�p�{��]���}�!���}�k_��q i$40z�;_���3�'p&��� ��tw�w��y�y��A�ط�	�u��p�"��T^@(fk��<��ZQ���0�%7�g{�st�0/���x?S�7.�Wx7d=�~�w
8|�u�p80�	D
j���I8i��}3�Q��<�0s�wv�W��p�Z�a�;({1X�b�fː?��3�o�K��.$��@:��Y�l��y�w�]7D
i�
b����}�h'��(>ІoqX�&8f�@v�`���h~�vrgx�pU H!��z{|�l~�CA�>�(H7`��h�Ȉds� X�R�
���嗁��Vx�h�Y0���v�HcF�p�Z���8���Y3X�p��oP츋<Ȁ�(Rz��>vC9��x�ը��ȅ�r
���7��Ȏ��|���Ō�A�3 ��H��8��3������x~�G���r�����=����t���P	8�Eu)�Xx�>}M(T�@
�@���Di��tJِ�t�Cَ���ؒ���1y�3@�*���ؕfh{`�E���4��h�8�xt�`��EPe`�ً��������7D,��9�7y�[����}yCeU�)��pH�jY�	Ֆ;�dP���n����z8�Rt�sY����@D[`j H�r��Ey�x�NQ��%�E2@���v)�`������T�������f[⚰��P�(�p�gٙ︝�=�
�u��ti��X��.@
FwCP�ٜ��ɨ����7$0��	�Yw�T�"0���I�������綞Z1A`��Y��I{��$=��7���Y��|}菡�v��4n+*���\�M�9�ɠ�76v�X:��)�:,�H�>�`����	��)�#�f��X����9���<Z�����:#(��J�j���Y/N�Q��"@�	:��9�GZ/���E��	�j�]�j"	aj�H0�㩥O
�"�Z�	s�ez�����x���`
�C
�`�N���J�*{ W�tZ�����Y�-��I<]pﰫ��2ȩ��Z�s0��J��*����Grj����
��y����t"yni	<�)�󉛅	{��7l�ꪣ�I�I���ୗ��h���fW�ZA
�
+�ة�r�L�����z����Z�@�SHez�vڮ��I ���iP
��*�Fڄ'+H۲�[�����6Q�V���� ��,�������ˢiJ�?H|�a  H�0۴�J�Qۄ�:WI��.����bC�����K��ɩH�!��,�$��H����?�9�
[�i�I4dH�E-b�@��ɚ��p�Hy� AcR*Y�$�&M�����)›8s����<#N�h1�FH=�)��ɔcX�ts�'vj݊p�B�A%>�x�QN?�	I�)T�-aV��	�x����X�5rL���ɷR�έ['�� z0�+t,Ѣ��*]˴�I�)�l�g��U�h���J2d�R;U�,T�"If˖�[˄0�b؀� P6ě�(1bИ��ۆ.��|���iZ�V��F�+��\�n��
̗��‰3�,9��Q�O��HV��Gޭ�x����y�����v�0½Pr�1�~�)�M��^��k	��K���'���W�-��s�u�a�"f�N%���k��V�m��#p�]��r=T�A��"���fn�-�pN&�\s8�H�7�ev`c�w'���y�Ȟ{���|�����cŚ�1��wp9�����ј!��z�������g�2j��KR)}�nh�"z\�i^���@�C–�\*)��'���Ƭ�Z9��Fn�$o�6iܓc�����j^$1l�^�h�.��ބ{���s��Ƶxʛ~J��,����Zh�27z���������θo�f���8u!,����Z"�e�{�
e�����^�1��z��іy�
P�"I�m�ު��:����v6�����*Jo��B�o��R��k��tNX�ʝ"��Q7|*�O��Ho}�'c,��Ev�+�������`B(q�|l�,����B��d�MG�O�܊�ϻᩧ|C=m?^��t�r�m/�Jj��4������ӡ*L*��
��j�n���q��+k8�!Cۣ�8��܃�꼮�G/&�w�s��=��:�P�s�7*n��rN5����N8����L~����W���j����c���VW*�
G�H�	��tXlˣ��<�=�Jzb�!B�m�y$ě	��(T�.���1��wtr���W�Ρ+���!���u�
 �x���ʡ�6��r����ֺ�Q
�bVx=�a)Y1t����@$�_l#�Fx79��{d���E?L��0E�״��oT��\�w�f9�F���E�БR� �x��`P9�G��ƃq�� )_�Sb2�g�c[�ƕmO�z{֯�S�$����[/a�G��Q9��PH�#�P�+�J�E��|* �v�[n0��&#�8��	P�S�bsL)-*���2[��;P��wRs��Y�3�����2g�P;8@1��G±��{昤�h���E6=�D	zs�B��T�"�F�6���т��rP��Mh?��X�2���N�H�����E�ч�fN�EP���M�y���2��n��x
�D��O=BZ���zjqS!��:�Σ
T���
)>�u�|���T�t�Z|BVU�ڍ�3&��Z��2�zY�"�{�p�Y�����l%)7�yR��ʯ�J_W`"�V�n��b�)PLԃ�ZT>�ʆQ�}
辌��BN���u�B�X���y��@��v����C5�!@kjA�ۙ6򭵅_Jk��v�K/}�[R�N���b=VPH,����p�k��*��Z�:Q��
����wO�Y������y?�B�n�s�P�� x!�p[L۸�w��Q0!���XDz�i;�
�
K
�@B!	Ѓ#�6�&2�(��!PHB�ް�=�����������ff&f���x�6vm������ǒ'#$�B.�D�/���΄Q���@\PH4d@�>���lS��h(�G�7w��d�i�'c�(@D �|O�i���~tRf\�?x!��s}��M@��8��A!��@$C�|N�}'|`�>��H�-M�g�|�6�%-�B������˜jq���N @g�͵���aܫ8�1Z�\���hb��(��$�Q�<���vp9=\kK��� 2�m�_9��޲��Ӂh�|`��w2�Mk�������j��,_wE�
�\��:(��`o�K��F�m���[�D)Vnt���"/��pr�Y�7:��lT�v��.@ p�n2�<�=_/��R��S��&�cN8�9|�
�}wa[]��2v�����5 �
_�;Z�NN�^;< 	���Y�g��]*z�����s�w�߬��;�]�w\;��p�1�d�?��9������"4"?y���t�4��z��G���AN�&�K�]~}���ݲ��}���!���=�{���q iPHT��g|֧|��3�7�&��� �Wu}�x�cz��y��A��7�7v�Tq����T^@ �owk�=��\Q��Ͱ�-���{��t �07h��WyHWS�G.��x9d=p hx�|��u�p8��D
j���Q�i�W~7�Yx�<`�8�s�w�׃��\�i�C�{9؂g6gː?�3�wx�S���.(e���@:��p�am�Vz�w�P]9D
i�
j��E~#�h'��H>P�w�y؆.�f�@~�` ���~��rox�pUPH)���{�(m�DJ?�XH7���H�es� Z�R�
������V$x�h�Y����w��hF��\������7Z;��p�oP�8�DH��hR�6�C�C9����(�I��r
� �9��H��h}"��E��A�3���Ȃ��������p��`���~�ǃ��r��9�E(��t���P	A�Eu%��`��F�}UhT�@
!�@��L��uRY���KY�݈��X��w�9��3��29��X�n�{h�E���<��@iy
�t�`��EPe�Y��(�����9D,����?��c����CiՖ1)�xȆrي
U�[�dP�9�v8�똏}8�Rt`�{ٗ��H(D[`jPH��z	�M����NS�-�E2��ə�~��e&����T�y�'��%g]b����К(�oY��8��E�
�u뙜|�٘.@
O�CP�Y�����(���9$����b��\�"����ɛ���	��6�\1A�١��{��$Ey�9���ٛ��|�h���v �4n3���x�d�PM�Aj�I��G6vp�Z%�����Z,�ȢF�`�&z�퉥贈+�f@�Z�� �A��Ĉ�Dڟ���%:#(�ʤr��i/N�Q��"�������O�j/@��E��ejk*	i�H���)�W��*j�\�	s��m��
�i��*��`
p��C
��V*��ʟ9*{`Wh�|ڧ:��٫.��i<]p�0����:H��a�\�s���ʞ����:�Hrr(��ۊ������v�yvi	<p�����	��	{@�9l��*��ɨQ����`���p���*gW�\A
���)�z�L������z�	ڟ��[Hm��~Z��J����iP���g��NZ�/[H[���{��vQ�V�{�(�4	�������K�qʲG�|�a PH�0[�˜Y[��zWI�6;����cõ���˴�I�P�!��,	�$��H����?�9�
[�i�I4dH�E-b�@��ɚ��p�Hy� AcR*Y�$�&M�����)›8s����<#N�h1�FH=�)��ɔcX�ts�'vj݊p�B�A%>�x�QN?�	I�)T�-aV��	�x����X�5rL���ɷR�έ['�� z0�+t,Ѣ��*]˴�I�*�<�لςW�z�b��*d�\�2v��1X�"E�̖-Y��	3`�Ű�!@�l�7oQbĠA]ѷ
]Fk?���+Դt��v�l��S���Ƶ����vܙ��ΣD�NC�"��8=|�Jx�f^*�ղ�n���-���q����s�U�H6MP#`�{���x�)x^.�ž�����܆�M�!�"��:=��Z���F�m��ƛ��ɇar�5��@�)�j)9[m�������r�9���4|s�SjW6���"y�����'K|bҗa��u��<V�9|''�u�� ��X\��)��h(^+X�Z/s�Ƞ�xB�d���W)�h*�G���U�
\Idl["���9rdJ9%6�Q�X���]*�[�Ne���x��ĚWIk �Y6z��Ga��
��z��-^��灡��b�/�8!������A���ꄆ�
Yo��B)�4�0��\0N]{ljɾ�,�I~	m��F9İ&4`��Y~���`F[2�g�y�k�H�x�h�+�����;D�h�]�9��3��������翖��`0�����K]*��z�������^���ٲ� �,p���i��#�
�,+���"�-��pG7Y�}��C��e�*4oz�9��HSGܒtA�?
.�f�0��ޘ5
�A�}�G?����
��o�k�^;���A:�s|���&�$Ɍ�<��8Ҽ݆�=��Sl�w�sW�=��:�\�3�?Z��~~�����N8���ذ��2נ���x6��v��l�o 
�>f�=��u�B�r�>� H���漻y/d�ޯ�7"6���$�Ǡ�½��o4�B5��O�h��g'�u�~�ݺ:���!	��V'���jK �0���AhC0`X7m����0�A/��똖�UØ��oD�1�8>�z��
�o`�	^��$l�S�}PZ�J5?�%�~�q� p�ChT!	�x�%iE/��A	
��x���dT/��Rv�Q%'{x�=�1�rt�l�7i�/@5H�>L�˺���� M�j��T�:`
GJs��\%���o?���JoB����mi5-:G�r��
~03��#%-�W��)��<�������0�&�5�����	���M�L��4���������yĢar*�\��#����@ѨA�a9H�a�64��+e-OY�J���D�.�Q`�����D���9L�Fh	��U�sf���ѿ�)��F8�;G����h��S���N���4�<�jPe`�2H�<�װVp�g�bSo���z�	_u�U7����ИQ�h�`���Uu�U;k��.hk�4���B�)�@Y�W�%����
l@����:�,=
��z`Ӌj�i��2Bv��Ws?��	����u�Y�³2���@�V�¬�DA�!�knAڋ[�F�����Km���KX/����^q��b=V�HH���Ejr����J��^�:�^�u�-ky]��:,�~�{b�q+����� Ƃ�����U�y�����%� �C�mN�T�v�R��I�@��>��M���B[�glb��8���l�v�㭼U�l��Y�:�Ή�qm�l\"��G�d9!�/$r	 �~��_x2��iL�:�D�!���{5L�J�F@���8��z~&D[+>@�E 	��Q�����:��D��	�5���p&���a�Ʉ"�.�����VZD�i"`{�z��˼iy$rd�5�i�fY����#v��2\{�y���g��_u�	��"�t�lJ7�Ȕli^%��D^���6��[j�~{�?��)�s7��W7��|��`������^�����7��p�P��ɮ9�5J֜{�A"�0��|�EFt�{k�t��^� JA�3���^y�P�'�
0���=�f�egu�y���)6�|��н�v��jq���p�	���lpm�/��S׳�duܮ��	D�x�s���r
`v�9�H@�Q^c��]�(=�PՓ@�w�l�	/��'�+�(���>���8@�C0>п��!��R�s�@�
�s~�P{��1m�����'�������K�dG���,|� �}0|�W|�v|�>�i�HT��}�G}�4�G�&��� �u�y��z�2z��A��ׁ�v�q�B��T^@*H�xl8=	��yQ���P�6W���|���t��0A���yQ�S�w.�wy=d=�*�xX}�'v�p8P�D
j���[(j��~<�c�<�B8t��w�w����y�s�MH|Cx�p�gː?��3���]�8��D.-��@:��k�m��z�w�]=D
i�
t����~-�i'���>�8��x�8g�@��`�����syx�pU�H2���8|��m�XDSG?��H7��͈��hs� ^�R�
�������XW.x�h�YP��x�h�qF�y���X���ZEx��p��oP�،N�иR�֊L�C9�
���ȅ醑r
���=����~,���� �A�3@��h��X��S���������g���s	�وOȉ'u���P	J�Eu/I�j��P(~_�T�@
+�@���V��'v\�����U���(����C��3`�<ٖ���x�|r�E���F���J�y8u�`��EPe�����ȑ�����=D,��Y�I��m������Cou�;ɖ�h�|y���x�dP�ٚ�ؓ�8��8 St��y����RhD[`j�H ����W���)OW��7�E2`��9��I�n�ƍ����T��1����g_�©�p�(��y��ٞO�
�u�9����y�G.@
X�CP����9��ȑ���=$P�*�k��f	#P���i��������֟y1A��z��i|��$O�=��z�:}����v��4n=J���n��M�K
�&��w6v�^/Z��I�)�,�h�P�`�0��)��I�5�f�^����K:��(�Nz�����U:#(��&j�|����/N�0R��"`�Z��Y�Y�/��E����o�k4	s��HP��ɦa*�4
�^�	s0�w��&��
	��ʔ�`
��C
���`ʡ�j�(Y*{�W&��z�ڡ�y�/��<]p�Ь�:�D誺�y�sP��j��J��ڗIr|Ƞ��*�ș�ƺ�xBz�i	<��I����	{�=l��ʤ�i�[9�������z9���gW�yA
K��ɭ�M��ʨ𚰶�z�`�eHw������vYJ@���iP;��J�X��9�H��κ���Q%�V���2��>������(;� �{j�Qh}�a �H�0)��
k�c����WI��@۶�:�fc���)��!k���Z�!��,�$��H����?�9�
[�i�I4dH�E-b�@��ɚ��p�Hy� AcR*Y�$�&M�����)›8s����<#N�h1�FH=�)��ɔcX�ts�'vj݊p�B�A%>�x�QN?�	I�)T�-aV��	�x����X�5rL���ɷR�έ['�� z0�+t,Ѣ��*]˴�I�*Y>�لςW�z�b��*d�\�2v��1X�"E�̖-Y��	3`�Ű�!@�l�7oQbĠA]ѷ
]Fk?���+Դt��v�l��S���Ƶ����vܙ��ΣD�NC�"��8=|�Jx�f^*�ղ�n���-���q����s�U�H6MP#`�{���x�)x^.�ž�����܆�M�!�"��:=��Z���F�m��ƛ��ɇar����@�)�j)9[m�������r�9���4|s�SjW6���"y�����'K|bҗa��u��<V�9|''�u�� ��X\��)��h(^+X�Z/s�Ƞ�xB�d���W)�h*�G���U�
\Idl["���9rdJ9%6�Q�X���]*�[�Ne���x��ĚWIk �Y6z��Ga��
��z��-^��灡��b�/�8!������A���ꄆ�
Yo��B)�4�0��\0N]{ljɾ�,�I~	m��Fi�&4`��Y~���`F[2�g�y�k�H�x�h�+�����;D�h�]�9��3��������翖��`0�����K]*��z�������^���ٲ� �,p���i�s>�`B(t��,�/�̷��N��d�MG��ߖ=�м���|F#MpO^��4�t����Rzc�4�����Nvԣ6l��M��l�n����7�x�$7~����v���.^}�Y�1�]��D���ϭo�h�{���G��;ᔞ>4���V��M
vų�X��
d+}Q�1��T�;UW�#w8��@:�7����{!�~e=�	�
#�`	���po+�͢P
��p ���,��G@��i~���qB�.&�lH�#�8/։ʀgC��0L`�~P@����C[�$f)L|��!�:�%f�0f�7�$��s�
��G��9�B��Iؠ��4���~�["���A��ШB2!�"V�$�9����H�ͨ0#b�a\����O��~���2��o�:��S�$��¬1mHȑ�o���u���b�l�9L*�O
��~�K�c�ᜤ����j\tN+��F ��&-w�[�j�[�>y<3���� afMn���Y�!�@�Ў��5˔M@���/�Y�*^��I,�&w��	=0K�	�+T��&0�F��F�(D	?T�R������HD`�� AJQ�Zt������Ԅ����93e�c����R#�4��ljz�H4t�o��c�T�Sy�ўPM�20a0R|��Y-h�4j1�7�c���NV��[Ws��(���A�
���fU�[�Z,L��@���@B����t��i_����+�z[ؼ�Բ�L(&�M0�����g�XY�"�_�#'���n7�u��
��8��v'`�a�ע��w�hi t
�!}}�SJ�U��������p	�ps]��,F7]���
����L}�wӆ�o� PG ��ڥ�U�j]/m����,����b�7q2Σ��� ���J���5�~�O�	�%� �K�mO��ԃ��R��I�`�� >Q�S���B�cF��w���!%mɆ\d��U�tN�9Z�:�ό<�n��\&��O�$:!�/0r	 ���\�y2l�kL�:�F�!���}C��^�F@���8�ł��Dg;>D;F 	��U����,�:@dF��	6�	lXrF��ǡ�Ʉ"�n��
,b'VZ�!xj"�{ڂ>���<jy0rd6�ylg]���cv��2|{؁6��w�_u�	�c�-mNW�ɗ��_%�Z0^�7���j�{�?��1)�wW�
�7��|��`�������b����8��P����9�=�֠+{�#�0���|�M�tƇk�t��D)x~�	?��3_���s�Y�.�z����v��.@ ���:3�N�o�GS����﹎-��^8��?|�
�}�i�}�⺶����5 �*oq�z�_Nڞ;< 	 =�{,���]*{(��m���x�������s�'ۚlj��'�����j��=������g/9�-�����D0��s�{�_�Ͻ�Zm�>�5|�'}��$�ʗ}��oΗ_�����D�{�w~��iA�y�k�HH�"��e�h��:��*��Y l$(rsWP&')+�HE�D��w�����E0
}�<�s�Ϸ8H�3��8��u>�}�z��C����g��wzi''�,AԠ��	 ��F{�T)��8�G��K|�'�N�P����@�˧�>�g�����Q8쀈H�hI�Sw�`�=PH(���i�w' �CԐذ���]�G��vN���3���
��~��y����6P�����p@��@'P��s�8��W��v�G�u����t�H������6'P	RF] �`���2�zU��P��H �숌���
�g� � P��p�||�ń�'��P��X�%x�/i�He?�,���ch�u)�P	C�C_��َ�7���]�x� �Y0+��=�؋��8y�1	��7y�(|Mx
�N9�} ��h��xqZ���� u`T`�+� y��g�Ou
� �Tٕ��h7�&�H@ɕ�9��F�H��[�0M9�tɋv��ϗ�`D
-P}Д�0�_����[fPj`P���H�#i[�	�C�(��,	��H��ha�i�?DW~)�s��}8��HQ��@ep��y�Dɏ
IH�6BGP�ɘ�ٙR��H�f������������E��`�$��j���ig����M������y_��%Ǚ�\���	������p�`��0^����٘OY���q�"�v?U��ə�)�#�	�Cr��y��)w�ؖ0"�H�����y��o�#���.:��W�Jb�X�C p\��ι��g�Y*[`�	B#�0@���HZ�[�} ��ْ%�~gcX
F``�\Z����ҏ=z��p�8�i
�kʣ�a�F�	C*�
Z�Z��b�^�3a�Q�ڢ]:�"ٚ��'K �*�ܩ�l	���
B]Pr*�/j�Ƕ����o��ʟs��ɸ�w�%�0*꧰ڢ�J�G�S	��7�@	�z�#��
�����Ղ�ڨ���$ʚ�"{����G��j�:������]0�J��)��H���$W0��\��	���ڬ҉'�w�������ʠ�驑��C`��0�S���*�
��O��
���j���vn��p�0P���㺈��	l�p�۫詡j]�Ȇ���띨dk�>]��`�K�k��f��D�F[��ɱ��p Ų�aBZ����R[��
�H~�Z{�E*�=��݇f�tS�f�ݩ�f����r{�t˩Jk6m�M<�ኲ]K����!��,�$��H����?�9�
[�i�I4dH�E-b�@��ɚ��p�Hy� AcR*Y�$�&M�����)›8s����<#N�h1�FH=�)��ɔcX�ts�'vj݊p�B�A%>�x�QN?�	I�)T�-aV��	�x����X�5rL���ɷR�έ['�� z0�+t,Ѣ��*]˴�I�*Y�|��	��V���*V+UȐ�Je�T�c�PE�$�-[�n-f���a8C�@�oޢĈA���o���~�A�W�i�j�ٮ٧r1ˍ�70_��7>���ΟG�^��"EXq'�@x��*��y��W{�Ip�C��)��s��g�"�4Àj㹶 z�<�J{H��|fx_sFG݇!�H�v��p�j
�6[m��[o3
7_��1��t?T��C�����ن�n�59\qP.��s:�H�7�P�v`�Zx)��`z��|��Gf}������cś�1�xtyg��8!��ٸ!�����������R�
B���MZX�}�v��"zl��i^�ذ@�E��e�`2I��%g�1�	�
m������K����Ey��;�q@<��U@����	�{�U�'��FG�ht����̉���"�2R�*��*Clw���:�a��C��NZa�\�#�S�*���9륒aN���RbZ���@��n)2�ъI-�צ��
h�"I�n��h��R�����v>�D��:�o��R
p��\�k�uNX�̡:|��YO�*����c���)�#��*mp�����?�`B(x��,�4������dU�MG���]�ѽ��'}K7]t_^� N��v�ͯ�Z������}�G?��mu���/�p㾆���A:��+��:��ɑ����8�ދ�Z���c?��w�sW�=��:�pNt�G�n���5����N8�c4��ͽ�s��w���j����c�C��f�*�JG��	��txm�ۛ�HF��+{�L�A�/d�c��\(��E�v�@�ܧ�Y���Ó�D����]!d�ِG�^�#Uٶ��5pJ�ؖ����!5̛�׶�US��@�K�ҡ��7��Tc@�HB1�h���o{|��
,4a�~��
a
#ʯjE�ߩ�7:'�O?�Dτ�*$!�Db&���y�;(�����
2�
K�#�W�:��� HB��3�W�EB�A�a
c�
�9D��9�j��T�:`�J^�s�'���o?��qJs^2��"�{���/>'�r�
~T��[�.��5�9��<��iM���5�f9�Mpnh(�A��<j�|�<�7}
�z �(g*��Au2Qi�܁
,'D$�2=���6z�v��@ ��CA�M(�X�KW��R;P*$!����4iFQ��!�����CWyU��0|b�3q�p�l�^j���S�SU�����e5�c�L�z�5�ӪU&�!Hʃ}mku��.^GI����V͂��}+�)%��u;h�Ax�֯�^3���+䆅	�y@x�י�S�6%����	q6 qX�v���D=<*D5�a��0�9�؆L���dK[�Z��m�\#���n�, 1�k�&S�e-���1!�oq���&8�#0��.!�
�.M��E첋�X$]�]�W��-��>b���~kշ^4���-sl�ǀ��H0k|C�6.�|�f)� x!���_7��B����#Ǹ@Y��j>���[
�@$	Ѓ/���(�p+ͫ!PHB�/���i��"����E���옽y�p�s6U;_g�Nn��;��:�ʝl'#$�H.�DH0��χ�؍�@\I4d@�&�/��\T��h��G�C�8��Ĩn�h�(@D �-kY���R��?x!ʞ��NL�9��$��@$CԔs�S�a�V����]M�sk;юm7�U-H���^���l/r�&t^ @s+��V����8�1c�\��=jnWy�7-�$��<����vui}]w��=� 2Po��9����Ӂț}`hx2�l"<�?��1�j4�D8I��h��:����p���ʗ�r���{�D)��u
[��:w�����Y�5�:��\U�v��.@ �.p>O��U0ֹS������푓n8��#|�
�xm�]������	�5 �:��Z�fN��;< 	`�͉�����]*�{D���my�;���!nt�C{������'��O����M����������og��/$��
�Dp��s���_�|���~�y��|ا}܁$��~�Gp�`�����D@|�~�WjF#z�mIH�"�mWi�';��*�'Z#l�,�r{�P-G)3IE�D��xx�f�׃��E0
}�DXt���8H�3���vDe~�"{�'D�������zq''�48AԠ��	����{�gT) �@�O�R�|���V�X� �����'�F�g����Y8�� Ȇ"�I�rSXa�=PP���Fj��' �%DԐ�0��^�ǃ�vN@��3��(��x����p���6P�(�qG���@'P�t����׉�J$v�3��t�ȍ����6'P	R0F] ��h�:���Ճ�Ў�I ����'�h� ظ Ќ��|�E��'��А�؅-��5�i��eB�,���h�k�}8)�P	K(D_0�
Y�ﷃ�X^��#�Y03)�EX���8y�1	�?���|Ux
 O@��}���腫�qa����ucT�3��(����Uu
���dY��h�p��.	IHI�i�A�Ni�P)�x�0U��|I�~y���cD
-P}P�찑g���7�bf�jcP�y��Ȋ+i[�		)D�(0�4���ȇ��a��B�W���{����ƘQ�I@e��LI��H�<5BGP�I��Y�Z�K�f����9��i�ؙ���E�i�c$%)�ry���g���N ��	���_�&��yƉȉ��	��9q��ڠ^�@��Y�Wّ��q�"�pvBUp��I����+�	�)Dr�����w�X�1"$
I�p�ՙ����	jp�#�	�6���לK�`)D p\��9���y*[`�9B#�0��㙎Pڇ[�}���Y�-*lc`:F`�dڛÈ��R�E����@j�q��sJ��a�8F�	K��ڍ!ڥ��jj_�3a�YZ�e��*Y���h5B��"P�*J��I�h�/Щ�E��*z�~�lC	�z�H@���p�C��`�	s ����5��������`
�uC
���o���Z�7y*{�X5��j� ʢ�y�0��<]p�Э�*�S諻���s@��Z��:��ʘJr������׉�֪�z2{�i	<��I����	{РBl����i�j9��������)���hW��A
 .K��ɮ��M��َ����
�"j�P�tH��������J0���iP/;�
;�g�II-��ު�%�gR5�V��.�A��M������8;�0ۤ�j�`X~�a I�09��[�s��XI��P۷�:�kc���9��1k���j�!��,�$��H����?�9�
[�i�I4dH�E-b�@��ɚ��p�Hy� AcR*Y�$�&M�����)›8s����<#N�h1�FH=�)��ɔcX�ts�'vj݊p�B�A%>�x�QN?�	I�)T�-aV��	�x����X�5rL���ɷR�έ['�� z0�+t,Ѣ��*]˴�I�*Y���8g>^��E�U�V��!s��ةZ�`��I0[�d�Z&̀��p���!޼E���uE�6t)��v�T���6�]�O�b�Wo`��/~|Xrg̟C�2�:
E�`�݀��Cx��W^l襢^-�&A|��"Lq/ �\~�E��u�d�5�Wj������!*�I0!p�a�!~�u(]u �Hb�ܡ���-(m��o��8}.ל��U�@�Idk+Y�m����%s�A�#�4|s�WrW6����y
�����'�|fڷa��}��<V�Y�g��y����x܍�ih���(^+h�Z/w�蠤|R�䅗ޗ��l*��G���U�
li�l_*)f��Y�rhRI
qB`C��ʥy�&&��erR�	+�wO�y��*�e�{��|�*������h(u&X�y-��������xZ�NhX�+��Fꯄ�Zh#�[7����Ųͮ�llт���J씚{%&4���]��+�d^���k�y�k�H����-��'��<D�l�]�9�k����;)��<h�-[��`P���1�k�*���u�;�0��7y s�E���ɿV+��g��-�%�`B({���7�<�����d��MG����}�Ҿ�	h}NCmwo^�0~��x��o�c�c����}�G?��������s����A:ŋ�+��J��ʕ�|9���H�}?�k��N�}�-�1�]��D��ѵ�>�����O�W�������f'�m
w���`��
|+~Q�1�5U�[U_�#wX��@:Ʒ6��|'K���=X��DlXa[X>�a/���a�x�j����>fa?OO�3�����x�zHdC��|��T|�&A*a�[H�"І`�oL�r�1Ma�i,��72/I�9[��cD�uI(��x=.�4d_t���&����A#L��a
i�K�NGE����Q�$d��NeC�<2�p%H�;E�bO!�Dh��E��D��H��f�"�%��T�@5H�>L�L�=�LY$
W��
PGL��.�.���%����Da>\�NO~�_�{ 1�VF��RiT�B�n��x��򺦻	�g�6��8:g�b��y�
-�p(#_��p�o�i*���P�섥?O)6͔;P�搈�!���%:���%p#�����,�YK�fjQ�$"�R�:��-�KE:�Ҵ;s +/��P�/�ڛ�Δ�pÀ�S�M���~�R��"��@�"4���)R�G�v����=dpIy�t�`0�8F����M��ڳ�pj"5��׿�
6/�jVo��y�\�0��FO/
��wF������jH��DX�d�T�����GI��>����h-KQ�����@nw�ގ��2�k�k\�|�D }{k_h2��E�P�<� fnR?�X��8b���%8����z��w1�+����f��썛iO��4�@�0o�jW��5��m΂�� 0�{x��Y�B8�.�/� 6�����3?'�d�`�+g��J�V'*cL���H�$z`��8E#�e{7
I���8N���d�T�+��K#X$�΅gl��E_���Ųv���
w���d�$�p�%x�>�)��q9�.��d��~���Z�
�N�<�hC��
�,�h�$x��s��&G�Qꀔ/�/$ ښ�0e��y&G�>�$"�d�z�h�0�I|Ylu`X�`����pC����s��q����V2���ciRNۋ~���h?�ڑN����'4&���6�U=n.�ҧ���7.y�T����[�X����@�=r;c�znsr:�|�O�ŧ�d����*�ǹC
�{�
_�]���at\�<�*��o��'�.r^�����(����N�;�tB�=+0��e�w�����]���>h�����:6?w���N��q8���	6hw��]�4���Pb;~��Ԁ"=�e�ꀷ9�;��$@�>_2�	{�xA���I��ƻv��6�=_D���x�1mqr@5F��?B���3楗��-|:t��i���c|��}��D�����o?7xl&0�w|���f~�wy�}�~�$��w~ڷp�w`�����D�|�W��jI�z�orIH�"p�t�i�g;��*��Z(l�2s�Q4g)9xIE�D��x�Ɓ�� 8 E0
}�J�t���79H!�3`�%��wvK�~�{��D�����G��W{x''�:�AԠ��	��&|�T)��F�Ux�Y�|��\��^8 ��� �ه�Lhh����_8�`�&(�(J��S��a�=PV��j�W�' �DԐؐ���^(��vN���3�h����؄���Љ�6P���
�qN爷@'P��t���7��V�P�v����t�(��x��7'P	R�F] �@��Ȁ@���5��0��pI ��h����xh� �8  0��P���|����'��0��8�3X�<�i�(fH�,��ȏqH��X)�P	Q�D_���������^�X�(�Y09��K���(9y2	�EY�}[x
�OG�}��H��Xrhw���viT@�9��.Y��G�\u
��t���ȓw�4yIN��ɏGy�TɁV����0[�����و�w�iD
-P}����m�����if0kiP�ْ�(�1i[�	�D�(��:镾(��Hb�I�H$X�	��y����R��@eP��Y�R���H�C�BGP������`y�Q�f��������ɖ��%F�ɔi$+��xٙ�Ih���N���i��Y`�6&�y��̉���i��q�@��_���蹙]9��ir�"��vHUМ�	�1�	�Dr��Y��x���2"*zI�П��Z��p: #�i�<��7�LB�f�D p\`�ܙ��G�%�*[`��B#�0 ��V:�[�}����3�ocf�F`@�j:���β�KZ�P�Fʠw�y���a�F�	Q�
�:�':��p�_�3a�_��k�0����o�B��"��0�����n�/0��E�0ڣ�ZmI	�ڧH��
�vz�IZ�b�	s�����;��"Y����`
`�xC
��u�κ�=�*{�X;h��ʩ&*��٭1�=]p�0����YH��a��s��㺠����*�Kr����z����
�|�{�i	<p�������	{0�Hl���ɪp�����`�������*iW�B
&4����)��N��ߨ���j�(ʡ��zH����Z��9K����iP5����mJ�O{I3[��
�+{��R;K V�4{�G�S	�����>��6;��ʴf�~�a pI�0?[� ��yK��
YI�V;����n÷��?�7˶�I�pK !��,�$��H����?�9�
[�i�I4dH�E-b�@��ɚ��p�Hy� AcR*Y�$�&M�����)›8s����<#N�h1�FH=�)��ɔcX�ts�'vj݊p�B�A%>�x�QN?�	I�)T�-aV��	�x����X�5rL���ɷR�έ['�� z0�+t,Ѣ��*]˴�I�*Y��)�q�&|�ZՋ�X�T!C�*��S���B)�`�lɺ�L�/�
�eC�y�#�늾m�b����^�����uld�j���l7.�|	n�0�ΚC���u�(��w�G�B�y����z����	w�0ƽ�s�A'��)�M�H�^��Vl
��K���'��ї�=��tօ8b�&v�N)���l�ݖ�n��V#q�mȜs;R�#
AT�E��"���o�=Y�qR6�\t<^��#d�]ب6ފ�9�^{1�'�,�y�k�"��X!�iLd ޝG��3Vh#r8v��"~�x���j���⃓�Y�b���^������W96,�呴��$�NZx�}˩Yeu��	�
m�J����M'l��M�f�=�q@<��U@�&���)c|�](諅Nw�h��W��ة�����4Zت��*s�w�:�a��E�+�Zz�|�3�S�:���I+&�e^+h�Tn�,
wd	�	
4��&�Z��ز�m�4����Z!�>�B�����.�a�:pGtN�&�o��R�j����W��m�L��]���Ů���>X��M�,��8'y2��7l�-s�A�`B(~���:�lx����d��MG����jӿ��}QO}z^�@���y�
��g�#����}�G?���5��*0�v�F���A:ɏ�+��Z�ʙ��y�Aj�#�>���{9�ƺ|�8wU_�=�C�J�~:����X'6��+�G���`ct�3���;��hl���e��(��E�$��ݱʂ��;6�A�h �s���>���{�
_��W���"����J�=���Y�a����"��=PuLN��B�9�
Ip����SMPn�����o9�
�@�Ŀ��ys�]�6�	��@L�4-#�~��{H @$�t�jH�C�0~����F?L��0������OU\��wbhN�F���QRєg4��Ԙ��@QN�G� YLjU��;!/'_�҉gxd$�8Ȝ��&��� � 	�0�4�V�"VRe�L\5v@�N*@0�(�X�c�.�Y�
���<�����<IY�~1������K9�Q?�YL������0��N�A���Hɝ�3�Zg;Md�����a!��t�i�>��C=�_�Ӗd$�=�5V�@�s"z`��ҳf�hQ�;L` ���!��R�Z��L�.��\����KaJ�I�Ԥ5E�p���A���jEg���z/�>S8v��VO<5�OzK���O{W���7���N%�:֍*��A'���u���cɪ#����O��i�*����ڤ�`k"4� ��+[��V�s�„[=
 �X,P�yѡF��4+#;�!��mlTU�Ѝb�+u���_�֎��Fv�tr�
�{GJH����S.s���.�iȓ�B�� X�O-�c�+���خ��`��7��Ecy��z���.`����ʗn�m��u��*_I��"�9�0�@��@X8�Bb+gdD
��tb�b���(�.d;,����o\�	����B��a�(�3�z �����Kc�X���($qg���Aޫ�LSܲ��Y�b���>/ڜ��3 ��-?���3u7<fU���B'��"X��.��n�G��.�$2��+��p��jq4���#���l�r����t��"�������|MKJ�X�����k�Ú�g��T���L�@ ���P�Y�6Vqg�ՁAx���&��m���;з�G'G@kcʊvv���9pG�; ü�]im_��U&V�И7����u�ŌJ�JV�����z�[��&�o�%w�x��q�z����m?0h<�v�%�_��l�%'54^�C<�}����1rt�S��ofR����yA���P_��G���QU`z��������|;xd ]x��Nd�;��ބ|�%���R�������'�`ޛ?��ߜ�uGI��/P� �*��>�0@��s���=�FW|�|���'��'O۰�ۢ'�wQ��o��S�|����q�؉�8}2�/}����������������:C��UN$|D��GpE�xr60��|����~��y�u}�g~A�$���~�q��`�����D}��'kL�z�p�IH�"Ёz'j��;��*��Z-lP�8hs�wQ:w)?�IE�DP�Hy�&��C�&h"E0
}�P(u X��w9$H'�3��+x���vQ%��{��D��X�����{~''�@�AԠ��	`���|
8U)�L�[�؅_W}�g�b�dh"�̀���R�h����e8�,��.xJ�BT�(bգ=P\h��kɷ�' ��DԐ���^	���vN��3�ȉ艒8����0�A�6P���qTG��@'P��t�x�ޗ����V�v�t����؂�87'P	R�F] ؠ��(�FX���������I �ɍ��!�h� �h" ������H}��"�'����蘆9��BUjȈfN�,P��(�w���h)�P	W�D_���w�)_���-�Y0?�Q��h9 �8&2	�K��h}ax
�OMG�}`������rn׊��`voT��?Y�4�����bu
�`��%��(�}w�:�IT	�)�MّZ)�\镦�0ay��	��9��טoD
-P}��p�sY����of�koP�9�ꈋ7i[�	�D�(�@I�Ĉ�ƨb���N�X�i��ى�x��hR�Y @e��ȹ�X	�YI�I�BGP�	����fنW�f�������)��Y��F�)�N$1�~9���h����N�ɔ��`�V&�ٝ�҉�I��ɑ
r����p_����c����r�"�@wNU0��	��i�7�	��Br�๢�yx�3"0�I�0��Y���:qj"#�ɡBz�ᗝM��l�D p\���+�*[`��B#�0���Y�\��[�}`���9�rcl�F`��p���H���Q��&��L*�}J�
���a	�F�	Wj���-��"�v:`�3a�e�qz�6��u�B��"�6
��	�t
0���E`�6:���mO	�:�H�z�|ڍO��d�	s࣒Z�AZ�(���z��`
��{C
�@�{z���C�*{PYAȪ�*�,���9�2�Z=]p��_�����&�s�����Ɋ�Lr�x��ۡ�I��j�}�{�i	<а�	� Z��	{��Nl�{��)�v������z��駾�iW�&�B
,:����hN���[��ʟ.*���H�Z�����K��iP;����s��U�I9���j�1۫7SA$V`�:۰Mz�Yi�����D��<���*�l�a �I�0E��&����jYIp�\�����q#���Ek�=+�ة�v$!��,�$��H����?�9�
[�i�I4dH�E-b�@��ɚ��p�Hy� AcR*Y�$�&M�����)›8s����<#N�h1�FH=�)��ɔcX�ts�'vj݊p�B�A%>�x�QN?�	I�)T�-aV��	�x����X�5rL���ɷR�έ['�� z0�+t,Ѣ��*]˴�I�*Y��)3���8��Y�jU/Z�b�R���T�N�:U�H�ٲ%��2a�6`�3�
��-J�4�+�������{՚��س��}*�޸��E�8r�Ø;{.}z��Ѡ�"X�g�@x�@�*�G�z��W|�I@q����9ǟt���"�4Á�Śk�� {�L�J|X8�}v�_t V�݈%���w���k�v[n���[p7w_��Aףu?
�͐�c䑰��$n���|Q���E7��Y~s�\~W6���bz��ތ��'�}k�硛��(�<Vԉ��g�}�Ha�⨜���(��(^+|�Z/{����b�����i�Y*�G���U�
���md6y&���_sm^y]�rr	�
m�zj��ˤ�O
W��U�&�?�q@<��U@�.ؠ���I�|�eX���V��h������`��(#�6b+��*�l�w ��:�aA�G\�f�a�	/��C�S�J���Y[��hn[(�Vz�,
⒋"&4��b�,l�ir�p� �"k�H��;)�0�h��&<D�Y��]�9���
|i��"|��2g��`p�������*��z��;�����7y���H�����j[��l��� ��&�28���sˋ�1��MV��t���nݫJ����g5���w�]��_�˧�k|0�<����~�{�s9�a����s���kЩ�A��ɿj�-�R���̡�Υ�8�}�;>������w�s�=��:�P��~׺K�kP��ٮf��#��4����u��#��j����c�� ���*��G��	��t�on�3��XF���|����P����K��x�86�hQ��]f8��c�`�d@�%p9��W�GE6$�Y��T���mPo�&�EE?( m�	����mx�&dX��}(ӵ�4�9�:R���b����a���Q�XhB�0	4�X ؠV�V0v`\��1��UHB&R�EV���Ճ�wP�FQ1���+��f���,u�i�����Db"}6�&2�[��N(�T�$���$�6��I�u�q��F�u��L���W~�Pd�~P��C��T�&=
B�lq�1�PG �@�2��KgR�l���DGy�3��S�&���'�(����P�bR��lg���x��@~�O^�Q���b�d����H�����ѣta�0�����0BMQ�Q��h�v��Q"B4��63�S��ԥC�)PQ4��b��a��J�oM��7"�=�DMh/��.Rm^d+E�X��RU�}thZC�L�C�� �6ӏoT+����:�>����+NgW'��J�]��`���rU']y[X�%.`�4��"�F�gG�zYv����
l@��~v�W��CC��zĔ�j�q�[>�V� MX{?0�	���M�"��C�~��}�X@b8��&#[�[m+dB�`�Vu���.��#F` ��[�;|ޣ�׍�#豂Q�@�pYӋ߼�v�5�#�#���U)a�\�\8���#9���)���A�B��bɺx��1f�3cQ�q�	&s��kU����>�(ꁄQ�r���Y�b`��C��D��L�*9�X��N}�.�@����iv��ΰ�(�\]2����
q�a	PFH��\����9x��1 �3��`�h�@�s�������:���62�׹���O�(R��@�
K��I�r79I�xy��B�mj�����'s\�Q2!�HF�OMg�ƣ�VA���n7�C�C�Z���m+C��K����}i�@������jo�X�pBc�x:n����F�+��YIpc�x@��n�[���<B
d�/4�n�<3�?(8���d���W�8�5�����@����n�v��F�u0�#L!�I�U=��.��x/�RX=�-N���H!TA�۳�������]�@���6���Nᵓ������e�+�Nx��`�|��݁�s��=%� yT�@
H �����nx�S��+�@|��+3�����
,�dϼn�^zr�^�BD�)���g���v'�d*���Ɉ?�y{[ı3@�_Gh��'w��s��!��UT�|D��pK�xxv0�7}���&�7z��}��~\�$��7�wq�7a�����D`}����kQC{�s2JH�"0���j�<�+�W[3l��>�s��Q@�)E8JE�D��%�yↂ壂,8$E0
}�V�u&����9*H-�3 �1؀�7wW��B|�GE��"�����|�''�F8BԠ��	����|��U)@�R�a8�e�}�ǁh�j8$@����G�X(i����k8� �2�4�J�T��bۣ=PbȈ�vk��' �EEԐ�P��H_脺vN`��3�(�$H������䐊\�6P�H�HrZ���@'P�Du�؊���\TwT��t���8���7'P	RPG] �����L��������0J �)��G�'8i� �8$ ����}�e�(�'����?�H�j��fT�,������}���)�P	]HE_P�y�؄�_��3�Y0EI�Wx���9&y\2	�Q��}gx
PP�*�,�p؋1Gw�H�P	lWGuPY����q8���V�@
L9B���x��H9x~	����w	�9�#	�((�d��3��]������~�YG���h�-��l	|5Xw�`�VGPe��9	��ؓ�����TD,��i�k���Ȍ0ƛ�IE���\阣x����,�(�dP����I��8��T3t �����ٖs�E[`j0J@��ɝy����PněXYG2p��Y��i��֏����T�9�Rٙ�ih"��	�(����"��&q�
�uZ����/��2�.@
zGEP���Y��ؓ�ПT$p�2J�����Y#p��
���٠�ɡ��C2A��#���y~�$q9�T��#��&J����v�34n_j��8���@O�m*�G	�x7v0�uQz��Y�K:-��r9$`�R�:�J�j�W�f�u���mZ��H�p���ѧ	V:#(��H���ʓ�I0N�W3 �ڣ�Y�����:B]P�ڣJ��V��P����z��:��h��y&�0E��̊���bʪn	��
8�@	�*�>��(�����u�����:�?z��J#{0���G��*�UZ���:$]0�
��	���$WЉ.�\��$������	(�'���;��z�쩫�� JE`���n:��ڗ&+�O�ˬ��ʙ�Z��vn�%3@{�����N���˲�:�5��p��H�ʲ�*���KP���iPAk� k�z
�[;J?��ڝ8K�%�SG[']
�K�m��
�
0J~��t+�`کX+���f�tS���۲�I��H����+����ek7�KO<���:�w��Ѻ�u!��,�$��H����~>�9�
[�i�I4dH�E-b�@��ɚ��p�Hy� AcR*Y�$�&M�����)›8s����<#N�h1�FH=�)��ɔcX�ts�'vj݊p�B�A%>�x�QN?�	I�)T�-aV��	�x����X�5rL���ɷR�έ['�� z0�+t,Ѣ��*]˴�I�*Y��)3M��6��ժ^�X�j�
2W����u�H�$�eK֭e�x1l�g(��[�1hhW�mC���>�h��5-]�i#ۅ�T.f�q櫸��ˇ5w}:�(�iG�"�`ށ��Cy���^m��^-�'A}��"Lr/0�\�U�v�d�5�Wk��7���B!*�Ip!q�q�!҅h]v$��b�����=hn���p��x~>���9`wߥXΑH�Ⓓ���o�I��rUB'u?j��#^شf���E�|4�W�,���߇o�7��Xa'xLdPޞJ�)c�6b��r;��%~0�y��k��	������r����"j�����X96,�����$�Qf�f~ι�%v�Yg��І����^�M�	�p�Rٜ�o�
�ģ�c$1-��i)�5�g���Κ�u��ƹyE��
��^�3�xc��vh�2�
x�������l���p�����9u!-��Y[�f>�f��&{���@��К������۪����IÜ
��"I�.������z���j�C�J����WJ0�o�0�Ӭ�k�ѵNX�Ϩb<��ew,+� ���o���('�3�-˭qǶ9��G�t�#�
�=_�8�/3>4���pG7Y���C8�v�:�p����YkG�tA���n�w�q���;k@�;B���u�ͪƯ"�1�ǯ���y��)����O3�4�N������k.,��z~��4�1�]��D� ��<�aJ^����І5|��]���l��w��نw=��V;��7���_[%<Xu�V?r�IX
��}t�����Y諕����"6�0�9��������qE�B5�BC��O� ����N�̡�d��*�!	��"�~�*
⍃{� �0Q�*
DhC0�X�R/o�ا01C;��G���Ȕ�&
�~����� @$�{T��x��G���`H?L��0E���U�]�wbrU�F���Unѕnl������Qv��0�Njq��s!1�WcⲊg�d&��ȟ�ω��(�3J;� 	�0�6�M&vf�|\5v@�R*@0�*���g�.�`<���\�����>Y�ƁMo��<��cL9R?������3[�>X�R�A�\g��ɠ��!�g=�Ĵ����a#�i�x�i�>��E=�_�ӗk\�?�h5Z�@��#z`���m) _h<L` ���!�pS�z�����0%�|����Mq��M�ԥ=���*��A��(kGu(���/�DS8v�
	rOD5�Q�K��NjU��jQC���Ve�!�֑*��A)��
V��#��#���֐O�k������bK$4� �,]�iW��s�„�=
 ��,R��ѥfv�t+%i�!���lVeёb�3�����_춏�%�H���r�M�}W�H����.u��^.���ȗB��Y���ڽj+-��6�G���xI��8�I���k/F�c�t}A<೮W�z���qlH�#V�Y	�R�������^�̹'CR@����Ŕ�qw1kb���Ƥ4�L`f4o�MkH��)P�	�$@���H����@!	@��XV�`�La�Wf`� {�H���-����R���gFo��Kb6�R����J���vqC3�@>gpA)ѐT�X�>γVg�� `ֆ�:��O���Ͻ_�S�
��6����oz�Js)���;�!�?]�����dB�\���#��K����$$6�
�O�v��<J92|;�Y���ϥ[���
nO����2�:��u�~w��fX2U���F)/���;��U6{	�L����e^�?<�|nN~��a��(����qw<f,w9��1rwk=�9-���=�렔G�ət5����e�:0qC^��:�a�j�C=�B�Bչg,��G�Z���G��0;�%��&���n7g��yk7��__��*>��&=�	��wћJ{���x��@��y�y
q>���_����Z~����//p>	��yު��^}����R8��&���
O���v��A���Wv�eg�Tߐ��{��|uWxB�kr|`eG�Gh
�t��g	s|֗;-�n��}��[��~�g'�@}p~��~�~f?�iPJT��G��&5��@'��� &8x�V{�3}�r|�UE��?y5t����T^@N���Wn+h>-��DR��͐�[���~�ӂt�0eH�(|v�U�G/Ƿ{vd=P�N8{C��wx�p8��4D
j����xl�7�[��X�<@�f�v��y���ІD���q�~g���&jː?�3��X��x��/LE�+�?:�P���o�&}x��_vD
i�
����%�Q�k'���=0��x����\hi�@�h'`��ȁ'�u�x�pUPJW���x~�p��Ex�@�XJ7���Ȍ6(�ys� ��R�
�����hYRxi�Y���Xz稂�F�ЎD�䘉��\i���p�oP"�r(��T��qfG9��.ُ	�3)��r
��v�)�
I�P�%�DYE�3����ژ����`'�P��@�$فߧ��eu-�/�s�4ww�X�P	ogHuS���ؓth���V�@
OIC��zɌKix�9��ԕy9�i�&9�+X�g��3��`��8���~�iH���j�0ɗn9|8�w�`�fHPe��<9�������vD,����mٌ���3曳iG���_	�������.5�)�dP����y���8UUt@�������v�E[`jPJ`���{ٞ��Po�[iH2���y��������T�Y�U��jiB���(Н�9�%�)s�
�uz��ɖ2��5/@
}gGP�9��y�����v$��4j��א�i#����������D2A��%���~�	%sY�v��%��(z�H���v�U4na���X���`O�oJ�J)��7vP��S��҉�MZ-��tI$`��TZ�j���Y
f �����oz��h�r����f:#(�J������i0N�WU ����y��٧�JC]P���L:�䆕�p�v�����Z�戥��&�0G��Ϊ���d�p	��8�@	�J�@ڭ*ʔ���������Z�A���Z#{P���G��J�W���
�(�*�
�)���$W�0�\��&ʞ����(�G���[�����ɫ��"jG`���pZ����&[�O���뙇z��vn@*0�������	l�0�,��z�+jz����,˪"���d�HB]���6��ɧ����4�?��B��Ɗr;e����Ak�l+�
�
PJ~��r�k��W[���f�tS��A+�M��j�����Vː�*p�kO<��jK�j�ۘ��!��,�$��H��A��†-ϴi�"2���1b i�d͎G8p���tI��1(��TM��mqb��͛8s�pha�%R��Q#$�?��F�$�1+Y��)�:�j͹BaC�M�x�('����iT�/�����ֻx����aر3nD��mI�Q�ʥ['�� z,�T�P���&U��iɓ)W�|3�̚�6��ժ^�X�j�
2W����u�H�$�eK֭e�x1l�g(��[�1hhW�mC���>�h��5-]�i#ۅ�T.f�q櫸��ˇ5w}:�(�iG�"�\ށ��Cy���^m��^-�'A}��"Lr/0�\�U�v�d�5�Wk��7���B!*�Ip!q�q�!҅h]v$��b�����=hn���p��x~>���9`wߥXΑH�Ⓓ���o�I��rUB'u?j��#^شf���E�|4�W�,���߇o�7��Xa'xLdPޞJ�)c�6b��r;��%~0�y��k��	������r����"j�����X96,�����$�Qf�f~ι�%v�Yg��І����^�M�	�p�Rٜ�o�
�ģ�c$1-��i)�5�g���Κ�u��ƹyE��
��^�3�xc��vh�2�
x�������l���p�����9u!-��Y[�f>�f��&{���@��К������۪����IÜ
��"I�.������z���j�C�J����WJ0�o�0�Ӭ�k�ѵNX�Ϩb<��ew,+� ���o���('�3�-˭qǶ9��G�t�#�
�=_�8�/3>4���pG7X���C8�v�:�p����YkG�tA���n�w�q���;k@��M���u�ͪƯ"�1�ǯ���y��)����O3�4�N������k.,��z~��4�1�]��D� ��<�aJ^����І5|��]���l��w��نw=��V;��7���_[%<Xu�V?r�IX
��}t�����Y諕����"6�0�9��������qE�B5�BC��O� ����N�̡�d��*�!	��"�~�*
⍃{� �0Q�*
DhC0�X�R/o�ا01C;��G���Ȕ�&
�~����� @$�{T��x��G���`H?L��0E���U�]�wbrU�F���Unѕnl������Qv��0�Njq��s!1�WcⲊg�d&��ȟ�ω��(�3J;� 	�0�6�M&vf�|\5v@�R*@0�*���g�.�`<���\�����>Y�ƁMo��<��cL9R?������3[�>X�R�A�\g��ɠ��!�g=�Ĵ����a#�i�x�i�>��E=�_�ӗk\�?�h5Z�@��#z`���m) _h<L` ���!�pS�z�����0%�|����Mq��M�ԥ=���*��A��(kGu(���/�DS8v�
	rOD5�Q�K��NjU��jQC���Ve�!�֑*��A)��
V��#��#���֐O�k������bK$4� �,]�iW��s�„�=
 ��,R��ѥfv�t+%i�!���lVeёb�3�����_춏�%�H���r�M�}W�H����.u��^.���ȗB��Y���ڽj+-��6�G���xI��8�I���k/F�c�t}A<೮W�z���qlH�#V�Y	�R�������^�̹'CR@����Ŕ�qw1kb���Ƥ4�L`f4o�MkH��)P�	�$@���H����@!	@��XV�`�La�Wf`� {�H���-����R���gFo��Kb6�R����J���vqC3�@>gpA)ѐT�X�>γVg�� `ֆ�:��O���Ͻ_�S�
��6����oz�Js)���;�!�?]�����dB�\���#��K����$$6�
�O�v��<J92|;�Y���ϥ[���
nO����2�:��u�~w��fX2U���F)/���;��U6{	�L����e^�?<�|nN~��a��(����qw<f,w9��1rwk=�9-���=�렔G�ət5����e�:0qC^��:�a�j�C=�B�Bչg,��G�Z���G��0;�%��&���n7g��yk7��__��*>��&=�	��wћJ{���x��@��y�y
q>���_����Z~����//p>	��yު��^}����R8��&���
O���v��A���Wv�eg�Tߐ��{��|uWxB�kr|`eG�Gh
�t��g	s|֗;-�n��}��[��~�g'�@}p~��~�~f?�iPJT��G��&5��@'��� &8x�V{�3}�r|�UE��?y5t����T^@N���Wn+h>-��DR��͐�[���~�ӂt�0eH�(|v�U�G/Ƿ{vd=P�N8{C��wx�p8��4D
j����xl�7�[��X�<@�f�v��y���ІD���q�~g���&jː?�3��X��x��/LE�+�?:�P���o�&}x��_vD
i�
����%�Q�k'���=0��x����\hi�@�h'`��ȁ'�u�x�pUPJW���x~�p��Ex�@�XJ7���Ȍ6(�ys� ��R�
�����hYRxi�Y���Xz稂�F�ЎD�䘉��\i���p�oP"�r(��T��qfG9��.ُ	�3)��r
��v�)�
I�P�%�DYE�3����ژ����`'�P��@�$فߧ��eu-�/�s�4ww�X�P	ogHuS���ؓth���V�@
OIC��zɌKix�9��ԕy9�i�&9�+X�g��3��`��8���~�iH���j�0ɗn9|8�w�`�fHPe��<9�������vD,����mٌ���3曳iG���_	�������.5�)�dP����y���8UUt@�������v�E[`jPJ`���{ٞ��Po�[iH2���y��������T�Y�U��jiB���(Н�9�%�)s�
�uz��ɖ2��5/@
}gGP�9��y�����v$��4j��א�i#����������v�Y�K
��'�P2�uiG p\P�뉢�7�4�*[`�YE#�0���d*�[�}���Bz�xctjH` �x*��ؤբ�YJ��2�T����ڡ����aiH�	_�'*�6�+~�`�3a�m��yک?���}UE��"p�?��Ǚ�|j0�4�E��?ʤ�JnX	�J*�ڨ�j�WJ�h�	sp�����ʞ���p	��8�@	�J��
��ʔ���������Z������?]p�j�h�������٬��$W�0�\�&j�)�W!�G���[������V{ �vl���ٱ�ﰰ⚯�i��jW��°U���Êr;�	l���#��19��4bz����#��[��j�HB]��M[�A���R[J*���z�*��
<�/6�̺�g���?+�Ԫ�B[�7Zsf�tS�uۮ�	������۲$��\+p{kO<�c˶����!��,�$��H��A��†-ϴi�"2���1b i�d͎G8p���tI��1(��TM��mqb��͛8s�pha�%R��Q#$�?��F�$�1+Y��)�:�j͹BaC�M�x�('����iT�/�����ֻx����aر3nD��mI�Q�ʥ['�� z,�T�P���&U��iɓ)W�|3�̚�6��ժ^�X�j�
2W����u�H�$�eK֭e�x1l�g(��[�1hhW�mC���>�h��5-]�i#ۅ�T.f�q櫸��ˇ5w}:�(�iG�"�\ށ��Cy���^m��^-�'A}��"Lr/0�\�U�v�d�5�Wk��7���B!*�Ip!q�q�!҅h]v$��b�����=hn���p��x~>���9`w�XΑH�Ⓓ���o�I��rUB'u?j��#^شf���E�|4�W�,���߇o�7��Xa'xLdPޞJ�)c�6b��r;��%~0�y��k��	������r����"j�����X96,�����$�Qf�f~ι�%v�Y��І����^�M�	�p�Rٜ�o�
�ģ�c$1-��i)�5�g���Κ�u��ƹyE��
��^�3�xc��vh�2�
x�������l���p�����9u!-��Y[�f>�f��&{���@��К������۪����IÜ
��"I�.������z���j�C�J����WJ0�o�0�Ӭ�k�ѵNX�Ϩb<��ew,+� ���o���('�3�-˭qǶ9��G��#�
�=_�8�/3>4���pG7X���C8�v�:�p����YkG�tA���n�w�q���;k@��M���u�ͪƯ"�1�ǯ���y��)����O3�4�Nz�����k.,��z~��4�1�]��D� ��<�aJ^����І5|��]���l��w��نw=��V;��7���_[%<Xu�V?r�IX
��}t�����Y諕���w 6�0�9��������qE�B5�BC��O� ����N�̡�d��*�!	��"�~�*
⍃{� �0Q�*
DhC0�X�R/o�ا01C;��G���Ȕ�&
�~����@$�{T��x��G���`H?L��0E���U�]�wbrU�F���Unѕnl������Qv��0�Njq��s!1�WcⲊg�d&��ȟ�ω��(�3�� 	�0�6�M&vf�|\5v@�R*@0�*���g�.�`<���\�����>Y�ƁMo��<��cL9R?������3[�>X�R�A�\g��ɠ��!�g=Ĵ����a#�i�x�i�>��E=�_�ӗk\�?�h5Z�@��#z`���m) _h<L` ���!�pS�z�����0%�|����Mq��M�ԥ=���*��A��(kGu(���/�DS8v�
	rOD5�Q�K��NjU��jQC���Ve�!�֑*��A)��
V��#��#���֐O�k������b� 4� �,]�iW��s�„�=
 ��,R��ѥfv�t+%i�!���lVeёb�3�����_춏�%�H���r�M�}W�H����.u���^.���ȗB��Y���ڽj+-��6�G���xI��8�I���k/F�c�t}A<೮W�z���qlH�#V�Y	�R��������^�̹'CR@����Ŕ�qw1kb���Ƥ4�L`f4o�MkH��)P�	�$@���H����@!	@��XV�`�La�Wf`3x {�H���-����R���gFo��Kb6�R����J���vqC3�@>gpA)ѐT�X�>γVg�� `ֆ�:��O���Ͻ_��
��6����oz�Js)���;�!�?]�����dB�\���#��K����$$6�
�O�v��<J92|;�Y���ϥ[ө��
nO����2�:��u�~w��fX2U���F)/���;��U6{	�L����e^�?<�|nN~��a��(����qw<f,wyx�1rwk=�9-���=�렔G�ət5����e�:0qC^��:�a�j�C=�B�Bչg,��G�Z���G��0;�%��&���n7g��yk7��__��*>��&=�	��wћJ{���x��@��y�y
q>���_����Z~����//p>	��yު��^}���R8��&���
O���v��A���Wv�eg�Tߐ��{��|uWxB�kr|`eG�Gh
�t��g	s|֗;-�n��}��[��~�"�@}p~��~�~f?�iPJT��G��&5��@'��� &8x�V{�3}�r|�UE��?y5t����T^@N���Wn+h>-��R��͐�[���~�ӂt�0eH�(|v�U�G/Ƿ{vd=P�N8{C��wx�p8��4D
j����xl�7�[��X�<@�f�v��y���І���q�~g���&jː?�3��X��x��/LE�+�?:�P���o�&}x��_vD
i�
����%�Q�k'���=0��x����\hi�@��"`��ȁ'�u�x�pUPJW���x~�p��Ex�@�XJ7���Ȍ6(�ys� ��R�
�����hYRxi�Y���Xz稂�F�Ў�䘉��\i���p�oP"�r(��T��qfG9��.ُ	�3)��r
��v�)�
I�P�%�DYE�3����ژ�����"�P��@�$فߧ��eu-�/�s�4ww�X�P	ogHuS���ؓth���V�@
OIC��zɌKix�9��ԕy9�i�&9�+X�g��3��`��8���~�iH���j�0ɗn9|8�w�`�fHPe��<9�������vD,����mٌ���3曳iG���_	�������.5�Be@��I�a��'�I�QUEGPę����oi�^�f������ݹ����F����$:i��ɚ�9i��iOp��Y��9a��&�Y�ᱝ�ٙ�Y��r�0���_��鹖�x��8o�$��wvU����&:��	�iGr����	y
��6"6ZJ�#���H��qj'"z�ҙ�Z-	%sY�v��"j��ɖ2��5W#[`�YE#�0Хʼn�3���i0[�}�����?z�xctjH`ʣ��T�VJ���
���ꇨ�aiH�	\��_Z�aڞ��)~�`�3a�kz�2����g�}UE��"P�<�>��L�7Ъ4�E`��Ꝟi�䆕� ��¨�Y�S:��	s@����#��1y4���a
��C
�@��ڦ�x�q{�YJ�����ʐ�
�{@���G��J������&Ϊ+Ȋ���	W�-�\��Ӻ�o*�p	�G���
;��
��*{�vl�+���|��[E]�ᚬ����vnp.����������	�$Z�>��I#���H�
���uX���$�iP0�����hQ[J*{��ڨ���(�S;�/5�*�9�
PJ~�`+�^ʰ�����
f�tS�t+�N�󬞕�۲M{�$K|{kO<�a�c˶���!��,�$��H��A��†-ϴi�"2���1b i�d͎G8p���tI��1(��TM��mqb��͛8s�pha�%R��Q#$�?��F�$�1+Y��)�:�j͹BaC�M�x�('����iT�/�����ֻx����aر3nD��mI�Q�ʥ['�� z,�T�P���&U��iɓ)W�|3�̚�6��ժ^�X�j�
2W����u�H�$�eK֭e�x1l�g(��[�1hhW�mC���>�h��5-]�i#ۅ�T.f�q櫸��ˇ5w}:�(�iG�"�\ށ��Cy���^m��^-�'A}��"Lr/0�\�U�v�d�5�Wk��7���B!*�Ip!q�q�!҅h]v$��b�����=hn���p��x~>���9`w߁WΑH�Ⓓ���o�I��rUB'u?j��#^شf���E�|4�W�,���߇o�7��Xa'xLdPޞJ�)c�6b��r;��%~0�y��k��	������r����"j�����X96,�����$�Qf�f~ι�%v�Y'x�І����^�M�	�p�Rٜ�o�
�ģ�c$1-��i)�5�g���Κ�u��ƹyE��
��^�3�xc��vh�2�
x�������l���p�����9u!-��Y[�f>�f��&{���@��К������۪����IÜ
��"I�.������z���j�C�J����WJ0�o�0�Ӭ�k�ѵNX�Ϩb<��ew,+� ���o���('�3�-˭qǶ9��G�4x#�
�=_�8�/3>4���pG7X���C8�v�:�p����YkG�tA���n�w�q���;k@��M���u�ͪƯ"�1�ǯ���y��)����O3�4�N������k.,��z~��4�1�]��D� ��<�aJ^����І5|��]���l��w��نw=��V;��7���_[%<Xu�V?r�IX
��}t�����Y諕���6�0�9��������qE�B5�BC��O� ����N�̡�d��*�!	��"�~�*
⍃{� �0Q�*
DhC0�X�R/o�ا01C;��G���Ȕ�&
�~�����@$�{T��x��G���`H?L��0E���U�]�wbrU�F���Unѕnl������Qv��0�Njq��s!1�WcⲊg�d&��ȟ�ω��(�3�� 	�0�6�M&vf�|\5v@�R*@0�*���g�.�`<���\�����>Y�ƁMo��<��cL9R?������3[�>X�R�A�\g��ɠ��!�g=�ô����a#�i�x�i�>��E=�_�ӗk\�?�h5Z�@��#z`���m) _h<L` ���!�pS�z�����0%�|����Mq��M�ԥ=���*T��A��(kGu(���/�DS8v�
	rOD5�Q�K��NjU��jQC���Ve�!�֑*��A)��
V��#��#���֐O�k������b4� �,]�iW��s�„�=
 ��,R��ѥfv�t+%i�!���lVeёb�3�����_춏�%�H���r�M�}W�H����.u���^.���ȗB��Y���ڽj+-��6�G���xI��8�I���k/F�c�t}A<೮W�z���qlH�#V�Y	�R�����S��^�̹'CR@����Ŕ�qw1kb���Ƥ4�L`f4o�MkH��)P�	�$@���H����@!	@��XV�`�La�Wf`�c {�H���-����R���gFo��Kb6�R����J���vqC3�@>gpA)ѐT�X�>γVg�� `ֆ�:��O���Ͻ_���
��6����oz�Js)���;�!�?]�����dB�\���#��K����$$6�
�O�v��<J92|;�Y���ϥ[ӎ��
nO����2�:��u�~w��fX2U���F)/���;��U6{	�L����e^�?<�|nN~��a��(����qw<f,wyj�1rwk=�9-���=�렔G�ət5����e�:0qC^��:�a�j�C=�B�Bչg,��G�Z���G��0;�%��&���n7g��yk7��__��*>��&=�	��wћJ{���x��@��y�y
q>���_����Z~����//p>	��yު��^}����R8��&���
O���v��A���Wv�eg�Tߐ��{��|uWxB�kr|`eG�Gh
�t��g	s|֗;-�n��}��[��~�w �@}p~��~�~f?�iPJT��G��&5��@'��� &8x�V{�3}�r|�UE��?y5t����T^@N���Wn+h>-���Q��͐�[���~�ӂt�0eH�(|v�U�G/Ƿ{vd=P�N8{C��wx�p8��4D
j����xl�7�[��X�<@�f�v��y���І����q�~g���&jː?�3��X��x��/LE�+�?:�P���o�&}x��_vD
i�
����%�Q�k'���=0��x����\hi�@�x `��ȁ'�u�x�pUPJW���x~�p��Ex�@�XJ7���Ȍ6(�ys� ��R�
�����hYRxi�Y���Xz稂�F�Ў��䘉��\i���p�oP"�r(��T��qfG9��.ُ	�3)��r
��v�)�
I�P�%�DYE�3����ژ����� �TI��}jx
pPVג}�8��Hswg����v�T0�H�=I�8�ju
��4�.��̸����CYJ� �^9�i�&)�+H�f�3��_��8���~�iH���i�0��m9|8�w�`�fHPe��<9�������vD,����lٌ���3ƛ�iG����I�`��'�N�� ��Uٙji8UUt� ������v�E[`jPJ@����zy���Poě[iH2���i��i�������T�9�٩����A��׹����ۙr� ���_��䩖�X��8o�$��wvUP��Y��F���v$0��y�ʼn�/j0�����9�%Y���v�C��Z-	%rI�v������2��5W#[`�YE#�0p��9� :��`O�f*��ِ�i#vЦ�A��B
��٤䆕����~J�a��.	f� ����`�q������r�f:#(P�}���Z�z&N�WU �z��	yt���JC]P|ڧ	Z�N:���������竑�	s�ʡ�j�i��]	��8�@	�ʬ�*���������
��:��ɔ���?]p�@�����ʠǚ��b��*���W�'�\@�J�1٭����|�i	< ���ފ��jG`���gj�*y[�O��������vnp.�J�h��������Z�>ɥoiz���6ˢϪ��g�HB]��A���z�E{�$�L�%��������Ҳ&;�����4[��:��:�.j{�` PJ�05{���!*��jG+�sK�r��:J|nkO<P�V��.���$��!��,�$��H���|aÖgڴG
�BQ�1�2r�f�#8�B^�$HИ�JR*��IӶ80�|
g��͛8sf8�0OÇ'R���F�AJY���+Y���	���X�j]���O��$V�X��Ǝv>�d��J�S�|�BA�ݻ�te��؊5�M��d[�R�έ���]=�V��F��U���I�*Y��G&M���Y�jU/Z�b�R���T�N�:U�H�ٲ%��2a�6`�3�
��-J�4�+�����7��{՚��س��}*�޸��E�8r�Ø;{.}z��Ѡ�"V�g`Ax�@�*�G�z��W|�I@q����9ǟt���"�4Á(�Śk�� {�L�J|X8�}v�_t V�݈%�������k�v[n���[p7w_��Aףu?
ȝw��c䑰��$n���|Q���E7��Y~s�CX6���bz��ތ��'�}k�硛��(�<V�i ��g�}�Ha�⨜���(��c+|�Z/{����b�����i�Y*�G��vi�`&i�M�	%�j��\�W^��t��
m�zj��ʤ�O
G��U�&�?�q@<��V@�.ؠ���I�|�eX���V��h������`��(#�6b+��*�l�w ��Z�a�G\�f�a�	/��C�U�J���Y[��hn[�Vz�,
��	
D۫�*�m���-�4ȩ��w!�>�N�.��/�	�h�:p�4V�6�/�_Z�������[g��m�|��a�:�Ʊ���>h��6N�l2�</����W,�1�[�G�6�	��s���ܲ�A{�lwts��9!>��K��Q'(��U}uv�M�ADP����Y7��)�h������X>7ثb��]��&_��8���c���/{.3袃�A(�xO8�?,��#+��ԥ}MO�!�s��Xw)x
J^�3���w��v��4�
��nu[𪷣��j�Y��c�� ���*��G����t�On�+\�X6?��|�Ÿ��P����KY�x�82nhQ�]fH���c� �T��!p9��W�GE6$�Y�W�T�A�m0o�&�EE�( m��B��Mx�&dXG?���C٘��D�կqՑ��$C�����ڏ:�B
�Iؠ��b��4�ʀ����AD��ШB2�J-���,�_��4�����%�X�-�0c-&�S�[R���$�3�5qq�$uD	�$A���ูDN�̓���@J�#�HeU������w�k�0���*���i0�e��t�)�B*���G:���_>szd�)J�3�꼜7��w>D��w��bl4�:d�;�O7��а��|�R�*��6��`tuDB�`�}
������	䀔?8�l�Ҏ��fD;�����M��I����/�O���9ĕd�h�g��Sh�����)`�F(�B}yV�tqj�R`[+Z�R����C�*Re`�2 �<���Й~|�Zy����	u-]sz��:1�VR,c������:��[�vY�pAc������=*?=�T�&��m��W`"`���jl!*RL�C�uT������
i��RN��ȵ�J���sѝ��X@bX��f#]
\l+dBgת��lw��1���a�"�nd/�A����ͪ��m�4�q!A��@88�e�Jk��B��vX�?8�I$��H!�u�@�O��ܽ,�3�����K0�ͬݫ6� �1�@Q$��=�3vw�"S��$�<�"[ɂͲ�w�[�y̍yl�MhI�ӷvƥI)f��gޮ��ˀ2B_ �<@�������t��DCL�c��Y�����Xr��;�N�:�~�F�4@px��V����I*u�ˤ����S8��d5@��j��	D2l��:���1&m�:02�P�Dط�;-ڀ#��� ����o_9��f�7;wnL�dз�9nO[����SH�u�ݷ�w�_���J����D��w������R 	���K��C�9���#��'c���r��񗩜厡F�ٍ��㔰\/�0T�Ra
"W��Ѽj�{w9/�@�y@���rw���t@
�
Sߟ�t�3��i�o������ٗ�v
����|���-w]9p|���[�����%�)�ȫ�j@�>�?׵��$^{x@�c��'>��� T��$(��w�vӗ;��o�"J�|ѓ\�'�;9 !���O����s��#��:0�BB����|s7x@�kR|_UG�GH�t��gS|ԗ<-�n�}��[޷~��@}P~�w~�~F?�i@JT��'h�5��0'��� $x�6{�}�R|�EE���=�xt�b��T^@Lh��7n)H>+؂�Q���p�Yw��~���t�0c(�|t�U�'/ŗ{ud=0�L{Ax�Wx�p8p�3D
j���}Xl��Z��8�< �dhv��y���������oh~e���jː?��3��8�X���.K%�)A:�0���o�}x��_uD
i�
�؋��O�k'���?��X����ZHi�@�h 6P�X�Xr[���@'P�Tu�����&�\dwd��t���H��x7'P	RPH] �����MȌ�����@J �)��G�(Hi� �h ��x�۷\g���p��oБ��p��T���oVG9�*y����)�P	^XG_P���q�|�֏��?IE�30����x��S��"�� ��݇��Eu)�ɒ�/o���v�T�CɈg)��iu
���3�9���9Z=ɗ#4	N����R)�]��_�������9����D
-P}@�+��E9�B8�Rfl�Pd	�u�27�1����uD,��������،��	�YG�5�Y��y����꧙X��ˉ�͙�?8UTt���i�99�t��E[`j@JК�I�t��7��b�WYH2`��	�(���1�YO����a��&ة�B�J�zr�����_���Y���:9s�"��wuUP���ɏ;�	�YGr��y����
��5"(JJ��#���Ƞ�r��������~��$l�u�������%�0�*[`�IE#�0Ф�ٞQ���I0[�}����1Z�vcdZH`"��ʹ�!٠Lv��"��y�=Z��aYH�	L��Oڒ�'�j�I#n�`�3a�[J�^���ɦ�|EE��"P�.J����xY#Щ3�E0�t��~*nT	��+|j�\�,�	s`��J��
�_��u��J:�@	�
��z��
��I#{�YH��j�j��
{���G��:�����	�Z.�j�<*��v�����Z����&���`|�i	<p�Ϻ�����ZG`�� �]��G	y+�O���:�f���qn�/�:�Dʱ�����
�����hxx�`�*K�-p;��j�8B]��5�����9��#T�@[�ۧ�:i%1![�#������(������z�wi��` @J�0)����;���YIp����I��'���)��Qۘxz8V1!��,�$��H� �|aÖgڴG
�BQ�1�2r�f�#8�B^�$HИ�JR*��IӶ80�|
g��͛8sf8�0OÇ'R���F�AJY���+Y���	���X�j]���O��$V�X��Ǝv>�d��J�S�|�BA�ݻ�te��؊5�M��d[�R�έ���]=�V��F��U���I�*Y��G&M�M�,x��-V�Z�B��U*c�j��*R$	�lْuk�0^0�ʆx�%F�}��ű��ڽ�bMKl��v�>��o\���N�x�a˝9�.=Ju�4(��U�X=��Jy�ͦ^*����o�7�-���r���t�e�H6MPc��Zk����z�H�
|T(\}r�tRw��$������k
�fn���p7g��=�cu?�]w��c䑯���m���[|Q���A'��Y~s�C�X6���"z��ތ��'K}k�ס����<V�i ��g�}�8a�☜�����c+|�Z/{����be����)�Y*�G��zW�
��dmd6y&��ysm^i�r��6���a�,�f>\�S.W����x����]IH� �bV�'��чa��"J��z�a�c���炩���4�x!�֫���A���j���p�S�)�9*�0v�B1V]D;mk��vm�N��m��Z��4�[�&4 ��b�,��iv3�p� �#߅H��;i�0����*<D�Y�e�X��4��|���&|��3c��`p�������*��z��;�����8y���H��$��nK��l��� ��&�28����ˋ���1���U��t���nݫJ
����g5���w�]��_�˧�o�0�<����~�{�s9�a����w���k8�|M��<ʿj�-�R��̡���8�}�;>������w�S�5=��:�P��~׺K�kP��ٮv��#����l��w���؄g���V;��$8��x_Y�WupV>r�IX
��}s����2���X�U����6�0�9�����C��qD�B5�BC��O� ��'�.�ʙݽd��*�!	���|�*
ލ�z��0A�*
DhC0�H�No��01C;��G|_�Ƅ�&�~�����@$�{Td�x��G�~���`H?L��0E6��U�]�wBrU�F���Unѕnla�����Qv���0�G�q��s!1�7cⲊg�d&��H��ω��(�3J�� 	�0�6	�M&v�e�t\5v@�R*@0�*ո��g�.�`4���\�����>Y�F�Io��4��cL9R?��L���+�>X�R�A�\'��I����g=������a#�Y�x�i�>��E=�_�ӗk\�?�X5Z�@��#z`���s�m) _X<L` ���!�pS�z�����0%ک|����Mq��M�ԥ=���*���A��(kGu���/�CS8v���OD5�Q�K��NjT���jQC���Ve�!�֑*��A)��
V��#��#���֐O�k�S����b�4� �,]�iW��s�„�?
 ��,R��ѥfV�t+%i�!���lVeёb�3�����_춏�%�H���r�M�}W�H����.us��^.���ȗB@�Y���ڽj+-�]6uG���xI��8�I���[/F�c�t}A<೮W�y���qlH�#V�Y	�R��������^���'CR@����Ŕ�qw1kb���Ƥ4�L`f4o�MkH��)P�	�$@���H���o�@!	@��XV�`�La�7f`�] {�H���-����R���gFo��Kb6�R����J���vqC1�@6gpA)ѐT�X�>γVg�� `ֆ�:��O���ϵ_��
��6����oz�Js)���;�!�?]�����dB�\���#��K���$$6�
�O�v��<J92|;�Y��Nϥ[�v��
nO�����:���t�~w��fX2U���F)/���;��U6{	�L����e^�?<�|^N~�p	�a��(����qwf,w9^�1rwk=�9-���=�렔G�ət5����U�:0qC^��:�a�j�C=�B�B�g,��G�Z���G��0;�%��&���n7g��yk7��_O��*>��&=�	�gw�{J{@��x��@��y�y
q>���ߞ���Z~����o/p>	��yު��^}��V
���\?����qَ��}2���>��.q�Ё��|�Ww�'t��!�Vv�|D ���pN'y{�0�g}���F�gz�~��~ށ$��W�q�Wa�����D�}�7���kQs{�sRJH�"P���j�<�+�w[UlЀ@�s��QC�)GXJE�DЄ'�y如�Â.���̀�[���~�Ât�0c8�(|v�U�7/Ƿ{vd=@�M8{B��wx�p8��4D
j���}xl�'�[��H�< �d�v��y������!�ox~e���&jː?��3��H�h��/L%�+&A:�0���o�&}x��_vD
i�
�����P�k'���?P���&8������䀊ŠԸ�'�u�x�pUPJW���h~�p��Ex�@�XJ7��눌5�xs� ��R�
p���hYQx�h�Y0��x���\gȅ� �؍Y�Yx���9�p��oP����A�J�j�gv�,`�َ����r
��v�y��X����q�ȓU�Y0@����)�S!y(�Ɂ߇��eu%�'��B)�h{���v�T��@Ɉcɋ4���u
���4�&����t9p:��$4	K�My�PY�<��]�Vɑ�H�YYa�iH���`����r9|7�w�`�fHPe�|�8�5c[�	iG�(��5��H��B�Y�vY3��)��(���~�Y��Y��9a��&�QUEGP���bi�sI�^�f����������+y�E<�I��$3i��9�~ixӞ�T�I�Nّȉ�@3�թ���Йr�����_�������ݙ$��wvUP:����8�	�iGr��)��i��i�5""ZJ����9��q
�(4�6J-Q�$h��v��j��Ɏ��-�*[`�YE#�0p��	��	��Y0[�}`����y�,*vॆA��3ڜ�~�	�i9*;�f8�g	f�����`�b��*iL:o����;#�(P�o��Kʒ��}UE��"�(J��Y�x7p�4�E�oZ���s�}�+w��r����	s��ꠃ�����w��Z:�@	����*���z�����
��ڗf�4�*A]p� ����=Jni����y��u�������ʚ Zs�|�i	<�Ɋ������jG`�젯WJ�+j���U�O�������Nrn�/�j��������j����:�:#���H�J�z�e	<`�$j�iP0�):���t5[J���:������N1��(�SPJ~ �D���ʫ2��h PJ�0#k��*��ڛ��YI�;�ʪ�?+c\kO<0�E;���
Q1!��,�$��H���|aÖgڴG
�BQ�1�2r�f�#8�B^�$HИ�JR*��IӶ80�|
g��͛8sf8�0OÇ'R���F�AJY���+Y���	���X�j]���O��$V�X��Ǝv>�d��J�S�|�BA�ݻ�te��؊5�M��d[�R�έ���]=�V��F��U���I�*Y��G&M�M�,x��-V�Z�B��U*c�j��*R$	�lْuk�0^0�ʆx�%F�}��ű��ڽ�bMKl��v�>��o\���N�x�a˝9�.=Ju�4(��U�X=��Jy�ͦ^*����o�7�-���r���t�e�H6MPc��Zk����z�H�
|T(\}r�tRw��$������k
�fn���p7g��=�cu?�]ww�c䑯���m���[|Q���A'��Y~s�C�X6���"z��ތ��'K}k�ס����<V�i ��g�}�8a�☜�����c+|�Z/{����be����)�Y*�G��zW�
��dmd6y&��ysm^i�r�y6���a�,�f>\�S.W����x����]IH� �bV�'��чa��"J��z�a�c���炩���4�x!�֫���A���j���p�S�)�9*�0v�B1V]D;mk��vm�N��m��Z��4�[�&4 ��b�,��iv3�p� �#߅H��;i�0����*<D�Y�e�X��4��|���&|��3c��`p�������*��z��;�����8y���H��$��nK��l��� }�&�28����ˋ���1���U��t���nݫJ
����g5���w�]��_�˧�o�0�<����~�{�s9�a����w���k8�|M��<ʿj�-�R��̡�ޘ�8�}�;>������w�S�5=��:�P��~׺K�kP��ٮv��#����l��w���؄g���V;��$8��x_Y�WupV>r�IX
��}s����2���X�U���w6�0�9�����C��qD�B5�BC��O� ��'�.�ʙݽd��*�!	���|�*
ލ�z��0A�*
DhC0�H�No��01C;��G|_�Ƅ�&�~����h@$�{Td�x��G�~���`H?L��0E6��U�]�wBrU�F���Unѕnla�����Qv���0�G�q��s!1�7cⲊg�d&��H��ω��(�3��� 	�0�6	�M&v�e�t\5v@�R*@0�*ո��g�.�`4���\�����>Y�F�Io��4��cL9R?��L���+�>X�R�A�\'��I����g=�����a#�Y�x�i�>��E=�_�ӗk\�?�X5Z�@��#z`���s�m) _X<L` ���!�pS�z�����0%ک|����Mq��M�ԥ=���*Ի�A��(kGu���/�CS8v���OD5�Q�K��NjT���jQC���Ve�!�֑*��A)��
V��#��#���֐O�k�S����b�4� �,]�iW��s�„�?
 ��,R��ѥfV�t+%i�!���lVeёb�3�����_춏�%�H���r�M�}W�H����.u��"C��%�7���"@h�!�<X�Wm�e�����/	����7��}c{��z���.��|��7o���
	u��5+aYj�C�9��cXCX�J,��I!�v�@S���l�5�����K0�ͼ]�:4�!2�@Q$��=�svy̢s��$�Ld#[9Ƀ��y
ܘy�Z�l�MhI��vƥK)���g���,K�2B_(�<@�9�
�؏ٜt��DCL�����Z�����Xr�4�;�Ζ>�~���4@tx��^����I*u�˥����S�X��du@��j��	D2l��:���2.��:0�2�P�Dط�;=ڀ#���(����o_9��n28=wnLgdз�9nO[����c��u�ݷ�w�a�T�J����D��w����� eR 	���K��C�y9���%��'c���r�
�q����v�F�ٍ��細\/�0T��Ra
"W��Ѽj�W9/�@�
y@���r����@
�
S��t�3��j�o������ٙ��
�ݜ�|���-w=9pB|���[�����%�)�ɳ�j@�>�?׵��$~{x@�c��'>��� T��$(��y�vӗ;���K�)�/z�k���'�1d;��Ɉ�{.�#�ı3@�oHh���7w�t��!�Vv�|D��pLyy�0�G}���&�Gz��}��~���7�q�Ga�����Dp}����kQS{�sRJH�"���j�<�+�w[Ul��<�s��QA�)CXJE�D��#�y�f�僂*��@�YG��~���t��0]��
|t�U�7/ŗ{vd=�I{>h�Wx�p8@�4D
j���wXl��[��<��iX~_h��j�@��"8���y�8ː?`�3���y(��/Lň*&A:�Ѕ��o�}x��_vD
i�
�h���Ȅ�vN�3�����%�u�X� ���%Hi�pUPJUW��H~��o��Ev�@�XJ7 ��X���5|'P	R`H] �P�8����H��`�Y����f׉Wȍ��ר���\ah��p�oP��㨆=h�J�j�fv�,���X�����r
���v��ؑ�菈�i�H6�(�U�Y06��UȐ��9y(B��H��'��Eu���8i�2Ww�8�P	mgHuBi��Ȓ[Ixju
��4�i�𸄖t0�$4	A�C)���&�S�L��N��'��D
-P}`�y�k���7�vfl�PV)�Y�z�����vD,�����i_�X�e��iG�5����X��ِ.��K��X��8UUt�����hY��([`jPJЙ�ɗ��-��c�JiH2����	�H�j�)�iO�Y�)a��&Ɖ���M)�'_�
�u(��W)�ܙ��g@@
{gGPe ��1����	�iGr��Y��I�)�w#ZJ�Оj���D��():��9,_�v�����I���#�*[`�YE#�0���y�=*���`O�H��7y����`OjH`z��)����M6����G��	f@������S�� I>o����;#(p�`��
�x&N�WU ��ʡU���I�w�JC]P_
�h
�1��m�+�J���	s@�q�s�Kڝ\	�{Z:�@	���*�vʤ�{�YE����sy��J#{`��G��ꨡj��Z��*�iکWP����*�t����a|�i	<Э�
�ẫ{�vl�蚤��jٮ�������ʩ+�W���9i����:�ʣ�چ:# ��Hq�����$�iP0����:ih[J�Z���9�Բ�	1GK�����벨꭪ʱ�f�tSа?���z��)�v�I���J������EkO<а/K�7;�ĩ�!��,�$��H��>��a�3mڣ��i��E�H9Y��i /]$h�I%(�DӤi[��z>�+H��͛8if8�0C�%N���ƍ?JI�䘔*W���	���X�j]�p�χ�"R�X��F�v<�d��ʖS�|�BA�ݻ�t]��X�3�M�vd[�R�έ���]=�V��F��U�tdɓ)W�|'�L�M�,x��-V�Z�B��U*c�j��*R$	�lْuk�0^0�ʆx�%F�}��ű��ڽ�bMKl��v�>��o\���N�x�a˝9�.=Ju�4(��U�X=��Jy�ͦ^*����o�7�-���r���t�e�H6MPc��Zk����z�H�
|T(\}r�tRw��$������k
�fn���p7g��=�cu?�]wZ�c䑯���m���[|Q���A'��Y~s�C�X6���"z��ތ��'K}k�ס����<V�i ��g�}�8a�☜�����c+|�Z/{����be����)�Y*�G��zW�
��dmd6y&��ysm^i�rҩ6���a�,�f>\�S.W����x����]IH� �bV�'��чa��"J��z�a�c���炩���4�x!�֫���A���j���p�S�)�9*�0v�B1V]D;mk��vm�N��m��Z��4�[�&4 ��b�,��iv3�p� �#߅H��;i�0����*<D�Y�e�X��4��|���&|��3c��`p�������*��z��;�����8y���H��$��nK��l��� ��&�28����ˋ���1���U��t���nݫJ
����g5���w�4]��_�˧�o�0�<����~�{�s9�a����w���k8�|M��<ʿj�-�R��̡�~��8�}�;>������w�S�5=��:�P��~׺K�kP��ٮv��#����l��w���؄g���V;��$8��x_Y�WupV>r�IX
��}s����2���X�U����6�0�9�����C��qD�B5�BC��O� ��'�.�ʙݽd��*�!	���|�*
ލ�z��0A�*
DhC0�H�No��01C;��G|_�Ƅ�&�~�����@$�{Td�x��G�~���`H?L��0E6��U�]�wBrU�F���Unѕnla�����Qv���0�G�q��s!1�7cⲊg�d&��H��ω��(�3ʻ� 	�0�6	�M&v�e�t\5v@�R*@0�*ո��g�.�`4���\�����>Y�F�Io��4��cL9R?��L���+�>X�R�A�\'��I����g=�����a#�Y�x�i�>��E=�_�ӗk\�?�X5Z�@��#z`���s�m) _X<L` ���!�pS�z�����0%ک|����Mq��M�ԥ=���*T��A��(kGu���/�CS8v���OD5�Q�K��NjT���jQC���Ve�!�֑*��A)��
V��#��#���֐O�k�S����bk4� �,]�iW��s�„�?
 ��,R��ѥfV�t+%i�!���lVeёb�3�����_춏�%�H���r�M�}W�H����.uk��^.���ȗB@�Y���ڽj+-�]6uG���xI��8�I���[/F�c�t}A<೮W�y���qlH�#V�Y	�R�������^���'CR@����Ŕ�qw1kb���Ƥ4�L`f4o�MkH��)P�	�$@���H���o�@!	@��XV�`�La�7f`3V {�H���-����R���gFo��Kb6�R����J���vqC1�@6gpA)ѐT�X�>γVg�� `ֆ�:��O���ϵ_���
��6����oz�Js)���;�!�?]�����dB�\���#��K���$$6�
�O�v��<J92|;�Y��Nϥ[�X!����q��^�>V��C����ε��K�jV�(�0r�[��f/����)ӐXx�m�'����.A0�<$��7n��l�-�K ܝ��細]?�0V��Ra
#_�����W9/��
y@��r�1���@
�
T��t�;�j�o���e��ٛ�v��1	<�5�[�w�����[�'؀ߢ�����.zO)�H�/P� �2:�!��0 ��s�z����HS�o/h~���ӟ[���K�2D_�w����8�lG�~������j{���7$4z����}�A�kb|`eG�G��|
�t��gc|֧<-�n��|�q�Wa=�~��}&�u�2�iPJT��
|t�U%;0'��� ���pH|�b|�UE���-�tZ�t��7@XJE�D`� h~�5��S�'�8z�W���9%H(�3�9���F{QSƧ{vd=�	 �>���<K�!'�AHCԠ��s����
�U)��N�}`�[�x��Wn(%aX ��u腓�ː?0�3��H�.��gw&��+&A:�`�t({iȃ�Wx' �eGԐ�Ј���gY҇!'���?���0����Xi�F�h �hv��yVx�pUPJV��x�G�j�J��E�XJ7����X�z�7'P	R`H] �P�H�H8iJ�g�h�Y���H��x��hi� �H���
	���'�����,x�x��85�R�qfG9���hp"��r
���v��ȑ��ȏ�ŀѧ_�H�U�Y08ɌS�����y(R���\��S�Uu��:i���P	mgHuD���8�\y�r
��4�i��؏�Փ'�nIB�0��P�)�P��8�U�Nم��N�iH���Xّ�ؒ�7ovf l�PX)�[��h#[�	iG�(�,9��Hx�T��iG�5�y�����T9$�I��	4�QUEGP��ZI�3Ww�f����	�}ٚ 钣��ɔ�$*i���	�<)�ԝ�T�y�FɅ���I�u�H������_��ə�����i��"��wvUP�9���j�	�iGr��)��|�	�5"ZJ�*�홐�i�M���B��j��aiG p\���)�☝�Is4�vp�U4n4z�g��ͩ��`O�Cz�9I��h�cKjH`
����X��$.:**:�,	f ����0�Oj�Y����a��;#( �\Z�r�TJ!N�WU |j�Q��ڃ�JC]P[ʥ#
�v�i�+e
��	s�mʟo��
���	�wZ:�@	{J��꧲���*{�YBx�|ڧs��Sz�4��IB]p�Ы�z�_�����ҩ�zWW ����ڟp��
�r|�i	<�����i�{��vl��J�����	�j�O��*���J-�	W��"����ި���y����:#�~Hm�j��<Їƚ�{��菈�����$���j��Vi	10{r;F���۲�ʭ�ʱ/�lb PJ�0
۳��먡�YI���
��zl�*pDkO<а.���ӊ881!��,�$��Hp�>��a�3mڣ��i��E�H9Y��i /]$h�I%(�DӤi[��z>�+H��͛8if8�0C�%N���ƍ?JI�䘔*W���	���X�j]�p�χ�"R�X��F�v<�d��ʖS�|�BA�ݻ�t]��X�3�M�vd[�R�έ���]=�V��F��U�tdɓ)W�|'�̬M�,x��-V�Z�B��U*c�j��*R$	�lْuk�0^0�ʆx�%F�}��ű��ڽ�bMKl��v�>��o\���N�x�a˝9�.=Ju�4(��U�X=��Jy�ͦ^*����o�7�-���r���t�e�H6MPc��Zk����z�H�
|T(\}r�tRw��$������k
�fn���p7g��=�cu?�]wX�c䑯���m���[|Q���A'��Y~s�C�X6���"z��ތ��'K}k�ס����<V�i ��g�}�8a�☜�����c+|�Z/{����be����)�Y*�G��zW�
��dmd6y&��ysm^i�r҉6���a�,�f>\�S.W����x����]IH� �bV�'��чa��"J��z�a�c���炩���4�x!�֫���A���j���p�S�)�9*�0v�B1V]D;mk��vm�N��m��Z��4�[�&4 ��b�,��iv3�p� �#߅H��;i�0����*<D�Y�e�X��4��|���&|��3c��`p�������*��z��;�����8y���H��$��nK��l��� ��&�28����ˋ���1���U��t���nݫJ
����g5���w�4]��_�˧�o�0�<����~�{�s9�a����w���k8�|M��<ʿj�-�R��̡����8�}�;>������w�S�5=��:�P��~׺K�kP��ٮv��#����l��w���؄g���V;��$8��x_Y�WupV>r�IX
��}s����2���X�U����6�0�9�����C��qD�B5�BC��O� ��'�.�ʙݽd��*�!	���|�*
ލ�z��0A�*
DhC0�H�No��01C;��G|_�Ƅ�&�~�����@$�{Td�x��G�~���`H?L��0E6��U�]�wBrU�F���Unѕnla�����Qv���0�G�q��s!1�7cⲊg�d&��H��ω��(�3J�� 	�0�6	�M&v�e�t\5v@�R*@0�*ո��g�.�`4���\�����>Y�F�Io��4��cL9R?��L���+�>X�R�A�\'��I����g=�������a#�Y�x�i�>��E=�_�ӗk\�?�X5Z�@��#z`���s�m) _X<L` ���!�pS�z�����0%ک|����Mq��M�ԥ=���*T��A��(kGu���/�CS8v���OD5�Q�K��NjT���jQC���Ve�!�֑*��A)��
V��#��#���֐O�k�S����b�4� �,]�iW��s�„�?
 ��,R��ѥfV�t+%i�!���lVeёb�3�����_춏�%�H���r�M�}W�H����.u��^.���ȗB@�Y���ڽj+-�]6uG���xI��8�I���[/F�c�t}A<೮W�y���qlH�#V�Y	�R�����s��^���'CR@����Ŕ�qw1kb���Ƥ4�L`f4o�MkH��)P�	�$@���H���o�@!	@��XV�`�La�7f`sN<p�H���-����R���gFo��Kb6�R����J���vqC1�@6gpA)ѐT�X�>γVg�� `ֆ�=��O���ϵ_��BP;˓���������B����֟��rb�R2!�H�U}��xƥ�VQF��n��GpE[���mI細&��̭i�$�۞F6���MOr�N�`�!O�mv��k�%S5+	n��ȷ��k�'�����LC
d�;���Q�h�*Z�� Ƞ�[��]��P�r����^��3n�a�\�<�t�t�:�%~�:qC^��x�W�g^7�B�B�g =�o����G��X7�}�&���go�׭.v����pB|���[�v�z�w0�ɳ�j@���n�;���0`��s����[�>��R�o/(��C��g����'oq�b����8�lG�>��<��o���>�@�
	
���<��eٻV߃Վ�G��~�7iɷx�{Χ<-�n��}W�[��S�G~x1}aW}�Wa�����D}���f�&s��sRJH�"P|&�{��w?+�w[Ul �2H���t�U���T^@?��'��ׁ�Hy�gy(%H!�3�28��kQ�~E��gG��}�K�z4(��wr8��4D
j�����z��Q��#)P�G�}�}H}ᶁ�fY�X S�}��Xː?��3��؇��op�E*hb��b�=P^؆��s�H' �eGԐ�p�|h���vN`��3�����}OX䀉b�M���H'P�4u�ȉ_�'�v�7��Q��t�����r�g��w� ��R�
@��X���@���PJ ��H�m���Gr�(�،L����S�pP�oP���X���J�j�gv�,����8��r
�������8�A�|��)�h�v�Y0*Y����	�Wy(�	�<u
pPR��}�ɒۨ{�/���v�T`�*���")�@
2YE��YY�-i�/�%YJ�P��p����:)�xE�F�@9�V�yviH���I)����sPi�`�fHPe��eɔ��[�	iG�( �����o-t��iG�5�鏉(�Yi.՗?���jh8UUtЙ�����p�E[`jPJ������w!���铆$�����B蜝��Y���8�yA����d��i�੗�8R�
�u(��JY�[ٜ�@
ugGPe��9��ɋo���$��Թ�~x��x7@���韜��Y��-��(y9��&RI�v���������*[`�YE#�0p����+
��G[�}`�ʹ���
Z0vࣆAП���w��H����ҡꚾa�hH�	&*�)J�9z�c�*I�`�3a�5��8�\��N�WU o��D
�*�vJC]PN��ʚYJ��������S*�g�	sPJ���)��	�:�.b
���C
�ঙʧqڊ��{����y��pj�Jg���{P��G��ʧ�J�����@���jW�����
�cJ�sZ��痖�ъ��Z�G	{��vl��z���;:!�ڎO��z���š�-un�/�J-��	lP����**��`gx����e���ivHB]����
��[�$����ʯ	���#WiPJ~�#��Һ�8ˍ��
f�tS �4˭�z��Y���@+�C���D����K�C��h�;��!��,�$��H��>��a�3mڣ��i��E�H9Y��i /]$h�I%(�DӤi[��z>�+H��͛8if8�0C�%N���ƍ?JI�䘔*W���	���X�j]�p�χ�"R�X��F�v<�d��ʖS�|�BA�ݻ�t]��X�3�M�vd[�R�έ���]=�V��F��U�tdɓ)W�|'�̜M�,x��-V�Z�B��U*c�j��*R$	�lْuk�0^0�ʆx�%F�}��ű��ڽ�bMKl��v�>��o\���N�x�a˝9�.=Ju�4(��U�X=��Jy�ͦ^*����o�7�-���r���t�e�H6MPc��Zk����z�H�
|T(\}r�tRw��$������k
�fn���p7g��=�cu?�]w8�c䑯���m���[|Q���A'��Y~s�C�X6���"z��ތ��'K}k�ס����<V�i ��g�}�8a�☜�����c+|�Z/{����be����)�Y*�G��zW�
��dmd6y&��ysm^i�r҉6���a�,�f>\�S.W����x����]IH� �bV�'��чa��"J��z�a�c���炩���4�x!�֫���A���j���p�S�)�9*�0v�B1V]D;mk��vm�N��m��Z��4�[�&4 ��b�,��iv3�p� �#߅H��;i�0����*<D�Y�e�X��4��|���&|��3c��`p�������*��z��;�����8y���H��$��nK��l��� ��&�28����ˋ���1���U��t���nݫJ
����g5���w�4]��_�˧�o�0�<����~�{�s9�a����w���k8�|M��<ʿj�-�R��̡����8�}�;>������w�S�5=��:�P��~׺K�kP��ٮv��#����l��w���؄g���V;��$8��x_Y�WupV>r�IX
��}s����2���X�U����6�0�9�����C��qD�B5�BC��O� ��'�.�ʙݽd��*�!	���|�*
ލ�z��0A�*
DhC0�H�No��01C;��G|_�Ƅ�&�~����x@$�{Td�x��G�~���`H?L��0E6��U�]�wBrU�F���Unѕnla�����Qv���0�G�q��s!1�7cⲊg�d&��H��ω��(�3J�� 	�0�6	�M&v�e�t\5v@�R*@0�*ո��g�.�`4���\�����>Y�F�Io��4��cL9R?��L���+�>X�R�A�\'��I����g=s������a#�Y�x�i�>��E=�_�ӗk\�?�X5Z�@��#z`���s�m) _X<L` ���!�pS�z�����0%ک|����Mq��M�ԥ=���*T��A��(kGu���/�CS8v���OD5�Q�K��NjT���jQC���Ve�!�֑*��A)��
V��#��#���֐O�k�S����b�4� �,]�iW��s�„�?
 ��,R��ѥfV�t+%i�!���lVeёb�3�����_춏�%�H���r�M�}W�H����.u	�"C��%�7���"@h�!�<X�Wm�e�����/	����7��}c{��z���.��|��7o���
	u��5+aYj�C�9�pN�a+Y�ޜ�!)� ӎA�B��b�¸��-�f�ScRr�	&s���U��5�@�(ꁄR�r�.�Yca�C��D��l�*'y�X�0O��.9'F�#���"��.e��Kf�#N�,�I|��K�<<�7c?ds��
 ��#�c;ku�:^m�x�ʎ�t;[�\��Z+��2���dpz�^.������tqVI�����dB��s�X��V�y=�2��D�w��KlB����V�Q����v�9M�-ܗ�J������0�c��A���1�׭�.G�(�@o���ϵ�:�)Ӑ��=���8���%2�|��n��A~,���.P�8�?�I�\�<�j>�{�����.s@�"$(�����WUX:�����}�F7t��с�7��(w�5�u���w��+o}�]��[�'؀�p������Oi�H�/P� ����p���zߞ��~��7����~{A����^�m;��y�<�.q�?���8�lG|>�g~��G?{w�9��
	�ֿ��7?{���ۃՎ�'��?�+^�@v{ǧ<-@n�x��qL�u�}�Gy��|��y/����D�|��fkJu~�sRJH�"�{hvgfY��7�w[Ul�*�D�·U��T^@7���[G��c��ͧ�Y�x�b�t��0͠�+({�Vz��T=��gG��}�C{䷅ews8 �4D
j��`�ho��sl�!)�?�}p�w�N(i�&RX Mh�������T8� �w8~馆]ԅTӇ*&A:�p�g�� ���s��_vD
i�
�h�+��.�k'���?��`��G�����W�����5�PH�pUPJMG����8Ȃ+�v-牥t�8��-�clx� ��R�
����xF��PJ ��؋g��x��x� �x��(a��9�p�oP���؁ը�!ȉ�r�nfG9�ɎY���H6�P	KhG_��
I�혃7B�#YE�3p��H�Q���w��"�H��8��t�
��)i���J�"(�P	�gGu3y���ɒ�p
��4�i�ߨ������^IB� ��@���xև�<�C�=I-��RtiH���F鐖ؑ�8�Mi�`�fHPe`�b��ɒ[�	iG�(�Y��(�-T��iG�5�����ȏ��<9�x)�@8UUt������y�hօ[`jPJ�ٖ�)z�������$y��9�Eǜ��Y�y�5y�K&��D���)��Y�	O�
�u(��G9�X���	/@
gHPe����Y�ot��$��ҙ�xX�fI! ���ɟ�؝������(�IqM��QYE p\О�)�Ԩ���r��vp�U4n$z�W��8��`O�3��(I�:��5b;jH`�)��	{ʡ档���7>�`�hH�	#��&
�6*\H#F�`�3a�2ʤ5����}UE��"������pZ#0�4�E��LJ���z�Y��O�Z�-�	sPJ��饼�7���a
`��C
������mj��J{���5�v��l:�7�}��)A]p��yj�	��	��B�yyS�����_*�Y9���{|i	<���
����{��vl��J�����
(�z�O��:��������-W��"�r�	l�����'�)��3ba����ڟa���$�iP0p�
||
�
[J�:�����ٮ>�S�1�ʚ�����ʱ�������h~�` PJ�.0�ڲ�ʬo
���YI���
���e	�4kO<����Z��
�(1!��,�$��8��Cذ�6�CC��H�"F����������.	4����J�iҴ-�K=���I��͛8f8�0�†#J�xRF�=J9���)U�|�	���X�j]qP�O�� N�X�Sƍv:�d�jJ�S�|�BA�ݻ3�tU��؉1�M�Vd[�R�έ���]=�V��F��U�T$I�(U�t�L�6��Y�jU/Z�b�R���T�N�:U�H�ٲ%��2a�6`�3�
��-J�4�+�����7��{՚��س��}*�޸��E�8r�Ø;{.}z��Ѡ�"V�g�Lx�@�*�G�z��W|�I@q����9ǟt���"�4Á(�Śk�� {�L�J|X8�}v�_t V�݈%�������k�v[n���[p7w_��Aףu?
ȝwC�c䑰��$n���|Q���E7��Y~s�CX6���bz��ތ��'�}k�硛��(�<V�i ��g�}�Ha�⨜���(��c+|�Z/{����b�����i�Y*�G���V�
���md6y&���_sm^y]�r�9$6���a�,�f>)\�S2W����x���ZIH�`�bV�'��՗a��"Z��z�a�c���'�����4ڈ!�֫���A���j���p�W�i�9*�pv�B1V]D;�k��vm�N��m��Z��4�[�&4 ��b�,��iv3�p� �#߅H��;i�0����*<D�Y�e�X��4��|���&|��3g��`p�������*��z��;�����8y���H��$��n[��l��� =�&�28����ˋ���1���U��t���nݫJ����g5���w�4]��_�˧�o�0�<����~�{�s9�a����w���k8�|M��<ʿj�-�R��̡���8�}�;>������w�S�5=��:�P��~׺K�kP��ٮv��#����l��w���؄g���V;��$8��x_Y�WupV>r�I8
��}s����2���X�U���7$6�0�9�����C��qD�B5�BC��O� ��'�.�˙ݽd��*�!	���|�*
ލ�z��0A�*
DhC0�H�No��01C;��G|_�Ƅ�&�~�����"@$�{Td�x��G�~���`H?L��0E6��U�]�wBrU�F���Unѕnla�����Qv���0�G�q��s!1�GcⲊg�d&��H��ω��(�3JG� 	�0�6	�M&v�e�t\5v@�R*@0�*ո��g�.�`4���\�����>Y�F�Io��4��cL9R?��L���+�>X�R�A�\'��I��� �g=봴����a#�Y�x�i�>��E=�_�ӗk\�?�X5Z�@��#z`���s�m) _X<L` ���!�pS�z�����0%ک|����Mq��M�ԥ=���*�:ɕe��wW�sh���A�)��F0�B�V�x�j�Z�[-j�Rժ�#D�:Re`�2(�<�����#[y����	um]u�8�>Q�VR,cG^���ko
�da���^H����R1�@���4\�
�`]�R6����H1Q���Q
|(�/t�G؎V�
c�J9��f,K���~��1�Kߕ2r�n.t����!���{�VVv�l���p	, †͛T��Q��b=VPJ�w�
>+z�ʘƆ�:�`V��\�!�
[xTEα���MO6N@���cœm�v/���GƤ4�L�e0c��MkH{�)P�	�$@�l])����į�@!	<y�f0r�MG��X�2�`$7���EV�K�e�~��a���,K�2B_(�<@
���
���t��DC<��E�8�Z�����TrD����)_ڷvƦ���J����5_�\�?x!$p5���ᬂ���9�JɄ"��ph�VA�ze$����OϷ��hzI�ȣ�# h#田��-�\U���&��a�'0Ɛ�[x���bQ����e�$�Q�<��#��>k�u�O�!2���}1�m��|Kd���)�q�*y����#v�8�VF�uP�#L�>��y�}��-D)�A���β:~�P���
�y��@�Y�u?vn�W}�zַε�'���)���*>��f��C
���|Jg@��x��@�����
쁋4����$ ���;��<�@��Bn��;�W�|^'_y�3��TvtO9  ���O���Orγ�]�O��:�{CB��ǽ��w�#�`�#퉐~��}�w�a|����gxχ|чi�B}֗4��h�m����D0|ڧ~�kJ~�sRJH�"p{(vbVY��7�g[Ul@$h?���U���T^@1(��x�We/�8H-N'���t0�0�@�%�z��y��T7��gG��}�=�z�W�%ws8��4D
j���o�Gsf�!)��9�}�q�p~�qX�-L�;G�l
hXː?�3�|���Gnd�EWH5whb�=PQ����5(<' �eGԐذ�pX�s���vN���3z��X|~p��|�A��<�hi��C�pUPJH׈�(�2h�&Gv(w��t�����~'�cfx� ��R�
`��xG�sƍ�PJ ��h�a��֖��w� ���ɧ��p��oP���x��H�X���ifG9�I�S8��H6�P	EhG_ �ى�8���7YE�3��H�<���?���Jx
�pPG7�}P����y�/���u�T����	i�$i�@
'IC�A�My�"�Zt(LY�$4	*�,�5	�x��:�6g	yB���D
-P}Г��)�I��f�k�P=��@��$����vD,��I��؊��B�	�v�X3��؇m���4���mP8UUt�v��y	�cv�[`jPJ0�uI���yz��9��$���Ɋ@�� ��Y�ə-i|/閎�����?X�g��_����x����9��"�pp�UP�y��)���F�YJr��i��)��ٕ"�iH�����)�MG��Ý4��CF��v��๛wɌ�)�'�*[`�YE#�0p���:s�Y0[�}`��	��I��Y#vࢆA�ڙ����l��U���`�hH�	*���)�~VH#9�`�3a�%��(*�幢�}UE��"�I��ٟdZ#p�4�E�?z�HJ�Kڤ
J�H����	sPJ���)���*�ڡ�a
���C
�ॉڦa����z���Ղj��`���f�q��)A]p� �m���j��F����
xM�����Sz�Pi��{qi	<Ы�J���{Нvl��z��J��
(��O��z��i��*�-unPJ��I��Ȩ�:�⩡bʡ�8#��kHP��Y��x��`jHB]��������	��������j������SPJ~�����������
f�tSЮ ���:��Y���,�3���ȕ�y����
�3
�����
kH!��,�$�����Cذ�6�CC��H�"F����������.	4����J�iҴ-�K=���I��͛8f8�0�†#J�xRF�=J9���)U�|�	���X�j]qP�O�� N�X�Sƍv:�d�jJ�S�|�BA�ݻ3�tU��؉1�M�Vd[�R�έ���]=�V��F��U�T$I�(U�t�L�6��Y�jU/Z�b�R���T�N�:U�H�ٲ%��2a�6`�3�
��-J�4�+�����7��{՚��س��}*�޸��E�8r�Ø;{.}z��Ѡ�"V�g�Lx�@�*�G�z��W|�I@q����9ǟt���"�4Á(�Śk�� {�L�J|X8�}v�_t V�݈%�������k�v[n���[p7w_��Aףu?
ȝwC�c䑰��$n���|Q���E7��Y~s�CX6���bz��ތ��'�}k�硛��(�<V�i ��g�}�Ha�⨜���(��c+|�Z/{����b�����i�Y*�G���V�
���md6y&���_sm^y]�r�9$6���a�,�f>)\�S2W����x���ZIH�`�bV�'��՗a��"Z��z�a�c���'�����4ڈ!�֫���A���j���p�W�i�9*�pv�B1V]D;�k��vm�N��m��Z��4�[�&4 ��b�,��iv3�p� �#߅H��;i�0����*<D�Y�e�X��4��|���&|��3g��`p�������*��z��;�����8y���H��$��n[��l��� =�&�28����ˋ���1���U��t���nݫJ����g5���w�4]��_�˧�o�0�<����~�{�s9�a����w���k8�|M��<ʿj�-�R��̡���8�}�;>������w�S�5=��:�P��~׺K�kP��ٮv��#����l��w���؄g���V;��$8��x_Y�WupV>r�I8
��}s����2���X�U���7$6�0�9�����C��qD�B5�BC��O� ��'�.�˙ݽd��*�!	���|�*
ލ�z��0A�*
DhC0�H�No��01C;��G|_�Ƅ�&�~�����"@$�{Td�x��G�~���`H?L��0E6��U�]�wBrU�F���Unѕnla�����Qv���0�G�q��s!1�GcⲊg�d&��H��ω��(�3�Q%A��&���N�쓎��PJ�#�P�W��L����� w�k�0��'+�(0�mP�f��t�)C*���G:�	=`B�ze#�)Z�3����9	�wBD��P��jr��tg���&y��@~�O_�q���b�h��ΎH������|a�0�����0BMS�Q3�Ìh�v��R"B4�)77�Ӗ��C�)PGŋ�rT��+��94e�c܈ � T#U��4�{�H5z-��5d��JՅ��i�20a�R|p�_U��?�Q�<�i
����U��+��DqZ鰉5�m�
ؕ
և��&\�X�i !��c��O�&��
� [)I�؀��ld��Z�������Hw�I��ͫ0�~����{��W%2r���\�����0r!�m�,@B@��B����,��#F`��$\�P��V���-oh��z���.ho����ւ6�,vq)A��@T��sũ���`8�¥�J���CR@������Űu5,ˀ:�Ť4�L`e,_��)�q��
�z ����A�ߋ[gzT�8�($�fC�8��s+�&��Q٠��MG�T�P�r��+[��Vmha�T�~Y_(�<@
��(&���t��DC*=�:�U��]q�jC����[C{�M�Nڰ���o�[H�!����ԗ>1C��e�2���A)��@$�&���s�gW��$�5�m�_(�֚��k��y�rd µ�}of7Z��mN�%��e���%l��C�N�׮w��|��nز��F)/�sg�����0�܁ ����ONg�j�+_s�Zo	��&����vF\h�����N��P�A)�0��<��ͷǻ��~��H	���Lcl�Bz�?+0`�W'��ъ������>t[��O�O��������[�'��b'����nO��H�/P� ��.{��g���lߞ����r�9�M��o/p�؅.h���.U<��;���8^lH<>�߽�'?zns��@�
	����(W���Ѯ��{Վ�'��_k���k>��ׂjG��/���I�3��Wh�W?�iPJT��}�m�'Y[�@0'��� �׀X�ei�nysz�UE�ꗁ�Ws��~Ye XJE�D`��Wx��hh��C�h�RR�t��0͐�(z�Vy�q��yvd=�	 ��G}G�P�!'�!HCԠ��Qx�{�w�Z�<�C(��5�p��ۣ�	flŲ��@8�Іb8}�V��/J�� &A:�0�R�(�)'{�'' �eGԐ��a��d؁9G�N���3k���{ohs����C{�?vh\��!�pUPJ?�H�'���u݆��t�؋�~Ywvx� ��R�
����~)(�x��cYP��(���_�8��@���w8��p��oP���Ȁ�h�H�e'�afG9��h�EH�*�)�P	hH_@���׈��U�+�iG�3�8��H����@B��l6x
`P>7�}P����Hy�d��� u��T��ى�h��x!�@
YE�A�=��_A9	Y�44	�)�}NJqhW(���S��2[iH���-i��X�����fk�P-��0��M����vD,�uI������Bz	�v�X3���WI�Y	�)IC^	xP8�TUt�g��j�[�i[`jPJ0�fI��)yk�z9��$��v��w��YO@��ّ�W��'�����;�86�
�u(�.��?���	/@
�fHPe��9��	���	�iGr��i��9����@������` �M�iG�y\6��v��Ϲ�h鋮�w)[`|YE#�0P���	���Y![�}@��	���~�hjH`�I��	z�d��C�iH�	`�`�hH�	
�����HH#&Z`�3a�ʢ:��)�5�{UE��"���)��ٞY!0�4�E��,j����&y&7�����i��0�ɣ�飠	�*��b
`��C
���u��M
�yʌ4��%�V���L���ƥP��)A]p��Yj�����	�rjH�P�?s?����
�?z�@Y���zbi	<���
�x٥{��vl��Z��J��G!��O��:��i��
��zn�l@�f�	l�������
���`Lȅ����Aʁ�i[HB]��麞�'��$�����ϊ����4�\`������گuʪw���h}f�tS��{������v�I�������ف[O<�����������t���!��,�$�����!l��L����!CZ"j#�EN��h�G��K�	CR�I%�4i����O�ʜI��͛73:�G!C�#R�	cƍ��Ir�I�)Y����ΫX��\a0�φ�J�H�F�v8~\��)ʕR�|�BA�ݻ3�tM��X�/�E�6dۧQ�έ���]=�6��E��M�4�Ȓ'S�l�eL�6��Y�jU/Z�b�R���T�N�:U�H�ٲ%��2a�6`�3�
��-J�4�+�����7��{՚��س��}*�޸��E�8r�Ø;{.}z��Ѡ�"U�g�Lx�@�*�G�z��W|�I@q����9ǟt���"�4Á(�Śk�� {�L�J|X8�}v�_t V�݈%�������k�v[n���[p7w_��Aףu?
ȝwC�c䑰��$n���|Q���E7��Y~s�CX6���bz��ތ��'�}k�硛��(�<V�i ��g�}�Ha�⨜���(��c+|�Z/{����b�����i�Y*�G���V�
���md6y&���_sm^y]�r�9$6���a�,�f>)\�S2W����x���ZIH�`�bV�'��՗a��"Z��z�a�c���'�����4ڈ!�֫���A���j���p�W�i�9*�pv�B1V]D;�k��vm�N��m��Z��4�[�&4 ��b�,��iv3�p� �#߅H��;i�0����*<D�Y�e�X��4��|���&|��3g��`p�������*��z��;�����8y���H��$��n[��l��� =�&�28����ˋ���1�эU�_u���nݫJ����g5���w�4]��_�˧�o�0�<����~�{�s9�a����w���k8�|M��<ʿj�-�R��̡���8�}�;>������w�S�5=��:�P��~׺K�kP��ٮv��#����l��w���؄g���V;��$8��x_Y�WupV>r�I8
��}s����2���X�U���W��0��S��z��6�hQ�]h(��c�`�d@�%p9����GE6$�Y���T���qPo�&�EE�( m�	����mx�&fXG?���K٘��Ġ��qՑ"�T=&2|<L�#�x?�xM(�&a�F���
ت���;!9*B�
I�*���6��zp��JШ:�cw�ܣŶ�B��0�ţ�0kI�3$!���!#5�2NB�̕),�DE�l~Md��:Y�@�
PGLq�4����s�
�A��Ԥa>rY�T�Q`���3���S�T�B��q*z�l&��F�>T�g�>,��mh�|"��Ns����<)��94��Ј��z�R�+̧����tuDB��S{������	�@�?8���R>2ӏodh�v`UQ"B�*9	g�%r�~�t�Ms�ҵbN��D)\U
�p#��S�N��ӂ�\l�P�@�B����iS
�G�S�<„=d Jy�j�(��jY�z���-��ʋЖ�2�!M?�׿�F��w]$����uZ	.,�4��?�gF�J5�z�����
l@��N��P�B;��z���j�C��Z$V֍�UXw? �	�`���-�b�ۙz.Y���C��W����жB ! �u
T|v��
�#0].�DP0r��J�F5��c=V J�W��jF�{��X� PG _��W��Mg�0�����m�7�8!��u�@
_���}0�����K0���`�z�Ŧ�(�Q�[&/QEZ�X�V��D��@$�5mu�9?��H���ۚW��ТTrq����>����b#�I|A�K��eGw8���C��
X4��|�_��@��9��y~-��I�u"�kk&tlul�Y��BH��Fs����+
Ui��	D2��aʶ�բ�RAF���f�/R������<D92�ٸf����gb�؁Y����^��	�)����lu?��Pe�+	n���v�;��V;�ͤ���iH��{�j�2����0w�� Ƞq�X�A�u#Sʜ �t�q�y�s��S�8ʻ�]H�G�|��/�R$�K��1��	�
1�p��|�_�z�:vZ ��̓�o^�	F�ʅ=�r�	ߥ�l��g��[�ԧ$u$���	D`xnk��Ns�S���o�@*��{|�����
��6���>�=�n���k�C��ą��A|�;񘏶b!l����А<�I�qo���U�z"L��V��饪ί^y-Pv��.{�������Ν׏�H�(������f}&q��s"JH�"0z�tP�v-�7��ZTl�}~)�g�F(JE�D���k0%tvw��?��V�u�G��3�؀�m��|�y�WG��}�$hyȧ�	�r8@�4D
j��@���m��m�#)Є �}`�U�o-Xh�4�Ö&ː?0�3�`X���iHiS3e[Xa�=P6X�s�qX�z�p�^uD
i�
_H�
�x�ח�rN���3^�q{b�w���AlHBh�w�A'P�4so�7��qNG�����t}芀X}M�ux� ��R�
��r~8�x��cYp��X��8h�h�@ ���(h�p��oP�������A%m�xeT�,`�Ȉ�G؁7r
�����x����B̘)�ȏu�Y0��%8{�V�xTT��w
P2W�}p��(���x�$i���wuT����x�9�@
IE�a�-���i^1i�X�44	�
I�s�ug���c�v���D
-P}Б���H��|�`�VHPeБ9	���[�	�XG�(@�����-��_YG�5p9�ax���������k�HEEGPoi����e��f���bY�D������YH20��Y���j��	���0�{鐱g�l�@s��ٍ���c���^����X���)��"�0o�UP�i���t�1�)Jr��Y��i���5"�YH�К�	��Y��V�Y	�YHN�C&��T�����W���)�w)[`kIE#�0p�{�)��v7[�}`����)~�hZH`�Y�|Yy�y���$�	}9�g	f��`���꘠���4����;#(P���FX��Y#N@WT >��*��9�FJC]P����邿���,����	s J�����
:�b
���C
�Уiʤ@�m�4��U�I�?���ڧ�)A]p�� �L���G��7�e*��bz2�����2j�0i���yQi	<�xJ�g�{ОTl��z��:��	�:�O��z��i������$W�f���������Z�©�Aʟn:#�OH/*��I�x��$�iP0��Yz��y�1��ԫ��ڗú��Ԭ�d�ъ� J~�󚦠���*��g  J�0�J��*�Bz��ZG+�����H�,�����J�
���[��t�0�!��,�$�����6ly�M{�А!-���"'kv2#��K������h�4m��RϧpcʜI��͛532�'�†!N��"F��}9r�ɓ(W����ΫX��\Q�O��F�H��Ōv6z\���I�R�|�BA�ݻ3�tE��؈-�E�dۧQ�έ���]=�6��E��M��H�&Q�d�%L�6��Y�jU/Z�b�R���T�N�:U�H�ٲ%��2a�6`�3�
��-J�4�+�����7��{՚��س��}*�޸��E�8r�Ø;{.}z��Ѡ�"U�g�Lx�@�*�G�z��W|�I@q����9ǟt���"�4Á(�Śk�� {�L�J|X8�}v�_t V�݈%�������k�v[n���[p7w_��Aףu?
ȝwC�c䑰��$n���|Q���E7��Y~s�CX6���bz��ތ��'�}k�硛��(�<V�i ��g�}�Ha�⨜���(��c+|�Z/{����b�����i�Y*�G���V�
���md6y&���_sm^y]�r�9$6���a�,�f>)\�S2W����x���ZIH�`�bV�'��՗a��"Z��z�a�c���'�����4ڈ!�֫���A���j���p�W�i�9*�pv�B1V]D;�k��vm�N��m��Z��4�[n�&4 ��b�,��iv3�p� �#߅H��;i�0����*<D�Y�e�X��4��|���&|��3g��`p�������*��z��;�����8y���H��$��n[��l��� �h(��l��?�����*��X�UG����ֽ��	J(~Vc��N�P�5�|�]��s�c����7}�G?�����zp�{������A:ͣ�+��j.%̝�y�:�}�>������w�SW�5=��:���t﫻T�5/؝�j���;�Q;�����v�:	�
x���h��
�́1Q�1��U�U�{Ug�#wx�3�@:�77��}-���U>Z��~�*a
�٧2��Pq;lѢP
��P&���,�G��I��+�rbw/b�lH�#��/ީʂwà�4x%L��Q@�!���[�<�)L��~(��h�"�0qA����D q})���HΏ:�B�Iؠ�������j������AH�ШB2!�*��)��Y��4
���]1�hB+�Pc*�����W>�I&!���C�e�\d&7��iڰ}�D$6��j��T�:`�P�1u�d*�h(
"p?p&�1�Kw�Ҍ���i66N��r�
~���C��@uY�Y!��g�>�M"Jq׌_6�eNtF�������8o�Ϝ>��B=�_���e<�<�X�U�@��#z`����g<���&<�a9��a�bp���T�W8�@���@�
Q¥Ԉ�)9�S����gH��R+�c�h �@S#�ԟ��O�SzЫ	d�jj�J4�m�20apR|�+Y;��\2�cO�, � V^l�7���Z:4e�5�ICi\A�Z�%.�+�4���8�gVwJ5�jЫ���
l@��66�Iͣ+L�äpT���FԘҍ�¬�NN��5�U�xVk�V���-�d�Z�ꐵ���� �p.`sO,׀;b��%���QI)X�NWx���
8��Fػw�D?{�o� PG �޲򣙻�m��_����/Kg,���A�B���x�&`O��an�q	&r�,�
����E=��I�@��]o��ze���2�U`^����9����ߘ���s%�TgN��Dpp��«�f�$���%x���)�筠�8����b���!�e���<����/V)%���>ΆT����s�^H	"-�	�]IN���N2!�H�%��Q{��T� ��NAځ���GfK�9�'G@"��o�q�u�go����7�WZ�L;�1�,���n#W9��U�a%�
N^��&����Yd�:�?�1)��oK<�.&���M�����"�j7�����3��
���z߳V�0:�p�S��ǩ
�B�'��|A��R$�C78�1F�X	�
(ǟ��Uֶ�g;�uU �~��CM��\�<�9�n.�&�N���`�h?=�T�zԐ>%��xp�@
H ��O[�6z���d={x@�p��K�<.�� T��Poy���v~��z����>Wcq@'��?���ާ��<�	{`t`�����W�ܤ.[�
�����u�Y��#��G^���{����0ǹ�m�{���G�NRA��}�
'�u0'��� ��Dwd#}ySy��D��w��r��}[e�IE�D@��zf�g�?�W�7{�W[�G��3����wl�G|
Wy�G��}� �x�g�ŀr8�0D
j����7m����Iȁ<�2��u�k;ւ0�~�u_ː?�3�[��7iDhhS�dV�`�=P2�oHqT�*' �GԐؠ�P��S}�&'��v�?���І�ׅ��Q��Z䀆OD�`%�pU�I*��l8���gt�wu�I7���ȇ�WtTǀ'P	RH] �P���w��(v����I ��X�A��ۧ�+�C� ���*X���'����쐊���5�S��N�D9��8�48��G6�P	(G_�万�h�X�������D�3Џ��^H�9�H�Ho�q
�O)'�}@���(x�th�� wpT������H�h�@
	C�1�+i���]�(=�8� 4	�
�k7�_H��`��?)sJ	H���Y�m8�p���f�i�Py�������pD,�c)�����Lh�p�W3��ȅEٔ������8TOt�UّX�HFX[`j�I�T)�p	xYI�h��$�x�d���X��Й�Tb���z
�z�D��I�~yD$�
�u(��y�-���	/@
�HPe������9���	�	Gr��)��)���������lؚ�X��s��t6@�OB�&�D p\���i����͉p��v��O4n�,i��Wiw��N����H��X�v���A��๗�7��i_�|���f������
J��H��x�42���<#(�:�B��)N�VO 8j��ٹ�@
C]P���ٗ�9�P��,�#�	sН)��+ʘ�Y��H!�3j;�@	7*�F��}h��H#{�X8�8��8)nI�{0��G�{j�Sz~F�g���*��W���\���ɢe�	������}j�Ǹ�	G`��0�ڧri�񁪾��p�pʚD����������	l`�p��ڛ����y�3b;����ɺ�.���jJB]���z����ٺ� d��z��ʗ�Z�fB���Ⱥ����ǚ�b��dz��8|f�9�*�����_�XIP�
j�������Ȫ���"khe��t����!��,�$��|�s�<Ӧ=ZhȐ��ZĈ�D��5;����%A�ƈTBRI4M���Y��S8?0cʜI��͛43*��B�J���Ō�y)rLI�'U����ΫX��\A�υ�B�H��E�v4v\��ɔR�|�BA�ݻ3�t=��X�+�E��cۧQ�έ���]=
�6��E��M��cȑ%O�\��K�6��Y�jU/Z�b�R���T�N�:U�H�ٲ%��2a�6`�3�
��-J�4�+�����7��{՚��س��}*�޸��E�8r�Ø;{.}z��Ѡ�"U�g�Lx�@�*�G�z��W|�I@q����9ǟt���"�4Á(�Śk�� {�L�J|X8�}v�_t V�݈%�������k�v[n���[p7w_��Aףu?
ȝwC�a䑰��$n���|Q���E7��Y~s�]X6���bz��ތ��'�}k�硛��(�<V�	��g�}�Ha�⨜���(��hc+|�Z/{����b�����i�Y*�G��:V�
���md6y&���_sm^y]�r�Yg��fz�2i��;%sU�I�wO����6(f��8_}*+��)��6i(y2��z0�H������(���oVhX��V*p��f�#�
gw��_Յ
�*f�e:����"k�����,�K�<l������� �!ۅH��;�0�(��"<D�Y�e�W���|)��|h�0g��``���a3�]�z��o<v�;�p��7y���H����ئ�����)�D�
����L��=ޭ�1�эU|�t���ݯ�|6}黃Ƌ��TgG�ޝ�tA���n�^�
�Ʊ�]�;k@�M�я��-���)������4y��7쵔K���0g�9��㼽��V�}�0�1N]���D�b�ҥ��tp����S�W����F�F:U-Owͳێ�F�l�f�p��Y`nL��^%�Y����L4�G|0p����c��V�_�ʧ=k��g5�Y�P
��P&���,��@���t�S�rXW/N�lH�#�8:'>p`����	q&
�@��A�y�U`$�ML��~(@�-�@nL>ܙ����Q�;�##'�҆죎7��<�a6h�)�x?���OP����w�qG�F��	N6QypĘ�6�7��:c<hW6��s۝�8f���gHB/�h��O�,�d!'Yɇ�Й�,\4��j��T�:`�Mr�v���7ERzc?8�
�Jsv��!g��<
�RxT�B�S�ҍ�fi9�Z�ЇA��=l�L�ꓦ��	ΐ]����h��>o��@~QNWv1��L]�H�p�H�ZzN�90�t[?��	�?8��1�_&t�u�#�v`TK"B`�A�G���>#��L�R�r�|��^X�p���Tj���tOL�i�	���c�V��{�B�&�!Kʃu�*EA��/�2��QQ��'`��}aW	͌rӭp��GyQ�Z.Y�pA\������vu):��(�t�TE�
W`"ධx�,P�Y��`�=��܆�yU(?��Xr6�.h��Z�:r�bu�l�V^Ҋt��҆�� �8�]_�۽J���a���%����mO=�\�b�y���
,��&���<�><�O� PG �;ޭ6�i�!|�$_����=l��_�! �g�@�#����(���W�K0�}���6��c((�K�K�.y3��
'�C��D�A,b��ē]$k'7cB���/>�H6�ْ:�m���[����Z���I|��K����>3����3�X
�󅷜��By����x �%1��l�ҎYw�\{C���u�Ɩ��@F�y��d�gZhX�	D2|�`�v9�nNq�b����/V}*
C�˔��%G@"���h-ZeV���셱E���u�	������km���?�LG)	nX�Pv�
lo_�����UH�`{�Z6q����(w(�ՎȠ�T���~�\7��̜{�;v�Nq��soX�SP8ƛ�܀�P/耸�x@�"$���l�OoLU9��������xP=>�D���ϭjNW��fy���o�N���`e#]�Mf����5�;�j@ܝ�K����R��^�Xw�֝�D~xA���n�t�}�o�{OO�hr@>�?ꞌړ��yW���>dt��x��
y�;��^���z�����ߴ�)i�+��]vm{����)�1��3���S���U�KRA��}�}� ����%��X~�<d՗|��x�uD��їqi�y�ehIE�D���gz�v��=��~*�~�v�G�3����l{�.}�x�wF��}��x���ms8p�*D
j������l��u̕AH�<�*���u�Ek3V�g$����'8�0�I�{�ƃ��P�?:���9h�
D�s��]gD
i�
R�������pNІ�3Q�dHzU�~j�j�E_�G\�=�pU`I#'�c��
��xWlhI7��8���s�i�p� x�R�
��e(}h�Q"��`I ��Ȉ9����°����s�~�p��oP���(�؂oT��xdG�,���Ȃ;��r
��g����r���T��p��G�Y0�؈h�*�z�0�pp��>��$r��ٸ��(�z�D�'�P	6�Gu�(��؍�苶p
���*����X��dƎ(�A�Џ���Xv�x�2w#ِ�sR����xD
-P}��H��x��J�`��GPe�,9���[�	�xF�(������q�UyFs5fi�T��iƓng��5
Di�7uDGPeɔ��u�_|�f���X��7y�x�v���G2P�������h��TY�Yz)~t֗��D����]����N)�����"�0tgUP�ə�y�j�1�p�g$ ��)�J�L(�iI� ��9����u9�?��t6��(����g�@��ٔ�8���s��v�G4n����h��7��N���!yu�y�5b�G`™�ryxܩn��>�|�Ȟ�	f�x�����Y����x):[�3a��I�	���y�5�euD��"0��Y����8*��*�E0���t����= *�g,`���	s`�%J�j��i�񹢀b
࢝C
� �^�-I���;4����>:�4��i	����?]p��߷��y&Zj��`��	��x&�G�\��'z�𩢻�w�����\9����yF`��0���Dʧ�Z�O��ڦ����ڝ�W�����"�	l��p��
�ܸ��ة0�CH%�������aB�A]���
�C���ƭ�T��J��:��
�h&�jI	��^���FZ`I~���z����*���wf�9����ٟ)��r����������eN<���ڰ�����L�Jt��!��,�$��†-ϴi�2���1b I�d͎E8p�i�tI��1 ��TM��mqR�Ώ˗0cʜI�����1�P!Æ%B�X�bFi=�3�dI�*?ap`��ի0W,�3ᣅ
�DѢ��.mJ�$�8��P�J�nL:[�
�aĉe����ӷq��]LD��z{~�	��Тg�"�1�Ȓ'S�Yْ���V���*V+UȐ�Je�T�c�PE�$�-[�n-f���a8C�@�oޢĈA���o���^�A�W�i�j�ٮ٧r1ˍ�70_��7>���ΟG�^��"ESq'`Lx��*��y��W{�Ip�C��)��s��g�"�4À$⅚j㹶 z�<�J{H��|fx_sFG݇!�H����p�j
�6[m��[o3
7_��1��t;���v?�4$k*I�m���^���r�=�c��0B��
j�X���{��"���i��~�7�pr�D��Y$�-B�4g�j
�>&��
Bi�
F��MZh�}�vX�"zp��)c�ذ��E�e�b2Ia��%����曞�ڥ�H���o�>�\�i����3+c$���j�z�^|�����.�h(�&�%�.�(#��b��2�w��{�*�,�!��o�ս[��Uua÷ʖ�,�J�-��J�i�4`���1�ϒ)m�ծIC�
`L"I����I���.}�Ah�:`�sU���
K�o��

����O[��mp�Z/��k5�^�#�4���a��Af�ƥ�G���+��{����|@�۶�e�!������PU�MG���=�E����J��#t_���9О��0��J�u����4}�G?�/L��k�j��[�JC���.����.�
�ȏ��ɓWn��/;����{����LO�!�O-t��򉮴I/�N8����؜���0��j[��N��
�l}/Q�1顨�*^��<b�Á����iY������
}��R�8��pp5�B5�B��O�����F�<�O�;N����
Ip�;�AS�m�kUt0���DhC0*�7�Uqvl��2�	z� !o5�\��o2+ᢳ�ʰ�(ܕ
m(�i�:�B��Iؠ�b�8<#��GS"���A ��ШB2!�!�.��"��� ʋ�h]1�h�SZ�a�[�۠��O��I��g(�汅���"�FL��qd�$\5v@F*@0E$��*֯7���&����2���6'I�q��Z��J9�Q?LA��2����g����3@�& �V�gf/�՚f5����54f�ġs��h����6KI�J��S�&w��y	=0�H�)�"ޒvXs��0��0��0B1Z�3j0�k�AO�`������x���f��G):�@:��(8v���9O 5�H�iJo��h�D��j�7�*�3e�?��@����#��BU�4)@�Se�T�o|�SyqXRoq~�

)����n�̬U!7,L�����@B������&�f�2(�)Տ!\�
��ڼ�U�|U��0Q��zQ
|@k+�O�����"�9(��D-�e�ǧr�9�Em�*��������� ��-[K:?K�+�*�#0�[.�D��kiJ��4�YD#�F� �f�T���nЯn�A��@��Q
�y	IZ樗��%/w�ْ	���b�bط�l�;��,x�o\�	j|������@Q$0�= �r�;�Z��$���× F�	������1NqW�,���͌��jm,���ԝ��\��I|��K��[d;ئIƲ3�0
�s��,<$�x@���8����y�3��w��nX��3�^H	]g�R;N���F2!�H��W��Sɬ�!i"�ο�٬|l,3Z��0�/�ٲT-�����4_.�,�j���7f�۳�6����&1P��#/�`ǻж�6.����8�Ȁ��=�O���r~����5���f����$[w���n�r�:�`���o�������`��D)�A���j�r_�#�*T�yV`��]�q
[Z�j��9]�@Ⱥۡ����hri�<�%7�q8���	66�}nd��P�;/^�$�ڇ��C�}A
pt�9�H�ޡ�t��t�)@�y�
(����v��f����=��
�qh؋�H{2V�yy��︶��0��_x��^�
W�����Oݷ~�O��߯��r-�5뱾q�w����f�OAу��H�#��˯~���}�e?���HH������N��!�C����w|
'f��`��T^@H}�7a��uf~��E�'3�G�3��W}wko�g2xu�E��}�
�w�'��qs8�!D
j�����7l�q�g!)P�	�}�=�mM�U�f�H�+ː?��3�H؃�gh0�g�t?C�_�=P؂[p@�F' ��EԐ�p�<X?�{2('�b�<`�͐�����7f�ydBT�oQ�pU�Hw�X��h�w2a�H7P�����s��W'P	R�F] �P����G�k1�h�Y�؂��|��}�v� ��saЈ�p �oP���x~�����{d^�,��/X��r
�P�^����g�XTx�S�H�=�Y0�(����7b3���oR0
�x
pN׌}�Ѩ���v��V�P	)�Fu�u8��8��q
��!�|�)���\�/��4	��ȋY�L�q3"��<��(�6�F���	�Y�\X�(f�hoP9�
I���P�^D,�Qٍ�x�ˇKVɔ^�V3Е���1)f3���Гv5
(�8�R=t��C��F���uD[`j�H�B�^�vG9�Vُo$ۘ�Ri����iM�hi����^��v��)0p����@]��|��E�����#�ps^UP�Y��	�a9)��^$�����>x�k(��H񰙽���ًl������t6�\I�[ׄ��^��I��Ș�Yo��v��=4n�����W��`M�����t�y�v�oA��ә�{g����5�o
ڈ���e	f`�o�����闿���()	*^�3a����ꂳ��[�C��"��9��w�69B]P��չ��f�� �EP�$��׷b��	s�#�
��I�홢{b
��uC
��^��$���W5��u�<�2��`ɟ0���>]p����'��2Z
��@��YrW��o�xZ��ɞ({{Bx>i	<p�n:���{��^l��J�z*�|	���O��ڦ�	��z��,W����ڦ�y�w�	l �`��
�Ҩ��H��`'x�0����zA7�6A]��٪�A��f�
A�J����j��Mz�������ꥏʡ~��������b���c ��S������y��ڭ[jWI�_��ˉ�Υ�����k��n��s���!��,�$��a�3mڣ��iY�E�H9Y�Ci/]$h�G% �DӤi[��z>��ò�˗0cʜ	3áC	D�p�C��$N�xQ�F�DŽ9�$�OМJ���|p��y�QB�
�r�HюŌG�.Y�i�OX(X�K�%�����0"Y�h7�]��-�:u���]�2�q�٢F7v�rdɓqR�TLuU/Z�b�R���T�N�:U�H�ٲ%��2a�6`�3�
��-J�4�+�����3�{�j-]�W#���T.f�q��wo�‡wv\��(Σ�P�(*��/��wށ�k�b^-��&A{��"p/g\}�1��t�d�5�x��b�x	.ؠ��җ\��Aǡ� ��:=�hj��Zl��v[n.����!G�s6�G�u:��cx���l�ٶ^����q�-Wc��0B���
��}��x坷"{�I(�|�y߆��c��1�wq��`�����(\��	h��Hhb+�裉s��K���ᄓ�W��Q*�G��*�V�
|
�xZ�呺Ef|ő��s���f�~\d�\���K�d���x�� �XI�g��։���'�{{��gs�ꁆ�uʷr)*�F*!��*3�~w�)�T�aA��*J����h����ot�L0M]�୭s2[��HB�g�NZJ,
�f�����,Ƚ���%WKC�
\l"I��-���(��_�C��T�L��?'.�B�$������NO��ml\��:�/֔��5
;��t�2yЀ�,g��Ǽ��-�Ԟy�9Û��[��O;lwt#�3!>wӋ����V��Gk�4�607�.]A(��9�j_ͯ�������d���*v���ε����^�z'���J��ɐK~��O2��k��ȥ�KO�!�Km/��y.��!��;ᜮ<4`�y��z섷���hk��Tv>�(����L����;�ܱ��D�p�Oӱ�y/f��XE>��{&t�RH��E�q�`Kҧ�Y��A[����E�~��`�<Ȇ$8⇚^�(���9�������!��h�|U1k�&:���0��z^	�'C�LZ��]�B.+�0�[�j�,4a�~��
a
�/�B"��tD����(��Q�$d‘@��/xƶ!�;(��t���#eՆ�6��)������J8r�t��T��B�i0f߆Y�Uc@��S4���"�E�tY�?�e���k>2�+��Ne�U�R[T�B�S�R���;��6T��[<��aO_����� �Y�gF3l�L�0���2=�Ј��k�2�d�S��g��Yr*����#x�:i�N�a9@�a�b4�R�%�X����@|z�8F�eˤh3�pьBԏ-S&��8e�c��_��Q#tԜ���$�W����a�8��s擊�$�0a R|0+S
J���b�T�M���'(��!�'Ѩ��N�jX)�T�͐��ÄĚ;
 �8�G��mz���;�Q���؀��kZC*�R��x����6��4,^��z|���q!�S1N�{
e&f�#Z��ѫ�VG&!lmA��[��T�"-"lM*#F`���[��^���B��P��z��.(n���1·�y%��	u���m�/�*�ϒ9�E/g�KY��w�B8�*u/����{_n�՛�)�1u��8��e�K<���H@$z���V��w%e�U
I$y��zy�a’��,�R��_���3Ȍ�����]mLi�Z�ҏO�`�$���%x������Q�q��@\�H4d��~��xK�Z&|��<��-wY�s���f�u��eRT��?x!$t���NQ�و�ԳɄ"���]�+e���X�M`���[dU��# b��h��&���V]fԝ:�R%N���-Zn۱~���L絖�O��"/�_�[д��݁����@���d
�������l偁�V/��}�0su��>_���u��G����.������:p�-^�H	X>�9��B*�;+0`�,縃it�w`�.@ `��K���
���dr�������'���:�y�}nk{�o���/P� ��9��Fm���DG����J�:�uA���w�q.+��Zw�Ǿůk��8��q�d����^���gc����"4�~��|ؔ�;���S��G}�^����<�Z���W��W���
z�{��h>1�DRA�7���g����>P"��~�-���+
��3փ`��/��{Y�4e��HE�D��i�jZ'H��}[���7�Gާ3��zWk��Z7�wr�C��}��w��t|r8p
D
j�����l�q��/)��}��9�mч}�7j�H�7�����8�@�9�z�Ƃ�sl����<:���)��ǃ�t��\:D
i�
C����q�pN�3B�VHyFH|H(j`BQ�olPN��pU��HG�U����Vh\�^�H7 ��X���rLGd'P	R�E] �P�x��h�/�h���)�^�y�!� �hsaP����p�o@��0��W�(J���;�A9��H��H~�8�u
��:����8�G��R���A�3`��X�V'��؀�q��oR0
}��x
 N��}`���v(?�P	'�Eu�(�r�+���q
�Ў
�|@�	��Tu�N���3	��	xy�Y1#��;�Џ(`�Nh�[D
-P}p��h���j5R�f�h[P9�
��h[�	��C�(0��X�t8m���N�Cd5`9�x����P��[����<9�
8�Rt�D��G���H4[`j��Q9�.�jG������E2���I��(��(��TR��0Yy
�`�H����|��`)}�
�u(�i�	��u'@
5�CPe@��y�gx��	��Cr�y����鈆����)�U�n��pI���H�`\���y�:�0��Y�����i~��v��4n���8��9�³ M�����t�i�v0�[A��ɖ�X��8��s��w��ٚx�8�`��E�	�ٞ�I��Wo�Ӡ�E7#(����*��d� N`U 4ʟ6�x��,<�@]P:��i�o	n *��,p�Z���	sP�&:�Z��y����
b
�aC
�0�`*�$���ׂ��q�@�4Z�q:��({����G�{ʟO
}����¥�'J�w��Fr�E�\��(j��fJ.������
�U��u���C`��p�ڧE�������ﰩo
����)��rnP�l��oZ��%�����*�b���ڍm�(0�3H&*��Y���w�`2x>]����D���F�����z��J��z��ɬΊ�Ǫ�`*��������:��ʘ�I�d
��j �S�	;����ڥs�۫�ٟbY������J�����aY�1ks�p�	ۘ!��,�$��L����!CZj#�CN��H�G��K�	�Q�G%�4i����O�\ɲ�˗0c��p��<	D���CH#N�(
�F�c>�I��'dJ�J��
>6q,��…?9A�h��E�H���4�',�ʝےVl7�����ءg3�Uʴ��:t���f^�]y��ThY�E3n�1�ȒqN�T\��X�T!C�*��S���B)�`�lɺ�L�/�
�eC�y�#�犾m�B�z��^�ZEK����v��>���l\���ҽ�7�aG�<
��4)�j�K<=hǝw��&^*��r�m���-��Bp�͇�r�A�H6MP�߇v-�]/�w`�J�`n�IH�|�]��sr���Ӄ���bZ����Zl��v���G!q�����IG�/�k��&m�!��oKw\r3B��#P�_؈�]w�8^y)���`�W�e��<V�ih�f�r"��������-���d���7
��
;�Hb���ɨ�+>���Q�!��聩����c��Z��Cni$n~��pb:�~g�	�J��%�\٫��19�4�q@<�&V@m�9 �'��hz���^��򹜟z��-]���-�@�;*��B�b����d��ThX@�����轏"y���\�,S6t[+��jYd���	l��K����l����%�#O[&
g*`qU�$�O��k��{[����}B�Ô7�/χ�+j��F
���k�ѴTXІ�#&l/�><i�ZӰ�L
�
����Bz�,����&���|��㽬� �
����pG7Q���S��f]'�x�5���H@ܒ�tA�\�s����X������{�s9�R�.t���ֳk{K����������xɎC�t�z��ӯz�8q��=�C��Q׫��v��ypG'�N8���X���Njڰ�Q�V��
�L|*Q�1��u(��'@a�Àd�����cykY�$�`��{��D=rτ�\2���c�۟�E��9�}E���tA�e�
IpD1׻��uT�r0q-�AhC0h�O�ω����*X)L`Њ� i�<�y|s��d�P�nt��^VB�)M��&a�F�������Cr�	Z�[�;A�B�
I�"u�E��T��J(�u�آ;�0�-bde%3x�$�r���B�E���V��8�2f�� H�#�8�W�Dq��s��7v�Y"0��f"w�006�Qd�6K +*���)T�EV~�jk�(�i��3@��eu�b��S&3%GL8t��Q���N���$�hMG�/�D�T9"�F��4ӷHs�2�l�r ����*���	��R;�� !�䔞l�[�7�cNO�e�RYh��;�F�l�����d59�G��sA�'
9uQ��Ӟc>��	{�@����W�*���i�dzW+>�������A�Z�c�=�.ت�4����&G�
��I�A�#W`"|֭b�hO��/L��c�4T�Y���qE�`�Z�r6�mbu���6ժM¬f7U�:���������
�F[�Ѳ~�0bT+�%����J�CO��b=V H�6��M��;[�M���"��.���RAzݘi����.�+�7!��4�@���v��%-6���
��K0�M,^����(�A�3�-s�'8U��D������}� A��Xc�� ��HY9�˂qgK�в4ś3��Z,�/r�	 �wilf��ӾF�/q�
3���;��8�@���8»p�o5�*{X`F�s{��|X��BH0�2ϗ��R����I�@�L�@ �Qj���y�:0#��D�5�!��:�GN�!����v2��aK;��Y>ަ�*�81V��I=����[��$�
A^��&7�O]dd�?�0)��`�[�6���k������
�'[�[f*���m+n����y�)�߶�-yU}��`��D)�A����w.0~�P���
�7�>�ʼ��9��QG;҄����e_j\�w,���>��f��k�T����jG�Ԁ"�z�_n�\m)`��K� j6��}N|�s/]*���7|�ͭvӕ4��#�Q�,đ`���ȼ������j6��/7h�=�y�����ŝ�4�;P��Aܯ��w`�Nz��@Ԛ?�Ó�s����|�3�D��HDI
>�7��G���qM�DB�2D����1?��^�B�
�/�e��t�h��"�_��'`�%�7}VTw0��}t@}0�P~��v��yu.qGv4d=�	�k�y�?�!'��'>Ԡ��|��w��w��((HE�}�0(m<��(H(���8�0�yu6�=�}b��u<:�� ��6��t�`\4D
i�
;���'��G��pNP��3:�Lhx>H|Rf|gL�p��� ��|�pU H
��K(��w~�vg$�T(H7������'r>X'P	R`E] �P�؄�W^�/�h�Y@�t�wx{yHiL7B� �hE�ty�p��o�찈�׈�I��/�A9�Ȩ���}��~�u
�`�4������xh�҉ޘA�3 ��؃HG��x�nR0
}����x�s
�M	w�} ��x���uh^�P	gEu��hȌ"h��q
����|����SkX*ܨ��3	��X����=���s��+u1�iE�����L8�9Vif�gVP��ٌ�h[�	�HC�(Д�؈jxcq5�HIC]5Z��j7�Q���(H+0
6y�/��%�AGPY��)�O茛�f�B��>��[�u}��SY�V$�X�NI��h���L��eɒ��GU�0�u����m�
�u(������U'@
�fEPe�����]8���	�ICr�x	�����������(��qy��t6�Yi����ِ4�����	������}B�vP�4n�i��ȗ鹉���L��Y��s�9�v��VA���i�v8��֙��V
�H��ɏ�`�hE�	�Y�{ɛۇn�R��%7#( ��!�^I*NU ,J�.�w�4�@]P
�������"��JCP�z��1�0�顫���y�/z��� �'�5�@	+��:
��y$({�V7ʢ-��]�����y<]p�@��y��xS�%Uڜ��	���	WЀ��\@� ��9�_:.r�������O9����IC`���j�=���@����0�h���9|�xW������ܹ���	l��0�����x���u�b�@�@���ɬ��v�`)ȧiP0`��ɣ��k�*H���j���9��j���Y����X H~p��Z��i��ڥ��f�9�꯫�0��VjE+�	[�ܹ��(�^Y���Ⱥ��z�8iʢG�ʋ�б��!��,�$��=hȐ��ZĈ�Đ�5;�F��%A��hT�QI4M�����S8?(S�\ɲ�˗,3:�-O�i	<��!$�#N�f��1=~I�0�J��r�6q|TaB��B�#�bѣI=�d�
T��]I�*��Zuz]�P�P��&]��m�����AoN�;y���P�3n�1��8%O&���*d�\�2v��1X�"E�̖-Y��	3`�Ű�!@�l�7oQbĠ�\ѷ
]FK��ݫW�h�bU��.էr1���k60_�q��=�3�ōGIΜ�"EO��_�����u��w��Wy�I��m����_q��ל"�4A�~ֵv�hڀ��r *�I��m�=�{�Q��rf�!����Ç��Bw#��Zk��f���ap�ɘ��=�/	($k��&mH��ے�g܌P~s�T�W6b��ޕ8��'�z_�'���Yh�<V�9\禈qh"�*.�bo/N8��~p�����#�!�I��'��"�BꞤB���b�X96,���V��e�[�Ơ������g&���T�Y��J�Ƥ���x���XI��&��ޜ)��^�y��'r~ꁆ�sʶo
��t6�d������A���J���r��2:���P�p�0ua���zz%�Z�l��6	���R�ұ�v�,n��)r�4����S!�>���[���;D�P�0%�/���ݖj��6袾�Ұ�` 
���1�����N�p�;�p��-y��=���+�+�͆-�1�03�(םk�y?lwt�.!>o�����{'��	M4s��xJDJ�:O��Q�i����|��{���M�^��R�zv�+�J�s;�r��q��ܫ�#'�8�s#���x�}�w���*=��:��δ���k9��;<4�1���C�6�/�-������0zX�v��j�%
�>fq��.a����,w�)�@:�@i�n��^���+�u�{H\W6�異B�xQ">}̢|��Y��U9;��7�C���w@6$�8�\� �{U�D�0���!�[���D�9q�P�&.8�l0��B�������e{�BQ����n�#�ˎ��&����A#LqC��g��1D�������Q�$d��9| ��X60��8;(A�0�����x�:��)��<��pJ4fL��ca˜�B>��q�lc]��j�T�:`
B&�tKO�V.Gzc?�%��aIgR�ۤ;�0
'�r��
~��ZT%�XNT��g�>�i�K5�΃#������y�#����h���E31�D.JS}��#w���	=0�D�y>D�o�[��0�����0B1���h�R��d�Z�GD 3�g��;"�CjP;
N��ԛ2��n��s
��$��LF�g��h58���s����H�)��S���=d�Gy�a�A�m:Or•�t��~ʋ�v0y�a.�U�Qժ�;(T�+L�ટ�@B��R�����[�
��ٵzբ7}��0Q���bP
|@g
O��կ����8趰4�"b���a
Բ����+̀&B@�����]��Iy�Qj�F��j��Ở%�!w(N���\���
���—�C��x���'" ���!���"W��t�
K��dw���ps�2!`��@��V���X����K0�M^�8���(ꁄ?�3�mr�VN�Wǒ豂�]^<X���.+�agx�lhB�T�?�x�%�gK��i^N�-�������4�|É�#;cp�ѐ0�wȸ�m_�<�y�#�@ ��`G�F�,	��A)SX{������b�/8{f������@$��e�o�ܻ��yD����0���`�5Jk����# >��'��O�2�5=CK;�7p�af�e��'�q��{�jJ���\��8����n%��a�Q �n��!lA����A�e2���N6Q���lo�7`����m��S`��c���ؼ�y���
�R$��7��<hbCU���|o\��o�]ށ�#���4�
hj����o����N���`W�<�5^9��C� v�@
H ���Z�s[�U�Ȝqx@`v_��%v
�v��tG9�\hOعP�:�Α�
8�WG�1菪'��w�Ӟȟ��7��1����ݲ�7���v�b0�D0}��ェ>�j{��ւNc~�	/���F~�t@f�����H����_��N��K�9��HH���}�����]�{@�!������`�,���>��E]��%�'}3w��|�Gӧ3��W~h7j�V��v`�A��}��wv�G�'�wr8�~�C
j���kw'l$()p���}�/�l8�YvT�������|��ː?Ѐ3�:���'g"H^�45�^��=P��Q�n2�J' ÅAԐؐ�.X~1x{$xN���38�O(x<(|Qv�PEJ�nlP"��NG'PTpM�(�'n��q�s�K���腨�q:�r'P	R0C] �P���Ga5�hY@�v��yX{{i��F� �8C��h��xx��'������x}�8��$���/v@9��؅��}��~Fv
�`�����ȆzX�҉�x@�3`��hv�e>i+c��nR0
}�ȇ+s
�M��}`�͸���uh9�P	7Cu�|� �k��!���q
�Ў��|����WSn8*���3	�x�)�DG��x�,B���9Џ( �9���3D
-P}������_5M�`z6CPe��%ɐИ������D,�Vy��؆76O\�T�30��3i����G+0
=�tgm�>GPb����R�=�f�CH�G	��h�`������8C2���y��H��h��TU�w�=8��ԗ9<M 0@�{)����@\�����J���ٔ�#�pl3UP�ə�9�gA�p�$�w�dys��М�)�oi�zX�F��t6�b	�?�X?89��`������u�Z��v�4n����	�������L��I���v��3A`��Y��w�R֞�w��	�¨��	f��3�� ��Y�ɩ}�"]Z3a�ʝJ�ʹ���Lu@��"���eY�)A
>]P��2|4��Fb�(�AP�,*���	s��+��
���ɣ0�b
@�HC
���dz�;��i�v��g�~D��:j����:{����G�~z��Z���a:C�Ģ穗#�\Zr8��~ڢ�i�=��t�vCi	<�t
�Yy{{P�l��ꠀj�>Z�
�O��:�"J�q��Gxn��l�s���	���	l��ੵj��(�w�H��)H+Z�ȉ�݈��`(8<]���:�v'��j�ԫ캨�
�T*����~�J����*��G~0��
��I�׊��>f�9�
��Y��x~���IP�e�0������j�̺��Zx�T��)��+!��,�$�=2dH�A-b�@Z�ɚ��p�H�x� Ac2*٨$�&M����)���(S�\ɲ�˕–'ϴi4�p!��!J�V�b�1;z9�/�J��r��5o�$x�ON
ډH��ѤA2��	�p㪤sM��T�0�в�&]��m����1�.μ;y�t�P�1j����8$M&F�
2W����u�H�$�eK֭e�x1l�g(��[�1h(W�mC���]>h���*Z�X�jUz�S�������ڶs�����ģWNC������ӣ����u�].�����v�0����o�
W�|�)�M��!]X���!�]*��
y H[z
>�p�\�f�a~����*�Т]����Zk����m�=�[p17c}�=wcT��k��&ۑ��$p�'��0”��M��a���$�g�l�ɒ���Af|�7�hF�Dյ	"�%Ω����b�b�i�6��
:��"h"����h{�N��"zPjib�ذ��>�hjW��l
v��o`6�}e��*KU�:d�F�doK�i�wϰ��Dl����wbyu޹�{קhP+נ�d리��h��:H�2��w��+��顝���.��*�n���ԅ
��ʩ�����x��d�����T��Xj��m�~��4��@�S!�>��n��z��y�-��C�R���9����٨�z��r;���/}`A{Hp����ԏ�x5
;��4�,y�@�<�
��)���;�;f���ɵ"�1�|7�kwt�-!>s�;��>��D�oC���R�Η5�W��;k@ �J��O�?���fK��V�J��Ξ����݄g�7ǻ*2�C�|��"ޱ��1�[Ƨ�D�r���b>'�v
=n�E��;�>;4`Cy�ڦ�;�g�]�d��
�,|~P�1��(u��]�6*ׁ�D J4�G8�GÛ�����
d�ܮ7�Õ0z'�P5ܢ���O�0�v�(9�}��M�̅��!�
Ip�-���w^�0!�* mF�)�9aP��#��ְ�⫖B��pe/t�ߢ0C�pVn4[ƬM��&a�F�"������p�O��;!8B�
I�"wAyI0�Q�J(
ƣt���;Y�	��abe%x�$�R��ư�B>�-F���X�ǽ��e���u��\"��ß9�s���~0���#��L$��ޱ.�j�f	�`����P%Y��z�-x�dg
� �}��lԥ�	=9J(��&�2c��c��4�����d�����axEہ
�A$��&��?0�S���r ����*��JP�Tm;�� !��T�k�[�<�=4L��Bw�F�;�D������$53G��

~Aէ1eє�����=��	{�@����W�
���)�dz�>�������P�З�êVH̆��L„�*:
 �kF��Q��y^P��؀�u�X7�S����H����V��k\_zO�~@���o�S.2��u�A5��5��{L�����1! FlêQ�vk}�<���o	, �xE�RE����%#�A����nR�h^O>1�z�okuB��Ej.�G�J��w){ݪ^�cB8@)5/��my{h���=�
d
�`�����-0~�I*P�	�$@l�����1�@!	 3���E��
B�V��q�l�G�a�Z8˼ڲ K�Y�w�+e1z�bFH��\����پ�4�K��t��DC�`#玶�}�o�8�px!,�	Wːu��kH�K?6q� �����g��8{�f����>$"�d���on���ˆ�4lm�_TZl��3���yrd ©�<��.ձ���kh�x:��SC�I���Vq���H6CR��Pkt�Y�HV��;�
�����,ad#z�J�7�g2�{�R>�R���O�{܂�A|��]<�[�<��=p\϶�-�v�0^�ly�� A�՝�<�x�B���Eg��'�}�������MiC���z>��T��*��[>�����q\sV��Վ�d��Ԁ"��i�g��Q)`��!� r/v��mN{�{�\*x�C��ν6v��uA���1�:�8 �k�`O���n�ם��d�Ԟx�A��q��s}�]O-�4�`߉{���~������s��=�#��C�7�=�@D`�׼�8��4�
`���e�jڣ���’��d���7��m~���`���{�S���'HE�D��y�\�e]�}�WC}'~��aх$�Gߧ3��t�j��Qw�wl�A��}�8w�'�-Ux
s8p�C
j�����wk��l2� )P��}�=HmAǀW�i(H�~�g����8쀄=Xzw��uv�1��5;:��-���t�p\D
i�
Gȃ���'�e(:`�������We�7y�BW(ol�P"@��w�pU H
��[���'�g)�>d�qh��k8{'7tw'P	RPC] �P�؅��n�0�h�Y@��؂�|�8�� �XC��8�^�T�p��oЌ찉�׉!�I�(}(c�,��jh�嗊�p�P	�A_0��P�yx�H/����Y0�r7�TƄQ�2�x�&��[(�T�T���p�����e7�e%�P	 WCup}��xȍ/x��q
�����|Ќ&y���S{�(���3	�X�
)�MG�	}+�):��(���b�5D
-P}`��ȅ ��c�f�`�VCPe`�3��ݘ������D,�dI����:5j���U3�Y�A9���aPYC+0
Kɔ��u�$�@GPpi���_��f�P(�U��H�mx����YC2P��Y��H��H��Tcɗ���K�Ŵ�������Y�
�u(���(Y�[�C@
�VCPe`�����Y���	��Ar`u�)�@g�n�(�)H���ٗ�y�C�]�iy6�p�MـZ�!�A p�i�Wɉc���5'[`l�@#�0P��	�.(��	*[�}��|y��ɚnhZC`ә���x�Iq؆�5
�؟�	��	f��5��П�9��i~�"Z]\3a�����ש���R�@��"P�
��s)�7M>]P#J�@�|Bi�E	3*HP�8��蔞0�y�ʼn��	�Hʣ�h �@�4�@	D�Sz�lh�v�;{�V�PZ�F�J��f�{����G��:�%*�ֆ��Ӧ�8:��	�Wv�������Iz�ߢwQi	<Ъ��g)|{ �l�����J�J	�
�O��
�j�`
��j+W����
���^�	l�����:�����zp�7H7:��i��X��`6h<]���ꠂ�JJ�������Ϻ�a:��ᭂ��������P H~�밝���Z���Hf�7
묞)��8�ꦄ�#+������L< ���I�����D2��6��8s!��,�$�
�BP�1�r�f�!8�"^�$HИ�J2*��IӶ8 �|
秤ɓ(S�\�2e�C����3mڣ�Li!C��M�xq�ƍ?����A˧P��\�'�̚7��ɓ�†vJZ��F�J�|�BA�۷(�T�&+΁\~:�b٣IӮ���[=bֵy��A�
�
*��E�9zG$Ià��Je�T�c�PE�$�-[�n-f���a8C�@�oޢĈA���o��^��A�W�V���*V+U�v�>��Yj\��������a���;���4)jʼ>J<=�K�n��T���k��-���m���p��H6MPc߅r-]/�]��v��
x�Zy
2�^oG��Zxa}���*��R����fj��w�l�1�o-
�b|�)7cT=�vZj��6�l��[o����7��d}`�at����ލ�x���%z
r�^���cŘ�1�thv�&�!X��(ڦ��]�9�2�Y�
6�ȡ�*"�&����1
ᒊ�����c����2Q��H��by^n[&9|`��*K�N����ۑ\�����ka$�ƙ�a�wm�(y��������g(Ԧ�굅�y萟.��2��w���j���hh���['��.9n���ԅ
Ӷ�i�@V�Z�s�d��6�pJ�Jll�j���4����Q!�>�ꧮ��f�&���;ĝK��$�,�s�ւ�)��"��Ұ�`�����{�.}p�;���*y��8���hRVL+��j���)�2�~�<��pg����1�эSx�t����n�l�m�ݞ�3��0v�%]A(��̸�'�,&L�;k@�9J�я�
��+
�צ����&y������_��N8�ĿM�߹&|�8m�n�=�CH�D�۸���)��;��;�\�94`����z?;��{�"£������p�9�Ѯ~����ܱ���D�p�s41��joƃ��\4���y#{ޭ��j�Ł~��>f�=��lP�r��w�Ʌ������.Nv����'��`�c�S@���R�"҆��"F
t`"�DV��>V�06���!�Dh��yM@�$l�S��{���5��Ր|�q� �f=hT!	����.!v����J����cs�h���ڍ�i]�$!�w�$d��{�3X�
�1��[%��j�(T�:`
;��s@�q�-@zc?%��H_��k�i0�f�rp�
~�B�O�d�XMQa�g�>���/�҂bt^ɎeF[��z��[+�d�K@C��/z��FQ���c��,�zH�����q~�,��	��?8����M��,g�v�Q"B )8��60�Mdk���|����n�N��pC}�S@@�0Pg.2�6k�B�y�!�4���@)�Lq��U&�!ʃL�i;	x�qR3�-��S^�u�ƒPq�JZ���'�$L����@B�����j��H���ԃ�[�
��X�>��(�0Q�{�O
|@c�ζ~�����P8��֮%}b^;�\���+gIXQ�bB@��:ՠ�aB�9�1���X@��:��y��4���o1�+@�R�]�����'����ׁ PG ��ۙ�rmajN����&���%�qP�� �w=]�Jv��u�yaٿ%� �~.d�Z�6�@
	��6��#�{bI���e./��V
�3�|%�Ƅ�`�!		��l�/V��}�E-<L�-TÒ�
��"07�Ro4KLcg�.@!2���8�v�uk��-;p�r���O�cԧ���BJ�Ia��?x!$�r��͚U��tb�$|�B&D ɐ�w�����`gDW�f"�ʿ�3�J��S��@��@�H��x��=��,�ɼ�D��hu�	�q��ziXSx�T����)	n��u��Li��g���yG��z�/���Zw���� �=�X�5��M�+h�<;��w#��a<[(<��
�Q6���m^��o�� Aů=�1����B�]8+0��8|�Kf�w`�w.@  �k>�ٝ8��p� y��'��zO��C>r���ڦ!����]�$�EMr1k��KX�7< 	;�enn��:`;ނP��+��2�-��Y��?�w�@���qܷ��z2&�tk[��{�ٶkӁ�;`���Mjz�:^j�h��N�W���f��ϭ ��l-x4�{��<��&|m�x�9 3��/T�p i@!4�ɏ~ҥ��#ǁ0�	�A�ܯo�
��޶S�\�6�~���w��>_��E���{`�V���|�|��@nW}��|�|t }0�0~�Wv��yRELj�u�c=�	�dwy�Qv� '���;Ԡ���|s�{3w~�')����}��x2(x@FpD€(t��|����8�0Hz�m|�37�]��=P��f#(E%x�0[�C
i�
;���Gw�6�N���3:�P�w>{>|�S䰄�� w�p
8$�pU�B��O�(��W~�M9Wht[��^(��wv�w� �R�
��Q(&5{v��B ��h� �z�B�<� ��@������p��o������H�('�f=9��؅�(�Wg4rv
�P������؆2H���h=�3���8v��c�|#s��mR0
}�|Ah�ʤo������PUe�P	�@u�|�@�l�"Ȏ�q
���|�����Z��)�(��3	�Y�y��(`'�r�	Y8�(@�)K:�@���ٌP8���f�fPy�ٔ+9[�	��?�(p���n���ЕR�D0dY�x�{�x�A6�Y5
?	� �J��;GPc��ɔ`(�2�f�EX�H)��h��ҕ��@2�����ꨇ�h��TV��y��&p��}�������
8��@[���ِKɑ���"��kUP�ə�9�[�	��?r�t�Y�1���)̉B� ��	��xt�7��B�`\0����7��? p噛J	�Uכ�e([`_i=#�0���)�!H�$60[�}�o���陔i�@`ƹ��Y��ɇA��������X��a��@�	�	�����G����%5#(П�ɠ��J;N�S� 6���i�Թ�ࣼ�EP�J�ri��O�@�(,�� ��"�	s��(��
���-J�b
�@C
�P�bJ�8��:Js��X�~Aj�7���v�;J"{����G�|J����g]��tI)j�z�Bw
8��|���9�u��n�vDi	<Щr�9{{P��l����~z��	�:�O���[���^�(FW������)�A�	l�����J���g�u�`����ӊ��:�4h)�:]���
�1蠦G�(��ꚨ�ڝ?��ΊB�'�bJ�3i��(��:�����Y�f*�Xg  �S���
�sʉ�艸���I �c
��f�v�
�K< ��=���7�@"��({�*;v!��,�$���"F�����Y����.	4����J�iҴ-�G=��I��ɓ(S�<���!ly�L����!C��P!C��"N�8cF�?~��`�ӧPK���2�̚�n$��S…vBJ�hF�I�|�B!�۷&�P��M�9�~�9VbY�HӮ���[=^֥yw�N�>�
*��E�9z�R���#S;U�,T�"If˖�[˄0�b؀� P6ě�(1b���ۆ.���|��իU�t���J�]�R����4.�|��~-��0��r���p�1UN�$�ΡK�n��\�x���v�0��Pn���{�)�M��G�\<��~�]��v���F^������	�Z�:=d�J/�L�!2ٍV�i��f"l�-��n,�"|�!'cT��fj�
�lF�[o-.��#<�\�d�\t:��!w�&�,�ay�[�!|�X!&hLd�ܙ��_�#�h ���� �wJ�A�{µB�6n�����i艉���K*�ǣ�V�
T�#���T
�i��ݦe����e�����A�6k���%�.�q@<��U@m��ߥ�mם���y��۝z���[}�"-��V��r�`����@:�ShX�j��b
"�C"�.��2�d��ޫR6D�ꥮ�l���i+�'���(�
$ůњ%����?�H�D���{��w���a�:8�rJ�(�k:`����4�?��m8�a��M"�+�������Q��AV߸�=J���!{�]�|�e�&����m����pG7M�}���X�9s�6����@��~\A(���x��n�����`^�{�8�D�^(פ�X0�4�Ϋ�#y����m]�n��7�ߚ����V�
��w���#=��:�t>t���Y3�7sK�����N8���(.���~�蝖n�0��8��,�w��+t�JZ�l�+w�{#�@:A@A�m�
V�G�U�z�{�+V��=�l�����Yto~0��ħ���fr�r��xdž$8⅌���g���1�Q���"І`0m����w��}�7�x 0�'�*x!ȐWB�0��#��82�yMP�$l�S��{�Y�B7�m��|�q� ��;hT!	��#
�.�n�W�A	�xl�N� #����-�K�$$�ΐLz�a�"^�(�b��7p����ʹ9�; �
���Ž@����J���D��| �x���I�*B�k�,� ������$7	0k�S��&� }��`L%'��Z�����ޠG��6��>�7=�_�R�A�"1ifL�r*h��#4��ӣ�DgN�ȁ
p#㝚&'yί� �*D�pRq~Qma���VF�T�؃�,7��݀c�h_�@P#�����9��n/U'�&UЋF���,�G��	{�@���Sk
�����+H�
�'̔l���Z5O�՟GM*57�~�I�p�R���OE�0:�>�pN�{)y��^��BW*Vxa��Ğ���u�o
kGM[���p6h-^Q
Ž�����ޭ�ز�A��i��m1! h��P�ΰ�U5����ͪn	, �t#��<ʐ�T�k�A�����koE뢗��{�A�#�ݭMQɶ��`�sU��؞��(�� x!�oh�{��6T��`o!�`X�ԝ�}I;[��HP!zpb��`�f~�
Iĸ���./�V���M�U�$��ɓ0�yga�fx���h�i��?�X_P�<@��8��&�w<��@��hȀ��{c؍�
4�f����n��K����u��UH	��P.a��?x!$03��+M�q�|�d�$|�B&D ��4y�[��H�1g"��ʿ ��Z��W��P��@�L��z�i�vz��Lzʪ�D��H/�N W�L�z�*�2vA�PIpC�x��}fN�מl��:
d����w}g��?���@�uzȺ��u�J�a[�ػAx�
i�דX�ց
�0�u�{բ����<�݀�(E2H�qpkY�x��� �Y���x��{�5��4�s�i�#���,�Ń+������mm8!��{�
P����M��a�5 ���j��9k1GQ
P�9�H�q��w��)@���
�}��޹o�l�Y�;G��^����/����dx~���������� 4Ҿ�����v���.R�ݝ�=������;As|�Zp��ٽU�*/>�k�w���Ou�W��H�
���{������?�-�I�HH��~�s�V����;���׽���N�f�*T^@�w|��|��Aا}tw�Gy�l
�}t�}0�~��v�Fz�Cnsgv�c=�	P�m'z�Q�w8@�C
j��p���wH�{+w)��}��ԗx9hdJ'�G�*��7��|����8� �7�z!'n�j=�]��=P����f+8E'' ��=Ԑ��6�~}�kkxN��3@�X�x�V���`�0��� �Hq�F'P*DpVx���n�4r��O7��h�Z�~p'P	RA] �P�����R��w�h*Y���D�{Fhh�(�8XaP���N�\�p0�o`��`�߇��H�(z8bؓ,�e��vEW�P	�=_Њ��vX���.�x���Y0눌xt�X��'�x�&��W؈Շ�}s
�L��}�����(U���qTҷ�X�Ԩ����@
�:M��ؑ���5��R�%�9�P�Y��8�����~�
ɐys��h����"��D
-P}�ш���]�`oAPe�*)�R���0��C,�\Ɏ�x�`iby���3���(��Xd�h��Г*�� �Cy�C8 Q�s��N�Q���HC[`j��Zٔ5����nxH b	�$�h�]َ�����K��tI�8��:	=�i����)�Kg��p[���	�P���9�4#�lUP�9�©�`�	��=ruͩ�:玛)ҩB��Y��H��,��B�`\���ɚjd��= p�Oy�^7���&[`d�;#�0���)��;�@[�}@�t��Y��i
A`���y�ɶpH��Ǎ�y���p�`�A�	�i�����Dž�a��3#(0��)�
�	Z(NT� <Z������@���E��z��| �J)���,�&
�b�	s�.�
����3��b
p�)C
���h��>z�@�sm�Z�:p�<ڣ+�kM�����7]�p�0�Jڡ�G_y�Jd����'�lWP���\0�0����n�-t��������:�����=`���Z�l�����O��z�aj��Zh|%BW����z�퉛��	l0�0�����x�mv�`"����ܺ��0�9]���j�8H��g�9�
��Z�㙓Y:%ԪB���h��6٩��*�ת�k����l��ag ��S@��z�y:��X��P��I��ij��֫|�
�K<����Nx����
;X��+�!��,�$��h#�AN��(�G��K�	CQ�E%�4i����O�I��ɓ(S��p��<y�M{DӐ!���paCi%RscF�?ap���ӧ$W�q	S&�G6q4�B�v>:�(ƍH�|�B�۷%�L��j͛8uv��slIJE��][�a� z��;�V�\���	4�Ċ3n��c�àI��u�H�$�eK֭e�x1l�g(��[�1hW�mC���O>h���*Z�X�j�
�.W�N�bfWj`�Z���={Xmg�w��[8
E��&�?O��ϣO�~={�Zݥ&Ax��"Ll/�v[z����p�d�5��'���u�a���x'���������֠o�A(!�"�N��-�q�vƌV�iߕ�y
ޖۊ���^q�����������V$n��Ƣ��0����
��A�#n�j��2���-��z�7�`��D͕�!���("�8�jYg���'\+�X��gv蚄�x�y�:��"z4��a�ذ��8�̎��HZ�A�Xey�a�$p�u��NA	䔲Y��Yz����+\$���Uڟv܅�]�o��霾թ˾�g(К��aJ��	n�̭��A���6���N����+������J~Ko�)uaó�Vʪ�?J�Z�p�z$��&�pJ�JL���%
]*��S�$�ϳ���!�Պ�x���t*�C�'�4.�~J����k���K�k��sJX���.�#
0�*,�>�I4@�����cDZ�6�K�&�-ګ�N�6�����0e�IG����Z�f���,��9G�؃�qA� ޲�Z���H�;k@P9I���
��Z����@�����A:�g�vu�
����1�.��Co+�w��V�"=��:�h�9��5k+0����N8���t�ܿ^4蛊N�(K�8�3K�6�\�<����ov�rG��'
�����ֆ7�Q�V��T��}�yq�M5��@?XO���\(jy[�
亥@��
Ip�
�Ž~C���0���E�
����(?ίP��o0�@�J<��&�*^n"��9�
��y|^o���&�p6h�)R�=���{��^�d8���cu�4���L�q�Lcw@)�x�^<0W�$F0�X+�֒��G2wgHB%��0Uό�C#W�F72p^$^�V���
PGL1�n��j�#�Go���<]>
��:��_��!�5c�@T�B�SXr����4�ةGb��g�>�I�-���;�ۆ��Zޒ��@,UI�ϋ���Ȧ�^��M�̆i�>�@��z`��r{w����ɵ�a9(�a�b���$#�ٵ����@L�M-����U*���3����/��Ӿ�c�H��0P#���&��丆�n.='�"EP�:3��bG��	{Ƞ���Si���T���G��'Ȕl���VO�2���:jRx�b��|�&\�T�i !��S�˄NU�1���\J�ӭ�D��W��P���]���=��>@�y�[��Q���%��
^�ד.q����N{��6vltEdBN�bB@�B�u�0�*�1���X@��N��vla4��m1�+(�\k��ڔ��]�F�+��Ɨ� PG ��ۚ�Rm]D�_��\�P
I�,/�;K! ���@���,C����zK0�=|���״�](ꁄ�+��o�Vi�=��D�,`��m��;,����Ν�P�#S�JP.��!�a�R�!~!w�XbI|��K����/���0��:��!\��[WZ�0�@��8b���׼}0�Yf %�f_yX�p	�����^F�3a&f����A	��@$���l}��"u`6�ܝ���.�B�U�5{k�iy�pd §��d���Ҷ�t�Og������
��)�Ӿ���ü]S7T�(��jp�Y�=�&���ൻul�`�����r=80��݈>2�o��:����6��w�.��
~4m���a
��w�I�_�y/�耱	�R$�"7����M
�
���o�/��3�;�sB �����N;܂�ܸ:�d�0O��3�E8a��{�
\��x�.�S�Q�5 ��k���j5?Q
��9�H�}��x��)@���
>��9p
uUz�;���m�˒�/��1�d�>��>���P���g 4�>���[��5��R��G�������A{_��Z���+�ٿ}���z�������\$"
%���ozۇ�%/u�8�"!"��Gb�܀{�k� ���_���d��I��%T^@��|�'}M�A�~�w��y����}t~0� �gw��z�cn{�v�c=�	��u�z#�Qx8��C
j��Ђ�GxLW|/�w)P��}��y?�dN�XXBIx�~E%ː?��3�H؃�Gr��z�6��58:��.�zn�Ntx�p�[�C
i�
Gȃ�Wx��'�eh7`��Ѕ��hK8yLV��BX��nlP"`�ϷO�pUPB��\�H�M&>dXB7�����_Xxw'P	R�@] �P���R�wx�h%Y`���JH|L�h��p�A����8�V�y�p��o��Љ�"�H�(xb��,��j����vCW�P	H=_P��p�{���.�8���Y0�8��tƨ�O�6�x�&��\H���y��Tp������RUj�P	TG=u�}�0�z�0���q
���|�(���([��H(���3	y�I��x�Ȉ�P�i7�(0��y��D
-P}���؅!���]�`u�@Pe��5ّ\������C,�f���ȇjil���30�y��d�ER�@+0
M�BY�8Q�s �Xɑ[ن�B[`j�dy�@���	o}8 lɐ$��g��Ƹ���KP�~��C)�E�h�	������[�d!�
�u(@���*��])3@
+TUP�ٚ�I�j�	�I=rpu�I�>����)�YB�0�����)1�YB�`\ ��i���S!9���P�ʙ��hv�iYk�v�3n�ɚ����K��)9��Y�vp�A`�뉟�w_��J�){���I��	+�`��@�	����������3#(��١��:(NT� H
��Y�䙓���E`�'*�
�plS�7J=P�;�9�@�	s��:������?*�b
0�'C
�p�tj�JʆLtk�Zu:�0�H��6�kYڤ���i7]p��V��cڄf��;j��)�s�O��ʣ�I������wSi	<��i|{`��l��ʡ�j�������ઃʦ�����W�	W����:��)���	l����j��(�y�v�`(x���劝�
����6X9]����>���g�Z9�ʯ�
��I�d�7�ZB�G�tj�A��x�%��j��z�xJ�ig  �S�������؊����&[��
kȊ�� ����z��*����g�,��۳m!��,�$�ň�D��5;����%A��HTBQI4M���٨�S8? C�I��ɓ$3:�-O�i��4dH�M�!<�p�4�%��h�F��08@ɴ�S�+��t	S�#�6o��d��
�
%j1��8��Pxʶ�H:R���:�fց���p,Q�g��qK�-�,�Ƭ�U΂<����0�Ċ3n���c��$��B)�`�lɺ�L�/�
�eC�y�#�ߊ�m��x��^�ZEK�X�T!��*թ\�F�2
̗�ծa���6��Qx���H�R��C�顜�s�ҩ[�UK�i	ީv�0��m�ᦛz�)�M��\,��}�MW�u�����^��w������JX:=T�J/�<�!2�sJ-��Ɲ���w m��ț��	G����X�i@��ڐ�ݖ[�H~s�LW6.ל��m���y'xS�����1��<Vt	('&�e���!
H l%&x��~Т�n�������h:"��� ���(���c��ֈ28��#��=���R��7[�F����\����?�*�lDZ���w��n�Da�'�~�e�!wj�)^�p�&�h ���4;���Wi����2��w�z��
)��rx.����&��"�m��ԅ
̖*i���
��m�Zd��[0S��Z�TN<,
Z*pqS�$�����a��~��w���q"�Ò#�.�{>k��; ��K�k���IX�F��[.� 
�o�'��>�4I4���ޘ�G����b	�"Z��n�v���pG7K�M��#��R��2�0�:sͿ��~\A(��\8��V�/����@.�{�3��>c�՜��4|��� y����-�h����M��}��G��*��w����~<��:�T�3�����1_�/����N8��
��γ�ث��v�k�8�3�3^�o�Z�\W+w�z~�@:�?-�l����<Z�y�3�
�<�YpA�P���YTo}*�S��W���fq�2��hdž$8℄K�V?�P����"І`�ol�j��'��ij7�8 �
��#�*wTU�$�1
z�c�	aiwpЋk�7��N��0�	�Ǿ�e/s۳���w"n��F���9��� �����NƋ��a�"�j�ZѮ�H@��I��v*�E�Uj� ��F����8#ǀ��j�T�:`
9��r:<[�8>zc?���AH_�1��J$��Ȭ�r��
~���H�侨�CM92��;����Qb�����jyKB �0�<Ui�%[���@~�KC�P��t1e����x�CB�P�_^ώ��9�0L` ��!�P�vZ2��\d9����"@I�yE�e�a���,ن�x���7���ۀc�(�� P#ԙ���Ҕ8��n-E��5Њ>S���!G��	{����Sg���t���G�
�'Ĕlm��PϜ����8jR�'�b8U�~M^����M/�jP`"t�yt��\��1�n6 �d�U��T���D=p	=5�!��k8�֍���@�l[���{5%Q���"���,A�KK�J�bB@��B��]�0��=1���X@��R֢uT�4�Wl1�+@�^k^��4��]�F����z PG ��[���lZ<e���\<7��SC$;Z�JL����ü�Ůz1���:㽭4�L�a_ײ�=�m�z ��A�c���u��-($qc���(p[�[�H�0�ܐ��&y��� ���@G��֭�EG�B���Ē���"P��bNo4e�t�DC�\��δp��5Co�t	l�ﮯ\��3�@J���r��Pz�BH��0��,+3���I��L�@ �Q��~��@�:0�BN�D�5���ᚽ��<82��HV�^o�ETrz6����,�7G[��ֲl:�@p�&��Cc2ow��7x��Z�p>����I;�¢�@��o�؀�-;�_�
d����\l�6����ˍ�2>{��2�ɭa
��.��K�_�y/�	�R$�*g���hM
�
��@p�W��s�;�C ��6���Nc<�#wBɡw�T� ��9�'��xO���o���<���c�:�]�$�k�s9O��$J��5< 	������: �ׂP�ă=�G.��Nv�#�^���q/r@�5�?Ԟ�փ}�n���]t �Ѓ���|�:���Aj<�������
|~H�_ZD�z�S���z���ӧ�v����v�s�5HDH
T���7��[�jkq`KDB2D����\�<�p$xtE;����gpK�x���@E�D���'m�Em
6AR�~�=��~��i��}�G�3���}�j��8�&xug<��}��w����'�(:Ԡ��:H~��}H��') ��}���yL�yN&r�q���w�$(Kː?��3�V����r�F{����7:���;{q�K�x�p�[�C
i�
U����x��'�s�(7@�Ͱ��7u��dڷ�:EfHolP"@�(vD'Pqi��-����n��r�#�g����m�'�'P	R=] �P�ȆxR��x�hY@����Xx�ZxuF€����(�WV���'����������$��Ј)F;9�鈇��o�3pu
����øŘ�L��ҋI;�3@��8��G��A�x�&��j(���A���p������R�j�P	[g<u ~���؎=����q
�����|Ѝ4���8[�(�ȓ�3	9�)���dո}��#)7��(�9z�C��C
-P}`�긆.x�+�]�`x=Pe`�A��hY�ޱ����C,�rY����vixٖ��3�Y�	��X^	=+0
Y��N�i8Q�s�d��g����B[`j�p9�L����o� x���#�Țsi������K����O9m'�����	9M 0��r\Ԓڠ[���y�fi����.#�0s@Ue�p�����i��@��#^G��it����鞋y�����Y	�	=�`\�)���;-����0��Y���v�yYh�v���3n։��Ƀc���K���5	���vP��A0��i�x_Q��	�{���	��Y�`�=�	���i��񢎵4#(����� z�"
@N�S� Vꡮ��Y�ॢ�E@�5���Y�
6�Ej<P�I�����	sP�Hj�)����M��a
�9�C
�P��J�X��Z�th�Z%:�Vz�BIlg����)7]p�Щdj�q����IJ��	��v(=�\ЩJ��Z��:-������*����ͷ�I;`�쐬*���)�����Ы����y���W[HW���������	l��Ы�J����
w�`5H����Z���NhC9]����Kآ�g�#�����
���h�
����ˮ������@�Z�z��J�pg �yS@���t��)�!*�I �+��v�7벹�'۳M��Yȟ$KsE�G+��!��,�$�!	�d͎A8p�)�tI��1�HTM��mq2�ΏǏ C�I����a˓gڴG0
�BS���<�PC��L�X��O�\ʴ)�|T�t	�L�5qr"h�…?��x�h�OX(8]�6$���VR�9�́\y�m(vhQ�h��D�r_�ŪŦ֝^{�l�0�Ċ3��ؑ�g��"E�̖-Y��	3`�Ű�!@�l�7oQbĠ�[ѷ
]>��ݫW�h�b��*d�\�:��,T�F�u����^;��]�v�ܼi(R�t���xzO������sպ�]���"�j/�y�݆^o�d�5���R�s�IG�~؍��i�h�x�%��n:a�¡����Bs"#�1��r�u��bj��l&憢z�Ǣg�i��j�	)m��x�7���p`C!r��x����w�xexRiނ��cŖ�1��q`^8f~��a��6"�U���+���
/�h���i��(�x�*x�"z ��`�ذ��3ڇ����#�N%x�M�Y�n�a��l5飫A�6$���x����VI��%}��G�u�����a�&npꁆ�l�ʲa��~��ii��*3kzw�(�K�a������V*���˛���[R6(K*��������f�DJ+
�+�R�0�d�k%
X*p1S�$�������]w���o���#��-�y6Kf��(�m�+1o;�F�%}`AWh�@S��Ѓ�x4
;��3�"y�@�1�Z�9.�cè�*e��|��`�d����1�эRu�t���
��d�|&̽�\3o|�D��)#.i���{i�뺳����^�ϛ�)4��-���{�A:�Wh�s	���ms���}�]�G7؀w����u�O�!��,n⓾�f��M3�1���C�6����}5�$��X\�8�3K�1��8����oV����t8�2B�V�< 5OV���<GT�m� ����VO����T��guoZ�s�㰕@�Վ
Ip�
Ǻ�n~�n�0A��) m��(��P~�����	N�\�t'�T���!nH���݀�/��`�	��
a�f�}+�^��G-��<��j�*$!v\��E@ �U�A	�t�xX�J��"��9��+�%d�ΐLj�`��׶16z�o\�>L�	%�Qo"���@�#���3��2�����7v�Q�.��Yx/F�0�A��2K # �0E&���|92k��d7�w�C���b*'��V1�p�%/������|�t�h��E0�C'�eȔ�w��	=0�B���<��j�|$�0��,��0B1��br��"��J�@D +���E���m��@�f����%+�&Pe�c�@_��P#(T��,���8��o3]���ЍN���):��	{�`���Us��Ԝj�I�:�'ܔt���NEϟ�R�N��T�V�bX�K�gS1�łM/��Pb:t�|�!��7�2�n6 �f͚U�����D=�y<5��!�
,9��s�S�X�l�[�����Ue=���Vv�t�f�T{67���v�����jC=��cv5|$bL;�%����,G��BkBѷ�b=V�@�6���i�k_��M����@��@�׸:E�ټ�J낰c��nm����V���@��� F|Y;��6��u�~�8�%� �+�g	�ڼ�@�	��F�5<PHB�n�wy�Fp�^.PC,���vnH|�L]5F�����O�Y����u���GK�\����Ù���1��,
h3���:��u����F�@x���0�
��yz��\�Næ$^������&��d2B>X "�d�Z�g��=G4B†�C4|��_dZj¾/���y,pd ���\e���g1��\:K���.u�9�'fz�Ӷ�����ټ���$���<���s��,mO�.2��9��vto����ف~i*?��X����n�wۤ����{�n,�S�Á�Z����xA��
�R$�3�w��h��
����|��4�;��I �F��-�	�|�kj�o��
��6�ʣ�'жvO�A�t}���@��]�$�-t@S��XK�6< 	|��NpO;`<؂P�ȟ��OO.��ޚ���t�(��ӭr��P��!�d���������4/x�<���o��9����!n���@��<�Z���k���v��]��˾v����vu���H��������F��iM-di�H�"y�Gs-Ft(��W�l}(}ge��I���T^@�}�'~Z�J�'��x��z)�a[&�G�3�X��'k��8��x}w<��}�Hx�g�e�'�X:Ԡ��@�~��u��c�')���} ��zRxe^n+ׂd�؅)�v ���/8�Px|5wo�WkW�^��=P2���gD�D�'' �u<Ԑذ�O�X��m�xN��u3Z�r�y�����e��*�І�� ��}��\�pU�@�q8�h��VM7�=y8v}8��H�xxw� ��R�
�s8�-e}�G��@ �˨�A�����D���saP���hHf��6�p�o`��0��W�5�H�(�HcǓ, �،�xw?�h�P	$x<_��������X)Ę���Y0
��(�u��_gO�x�&��q��� r
�L�}А�(���U����r�S����8�i�@
Y:M���茻�r�G99�p�>y��؉	��(,�us$������Dْ�C
-P}��(�4(�6i^�`�6=Pe�LI�t	�ܱ� ��C,�~鐵��i����CU3��ɉie)�����@�e��ꈖ�U;GP�	�39����/�f�eȗoy�	�'��A�"9=2����	��T}i�f���ɕs�����I�i�08�
�u(К2�)�A�u�2@
��OUP�i��ٛ��	�y<rPv�ɘN��)�@�y��ҹ6ݹ@�`\��������8����Р���Xw�Y��v`��3n�Y��)�J����K�'j�@����v��A�
��'`�9~*|���ٙ��)�`�8=�	�����g������3#(`�Z�**�,�'NPT� `���٘�	�����E�?��rbؤOz<P�S������	s�R�3�:�:�W��fb
��#C
���b�du��bU:��`�M�lqZ����8]p�p�n
�{���Sꠣ���v.�O��J��ɡ�*��xki	<p����5i}{��l��J��꘬z���`��J����FX�	W��溩����	l�`�������w�`;�� ��
�[�8�I89]��	��Qx��g;9�J������|JA��@ȯ��X	���@�گ���ʰx@g ��S��窛�
��(����ӳI���������
8�K<�=���z��(r.;�� ��J��Zf!��,�$�!q�f� 8�^�$HИ�J"*��IӶ8�|
秣Ǐ C�I2d�C����3mڣ��i�)F��	D(maÇc$N�x1�'J*]���
>)W�|�(�L�7,h�B�@�N�X4�',��]�Tl*�”y�&έ;�2+�hٳu�
V�Gʸ.�^�R3+ޮ<{2tQ"E��h�8�s�H�ٲ%��2a�6`�3�
��-J�4r+������"�{�j-]�b�R�l��T�r1��
h`�H�F�zkg�e��b;7
E��_�O�Ƒ+g�z�ZԭK����-a����k��F[y�)�M԰��[׋|�5�\t�U�m���f`m�%�`���N��-�U��sƜR�1�Er]��q7�k��h[����[��A������k��F"��0���M��#}J��u�ɲ����x�7�Xz�D�uI!��e�����J٦��'[+���_Z������z ���Q衂�c���823�R�9.YZ�ݵ�����W啜����=��j���J��S+[$���5Z_t�iZ�gvW隵��î5g(�z9�A��N����A���*���.z���+���nnײ�.I]�pl���z*�����>��%+�JA�B�6��QBLC�
P�"I�s,|�Vn��a��h�;�D�p��#m{��ʆ���Y����k��3IX����ϑ�(4�"M�>ܼtH4����H��+,�>n�j�����H���O�m���wt����!!>bw+u�,��r�2Ӝ^���R8ʇ?��RJ4����}�G?��۳�{���F�N+�y�N��͜�h��0ۺrk}�M�7�@Hx���w����~<��:�\��C겙0KK�����N8����s�ܳ�կ�X�;l01�
��,�sQ��9�y�~�r����
��|Q�Ά��5�U��U�w��9byt�ޢP
�0�z��E�ޗ2<1�{�
�jW-ΎvlH��?���^�;���j��`QOhC086Fŏ����((L,�zx A��	��w�ݪ������֡B�1W|m��N��0�
y�Bz��Yߋ��7w"dǃF���=�p��*��v?o�p:^<*W�%F�T����%�K"�xgHB'�H�Q�jc��
:2p&��A�F���@���u�z\��V�B@Ɛq���NI�|02�|%�T?K]RG<@(�a
O6Q����f���zg�>���.���i����aRH=y��1:�W��4�����\��زgƌ�;P��h�����3#EuN1P��@��C���HCi��fm*e "����d��|WP8�P6	]���r�ҍE���n�on
h���G�4q�Z�E�7���x�r(H�9�m�����=d�@y�a�>��ۚη�+�t��xʋ�FPw��'Qey��Pժԣ\1�:P�26�A„�:7
 ��jDE:Q�R�i�N�H�؀�]�W'J�I���������ְ��kI�J4�~����o�&"�����,3�Y�A�}�S��7!@iXA�ۮJԇ�1�E�"F`���[�@^цt{��L�5F�ctAo�\�:1�$�/q�_�@� /s�J�}���w���$�6�ە�A�p�L/^1�+�󺐢�4���:Ro	&P1��KZז��E=��@�@ǿm���9�Ν� 2����b�z��=/ݨN��&���@�+k��v���Ϯ�������+V�2B_`�<@���8�=|�<����hȀ�	�d��֭N��g�U�2�+T0�xq\3�(!�>K����:Pb��	 ���|�@���2��}�@&D ɘ�}��Fzc�
%�h"�Ϳ(��}�Q���`��@YkZ���P����:̤�[�5�j˂z@pB`�'�n��-��aX�AJ����}�?׺�S���:���pv��L�	W��.��
80����0����qڠ�����;8_o������x�)|�Þ-�q-�a��D)�A��[�~�P���
�8�G~`A+�Rh���X���T�bɭ�aȜ�7�@�r3�\Ī�tK�'��D7:���2~�O��w��@y��m�pc_-p���$ �Ц:�1�xH�kA�����F�{wc?�Q�NwҝC�g���m�����ݓ�{��{��3�l��g�0<�1opbS����J�Gy",����^��d�A��8k��{��M;�����qO�̀�m1�ÉD���TЀ�y�|Z;��w`%�� ��9�bIwu�X�l`}	�}�e�W5��T^@X~a�~]�X�w�Cy�{/b^Vt�0͐�
�x'|%V�7x�c=�	��|9(?�!'�H:Ԡ��C�gz�|�')���}P��Wzڧe��ix����-8Q���28��T�|:�;(c[_��=P5H��hG�_I�' �u<����S���wq�('�~87��`��'rVH���e��$��� �X~�+�pU�@G�uh����vk~W}�v�������xMv� ��R�
@�wx�2�}����`Y��H�b�ebg�d�� �YaP�Ѝl�v.�!�p`�o��쐋���8I<��6v<9��8��ȋ|�C}u
�����и�H����㢌I;�3��Ȃ`7��hr��pR0
}P���(F��$9`P�}��X����U~�0s�S�9��h���@
I:M��8��H��e���K)9���B���(�c�f�0Y'��������1	8���5y�vx�F���fph�P5	�8y�T�![�	�x<�(����X��q�|y<Y5�ّ���_I��Ȗ��`�gٕ�膶8�Q�sИsy�vi��C[`j��)�[I��ypGy�%I=2 ��)�9���	�i�����^	��Iv�ɚ���i��GP<�
�u(�6Y�EI�x�2@
�OUP扜�	�����@r�v�S7��)�I=���"�թ6��@�`\И�)���K<�����I���w�YZ��v���3n�y��Y�!���@L�+��D���y�v0��A �J��g``�~J=��ڝ��	f��ԃ���*�����,=�YK3a�*z�9�Y�N�T� eʢ�	�Z�����E �C�#Xrf(�Tz<P�X�	���	s��@�p��y��hʥ}�!�`�3�@	d�rz����0*{pV�oZ�f��V����97]p�rJ�Z�ƨ�X*�����v1�O�����	�����y�C
�������ָ�y<`��p�8ꪑ	��ڌO��
����EZa�hrW����
�������*�����j�:h>�p�K���
XЄ��iP0��-Z�;�}{B�z�욯O���
F����d� �����@
��[�={�f:���:�/ju�ѨԳIг!˰�V�B����2��\9�

��A�,;�.[Y!��,�$�������.	4����J�iҴ-�E=���ȱ�Ǐ C�����!ly�L����!CZb��&'k	��pa�1#J�x�#�*]�q��)W�|�2�̚�8�h� ž?�F�H4�',��]��Sl(���i��ͭ:�*thٳu�
V��ɸ,�Z�2+ޮ;y*d��D��`�8���.�ٲ%��2a�6`�3�
��-J�4r+������ �{�j-]�b�R�l��T�r1��
W$	�|�.�Z�0��^���vn�Ξ#�č#W��9�\��[� A;�[ ��j��'m��H6MP�{n-P\/�-��s��W�u��Ɲ��ہ�� �>�:=H�J/�$g!2�sJ-�P�u��wZj�����o���4�`�ci?z��k��V���0�������'c}J�������X%y	�7�\z�DąY!��i�_���Z�Z��X'[+��"�c^�����������袂�c���H24�b#�:��i��I%����喠��F<	+�Sih�4�q@<��U@m�)_��E7݆إ��w��Y[�z���Zw�⬘�F���^:`���z�(�mRhX@�{J�!��"���֭��ԅ
͖i���ʎؽ���nj����4.$�O��ʚ�UZLC�
h�"I��l|�Zh�e��l�;�Fꐤ�!����Ж�'��
������k��HX�F��k�ѕ��4�#:M�>�<�G4�����X�C���#�:,n(��%=����"[�wt���!>j��u�4�y��:�f#����8̏OJm��bʴ����}�G?��[��&���N��+�y�N����p�����Lk�λ7�@�� #����1NZ��D��9��BN��j�-�;o�;�d�84`��ϖO;�^�.bӛ�2�;��ދB�����t���;�=?h �P ��6V=�U֓�6�=�=/z����Bv=�!�h���1��/f|������Tn[��ؐ��/23��AM���"І`$pm��_k�ĥE�P��`�
��+�*xTU�>x<(%υ���	yw����\+F,4����A#LQ�#�P_f����C����H��Q�$d��7d��E��;(����Ê�$�H�5�Y)��|��pJ3*�T���X(B8zÏ܇	2aEVύ{,Y5v@�
*@0!m���P�<��#A��X�.���!U��@�OS���
~��X$''����������w����`�@��^Vl���"�S���2}
)z ��&&���D�,�9s�T�<�!�F�(5Ag�Mr��^,&0��
��F(�?S��U>0�a�M+�@��<#���0�A�b%[E���_���y�%T��pC~zS�E��Qqf������B��!5��kFU:�S]�T&�!�
ʃdE�?h�y�`3�k��`T^V��C�@��պ
��_��AV�f5�[ń��7
 �(�FY�Ѵ.��m��P�Ⱥ�؀���Y;��N��H��������,�K�4�~����q�S,F6�m�"���V��@mF��B�ZB����#�f�h��Z��OD��m5�Ὢ])��E��l���
*���J�"�]j`��W��:�^�&��nS�.	�]��w��MjsK�c�زB8�(�/�֭|s�QɥO��I����8��e�{{�L��H� zp��V7��\n�b

ID�{�{y��n0�"��Sa,�
�!�	�%�x�Xނ�*�3�]�O�c��v�<��Z��I|��K�܋�?#��L��:�
�!|~�e�ۻn9D@���7�y�e�,S׸K�N	�����9?����@���/$������HA�8���A��@$#��k�
��u`B�ܥ���>�œ^��[�kyTpd �Q
n����l\s�w�<�-ն���Y�'�{�S7���c%z��n�$�Q�<��o���q߮?@1�(�nG��Κr+\�I� ۈ� ���{�h�w��=iW���n��=[��[<� ��h�v��f�0^�sk�H	�^p@#2��BP�7+0��E��!mqLu`�.@ ~�n�o��Ûl�+��g�S�9����q�	���l�l�S=�V�=�`uϻ@
H �C��Į8���p�lx@`yo�=�$�<>� T��yg��a�nV���9�ny|����8�=>��;��y�as�p<���W�����7/����y�'�����v�ZVZ���:�m'�د+��oW��f���?���D�zȇ}¦}�|��ZRAH�"@z
ht;vue�y��;��g��rf�z]COXAE�D ��jֵj#�]8�z�{��{�#�tP�0�`��y�|�V�y�c=�	��|G�?'�!'��:Ԡ��Q��7{c��ܗZ��<�C��g~gV{3؃��݃��;�bs���@8�Іb�}G׀I�ch�_��=�PC(���hUX`W ' �<Ԑ��ax��7r�('���7���@���vpHiFY>B�plP"�/�.F'P�r�8�D8�hpŶx���7���(������e'P	R�=] �P�X�$�S�Gr�h��؊R��f&�2Gb� ¨YaP���z�s|�!�p0�o`��`�	��F�IIw�C�<9�����D�u
�@���ݸ�(�dh��r��<�3������G��h{mԏ�pR0
}0���<��!�ޤ9`�}����V��t�S��(�I� ��@
#�;M�������5�'h�W�:�`�Ni����(�j��<�Y3�(y�������=�8���A9��X�Ri��fPi�PAɕD9�`�![�	�<�(И�����1���<b5�������Ȗ����� �s����w�8PR�s��9��I��C[`jp���g	��9qS9�1�=2���	���	�)����I�j�j1璵�y���)�{�PH�
�u(��B�Q	��Y3@
NGUUP�I��ɜ���YArpw���a��*�=�	j�/8�o�{6�����9�Ƅ�J�< p*��y��g��E)[`��;#�0�ө�SȢ�'[�}`��	�j�j>�=`�9�
�֒3(��

y�陏�I=f`�݃�p�(�ʀ�H-HJZS3a�5:�D���N0U� oz��ə�`���EФN���#	]�ZAP�b��*���2a�B:�**�f�xb
��@C
�চʧq:�s��ױp�:��o
�]�m����8]p�P�|���*��	�
� ��Z���:������y�C
��ժ��Z���<`���Cz���檍O�Ԛ��z�P
bq7�snp�lP����	���ʮ�Z���HhLȅ�
�
{�f�����iP0P�8:�F�~+C���J�ZZ��
o����*;��J:��;�
����f�7	�����:JvՑ�q�G��m�ʴC�L<���z�ʒ�
Z��\��-!��,�$��؁G��K�	�P�C%�4i����O�h�ȱ�Ǐ Cz�p��<y�M{�Ґ!-0ň�D��5k��P!�1!F�h�"�*]�q�(U�|�fL��8��I�`ϟA!N$�
LӪ�H�)��R[��:��V�]y~mt(Y�u�
N��I�+�Z�"�]�����0�Ċq.f�Yd%mɺ�L�/�
�eC�y�#�ۊ�m�ҹ���^�ZEK�X�T!��*թ\�`��I0_�G�F=L��ְcG��}��"EG}�߈��p�Ƒ+g�<W-��%H�.��0�/��x��Fn�d�5����_r�5��}�U��-�����߽V�l�!� �
��N��-�Q�LsƜR�1�ER0�V�i��ڈ��h�n���4�`#\?r�Zk��F���0����
���|B�ߎ�ɢ��
X�x�7�\v�D…9!��a�߆"�Vƙ�(ֹ�
,�(��y�~�i'�w�h�"z ��`�ذ��0ʇ̌��xc�;�H�vAR�Idm�e��k���Pª��UjZ�ă�Z$���AJ�s�eh]�kr�雳ũǪug(̊i�M
��^�̬��A@��&���:�g��[����n�Fno�!uaò�B���8���u�F�[,�JA�B��꣯SR,,
Y*��R�$�ϲ�K!���w]v����p�C�'��-�z:[����a��K�k��sHX���K.є�z�"|�>�G4@����H��
?�c�l��$`��Y�C?@�-%���pG7H����cv�V�3�4�zsη ��~\A(��ܸ�Ҟ�o�����`��{�B��������4�~��y�������l�
���]�����
62�ǯ�
8�w����~<��:�t�O:��5[�/����N8���(t���^�ֵgJ�0���|�x.�\�BG;��nV� ����t8�/R��V�V!�W�ž�&=GH�o�^
T��L�{��E���2>A�|�J_j&���wlH�	���
M_�s������
0m����-pvIDZ�
�		r��⨂��T���K��V8�n�y7`�:d8�'�1y#��0�Iؠ��!k�/3I�|�����A܍wШB2!H*�\�"�n���N΋��!E^k��ZҬ��G��I �f*�q�m�d�G>ro&ȄOH=��Pd��&�u���!�bw�C�Pr���\��|L2��<%�Įu�r�
~���Tg&ɩ��Ɠ������wΒ���`�<x�c+���"�ӎ�[#Œ�h���4+9M+Rf״�"w����	=0�F��9jb���$l0��L��0B1�iJ�����$�j:AD ;���VF��m�l(jQ�-��f_�A��c܈��Q#h��t��9��nCͧ��ѕ�ӧ�DWPE�	{�`���Y����u�z�)M�ʽ'��Š�N%Ч�R�C�jX���b�ա[�*�0���M/��іzt���a�l7�7��n6 �j�V��T���D=�<5�!��l<�����l�\�򔊓��@�Q<�ִc��(T�Q����������EkG�X؆T}!bl��%���e-K�G�+�/��b=V0A7��]j��;�M
f0�@��@�׺J����xK��Wn�eoq���ݚ���l�J�� F�y;_~r���w�K�-�9ޱ|]K��"x@��&H�$9�ו�<�;���BS�p���6�%�v�zb!͸�ƼsC\����Ɯқ'x���8��%����V�2B_��<@��*9�E�/�t�DC��,�ηy�2���Dso�{?a��hds�Y�g�QB�����ըZ����@Gz��.$��,�C�`�L�@ �al�Ԉ��:0�bN�D�����1���^M�1����&��%��3�R�6���hy�:�Q��=�����1���B+Rܘ�0m�?ل�Z�Ui��Xu�@�-����\��x~�mÁ�_u����4;5֗���	��[נų���	a
'��{K�e'r/X��Q�d�@�
t!'�m!T��x�F�t�OX��T�~���?���:�߻�D'a*pu����0�@\�=�Ӷ:֗�u�5���R�Ԁ"P|���l�g{k)`��� ��ٷ�n�`�cBP�wy�=���{w_x՝c�w�o�C������'��/�5m�þgи|�S�k79�	��M�Wz"l��6�aQ�z���=k����yc��%�n���|�9 3@~�oBW|��D0{��}��}7}��Z2AH�"�z�t=�u�z��;�槁�Wrg�zYCN 8AE�D`��w{��f��8A�ǀ�t/Q���t��0͠��y'} �V�Gy�c=�	 ��}K�?+h)'�!�:Ԡ��U(��7w�}�')�.�}p�h{h�fugo&��0�ܳ�8�>x@���D8� �f�}L�M�dm�_��=PGh��iYh`[�' ��<Ԑ��e���wn�('��h8�͠���ju�{jfYPB�(qlP"@��G��C'P�r���Hx��p�x��$T�̈��؁��e'P	R�=] �P׸�(�S�׉�hY@��h�t�~v�j��s�A€�����u6|v�'�����؀Ψ���t�Xd��,���h���xG�X�P	�=_0��P��X�*x.��΃Y0%�=(w�vGP�y'���(�H��v
�M.��}P�
���V��Pt�S�1y���)��@
,�;M��x��x�˕���_�:��V���h�5Y��(Di�xs<�1	���\u��C
-P}����I��N9}�`��=Pe��dɔ���ر����C,��i�Θ��i���30�2Y�4yf6���#�ܳ���}�	��&�:GP���K����8�f�:H������������#��y��h�����T��~)��I�8����9M 0`���w�V	� ]��ũ�����٘2#��n
Ue����թ���${���Yv(ɠ���)��9����n���=�`\ ��y��)�� ���p����͸x��Z��v�3n�ɝz�7����L�A�XI��ɠv���Ap����'a��P颪
)��)��U�� �3z�

��(-S
^=3a�@ʡOJ���NPU� y*��Y�������E��Y:�4hsx	f����lZ�3y�@��k��Mʟ5ʧp�xb
@�'C
����j�{��}j�ձr�:0�y��eIn�j���7]p�Ы����z�%�	s0A�Ħ(��fJ��aU��ڦ�i��ꈑ z�i	<Э���M�~{0��l��ꤿj��ڮ���ʩ����FY�	W�����):��
��:����z�LhP�����ۈ8��iP0бCz�Q�r#�Bɚ����fڬ�Yxs��4�+��
��*���)+�4J��
��j 0A�0=;����ؑ����Q;�S˲)xXL�L<���:���A0ud�f��!��,�$��F��%A��(T�PI4M��ř��S8?3j�ȱ�Ǐ3:�-O�i��4dH�K1b ��d͚��L��a��)~���ѣH5��C�$J��X�|)'�7��f��1

�
IӪ�H�)��OW��s&V���	6�؉e��YK8-�$ᦔ;U̪w��Ջ�_�d+^,�d#K�Z&̀��p���!޼E���mE�6t�̻�v�^����U�V���r��T.f�P�$�/[�d�*}zXjg�_��2�6
E���^�O��ËO��y�ZѧK�p���/��Zx��V�m�d�5����"r�1�~�Qǟ-�	���V�l�!� �
�N��-�Q�sƜR�1�EB0jG�i��ڈ��x^n���4�`-�q$k��F���0����
��#}>�ߎ�e���
X�x�7�\v�D��9!��a�߆~��Vƙ�(ֹ�
,�(��y�~�i��i j���聨���c���823�R�9��c�l��F%����喠��F`kw�Yh�4�q@<��U@m�*�9]�եi)���)[�z���Zw��작^8)��
�2��w�~k��(���wn��a�-�Ú�m��~ԅ
͖
i��∊�ս�#�BV�i��"[�Qи�D?�:��Ӑ��H�4�$�eN��u�]�ݿC�i�I��Q�.�	i�~j����.
;���}`A	G��Ԣ�o��.��=C͑
T�2�h������#[|���,vG���Oо��ZŴ�pG7E����S��C�<)�jJ�f��m["a�����ˍc����Rޮ;k@��F����nn֤��u���:F�{�h'��ڭF����]�����
6Bu�~'O���O�!�
���Bn3j8��N8���(����Hg*�;l���
�>f�;]mv��_�4E"w�o{~�@:Q�-Lm�z���+�
{�s�!����o�*T5����c���T>k��f��ٶ��ݱ!	$_|�d�/�)�v�+&��=D�
� ��5>��\K��0��`�R$�.�*�i�x>B�
����,X���Z�J�B 8	4�0"��$���Pr铍;a��A�
I�D eHĢQ
��XlvP:9/�+F+8CKj-J�'��3$A�aTة����IL�)�M���}� Q,!�pI�j�T�:`
@ƐqU,d
kvC��6;�+W��H:S���_���)Nʡ�?L1�)�ӈ��b9Kp��A�`g,�8�K�m�i�`.����A �Ч0�X=��h��fN��#����k�@��z`�>t�,b���`9��a�b蓔�g�ȹ����@l�N1���
+��J�>4��;�/�L:�Ɏ���Ѿ�)`�F��7)�R�����̡O��<FQԤ��)<w*Oa�2��<�V��Ӏr])][�Ҽn�	B�_+<T�S��萴���q�aU�U�FL�`�]��^���(ͨ}�Z-�v�r>u��V`"���dU-���a�u���.֝���`}[�@p6(�bo:����h��>Z��A��hUM�P*	O�bB@�ێ����F]��1���X@������ӭJ��5�1�+��������6e��z�o�D{�[TY�����v[s��
7	���x�)Y!����@�����Y#�Zg���[�	hl�6���@Q$@�= �q���w
��K���/�a����`?A�ݥ���0ޝ���/�w����%�!(c��ؽ�
p|Yk�jN�����"���ybJ�����.� 2`�S9v��)��Aoo�z7�`�g4sy�=J��~�B������BHph<X��3Gqh@�	D2z�߸fz��~� z��Ia�w�E����K6�����@^{̌E�m�A��:ͫ˛��-��B�zp�`���r�:�7>r��M_kJ�����oD�z�9f�r����vç�an?�ʨ�8�
20|�_��Qǜ�TGX�޷�k�Xk6�lʷ x�)0|����
Y�a���, J�=�z���Q)�*��nV`�Ɓ�r#y���?]�@��)�4??�rv35:��
2P��\�pf�i8����	6Pvӟn���<�T�:�]�$��
u`�K�.6< 	�|��neg�[*z�����E��E�w���t�<�o�w�����G�A|���8�o�ŧ�gЀ��E�pgG��|L��y"L���8�`?nzi��>k����vtWW�!���|��9 3`���s$"
D�z�G}�f}C7M��ZAH�"zt8f?�W�gX�l�}~f��m;��T^@�~�eY����y�{6�b%�G�3�8��q��|עy��<��}�+Hy�G�e"q�q8���C
j���7zj7~�w�)p�'�}���za(fl�n"F;A4�kx�y�Pː?Ѓ3�j���'tʧ��R��e8:��O�x|�&�VD��q��\�C
i�
i�Hz�vJ'��x7�����Gjm{dYoC|�plP"����!C'PTr�A�(pEh����rLj���X�S�i'P	R�=] �P�(�!�S�G��hY�����l(~nxj��r�A����x�n�{O�'������X��8�3�x�0�@�;9���X���su
� ���ٸ��m8��2��;�3���h�i����vŏ�pR0
}�����&��Dr�9�i�D�x�P	;�=u�����X�Q��q
�0���|P�N�݈\�(i��3	&ٔ6���Ȓ.����=y70�(��7�{8&<�=���@)��(�QY�Dfi�P@��C9�_y[�	��<�(ИI����0���<_5������a֒ph<n	A+0
sI�h��w9!�:GP���B)��x���f�t��~i��'����#y����Ȝ��Y�Y�u�����.8�p����9�x7k��\�����	��I��#��tQUe��I����p�$t矛�u�@��ډ��ɂ��ms��A�`\���ٝ���ara�С�	��Hx�YV��vP��3n�)�	
�+:���L�5Z�O����vУ�AП
��`�G���Ԑ&�������<�	&z��	�X��q���3#(@�:�8�_�P�;��"��6�����_s�:]PLڤ�ق,��`☘,��X��Z:?t����o:��8�g�2�@	kZ�yꦐ�:J{�V�vʦmʕ�Ƨ�*{@�w�G����Nj�ob�0J_ꡲ����$��\�`:�*��	8������Z��J���<`�찭B*�����j�O��J��z�Ojj�Վ�pnP�l��깬#Jr��z�9���Q��YH^Z�����h��`X�9]��{�`X�g�-ī�����ʎ-�	lAH����g��9ٞ�I3�[�(z��:��c ��S�&�=��C�۳I@��j�+�r���۫�J�jy��	W�Y���I!��,�$��	�tI��1�(TM��mq"�Ώŋ3j�ȱ���a˓gڴG(
��R�H09Y�f�&8L�0ZC�?ap౨ѣW�I�$�G*Y��	��̚vn�,�p�B�?����ҳh3�Y�m�Ӕ+���y�&Ni���P,�:i��C�ۓp�jqI�nֻxuv���a�8+
������0�b؀� P6ě�(1bИ��ۆ.�so|��իU�t���J�]�R���*\�$�eK��[�I3�,5��Q`���H�P��/����p�Ƒ+�U�9t	�W�.�Ei�ޱ�x�)�MԤ��Z���{���r�=]~��'L�u�����V�	*�:=4�J/�!2�sJ-�8It�dx�2���j �&"y��f"g�ȃM{�<�J����Zk!��#�[�4�[p.�7!s��H�u؍Vw�
���c���1��o_B(�|އ����!�p�A�t��B�*>��|���~�mHZ�:�"z�h`�ذ@�-‡���H��8�x�jF��ڔ�6ޕY~��Ix	��P�6k���p���VI��+��ʷ\sJwf��
��kpꁆ�h�ʳzBJ��V(���:� 
nQhX0j��JK���w��Ď筼�vԅ
Β�(��ֈʍҹ
�v�����&[pQи�D?�kŴVIÕ
ll"I��,���I�}�U��vں��:�2G⾜��ya�������?w�m$�`̑V���J��L�4���Qk�AV�X�1��0�9�7���^|�)���%=�#�O�,%�1��
Qzkt���M.�2KZ3�P�����D��0C���H����L���c��8����j]��^�z��[�A:�;��q��j�r;�ņ#޻7�@H�!N���1�Y��D����F^��7������N8�'��4�7�ͯ�Ic�n�;؀�z��c�[�jG:��.S�r���
��	d��ڶ���*y��[��G��9bz��D��j������,�w���|�J��&	�wlH�	������v��還	duOhC0�6G�otGKbזH(LL�{� G%�
��xDގ���(��{ϻ�1C�1I�t��k���&Pp6h�)fHD��iZ��a�x�w"o��F��	B�ЈF����:��sz^<<W�)fІ��Z����@�wgHB)Ǩ0S��p���>Rp&��QX�]Ҫ; ���b�4|��C��P}���~���僒�,$*�(%B�rx�B�S����Db9�x���{g�>�I��2ڒ�o��C�Gd*�{�@:�I�;Z/�SB���D�ϴ�4�g>�)2[<܁
��;$��f�y����r@�����)1INu�sP;�)!���dT�v��
t��(E���_�s�v�e$p��ӛ,j���,������l���[�ES*N��ӧ�&�!
ʃe=j?hW���2�k��PT^6��;@��K��ƫ`�^�QV�fp�T&\V�i !�Y5�R��G��b+HOT8��n6 �j�V�20�/�&�q�穁P�c�YX�V���'`��:V�U��-��W�v��-D�Z�b5��*���1! �nϺ�C�У�ݡ��۶n	, �|W�R���A�P���r�j���vye���uB��Ej-�vF\
Ի�e�{������$���� ƀy[_s�w����3���-�9�1}[k�o�M��(H�$Y�إp<
�`(Kb��p|y�j�%�SQ�׸�wnH���l�:���n��Q�����-����0B_��<@��*��Ed�����t�DC�,�,�N�=�r������/�'<b�M6�k�����=J�� �sC����t����@G����>��?��C���L�@ �al��w�����i����/X}��j�Җ�G@"{�e��RјK^��on�
o]�I��ӽŹ����1�}��Oܠ�0m�?ن��k���u��-�e��\�^eǻ�80���&3���f�º�8���w�ڳw���u@�#L��$�vo�H��P�fQ�d� �
��C�J!T��z�F��W��\T�n���>����Ib����z	3P����v�1i8���	6��ձ�d���A�T���]�$�⫝�d�=�K�^6< 	ؼ�;���/[*�z�����}�����u���
t�s@~�?���=�<ÛyL>�?��5���_��i'���i�<������	�r�G��Y���;��6qw'v���0��w�t�i@AT���|�wl��t�y�%�� ���J�c�z�!z��;�緁�Wrf�z��S"HAE�D����{��f�u�	�=�׀�s0�P�p�t��0Ͱ��y�xԇ-�Wy�c=�	@��}M8&�'�#�:Ԡ��W8��7w�~ �`�<�I8����gVw�vb<B�ԃH�@x���F8�0�h�}K7}�X)n�_��=PI���i[�E-�' �<Ԑ� �gȁ�gn�tN ��3q��h{�f���f�%7�P�� �hX='P�r���J���pN����%T�ʈ���\j'P	R�=] �Pո�*�S�׉�hY ����u�~w�j�xs�A�`�����tV|�������Ȅ6y���E�<9�y��،���wu
������㈊vȂ鲍�;�3 ����r'��hw�'p�'����(���M-g�} �	y�iD��@t�S�.y���&��@
)�:M��8��X��u�‘[�9���Rٓ�X�2y��(�B�7��(�>I|A�k�C
-P}P���Kh�J�t�`��=PeP�`���I�Ա����C,��9�̘��i�٘�3V3�/I�1if3���3�u�7+0
y��m�}	8W�I�Gy��ؐ��f�}����)�w�����#���I���� ��Y���{閮�	�78@R\)0��	x�ƛ�3���i��Y�Ù��#� uTUeP�׉�ϩ����$|'��Yv%������ɠ�Y��H�pÔ�@A�`\����)�~�: p!Z�������i%)[`��;#�0@��٠Y�l�'[�}���I����hB�=`j�$z���ǔNI���	��oN�:�	+ʢ�I�����3#(����=Z�d�S�;��" �;ڜ���dy�:]PQ*��i�5����`��,P�]
�_�^�dJ�Fj�.Z�i���a
Ц*C
�����t��v��ѱp�:��r:�a9n�
���8]p�p�:����&�	s@A�T�"��^:��8�\p�fz�/��������ʪ�����<`��0�G���	���O�׺��ʚT�j�U��pn��lp��:��)�'5`��ꮞ����eR(�@�;�ۈ����iP0��<��J�rC�Z��j�^z��hs��VT�
˩�ʖ�
��5[�ۢ�k>f:9��k��8:��=+�M۩O��+hWI�L<аĚ�����A q��:+�?��!��,�$��]�$HИ�J*��IӶ8�|
秢ŋ3j��1c�C����3mڣ��iY)F����Y�Ci	D�0Ç?apб�ѣW�	9���G)W�|	�SL�vl�H���	��	�h�b���H�(UJu	�j͛9����pl�:j��#�[�q�jiI�nV�9z��!�8)
�ܱ��Ox1l�g(��[�1h�V�mCθ5>h���*Z�X�j�
�.W�N�b�H���%K�-aF+��j�Q^���H����-���w��ŏ'�U��s	�S�����ޭ֚x�)�MԤ�[���{���r�9]~��'L�u�����V�	*�:=4�J/�!2�sJ-�4	t�dh�2�igj������v���A#6���+�xZj �F�7��$n`Ӡo��߄�ه�t�]�i�y7x�7�[r�D��	��Ux�r��B�i�%֩�
)�����i&~�Y��hX(��聨���c���20�"#�6��-<��YڔA�xXj	�Zj$��oOF��U�J�ij�Z$�Ưa�*�r�Y���:�w�ũ˦ug(��)��j��j�xw�h�E�a���;-}�V���;޷���Q6<[*���Z#*7F�j�RY���*kpQи�D?��J�Tn�
ll"I��l���Y�}�Q��v۾�-�:��F㾬'���y������?s�m(�`̒Z��J����4���Qg�AV�h�1�p�9�G��L�eodI��
,�#�]��1��
Qygt���].�2OZs�=����Hى�qA�83�Y��4�~ʹ;k@�E�я���֧���zE�C��kװۭJ,w��M����
6RuȀ�\k�w�s��~<��:��>���[;�͖���k��y��<�M�~Ga���t��
�6���)����V��ۙ��Ӕ��A@�A�p�Yİ��
b�Z��~48�yς�s���'2�U�f����1��寁eR�Ԅ���������B��v��u��*a"Y�S@���Q�+�іص&
_2hER���B��#�p{Q��w����kR�=o`�	��
a�Q|���vȼ����H��Q�$d7D��(�E��5;(�������&����������p�2.�T� �&�Fb	ɏ��>L��*�{�j�઱XP��)
i��eQ�:���&�����]>,I�C���b�C)�( �0*�xN%����,A;�w��C��<#.=���q���3�	>D =�����0�Ј��ibҚ�K��-�@�z`�Vst�L�����`9��a�b4��D��I��Ԃ�@|:O3�
�K^���!\4��s�/�i�<�i��T
8v����M5BG˙ɘ��L�l�区O�1��.5gP�9T|~�����25���L�Zӛ
|OP*/��⡊�R�%B-6ֲ��s�PkD���d�Q�p�Y���k�(LC:���^+�%M�Q�؀��k[i�-�t[��C��>����b��X�����
�;ٟ^Ѳ�,(a�K��v�e��(^�Ѯ���a�&����e+H�Ñⶇbx��%�����K�G\�R�kd=V`A87��u*���U���v���d[uiP�n65�/s������S�0J�� F����s���˭3$L�-�A�~g��w�M��,H�D���p=a,Kb�"&�}yqb�rp��+�T]L���wnH���^<�״����Z!�W��m׷�휆�����"�Wʈ>bL�|���.� 2Ph��v�j�=�I�o�}M���k��ܚ'h�QB�6q�%�U���<����\���t�M�B�dB��g+X����?=� vn�D趡Q�M�����<,82��knse���]�PJȾ��f�|��N2v��-���^7��ldj��r��/�nG��F��9]�O�@Ư��@�q0����&s+Mn�ā��5��T8G5ך���N��[أ�s��a
o�����E^|/�?�R$�R�x�G��V
�
5ϛ�r��|�U.��:��W �>��O-P���T%
�Q��
�]�6�3�G�',�wO����)�}_O2�:�I�5 �(�m�K;��_
���9�H���1?X�h}قP�>�o/�O�4��;G�Io�/����!�dX�����+nu����4B?�ك���hV�S齞�Ǿ�_�ؘ߾?���Z����]���o,6^}�;3��wpJ���D�{�g~І~U�M��YbAH�" {8uE�?����X�l$(.�f�oC��T^@1��'�r�Y(���z�|HwcE�@�3�$X��'r��}ٲz�'=��}�=Xz�g�dBr�q8���C
j���H{|W闂)��9�} �|s�f~�o-�#�E�0�}��������O8�qx~T�}h)wH`��=PR�ٗid�E6x' �%=Ԑذ�pX���n�tN���3z���{����g�%7���Yl�����cts�8�S(�&HqW�����(��(��x�e�j'P	R>] �P�X�3T�w��hY����~H�xk�t�A�P����|�|�>`���x��X�8�y�`�M�;9���X���|u
�@�����(�X��2�&�;�3����{�����w�'p'�����
���F�Ӑ�*�I�H�y�P	M>u���`��8�c�q
����|P�\��(]�($I��3	4��E�����@8��p
N�sB�6i�ͧ�I�
�C
-ДN	��H�_9�Vfj�PN��Q�m9[�		>�(��+I�������)=h5�y����n����<|闝�� ��i�	i�����sp��	��I��H[`j`A	���ٕ�眴��	��#�����֒�ٝ�T�I�����@8�Re)00��Ɉ�V��3��������V�#��uYUe��ٜ!����#�砩�v�ٖ0�ꉡ�x?�s�	U�
t6��ɞ�9��x�����Ә�*�ֲv0��3n*�쉝bX�u�'[�}p���٤bPʐAР"��a�9�Uy��
���)����	��y����9ʜڣj-Z�^?3a�F*�J:�x����X�;��"��H������*����E�_ʦ%�,	f ���t��٦'2ys
�T*�;������a
��*C
�����*�Hvֲu�:���*��y��w{@���G���#���	�7�	s�@�/��ڌ5�\��u:�<���>�`	<���:��h�"�{��K��`�Uʒ�h{�j�O��ګ���ajk�Տ�pn�l���
�lJ�4�3`��*��*��z��j[��0�"�%��cj�9]��v-��rX��%�2D�8˰{��ʏ?�	l`A.���u9�Hɟ?�8+�:J��j��c ��S��B�Y�ԭ�I��*�;K�{ŵ��![�
[��wF�F�q�0�M[���o�
!��,�$�/	4����J�iҴ-�C=���H��ŋ3j����!ly�L����!CZR��%'k��ȄG��K	DMaÇ�08�H��ъ+�|9�䣓)U����L;4m�Xpƒ>����ѳh-�Q�
dS�(��tiuf͛8uz���X,u�
>��G�$�Fղrj]�w���w�X�k���G�N
0�ʆx�%F�}��e�m�ڽz���.V�Z�B��U�S���B�+�`�lɒuK�/��vf:��(�a�P�H�������w��ŏ窵��	ѥW��"{�^l�d�5蝷����p��}�9��-�	ßܡ k�h �	چN��-�A��qƜR�1�E�0R��u؍V�i��x��V�f�ȃ
{�<Êp@ �i����0‘��
����"|&Wߍ�MW�u�m���
8�<Vp���d�G�}f���Z)g��hgZ+����cF���G���q��C*�G��
V�
<��{ȼ�J�3�xc�����@r����
�F`��$�R�Fe���v���VI�ѫ��Ƈ�r>�楳�krꁆ�h�ʳ|J:!��^:��
8�(
.QhXP��J;���Ċ筼�jԅ
Κ���҈���*k����n��&[0Qи�D?��J��Vy1
Y*�qQ�$���L�[&��A'�=j'�C�`�������b���¶�`����p�2OZm��.ͮ2Ӱ�?K}�
\��.�(������h�(���Y��C?C�����Mlwt3�!>i�[�̔ڬ&�m~�3x!P6�~\A(��<�ր&�n�`7���^�{�9������~��[�N���� ��1���ύyɇ'���~�`!V�<8�����E�O�!�-��Z�s�oޚ;�|�84`y��Bh4��R����l@c�S�1�(k�K]W�)w�������hank��^�Yu�X������Od�3���Q��O�@� h��]kM9�\��.<�!	-L_{r���M�w�&�5>D�
�h�� �>�!�^���0�����Z,��@��印y:z�	gX��݀��a����
�J�B28	4�9Tb��4���y:��;�7�A�
I�D"w�ģU
�l�jvP�:Q/�+F=�COrM�Le	*)�3$A�iT��'¸IL�2\M 9�}� Yt���=�TcȠ�S R���b#}x3 ��M��h)�|d�l%�
�RU<@(�a�UnQ�Ndg�Y�x���G=s��]�n$��	���h�H�@����V��4���š�̦��W�GfK�;P�􄇄��4�6�(A}�25��@2��C�ee'ש�vj:� "��S�kccØ'7�RL��(� �z&s�a�#�n؏o
�>�NNΔfh�&$5�TR�Q�i:��Ϣ��C���2(>�թ} _k�כ�t��{Sy�X"/U��/:,��u|�+�Z'
V�1�p�Y�����l
�LG*��ZK�'eRU(�؀�ի[i�/�T[���C��>����b��X�����
�K٠n�D(c�a�v�f��(^�ѯ�Т%�f����m�H�Ò�6�bx+�%����mL�G\�R�kd=V�A87�х*�J�U���v���l[{�P�r�4�/s����w����`J�� F���_s�7��˭3$LL�-�A�~g����M��2H�D���0>a,Kb�"&�}yq��~��+oU]|U����sC����-͝3�c�
9��e0m�>oj�4���2��RN�gj��fpAѐCc8̸�4Q�iLz|#�@ �k��8y�}��6�A������LѰ—4�q���ӈ^��h�1�>� "�d@[�{Uu_Y
�AQv�&���[cm���4�����^s�-+U7���WM6�e�K�إmұ;���q�~6��Le#W����72x�t[♖�"����2��2�n����7�ay�s�d�8�����y���,���8��&-�s�pd�S���=�E;��xA�
Z@�"$�:�M�U�RU�9���O�����Ձ�ú�p6�y�ꂪ�jv���d�a߹����(q�	��l�m��}�d��œ�� vԻ@
H �{�Ӗ�����ox@`zv�}�f=^Ϸ T����7���������qx�\�G�8BL=P>�O��1�z�_���<���ї��!7�玝��z�'��j�+V��O��/�4;�{�o��o,6^�ӗA3���pK%i�AT���}�m�gu��y�+�� ���TWd��z��z�%<��W��rn�{�VT,�AE�D �8|(g���0��{�|Iwc,�3�%h��7r��}��z�G=��}�>xz�g�eRr�q8Ђ�C
j���h{}w맂)��:�} �(|s�f�o-�#DH
�@�}���ׄ��3>8�q�~U�}x)wH`��=PR�ۧid�E7X' �E=Ԑذ�ph��o�tN���3z��|����g�57�?�ql����}ԃs�8�S8�'XqW���������(����e�j'P	R0>] �P�X�4(T�w��hY����~h��k�t�A�P����}}�%�oP�� �H�U�C�'��d“,��Ȏ՘y��W�P	FH=_��������6�.�x�ƒY0+y�J��w����P�p�qR0
}0���
ilNxs�+)� Y�L�y�P	N7>u���p��H�c���q
� ���|P�\��(]�(%I��3	5��F�����A8��p
@N�sC�7y��DŽJ���C
-P}�I�T��Syu�`�6>Pe�i��ٖѱ� ��C,��ɒ�8��i�y�ԓV3��8�:�f<)��×~�8+0
�9�v���iZ��7GP��P��h���f�
���I��"����#y���ْ�ȝ��Y�I��y����A8�Re)0��ùx�f��7p(��O	�^����>@
\�UUP:������Arpx��o璴(:>�Z�?��7U�
t6�����I��x��)5 p.*��9��g�oE)[`�I=#�0�⩡b�u([�}���ٕZ��hP:>`:�1*���X�WiI�������p}d6�	9����������4#(p�#j�K*�m�Z%<��"�I����ɡm�*;]P_
��	�?'��`�,0�k��m�� 5� �J�ʣ�z����{�2�@	���*��H�M�{`W��
�������*{@���G��ڨa����b�0�Js���ɦ͸���2�\`�tJ�=���7>�`	<�����R�{�����@�U������j�O�窫�j�bzk�Տ�pn��lp��
���4:�p��ڪ���JR��kHr��*�����`j:]��*s��r��2�6$�6��˦�ʏ@�	l�A/豫�u	�Iɟ;/k���!��-�>f+:J�+���:�:>+�_˪a��5�W[+M<�Ӛ�%���*B�q� �KK�HY�
,!��,�$������h�4m��Pϧp~"J�H��ŋ+f8t[�<Ӧ=iȐ��b�@Z�ɚ5;0�&��%A	��pa�OdJ���|:~9�Qɓ(WB����4m�8�`��>�|�B��ٳ�$��)I�PU��sfM�9�z�P,�:h�ѣc[�o�jI)��U�wqrݛ0�C��3g����N�p���!޼E���kE�6t�L��v�^����U�V���r��T.f�P�$�/[�d�f���a�F�>�:�j�4)�
Z��D<=r��;���j%_.A�s�ө�������߽�H6MPc^yj-�[/�'q�ɧs�ق�0����v��֚�x m���*��⛃�g�)��\$�c�t�Pg]v����j��l#j�<بG�3�D���hj��#I[�(�o+��q��\t�Uw]vN�]���c���1�An_6(&|�W���!�p���t����'2�|�Y�}�ah����"z�h`�ذ@�*���/�8c�7ޒ��<��6��Vb�i`j$��nL:	��?����s+Z$�Ʈ`���q�M�ܙ��*�����Ǟeg(��	i���Yi��),xw�h�C�a�����l|�R�ߥתKh�۾/F]ذ,���
�����\���8��~H���I��l��<IŴ�p��H�,���cFK�s�U�c�C��D�|ѷ.��}R������.
;���}`A/s�Қ�o��.��=C]�
T�b�,����1$Wi�(�m�%=�4�M�������pG7B�]��Sv�C�,)�h�f�9g�!a�����ˍc����鯦4���O��,^o��fM:�]���Y�.��Ⱦ �)�jì�-y�>V<x�q�
�P�q�"G	��w�SV�~<��:�|.���K�͓�^�w1�N�C�6��ݬ�D��*Ҙ�Ͽv���N8��,�����nt�+]�<���H�#�����x���`5��i�{ߋ��Q=��,{q�B5�rA��c�ӟɤ>j��f�{S�{=6$���[��e���t?�D�����!4���':�9�kP$&,�h0���S�*��b�+a�4���,X����m���B.8	4�8L���py8�;Q7�A�
I�D"u�ĢM�<�7vP�9E/�+9�COj
�J�)+�3$A�hD�������(�q� /�d�-���Ff�j�T�:`
D�q\ldk��m�r;�-[��LZS������)Rʁ�?L�J-����c;K�N�A��g.ո���m�$!ɜ	M�A �h2���?Nə>�=�_Ts���_�f�Hkq*����#|��&!��P��p#C���:��N� �D���z��lkl#�D�P�Q���C1Od��K~d����n��n
�<zNN�Tff�&$)w�~FoQ}):��O���?���.(>���m _i�W��t��{�Ry�X�T�*
8��|�+�Z%�U�-S{>„�j7
 �`+Hc*R���uZr5��j�֭�D��^�Z�z����D==5�!���={��&���l]�U���fGhU����b��(`�Q����bE��2� �n[C�H�4�@l#0�[�-�Dȯlaz��δ�[ #豂��
��S��`W���0�@��@�׻N�e�ظ6�!�U���|���$�V��U���*��2zA�B�����w\��k�t�	|K0����_��à(ꁄ�S��w7|O�FX˒��K�_^�8��,(�A�KsV�>����`7�w��=�hz�c���D��l��ۮ���
#$�.�D�/��D�b��@\pA4d���<=�3���<���X�*.^f]LU;�����2}�?O��R��?x!$д��i;��@��.Ȅ"�^�^Y�WW�zDl����D��V��'A-jy\pd B��f�F��o$/ܖ]���-�6vi���80�C����n#[����$��^�ߦ����H$ں����[G��[�bNq��mfX�<ݚBnk7��r�*�7+1�C\��w�I���	:���r�����v�Ƈ����(E2H`u�3�䭆���s�Y�/���9|��l�um��\�]��^��8<��A*@����:�s}�|{�e�����%_�`]�.P���6{��^n��m������s/3�]���-�}�=����~�0�֝c�O8�#������~�+���c\�7��}5h�����;lw�^�ћ=п�T�\�4߽~^O~������w�^�Fg/1 "0�x
�t�>T���}�7m�u��y`+�� ���Wwd��z��z��;��W��sp�{�FT,xAE�D �X|xP��*�ipA�w�ѷt9FQ�=8�P�&�z%�y�W-�'z�c=�	��}W8&'�'�-�:Ԡ��a���x��~*�j��<�S���G�q&xWg9R�t��P$�LyN��t���Їr�~X�}X)xX`��=PS(���ie�E78' �=Ԑ��qh��'o�tN��v3{��8|���7gB1�?�ql���(�H}��::7�0�T8�'xqX�����t�H��h�(h��v� ��R�
��H�A��h��pA ��ȋb�����&��%� U�qaP�����g��h8`�9��X�d�C�'��dѓ,0����׸y��W�P	G>_�����6h.昒уY0-���K�w����K�p�qR0
}0���
�lOh7Y}ВԈ��h�	~�P	�=uЀ����X�I��q
�@���|��`��8]�''���3	7��H���ؓA���d8P�(��I)}MȔ�(6��P�Y��G�W�M�`�>Pe�m)�VI����P��C,����8�q����ѓV3��:�<	g>9�m�i8+0
�i�zɐ�iZ�	5GP�	�S	�c�V��f�Hș}`�a9�$��@�C	>2��ى�!�����MЙ�y�{��}9t�*�:M 0��xdž��3p(МRY�bI�K�h@
_�UUP������	�=r�xʚr��(zA�Оz�?��BY�
t6��i��i�����1 p2j��I�ܹ��H[`�=#�0P��I�	ڝ��M�L��n�n �v0��A �'Z��a�i�Y���
٣�����pa�
>��У>��
��)-]�^>3a�Kz��9�j�~�Y��;��"P�M��暊J!Ш��E �cڟ@t�	fP���x��;�X}wZ�Wz����|jmeb
�)C
�@��:��B���v�:��j�Yj��w��i8]p�Ь�J��*�t�	s@���3J�pڌ���͚������{�C
���*��:�����.=`�쐯X*�Њv�������Y���Y�0W�$��4ڟ抣�z,`��j��
��Z�#e\Ȇp�(��:��ck�9]��3K�s�����5t�>����B�	lpA/x��:�yY�K	�#{+&�(��Й�h �S �HK�+�%��
>+�f;�h�5�WbM<p��*�)ʗ�z<�q���S˷Jy�wZ!��,�$�njQBPI4M���Y��S8?#J�H��ŋ3:�-O�i��4dH�I1b ��d͚��p�H�v� A�vP!�O`J���|8z)�I�'UB��򥝘3k��Y�`O�q>a�`��ىt�b��tdI�)WV�)�fM��LVl���˂�mH�P���:�j]�7��D����1v��pS�P P6ě�(1b�X��ۆ.�cW|��իU�t���J�]�R���*\�$�eK��[�x1l�g�F)�j���M>"��q�����\��#� �ys��_P��]i�ޱ�H6MPSyi-p[/�[p��w\r��r�0���h�����x`l���*�в���g�)�c\$�c�s�D7�u׉�!j��l#f�<ؤG�3��D����ci��#[�(x[n+�!q��Ȝs�IG�u��]���c���1��m_6(�{�W���ߏA���t����'2�|�I�}�a8���R	�"z�(`�ذ@�*���/�8c�7ޒ��<f����}we����F^�Ƥ���2%��q@<��U@m�
���
W܄ʝY)��j�f�z���Yv�⬞�F(韕���y�~;��(���w.��]���~�m��^ԅ
͒�h���B�r����=�Z�j�"[�Pи�D?��ʓ.
k1�4\���D!�>�*���η\s���v����,[n�y>�o��k�~���k��EX�F��)������@OM�
`�b�,����6�'�~���f[dI���k�#;l�wt#T�!>i�k4͒ތ��k��swP6�~\A(����~*�n�N���K��4~���rm��`����C�A:�/ȶo��0�rS��@~x�~�`!W�8�Q�L���O�!�
-��J�s�m^��;�l�84`ø��:x�.�)���4�;����V���t���;�=?h �P`��6�-bʣ���׽
J��ßȰ'��Uc,�>fA>�1�L�V�tf�7M�w�cC�PX>��N_�{ �P�)L�{
�@��@�9�|�K���Da���+�8*�q0{oC�BX7M��{л�A��)i����7�Є
N��0
���=I+r:T�θ�A�zШB21Hi������`NЋ��AE
��]�_Ө��GB�I %f��
bɃ���>~o&�Sh=`�lX��*�u�����x��l����v�W�.��&!O�?@-1���
~���V$g��Et�@��;����Y����e�֨�6z#��"��~���#i��h@��4+9M���f��Vw���	=0�F�):j"с��$i0��T��0B1�i�K�3]�d�jZAD ;�g�v�TyP��b��@Q�Bo��p�0�%<s4��7�7`��%]Z33]S��*>�����t�>�'P��!L�C�КT.0�0ݫLi
��=ᨼ(��w����X��:��y�hu(W�f��. k�4��"�m�G���j��U�m*{��w]�l�Ř��H(����V��Dlq{�z|����s#�S+R֖�hT:BԪ�lt�k5�UF�B�����j�!q���pC���n[�ᾰe������z����
*��"�K�"�Qy;�Fx���:q_�*��mC�S1;^��*��]n\�3p��@	� x!�@pp�[.��ur�uF�}	�%��Bίl��aM

�@B	�(?���gb|eIh9�#�//Ll�
T��!y�c��
I8��[G���Eu���[d��v������Y��0B_��<@�F��Fti��{�t�DC}a0�N�?%s�����o�1�b�Y���tq��G	T��|~hWߛ�W�^H	,mhg���)�
2!�H��WT�U՞9'j"h�п�u֤�IN{Z��l5�y�M�ъ�;7u����[����.��/��G�e�{�S.r��[9Ip��x@�~ig�ț�����Q ��O�no�Y�#7�@���z��fꛝ�\�NPx
\o`���8�^�0������M4")>�tޞD)�A��C� O�*�P���
H��s�a*�=P(��e�g�y^9��:0a*��׸�7f�)k�ls��R{�&��Ku���j@<~�_�ۿ�0��fs���ϣ��bvp��z���/����[Cunp�r{w����GO|����'�x�E/�W���}Р�yϻ�����ۧcz�BO�D�~�K��ú\��1���ւdC��n���b�q@ v~0�gx�t��;T���|��l�'u�Ty�%�� ���PGd�Cz�az��;�鷁�rm{�T"XAE�D����{��or����z
x|Fgc�g��98Ͱ�z7y�w-��y�c=�	@��7}M8&!�'�#�:Ԡ��WX���w�'~ �`�<�IX����n�w��sk��tЃPH�A�xC�t/b�0�0�h~Q�W}X)n8`��=PI��҇i[�E-' �=Ԑ� �gȁ��n�tN@��3q���{�f��g}'7�?�ql����|%3sd�����)؁焑x�hB�����ȅ�v� ��R�
`����=�~�ȍ�PA ��H�XX��w������� U�qaP����g�W�	h6`������Ȅ7Dy��L�;9�	���茒��zu
������䨊vȂ� 	=�3@�	�x7���w��'�p'���8�8��F���}@���yD��x�S�0��
��(i�@
+�;M��X��h�х��]�:��T���x�4y�zx
�M�s<�0	��'�Ci�E�2���G�����XɔSfj�PG)�J��f�[�	��=�(P�%ٌ�������	=f5���8�mV�y��ti������{��闤�Ss�����ɉ�H[`jЃ�i�m����qY��:�=2`��i�&9���	ש��@��ɗp�r�w�&�:M 0P��yx���1p(@�H��W����>@
XwUUP�ɝ�I����YAr0x	:�kw��(�=�0��5���	7N�
t6����ٛ����)/ p(ʟ�Ɍ��l%)[`�	=#�0���I�Y��l�'[�} ��i�ꝬhJ�=`ڡ+�&���P�;�P�3*�I��UJW0�	3J�ƹ���A��4#(�
�Eʠf�V�;��"��C*��i�f���:]PY���i�;7�4	f����oj�2���|�n��Nڟ6��s
��a
p��I	{���꧛�G�{0W��ʧ}:��ƨ�*{О��G�š�[j�x�F�0$Jo���y��H���,�\ �p�7�����=�`	<@��J�K�~{@��l���Z��Z���0��
��ɥ�VY�xnp�l@�����٭.���0����y���Q �bHn��
걏���`a�9]��&K�i(�.mDz1�2[�{��Z�|�	lPA%�����nɭBi��(+�[�˪)�>f%:F˳'K��H:�=+�[��][�+�WW�L<���j����0�q��G�A�G�!��,�$��TM��mq�ΏÇ#J�H����a˓gڴG 
�BR�H(9Y�f�%8Ҥ]�$HИ�	D���

q�=�|$�dI��8�li�e̙4o��I� �8��P J�lD:G�mTr�ӓ)���)s�M�9w~
[Ǭ_� zh\���S-&�ʭJ�nM�y
~]��e�]d$���a1ʆx�%F�}����ڽz���.V�Z�B��U�S���B�+�`�lɒuK�/�
���Т��FMC�����?���cv�۹w�������$$W����ԭ+=z{jE�4A�xᡵm���o��q��g}�؇_u��G�i�8 ����Á��Bn"�1��r�p�̄�-�t�Q��u�m�aw���e�ȃ�y�<Ên@��
��0�ai?~s�C�V6�f��5�{2&�\s�E7�ؑ�_w�X��eLd0��
��ރ�IH��k�7�~��f�0"�	���d�7sBw��=����"�W96,���!�$�/��q4�bc�9Z��c�qg%����F]֦$���(e���p���jVI��뗥��pg&���cvoꁆ�e�ʳy>�`�~R
h~��
nPhX *��J����g���������[Q68;����������:��#j�&kpPи�D?��J�+
;�iV*��P�$���H�+&��!��8<�?� ���3����g��Vz�����`]���0�2CZm��.�n��:���RK�AW�Hj�%;�*��I�_�'Ӑr�Y�C?C�����
Kkwt�!>h�[�̑�|�j~���@6�~\A(����}&�.�M���C��4����nm��_����;�A:�#��n
���qS�'~x�~�`!V��7�O�L���O�!�-��J�s�l^�]9��<�
�}C��������6���)��E�J��ڕ�����A��A�p�Mİ�n5R�d5(�yz�s��'2�AIp���X,>}̂|�k��w-4��rܢ �zdž$��|�ݾlAܡ.S�@��6C�ik�H��&z��D�W�bQT��`��v����n���	{w���CR�!o`�	��
a�"Qz�V�z�<�e��P�Q�$d9T��$�E��;(��������&��?��(�����p�3.�T�{���2�G~�a�L\q��V�W���
PGLQH:n�����|�>�\n?�e��a�jR����%J9L���)P�Et2Q�_dg	���3@�eq�A]"/����7����A �(2�x=>��>��=�_P����j��lq*x^��#|Ԛ����OO�ȁp##���d:յ�v� �D��Sz�QmjD�AݘP^tuh~!�c��K{\�2��n�o
�<j�Lʔfe�f#-wT~BOQ}�9�zO��3C���,(>���e _i�W��t��{�Ry��
�T}�.:1��լ��\1�*ѯ�M�k�&\pV�i !�[AS����֒�I�t�9�n6 �l��V�:��5&��P詁�me�X�6V����'`��R�Y�l.5{PW����mm�� ��zԫ,��2����1! �p��D��!���rn	, �~gS�w���A�X��]�t�����v����uB��u�-ٶ�nּU�}���$�v��M&�y�QB/^1L���q��n�AaaBo	&2��[[�~���E=�`A�@��/���X	gY\&���ˋ'���m�Ty�Y���tC���1��}��{d�y��u�q�>nJ�:���,�!�SNtez��Rgp�ѐCkX̳��P�iL�{#�@ ��
��x�m#���;�u���Q�牂U������`�
��]�F�dB��g3x���+�A=�!r��D�ak�U����<,82��lv�e��"�Wn9�����K�ئM�_�=�����.r��L�WNܰ��m�g:ڈ<r���иu��@�=f�;�ene�͍80���ns��g�������:�;�8���](,�a
g�����EZ|/�C�R$�R���E��V
�
4Ǜ�r���V.;�:�vX ��w�Q=P�\ל���u`�d�`G:���d��	6���N���J�T�:�]�$��-vi�]�K�^6< 	���N���/[*������5a8���;��G��2��Qj�?"���'>�7=ŭ�yl>�@���E/�����r���u
=����?��s��G��Z�m}���<�w�6g���0b�3���|K8�C�{�W~�v~U�M��WbAH�"{8uF�?���Y�l�~"-�f�oD��T^@/��^��F�*�i`A�G��GlHQ��tx#�3�"8��r��}آz�=��}�;Hz�g�b2r�q8���C
j���8{wdw�)��7�} ��{s|r�s�3�t`�P!؇J�cL�x�W6P�|��Guۧ��r��8:� �a�}�F�\D��q�]�C
i�
{�#H{��J'���7���0���w�g�/��?�ql���ȃ����T667� �S�$8qW����������X�e�j'P	R�=] �P�H�1T�g��hY����~����w�G�P����}���ք�4`�9��H�c�C�'��d��,����hy��W�P	E�=_���Ў�8�3�.�x�ЃY0+y�I������F#�p�qR0
} ��؀�������+I�h�Uh���@x�S
�7	�TY��8�@
2�;M������~R�g�:�P�^i���o֏(��p
 N�sC�7y�͗����
i0��O	�Y��7�V�M�`��=Pe�l	�U9���� ��C,��ɒ�(�p����ГV3К8ً:��<9g�)����`����	��
ḭ̌2GP�)�R)�b�V��f�F�}��`Y� ���`�A��=2Б�y�ْ���	M𙸉�z�o=חm8�R���i�Igl�	}�i0p(�Q9�ai�J�h@
[=Pe���I���0��#�����v.9�С�)��Ƀ�כ䅕�`A�`\���)�ǩt�H��p�
:�S�x��v���3n	z�ڠ�9�[�}��ٖ�V�piX�=`ʢ:ڃƗˆ�Z�;��B���	V��,�	B:�ѩ�UJ��"��4#(�,ڝb����5N�Q��"��R:�����' ���Ep�h
�/Z�@	f@���}J�9i����|��\���٨�:mdb
P�+C
����z��I�Gj��v�:@����^�������8]p��ƚ����	s��Ч8Z�uڌ=*�����j����űz�C
���j��*��Z���3
=`��Я]
��Z��A�����ꪺ����Y�	W�)�[�9
�ꪔ>�)`�𪰸Z����#e[����,�;��*��cj�9]��7��r���ų4��B[�#[�ߊk��	l`A,���z�x��
9��:'*+�,K���h @�S`�L��/[�#��=+�j{�l[�2�WfM<���j�.��0�~{����<j��!��,�$��(��IӶ8�|
秡Ç#J�H1b�C����3mڣ��i)F����Y��i�.]$h�M��<���
�p��;~|r$ɓ�8�di�%L�3m���� �8��P J�,D:G�iT
R�S�(��|Sf͛\w~
[Ǭ_� zd\뱭S-%�ʭJ�.M�y~U���]`$�����޼E���iE�6t��Z�v�^����U�V���r��T.f�P�$�/[�d�f���a�8s�@ِ!�G���H������{v�۹w��U+�p	�#_��s�ԕY����lMPxh- [/��o��'q��2�0��7]u��V�
8 k��`�*��b����f�)�\$�#�r�0�\t�!Pvn�]j�}x4�`S-ϰ�)��b-���i�}s�B�V6�Fۉ�1��{1��r�=݅�aE��cE��1�Al^&�z����_�p����t����#"�|�	�|�Q蜅��X��&�W96,Ш��!��.�cq3�Rc�8R���>Z���f��D��%��,FI�iw�f�D�~Y�z�E��q�U
��;�	�h [���4�'�
J�g��⇡�>�A�����6:.��K)}�b���qo�ua��>
l�/���7��=k,�BA�B�4�*L�lp�Z��B!�>�y��ҖY-�7�{]v>�$���r����'��Zj���n��`�L����/G�भ��S���;;�
LM"�(�̰���}']��bOdI��ܫ� /�,l�wtT�!>e�4̒R{��j��&Φ6�~\A(�����~�.�I���`��{���{���-y�ߪzC��h�p����6��(w����
6"��|����Rjx�8c9��=�CH�@?�Վ[[��7��;�\N84`����*(��Y���;�����c�#Q�d����v�r���
��	,���F���y�UҶ�=�A����Ǭ���E�b� ��1���o�cB���96�/
���ؐ��<����D�@�i
#`���Q��h;'��^.hEQo��[[�¸i
�%��
X��N�H+��B��&Pp6h�)jx��)Z��!�z����c's4���L�I���yc%���ⱹbT1�8�$�4�2��;CLYƄ�jx
c��`B���}��>L��*��z�R����PP��)iC�e�:��l������G%�Y�T�]�(��= �0�)�h�%rqk��d	��3@��o�\t�7��L�A ��1�X==���>�F;=�_L�������m�o;PA�v������5��@t��:��@(��C�Ee&ω�N�k:� "��ӌgC#��Ƅ�pը���x�^ʣ2��nȯn
�<JNL�4f�)�؇T~:oQ�i9�jO�"
����:U�
�kM��N�T��{Syq��Te�.�����g�抱V��uo�Lc�\Z�i !�[A*S�����[$t$��8�n6 �l��V�2p�~�&��P穁�me�X�2��'`��R6�W�,.5{PW�Q��`-� ��z�*��XQ�41� �n[Cz��T�s�#0�[�-�D��lcZ>��Ժ��#�
��
�.T��`U2�����@��@�O�e���͚ת:���$�v��Ef��K� x!�P0q�K.���qvƄ��%��B�om���{

�@	�(K���b#|eIhy�%�//P�X
���T�eg�#���ynHB��^;�7�-��|� 뗶
�/n�>%K�\����(#�3�rr�1����h�@�3f�e��d��i����5�b�ev�r��3�|��QB�>q�'V��Vл��@�J���v��>FH�dB�g/x����uqԁAs�&B�
�ZS�����: 
��Dh���lY�����}��L��Qz��>-��hT��p�n6��<�"O��7(x�p[▆�!��iyw�4�V2�n�9����Y����p` ��e�fwG��S%oU#�'��{s�7�q�g�{�;�>��oWщ��s^@o��� A�)�h����B����f���>�0��������=�Rt�A�5g�StP���ؗ��?��'�l��]�e���y�u��y�	D`yo�=�sw�S�����@J��ZK\/� T`���w��{k��9pBsww�ė�u�ӡ�l�������'�y�[<�7@�v�=h���9�;Lw�~�΃=п}R�<�2�}}X�{��`���w=�w?x�g��� b�3��}NgQuC�{ٗ~϶~X�M�WBAH�"0{huD�?�g)�Y�l0&X/�f�o�҂T^@3(��^��F�*�i@A����'lHQ�uNc�3�&x��7r�~��z��<��}�?hzݧ�bRr�q8�C
j��@�X{(wf��m��<�V��w��gBw<GHJ�P����9���pS�3��X��wu�灕‡F8:�`�e�}���Z���p�]�C
i�
�H�'h{�J'��X7�͐���w��fH�.��?�qlЈ���7�<�29w��x�4�����x�xx������)���v� ��R�
@��X�B�8���@A ���e8��X��g|� U�qaP���gOXlQH}�G0`�
�٘�ۘ�8�y��dΓ,p��8�ܘy�(n�P	I�=_�� ��x�7x.�ؒ��Y01ɐM8�9�7#�p�qR0
}�������(��R��1��&ɑItq�P	��=u�Г���gX��q
�����|��dY��H]��'+ɖ�3	;9�L����fy��(��9��(ГM	}O�ZQ)�C
-P�V�����g��Yf�i�PV�Y��uy[�	�=�(P�2���������I@0�����)�qV���9+0
�ɘ~鐏�p%s��������H[`j�����Y��������y��##	�|Y�3Y�hy��T�ٛ����t��F�+�:M 0`���t�����2���y��i��V�#�PoUe�y�"������#�ǡ�	w4����i��	��'��Օ�@A�`\��y���t�����) p;�������y5[`��<#�0��١ʤu��L�V�r�n)Z�vХ�A��0�A�a���]���
"y�ڐ�pbyȂ�p�Hj�Yʁ��g�Z<3a��U
��i��~��Z�;��"�Wz��V���'p���E��mZ�3��D	f�������?���G����a
�J*�Z*mdb
��(C
�਼ک�Y�����v�:���
�c
����I8]p�p��ꦫz��	sТ �<��z:�A��t��:�������z�C
���ʬ��������7�<`��0�bj�ښ�á���`��J������Y�	W�-���=Z��
�B:�B`����ό:R�oH�:�Xj��:��iP0ೞj��XC+Cᚴ��zZ��f����2˫�ڗ�*�B�I;�IZ�����c ��SеS��k{����޳I ��J�Lk�|���2+�+��H��u�뵇�@ʲ!��,�$��iҴ-�A=��YȰ�Ç#J|���!ly�L����!CZB��$'k�쨄G��K�	CS�M%�<�	���@�
m���Ō;>�RdIH�N����%̘4�ܴ�sg�OX(K�!��0&��)I�RW�|	sfͭ]
~�R��߱ z\TˑmS-#�ƥ:��̬xzE���]X$�t���%�ĈA���o�\^
�A�W�V���*V+U�v�Ju*3X�pE�̗-Y�n	3`�Űa�9C�l�oQD���H�O����[6m۸u��U�p	�W�����ӕU����iE�4AMx�@l��w[n���^p��g�|��w�t����v�8 ����Á��BKm"��1��rp�̄�-�\s�E�u��w���e�ȃMy�<��m@��
����h?~s�C�V6�6��5�{2��r�9��]�ݏ��cE��1�l^*�z�'!�����ڙ���Y�
#�� ��I&|�%Was�c��遨�~�c����2NB�"*1G�-6����t<�G�vVb	jYj$ѥlJ2�j�R
w+
wϮe�D�~y�z�[�q��*(�nr�̒eg(������ii��e��w�h�@�a���K-{�VJ����v��K�D]�m���"�2�+��X���%��@A�B�D�*M�H,��Z��A!�>�"����gf�8lv�� $��s����g��^j_�����`-���0�3K
!��*����:���R?�AW�hj�&?�j��M|��M��r�Y�C?C��$�[K����CG���M��a�f��ɳ�}�D
�2;���I��f�4���7��0����n��KW��꺶���Ȏ�ڸ9�j�3�}�ܴ�M��q�
�X-��%?y�1�1�X��D�:��>�u�g.�\�;��N8���,޷��oצ�T�v����N8��,�W��Վt������H�#h����xp���*ּwy|ћ�#����eJ��FX.8>}��|�s��w�ɩ	~ݪ`�|dž$��|��lW:	�nS�PV��6c�i{T�F���„�W
b�T��܆<���n��!
}w���C�G&o`�	��
a�"�{��z�>����XY�Q�$d9T�Ѹ('
�;(�������&o�5��(�����p�32�Tƃ���'+�HC~d��a�L\���V۬�\P��)
���mQ�<�\#����w��$5��u���x�P����b9��ů	�%Xg�� �}�Ӗi��u�<��ިF3/�����#��!@c��/��Ik�O}�a�~�&��@��z`�V3t�\"�i��`9��a�b�3��4�<���@|O4�M��"�ZB�Z4|
��;��G/�q�d���Q#lt���i�D���Ԩ���4�Rr��4e&�!�ʃfe*@xי��i_���B�$���]�bt��!ֲu�f�hW���5Z�@xq֎���Y+#�U9��αu+�X[״��]�k�0Qg�O
|k!+�����$�.8(��?͢dsYق���Ä:[6:�b��j'
V�1! o���D�0�������nn	, �|[�R�V�����A�\��0s�������e���uB��m�-ٶFZ��Tݑ��&a��Uo2�^�D/^1�����jm��`aFo	&�1��Z�^���E=�pA�@���.��iXGYT氇�ˋ��-�Ty�������� �2���--��;�v��u���+[m������"�wɂNbL�,\g�.� 2�g	kyv����3(:|#�@ ��	��x�m#����8��p4��Q��״|����<:���-d�!�dB��cخ��+tsԁAqs�&B��Wc͹��v�: ���D06��Y����ޕ��|A�9z޼m�~�g�.q�66�{��3{��7.x�P[�N6"Liuw�-�2 n�gY���v�[y�|�p` ��Y]fs?5�Q��T)�'�%|u�7�c���p{6���pq�_۷�^��q�vS�H	���As\ԭB^�7+0��N�y���@u`�.@ �-�V:�$ι�/뜞��7�@�>���6�Ԟ`jk��L����ê�uѻ@
H ��[���f�����lx@�yr���	�Z
p����'��վ�X������s�����`��O��	��ȇ��Ro�:@��Ac�o}�Ʊm�7��9�^�~�{�Uy��S��K�Ğ~�k~����kvY �~0�Wx�gt�t,C�{�'~�F~Q�M��WrAH�"�z�t>�?�w)��X�l�~ �~'wf��n�r�T^@-��]��F�+�ipA�'�ȷk(Qz�t�48��!z7yٗ-��y�c=�	���g}U(&G'�(�:Ԡ��_����k�u%()��5�}�	�{r�{j�s��t@�P؇H(cJ�x�����p8~P�}h)w�_��=PQ��ic�E2(' �=Ԑذ�o���n�tN��x3z���{vh�>xb�@����؋:hxXcMx017�0�R�"�pV���������(��8�d(j'P	R>] �P�X�/T�'��hY��~���w�G�P����v�����ͧx�op��H�S(�:�p�hd��,@����(y�m�P	C>_Ў��(�1�.瘒уY0-���G��؃�F#�p@qR0
}0�̨��ؐ�Ȅ�"��-i���T�����w�S�9�V���(�@
4�;M�����5�r�i�:�p�`�����g��(��p
�M�sE�9��ɷ��Ք	��B
-�RY��y����f�i�PR�"y�ei[�	>�(0�.���(�Ƒ��=d5����ȓ}�k&���9+0
���{���9pyZ�r�I��I�j�H[`j@����)���q1���9��#�y�/	��Y��T����ɗ��s�F�)�:M 0@��It�֘�眠2���9�9���Dk%��nXUeР�y�J��`��#�����v0I���I������ݥ��pA�`\��Y��Yt�x��G' p9ڠ�Y��i���[`�=#�0��깡*����L�T��oYn'*�v���A��.ʣ;Ha~9�Zɕ�
Y���*p_�x�	"�	Ej��ɡXz�[S��4#(�0�.
�aء�g;NpQ��"�UZ��6���'`���E��k:�1��>	f`����z�;���׀ј%����z��Z��F&���2�@	����ʞW��$�{W��ꨏ��*z�ڟ��G�ֺ�l���B�0+���ȉ����J'�\`����Iz��(�>�`	<`��
����	{P��l��"��t(	��O�����ڛm�j���pn��l��ʺ���L	��	YP�۫H��Ώ
R��jH�:�V���8:����iP0೜��YXCKC���xJ�����U�R{��:�*k�	8�%1��3{��)�h `�S ��z�kk����I �S���:�����2��(�pu�;����>���
!��,�$�5m�CPϧp~*\Ȱ�Çf8t[�<Ӧ=�hȐ��b�@�ɚ5;(�&��%A���TBSI�h	�1��Ağ@�.\���Ōu�r$$N%Q�Q���K�cj�Ĺm �OX(K�!���,"�葩H�QS�l�2�L�\��[��߱ zTT��-S-!�Ɲ:�.L�x5�,x��]P$�T���$�ŠAZѷ
].�v��ݫW�h�b��*d�\�:��,T�"I�˖,Y��0�bذΜ!P6d��(QF�V�s�w�xz���=���ܻs�\���Ɠ+��teԽ]�NC��lMP�wg-[/�ن�n���p���0���t��GZ�8�j��`�*��B����f�)��[$�#!r�(��s�!0�u��gj��<،G�3��D���X�o��7��j`c l��x���cq�%�\s�]H�u�8�W^�D�q���9�^�V��}f���_+�8"�^.������Y(����G���U�
,j�y�0餋��8܌��x&���_vSV٩_j$�elH*i*�P��vwϭe�D�vI*z�;�q����lfJ�h K֜�4{��
B��~ڇ!���A������.:.��+�|�^��ro�ua��6�k�/�Ȫ�7���=�V���I��l��,�"��K�
d"I�ì���)�pdV{���]�����/��(�zB�/���v;���}`A�Q��o��;+�>��C4P5���82é:�M��h(���%=�4�I�������эOv7t���-��2�\��7w�s�� v�	]A(���8�{���K���`��{������v]��V����~`ڷ-���2�mcܱ�-8�q�
�P�q�"7Ir���1�X��D�ҹ��6����;'y�1���C�6���D��*Җ�������|��w$���B���]�k�`����t8�%R�چ�6�Ob�c���׼�9"z�Y����L�{�����0��Z�C�t��5�
I8���|ͮ��#�0a��) m��ƨ��hH�g�		v��b�~�A뱍x���0U
v�,X��g$��dM��$l�S�p���S�����M�Dʚ�*$!�a��,��k��A	�Լxl�R�`
)�5�)�G�\d�ΐP�1a�^�Ve�W�PG��ؽ}� RD��|�6�MP��)�8��Yq�7,�!w���Rw�x$39J��)�Ԥ�x�P����b7��M-������t������,��A[����&��Þ¬#��='z �Xf$��?�	}�Z�T�<�!�F�h3=�L#2����&0��	��F(�=E9Io����K'�@��#��x�}�џ!��ѽ����#��X̒5O5BD�)ɒ��S�t��%
�"�fM�ySwb�������	\�Iۚҕʵ{O�)/�A�J�m�e?#&7p��+�抡U�J�o�4�1u����[�(I+���2�j�)	u��i�*i�E����h��������km�z�z|`���o;S*V���g�Ԙ<L� ����(>Ѩ�p�Um��
��\�� mx�ӆU:���jU�ἡ)�fk��n����
&����B�"II;�x���:q^��j3#;]��Hx�n��Y�zw�~��T/����z���iI��0/���8���zl�?��H� z���67�����,�$Gx��充�|jب�d�t�pN6�
I����;��f���V-\�=c�v��5���I|a�K���;��D�-t�L
��;D�tʋF���7��F0���X4�yd6��(!�AW��	�*x5��	 ���C�W�6�a�}0A&D ��u~�ji�b�у�� M�d����p+�hF�c�# t��-��,ڰtᆣ�y�xt�a}�#�����ƭ�k�X�4v�'	nL�@v���@�8��e�D�;
d��w��l)�R���ȠpPk9�C��rQ�{Ԉu�	}y�}�j˺9Ŵηʎ0�g|ٲ�3!�ܜt��ݻ J����x~��M)�*��pV`��ry�~��9]�@��'�4>3�rS/�9/�o��
8��&n3�Wx���	6@vӟ��K��3:R׼Ԁ"�����;�)`���� ��vף�_�`�vB@�rw����`���'�y稻��m�3���G�A�������mf���{�x|�C�pf/���|K��y"L���x�^;^��d�ck���vs;�g�=�8 s?3`?��}s�?���B�z�G}�f}BM6���=H�"zt3�?����W�l�}~�e��m7��T^@�~��vT�i0A�G��Ws'�Po�w1�18� �Hywx�g&��x�c=�	����|E&''��:Ԡ��O���v�w}�Xx�<�A��'�]�v�f�t@�PȆ8�w:�s�|��찆`X}A�|
�f8_��=�PA��ghSxE$�' ��<Ԑؠ�_8���m�tN���3i���z�憰�e,�6�?ppl����~��{*փ�2r3��(� H�g����s���(��X�Txi'P	R�=] �P�X�!HS�w��hY����m(~oHj��v�@�P�騇k�{}��u+`��H��8�RXC�f�;�;9��ވ��7�lu
�0���۸�(�n8��R��<�3���x�iǎ��v�'p'�������Ǐ�����sq��Y�x�D��C� w�S��(�Fy���@
#�;M�������|b�Y�:�`�Py��,�rx
pM�s4�(�����;�<8�B
-�BI��Hx���7f�h�PB�y�Ui[�	��=�(�y��(��q��yU0������\֒q8�p)����`�w������ŗ=	�WrЙ�I��I�^�8[`j@����)���p ��)��#�i	�Ɏ�Y��T����xɖ��,8�Q��䉛yk��$p( �CY�Sy�E8@
H�<Pe���i�*��`��#u����uI���I��ɂ���ģ��0A�`\Й�Y��ɇ{i�>9  p)ʟ�Y�щ���[`��<#�0��ڹ��)���pL�D��_�m*�v���A��ʢ�`���L�;�А5��8��FU9�'q��P�6J����%U�]c3a�C���
J�{�L�I Z���l�I���;]PZ���ق*��0	f@���r��*����{0�	Wq��Oڟ�)�v�kbb
��PC
�৮ʨ�y�:j��e�:��
�Q���7��Y8]p�ʥ�
���	s�� �*z�iڋ��������:���������y�C
���꫁:��ڬ��%�<`��p�P��*u���J��٥�vX�xn��lఽ���)�/�{�`�����8*��jQ��ZHqz�F��:�����iP0 ���ީW7�B�ڳ˱iz��r����F���Z�[�	8p%%۳'{��9�	h `�S`����_�����=+�f{�3�SJ�b{L<`��
� ږ��6pp���g˷9���ƓP��!��,�$����)���*\Ȱ�Å–'ϴi�22���1�Br�f͎I8p�I�tI��10��T-��m����ϟ@��3��Ō�6v���&�Tɲ%�13e�܆S�',����Ql�j��H�'S�d�2f֭]�|�C��X=&�Ÿv���M�J�;��ջ�n�$hЯ�]H�4�a�"IڡACѷ
].�f��ݫW�h�b��*d�\�:��,T�"I�˖,Y��0�bذΜ!P6d��(Qb�.�������x{v�۹w�;�	ō'W��9t�ʨ{����"E�4A
xߙ�l��gn���p�g�|��g_t����v�8 ����Á��Bm"��1��r�o�̄�-�s�A��t���_i���e�ȃ
y�<Êm@��
����pő��#�Z��l(��`o��X�q�-��sRgv?*2�Z^�D�}����=螄Z�&~f�a6|X'Y+�Hb�a2�g��Ň\��]Hh����G���U�
<z�y�8	勨�8����f���_v?^�e�d�����)ɤ�-J�q��p���JVI�,���Ǜ�fw鬃�f�4聆�c�ʴ{J� ��^*�}r��(J�OhXP��Z���Ηi��ɻ�����P6Hkj�ĺ���ʊ�:��#i�6��Oи�D?�
�J�+K)�W*��O�$���H�;&�Tj�&�Ww�:�rC�Ҭg���a���Gp���C;�m8��͓Nٮ�N�[�Q� t�yЀ�%��b��J�|ۗ1�ڵ�vC��Џ�.yr�8#�MO{/t����.�7�|�<��3��pv�~\A(��y�2�n�P���p��{��8��������껺~��̎�۷E̪�3�}�ݵ�}��#t�
�d]��(?��Ȇ�O�!�]m��O���;�l�84`�8��.�4��6�i�d�<�;��^��f���t�"�;�=?h �P�� ��ͭFˣՎ�v�qx/z�sD��g��A�pũ`��1�ᏁdJ��BسoM�w�cC�TX����_�{`�P�)L0�{
�@��@�A�|�[����[a���+�X��qP{qC^�B���q�`��
X��ZI-$��l�Iؠ��a�ǧk�M<l�u�1�EUHB&y�#*�R[��ؼ���)z�\1��A^�k�{Z�:���!	�$��Pe���Jy�j�{�
,4���0A&����
n0�c�S҆�â!u�Hn)r?h���!�gҔ��#�I9@���)HiEp&Q�\$g	��3@딥i�A[&����u��THG>��G��Q��@~�LJFS�;��٦��@��z`��BSt�D��I�`9��a�b䳔���������@l��2�팫���F���C�/�I�;~)��ܣ� Q#Pԛ�Li2�Y������k�DM�͜�s���&�!�
ʃ^%�>�֕µ�/�� T^�U��KU?�vK�^�n��7�7�ë�j��d�N/�jQ�bT=c������n6 �h���6P�,%&�a�敏�a��W�U���@'`����VLl-��X��n�pe�FQ���Ue�C�
�� ! �l�z�B�P�;�&��׺n	, �zI{R��V���A�T����p�z��wq%���uB��-�,߆F6ֺLݑ@5�&A��
�1G^�&.^1�K����"�j�A�_~o	&�1��kZ�>8��E=�PA�@�….���W'YL����ˋ�u���Rq�X��������.��������6�v��-�ݛ�9:���*�!�CֳSz��BgpAѐ�;+Xʴc�N��h�{#�@ Ћ�o�x�U#��w�4��84���Ы���t��� :�]����@���L�@ ��k��U�o�4�D�Q����/L���b�ѐ�GG@"���^F,R[����-G@s�vht�Z�I�����ř��ڮq�oLlkJ����
�D��7n�q!�����vã��nC�ʩ�x�20��]��QÜT�.�bp_�7Gs�<�p^����~O��wvm�|H����.�R$�A��#��T
�
#ߛ�񠫼�F���:�uP �>w�1�O�\ՎmN�u �T�7�w�Y�k~��	6X�ӣN����Z�Ԁ"|��.�G�)`@��� ��ש`�`�u����K7�1s8��F�v���3���G)���G�A|���'x�wfţ~h�x|�C��g;X���|L��y"L���8�_?^z�d��Ck������}�ng���qL������{�?���B�z�G}�f}DGM��XRAH�"z(t6�?���'X�l�}~�e��m;��T^@�~�]�F�'+�iPA�G��7k��Pr�s�r/8� �Hywxˇ��x�c=�	����|G8&7'��:Ԡ��Q���~`Gu�Zx�<�C��G��'f.�<3H6��n��*ƃ|�o*A�m(��7tʧ�Ɂ���9:��0�Rx|�V�YD��q�\�C
i�
l�8zކJ'���8���P���v�f����?�pl���Ȃz�-���Rr3��H� H����Ȉr��8��X�V�i'P	R�=] �P�h�!�S䇉�hY�(�o�q�v�G�P	�븇n���փ��wZop��X�EH�8�Z��cѓ,@����hx�V�P	5�=_Ѝ��H�#�.ט�уY0��9�~��F#�p�pR0
}@����}؏�9*Y}Б�X��h�	yH�P	t�=u�����x�Y��q
�@���|p�R)��H\�(���3	'�8Ɏ��e�(s(���9P�(��9�{;�Y=���"��B9����W�I�C�`��=Pe0�_)�Hi����@��C,����H�cY�����U3�*��,�.9fsY������zɖ�ؗ�揞U'GP�i�Ei�U)V��f�6(�}��S������3�=2�ϩ����H��YA
�P�ɚ{ٖ��rp�F�!��橛8Wk~�{0u2���I�I��yD�#��t�UP�Y�9���	�=r`w
*�^��(ZA�@�ښ,�z�I]K�
t6��ɝ繛9��2��% p,���i�҉���[`�=#�0���:��� ��H
�`�m:�v��A��!��-�`oI�Kٔ�
����oX�w�	n0$�	9����L��S���U5#(p�!�S���5NU���"@�I���F���'����E�_J�$��0	f`���w��+٦��1�	�0$�`��9�������V&�:4�@	�:��ڝK��{�V��J��Z��jy����G��:�`����A�0wڢ�ɦ�(���	C
�\�x�=�����=�`	<��j�����	{���l��J��f��O��*���azj�%��ps�=�+�.J��ʓ3
�����	[�<z�ƚQ��\�Hv��J:��H:��՚�:+�c��}��2��DK�#˦܊jr�	lpP ۴"[��Z���P��ZҲD��;j����f):.;��j�۰�=+�m�;;�W��i+�<��Z�#
�%�	�붂��1j���!��,�$���Ώ��*\Ȱ���a˓gڴG
��Q�H 9Y�f�$8Ҥ]�$HИ�Jb*�MӶ88bpధϟW�H�"�G9v	��ȒvN�\����1kn���
@ÊMHg(��F3nT�1�S�(U�t	�V�q���7,��^T�T�G�o�ƕ�Ҫ]M6q
$طr�."
>����#�*�������{�j-]�b�R�l��T�r1��
W$	�|ْ%�0^6��3ʆ�%J�)ډ��A<=X���-��mܹj�-A���Ə�P����ި_Ϯ([j�uW���B�l�ݖ�z���-�	#}�A��~�Ѡ�x:=�J/�Ć 2�sJ-���o�@X�2�%�\s@7�~�iH�iZ�<؈G�3�����X�n
'q�0B���
���f�y
��SW�r�U�t���<V`i���`�� {F8a��]h]��}С�c���~���c�����gᎃf�����U�
0Zby�0�d������Ј}8��u=Vye�c����!���+B�^p��r@<��U@m��%���&,����r��I]�4�F�b���x>�`�}R���b��
nOhX*��F���Ʒ.���ڣ����P64+�����"���j��
�~wk�Oи�D?��ʒ))��)��O�$�O�F��RV{&�jJ�m�:�2C��|�����`�������?7�m(\�̐F����|��M��s�
yЀ�#�zb��
1|���<�P��d/dI���k�#7L3ʲ���s6�D�|r�����mbG�؆�qA�,s�Y�t�j2��d��{�8������J��鷪n��^�ڴ5���1�}3�s[���A7�@H�!Nr�&GI��~<��:�x>4��k�͓�i�;�`n84`����"X4��&������S�1ߍk�]�H�.���������al��ft����������Od�s����<��c��d>�]+}�z`�tdž$�P|�ݾ�f���5�:��X#І`m�"_�V��nV�� �
@�'��w�^ۈ�&S�Jo��u��zFB��W,�M��0�X�<I��ĉ��E9wo��F���=�P�F�T�0o�qz^<8W'Zp��ܚ�(���\��;C:�Ņ�Jx[�񮅼]�XhB�a�L8ф��VX��)@0�c�8)����D!����Ru�`�2�J��Ɉ���������$�I�oZ������t����`,��AZz���"��Þ�������N�/���fگ|�:�
��8�yH�(���9s�
t')��	� �?8��a�OBқ�z�v��"B��:���0�j�e���hp���@�/��%9�%D`��n�'%f47�3���{��(I�y�v�t����"(>tU��<`[S�V�)��s�����Zx�ҧ�d�ωU;��bt�T��0�(֬FM/�ZQ�^=�$���S>o6 �h�
��&��*�&�1P�a׹W�5[��@'`����PD,,��V�і�p�d�FQ�v�S=�B��м ! �l�jQ?�0�6������n	, �zI[������%A�D����p����v:%���uB���+�&F
2ֺJ͑5�&A��
o0G^��lA�B��_ڶ�\��X���{K0��k�^Ӻ���(ꁄ�C.t�N�
Xɒh2�-�^^d8��g��:K�>G���ܐ�z��o�fU�ը�8�4^oi����J����"�!�D�sO���6gpAѐ<+xʰc4N��h�{#�@ Ћ�o8x�%c��f5�84��Ъ���u^��� Z�]����@� �L�@ ��k��U�n�4����Q����/L}��J�ѐ�GG@"���_>�QW�����FHs�vht�:�G�5�˻1ę��ڶ��qLl�J����
�D��8n�q;���vå��nC�ʣdūm80����2��*�R7���2��{֘�3�q��ya
߸�k�g���7�.�R$�B8�#���
$ϛ�q����G���:�uP ����1�O�\ՍU��u��T�)Oq�W���س�z�
���y�*�|:��=�5 �
�l�;��e
�u�9�H��*X��<�+ z�����M�A�8���;��)o����?����=�<��^#0^�?�F�'?z�?�bO��_�����ǿt������g��Yxm|��;����%�qL���A��~o���I��+T��W|�l�Wt
9`%�� �w�Cwc��yDZy��;��7���q`fzߦ.AE�D��{��nI����y�{8�b
5g~�c��%8�0�hy�x�g��x�c=�	����|G&'��:Ԡ��Q���v�}�Z��<�C��G�a�v�Ff$�tP�P�9�w;�s�|���Іbh}D�|(hh_���=PC(�ȧhU8E%h' �<Ԑ��aH���m�tN�3k���z���7f/7�?�pl����~��{-惝br3��H�!X���؈k��H��h�V�i'P	R�=] �P�x�"hS嗉�hY�(�o8~q�j�w�@�P	��ȇo�{���(`��h��X�T8C���?�<9�9�਌�W�nu
�@���ݸ�H�pH��r��<�3���k玳�v�'p	'����؋�珶ƃ�s2��y���F����@w�S��*9�H�����@
%�;M��8����5�}��[�:���R����.��tx
pM�s6�*�����=	�=X3�XB
-0�Di��hx���5f i�PD	���Wi[�	��=�(P����H�±��@0����ؒ`��sX�rI������yٖ�ȗ��?	_��Xr��i��i�a�8[`jP����I���p"��I��#I�k)� ��ٹ��@����n�p�r�ŕ�ɛzWk�	��{Љ2���Y�Y��)D�#��t�UPj�����	�<r`w:�^��(A��-(��I<L�
t6����ٛ~ؗ��=��-� ���Gy�	���vЙ�3n
����i�[�}�����diV�=`z�5�~&��'L锉�@z�����fU<�'��A���A��:��%`�]Q3a�Nz��9�j�|�N�I �
��l�	���;]Pej���-7�/	f`���~*�,I��|/�	�$�Ч�����*��6&���3�@	����*�RZ��{pVX��ʨ\�����9]p�P��z��*���	s@��3��s���H��������J��Ȍ��y�C
������Z������.�<`��0�[:��Ju
����`��
������X�xz�=���4���	��`��
��:����eLȅЧ4��J��c[ȭiP0�:��WDA���ʱ)����6��e�I���ʖ�ʓ��P��X"�R��)���
h �S0�j�����s�h�t���Y��7�m���3;�);��
�.�	�����+;��t!��,�$�?��C����*\�0áC���6�EC��h#�GN֬�	�4i�.	4����J�EӴ-�M=�08`ȳ�O�+�@�H��#�7z��	�H;%O�T�r̗3�մ�	��`��#[Ģ3&��)I�(S�ty5��8]��D�g+�M���R�P��]Y��&�6��ȷ2�.6z���!����Ų�ڽz���.V�Z�B��U�S���B�+�`�lɒuK�/�
��eC�x�%���<ͽ ��[���=���\�v�� !����_$g�\toӭcW��	��ܑ�k��'m��o��g�{��7_s�ݗ�u4d����N��-���mƜR�1�E�0��q�-��I��~~CZ��A#6���+�qb*)֢��7܌#iZ�Țk%��`n�(%q4&���IG���c���1��j[��y�� ��Y���a���)�
 �X`��&{��'}�(vzj�^�ذ��$��̒M������xˌ��wc��U���7T��Xj$�ekG&I��O��p��x�X$�Ʈ\�jn��Ilq�*Gi��]J�h���0kg�
>����M���<�A@����*:��)|�Yi�<ro�uaò�2��-��*�5�*�1�w���4.$�����$��>:��h�"I�l��~m�Ӗi-��eˣ����/��(�y6�o��^K�u;���}`A��P�˯|���.�>�uB4P����H2ç:�Į:�4Ъ��
Y�C?A���|r�)�m��c��C�l����u�k^G�؆tA�,s�X�y�h.��dn�{������I���鶪N��N`ڳ-l*�0�m��rS���;A7�@� �=2�%C9���?��:�x.���k�͓�Y�;�`�94`�x��H���"͵���A��S�1߉�j�]�H�.����#����Hak��dt�����J����/d�k����=�yO��&�լZ���s�;6$���O��5�֮���"���!<ۢ�:�q��& �P0�����6�=��ɳT5�A?܀�!����=�X-�$l�S�0�����8�ș�Z�s� �<hT!	����X4H]Q]���J��Ńsŀ�iXI���^��&��3$!�`L���װT�Z�Ñ����&�q&�MX=_�m�x,�����2di�B����X��|@��$%��t�mRL<@(�a
QJQ�E$'x�6�A�hg,�8��ֲxĥ�Q����@:�IL:Zώ�$���♒����'����;P�󞇄���4��@y�:��@��C��%%lj�yVj2m#"��3�hc��yF����>�F�vs�[��1	)Q�Q4F�(8'�RdZ�8*:#�(��4�;�gO_�	{Ƞ���CX���Ƶ�s�2bz�>�����7*�͖����n��p�+FX�U���f��4��B�U�F�ZCެ>@��V`"����d]m��Үa������*���m`����q6(nbs*E���]u�	\�pt�i/z�>t��#�
��cը k��J�R���lu�ὨM�t�R�n
����
�����H�"�KI;�&x��:���U�j#�!�]��Hx�p�`�ۖ���Co}Q� x!�0n�K.�J�mN�}�%��:��j�K�K�	�@B	�$���'`�dIH9�v//<���S�L��d�#�t�ynH��L^9���*�z�e������|[{Mg0B_h�<@�&9�B\i�{˜t�mDC��`,�N�<�r������ho�!��9֌j�[�߬;J���sC�z^��Y���@GZ��&0�?zh��	D2�`��Z���� x�9Ma�����\KR���h��@�b��̋U��F�]�٨nn���n]w�H��sz�}+ĵ�����{��J�m�����G#;�=��r;���vů�ar_{˧�\ǹm80����z�b����2B��;ל�s�}=�xa
y�s;h���Hw/�R$�JW��3��
,Ǜ r��\�L�z�:vS ���=���֑M��u��d�X�����foƢ��l �g]�[�W�����y�	D�xjk=�i�)S�����@:�k������
�>��>�u_��#�N�����;腇(�$0>�|�!z�;�F���}
�s������Վ���y�'�����䰏��;�r�wu�]��C��a�3���oBgxN�k�B`{�~�&~MQ����FH�"�z�t<v?�g�WX�l�~�~$Wf�gn�R�mT^@+�����T�i�F���t/�Pxvx?�x@�3�����q�w}@z��<��}�7�y�'�_�q�q8`��C
j�����zt�~�7�)P�3�}��{ohfv7oi�A=H@�ЁyH��g�C'p�Gp�„쀇m~Lg}(s�_��=PN؅�i`XE0X' �<Ԑ�p�l���Wn�tN���3v���{�����f7�6�?qlP����|2��˰p�r3����,�7���}׉����aj'P	RA] �P�8�-�S�W��hmY���؅z�~|�j��w�@�P��x�t�|�����'`%`�I���_HC�E�D�<9����7�ru
������{���R�*�<�3��	9�sǏ�xw�qR0
}��x��kG��u$Y}�����IH�P	|Au@�������)��q
�P���|p�d	��\�'(ɖ�3	89�H����:���ܔ9P�(��Iy|EȔ���4#���v��TY�i��'�[iC�`�APeP�q9�Z�����@�D,������u�9��3P�;ɋ=Yf?�8���9+0
���~����Y��5�� GP���W��gYV��f��@h�}�eٙ'���CA2��ɗ"	��Ȟ��F
P�	������780Rm)0��9x�&��8���p(��Vy�f�C$8@
R�<Pe����������#g��iv1)���m�	�����(��ӕ��F�`\@��Й��������! pE������I���[`��<#�0p��y��������b��r)n3Z�v��AP�:���a��Е_�;��S��
ɠ��UD�'���@��0�Tڝ(j��	%s�]c3a�a����)�z�R�I �:�1Jm�I�
��;]Px����5g�.	f@����j�<��	�|.�	�$��ڦʙ�j��&��
5�@	����Z�e��"�{�V'���
�o���G��9]pߪ��ڇ��	sp� �F꜇��
������:�z�����QzD
�������ڮ��A�<`��p�n:���u���J�¹���X�x��A�.�G�����	�`�
K��j��*�eWx��HK�+��cf�iP00����WX�F,۵�
�<
���6����]���ڗ��
Q��Vb�f+��Y��9�h  �Sp�~[��ʴ���l�������qE���G{�={���6��뷝[�?{���I;assets/images/softftpes.svg000064400000004225151526424660012067 0ustar00<svg version="1.2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 178 179" width="178" height="179"><style></style><path fill-rule="evenodd" d="m66.5 4.1c22-0.1 23.2 0 27 2.2 2.6 1.5 4.9 3.9 6.5 7l2.5 4.7h20.8c17.9 0 21.1 0.2 23.4 1.7 3.3 2.2 5.3 7 5.3 12.6 0 4 0.2 4.4 3.5 5.6 6.6 2.3 6.8 3.8 5.6 34-1.9 46.5-1.9 46.1-5.3 49.3l-3 2.8h-58.8v14.5c0 8.2 0.4 14.5 0.9 14.5 1.7 0 7.2 5.3 8.2 7.7 0.8 2.3 1 2.3 17.4 2.3 16.2 0 16.6 0 17.4-2.3 2.7-7 12.6-9.9 19.1-5.5 2.4 1.6 3.8 3.7 4.8 6.9 1.4 4.3 1.3 5-0.4 8.5-2.5 5-6.3 7.7-11.1 7.7-5.3 0-9.5-2.4-11.8-6.7l-2-3.6h-32.1l-1.7 3.5c-4.4 9.1-18.3 9-22.7-0.3l-1.5-3.2h-33l-1.5 3.2c-6.1 12.9-25.6 6.9-23.7-7.2 0.4-2.9 1.5-5.3 3.5-7.3 6-6 17.7-4 20.5 3.3l1.1 3h33.1l1.6-3.3c0.8-1.7 3.2-4.1 5.2-5.2l3.7-2v-28.5h-58.8l-3.1-2.6c-1.8-1.5-3.2-3.8-3.5-5.7-0.5-3-2.4-49.6-2.8-65-0.1-7.9 1.8-11.6 7-13.2l3.2-0.9v-9.7c0-13.2 2.2-18.3 9.5-21.5 2.2-1 9-1.3 26-1.3zm0 4.9c-24.2 0.1-26.2 0.5-29 6-1 2-1.5 5.9-1.5 12.5v9.5h111.2l-0.4-5.5c-0.3-3.1-1-6.1-1.7-6.8-0.8-0.8-8.1-1.3-24.3-1.7l-23.1-0.5-1.4-4.8c-1-3.5-2.2-5.3-4.6-6.7-2.9-1.8-5.1-2-25.2-2zm24.6 33c-55.7 0-63 0.2-64.1 1.6-1.9 2.2 0.5 69.8 2.6 73.1l1.4 2.3h60c53.1 0 60-0.2 61.4-1.6 0.9-0.8 1.6-1.8 1.6-2.2 0-0.4 0.7-15.1 1.5-32.7 1.8-39.4 1.8-37-0.1-38.9-1.4-1.4-8.6-1.6-64.3-1.6zm-63.6 129c4.4 4.2 11.5 2.2 12.9-3.6 0.7-2.8-1.6-7.9-3.9-8.8-8.2-3.1-15.2 6.5-9 12.4zm57-2c1.8 3.5 2.7 4.1 6.5 4.2 6.9 0.2 10.4-7.9 5.5-12.7-6.2-6.3-16 0.7-12 8.5zm59.8 1.8c4.3 4.1 11 2.5 13-3 0.9-2.4-1.1-7.6-3.3-8.8-7.8-4.2-16 5.9-9.7 11.8z"/><path  d="m36 101v-37.2h21.4v4.3h-16.4v10.9h14.8v4.2h-14.8v17.8zm23.3-32.9v-4.3h31.5v4.3h-13.2v32.9h-5.1v-32.9zm47.7-0.1h-6.3v13.9h6.3q3.5 0 5.4-1.8 1.9-1.8 1.9-5.2 0-3.3-1.9-5.1-1.9-1.8-5.4-1.8zm-11.4 33v-37.2h11.4q6.2 0 9.4 2.9 3.2 2.8 3.2 8.2 0 5.5-3.2 8.3-3.2 2.9-9.4 2.9h-6.3v14.9zm53-36v4.9q-2.9-1.3-5.4-2-2.5-0.7-4.9-0.7-4.1 0-6.4 1.6-2.2 1.6-2.2 4.6 0 2.4 1.5 3.7 1.5 1.2 5.6 2l3.1 0.6q5.6 1.1 8.2 3.8 2.7 2.7 2.7 7.2 0 5.4-3.6 8.2-3.6 2.8-10.6 2.8-2.6 0-5.6-0.6-3-0.6-6.2-1.7v-5.2q3.1 1.7 6 2.6 3 0.8 5.8 0.8 4.3 0 6.6-1.7 2.4-1.6 2.4-4.8 0-2.7-1.7-4.3-1.7-1.5-5.5-2.3l-3.1-0.6q-5.6-1.1-8.1-3.5-2.5-2.4-2.5-6.6 0-5 3.4-7.8 3.5-2.9 9.6-2.9 2.6 0 5.3 0.5 2.8 0.5 5.6 1.4z"/></svg>assets/images/cloudflare.svg000064400000001662151526424660012174 0ustar00<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 209.51 94.74"><defs><style>.cls-1{fill:#f4801f;}.cls-2{fill:#f9ab41;}</style></defs><path class="cls-1" d="M143.05,93.42l1.07-3.71c1.27-4.41.8-8.48-1.34-11.48-2-2.76-5.26-4.38-9.25-4.57L58,72.7a1.47,1.47,0,0,1-1.35-2,2,2,0,0,1,1.75-1.34l76.26-1c9-.41,18.84-7.75,22.27-16.71l4.34-11.36a2.68,2.68,0,0,0,.18-1,3.31,3.31,0,0,0-.06-.54,49.67,49.67,0,0,0-95.49-5.14,22.35,22.35,0,0,0-35,23.42A31.73,31.73,0,0,0,.34,93.45a1.47,1.47,0,0,0,1.45,1.27l139.49,0h0A1.83,1.83,0,0,0,143.05,93.42Z"/><path class="cls-2" d="M168.22,41.15q-1,0-2.1.06a.88.88,0,0,0-.32.07,1.17,1.17,0,0,0-.76.8l-3,10.26c-1.28,4.41-.81,8.48,1.34,11.48a11.65,11.65,0,0,0,9.24,4.57l16.11,1a1.44,1.44,0,0,1,1.14.62,1.5,1.5,0,0,1,.17,1.37,2,2,0,0,1-1.75,1.34l-16.73,1c-9.09.42-18.88,7.75-22.31,16.7l-1.21,3.16a.9.9,0,0,0,.79,1.22h57.63A1.55,1.55,0,0,0,208,93.63a41.34,41.34,0,0,0-39.76-52.48Z"/></svg>assets/images/dropbox.svg000064400000000671151526424660011530 0ustar00<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="43px" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 43 40" version="1.1" height="40px">
 <path d="m12.5 0l-12.5 8.1 8.7 7 12.5-7.8-8.7-7.3zm-12.5 21.9l12.5 8.2 8.7-7.3-12.5-7.7-8.7 6.8zm21.2 0.9l8.8 7.3 12.4-8.1-8.6-6.9-12.6 7.7zm21.2-14.7l-12.4-8.1-8.8 7.3 12.6 7.8 8.6-7zm-21.1 16.3l-8.8 7.3-3.7-2.5v2.8l12.5 7.5 12.5-7.5v-2.8l-3.8 2.5-8.7-7.3z" fill="#007EE5"/>
</svg>
assets/images/digitalocean.svg000064400000000723151526424660012474 0ustar00<svg xmlns="http://www.w3.org/2000/svg" viewBox="65.2 173.5 32 32" width="64" height="64" fill="#0080ff"><path d="M81.202 205.5v-6.2c6.568 0 11.666-6.5 9.144-13.418a9.27 9.27 0 0 0-5.533-5.531c-6.912-2.502-13.425 2.575-13.425 9.14H65.2c0-10.463 10.124-18.622 21.1-15.195 4.8 1.505 8.618 5.313 10.105 10.1 3.43 10.99-4.717 21.107-15.203 21.107z"/><path d="M75.05 199.317v-6.165h6.168v6.165zm-4.753 4.75v-4.75h4.753v4.75h-4.753zm0-4.75h-3.973v-3.97h3.973v3.97z"/></svg>assets/images/linode.svg000064400000006645151526424660011334 0ustar00<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 32 32"><path d="M9.545 14.42l-1.2-8.258L3.37 3.074l1.612 7.8 4.562 3.556zm1.38 9.443l-.852-5.823-4.356-3.63 1.17 5.648 4.038 3.804zm-3.383-.64l.862 4.165 3.596 3.817L11.386 27l-3.842-3.78zm11.644-1.806l-1.837-1.402.014.33a.19.19 0 0 1-.084.166l-1.386.934 1.507 1.23c.02.02.03.027.035.036l.022.042c.008.027.01.037.01.048l.064 1.45 1.7 1.423-.036-4.26zm6.3-4.507l-.36 4.153-1.2-.828.13-2.118c0-.024-.002-.033-.003-.04-.006-.032-.012-.046-.02-.06s-.02-.028-.032-.04a.23.23 0 0 0-.032-.028l-2.56-1.69.037-1.856 4.03 2.51" fill="#123d10"/><path d="M16.59 11.116l-.335-7.84-7.53 2.894 1.23 8.4 6.635-3.453zm.4 9.135l-.246-5.78-6.27 3.57.88 6.01 5.638-3.798zm.127 2.93l-5.333 3.816.648 4.422 4.872-3.88-.186-4.357zm2.465-1.762l.036 4.275 3.8-3.032.253-4.17-4.1 2.926zm9.48-6.782l-.534 3.955-2.998 2.4.352-4.068 3.18-2.276" fill="#33b652"/><path d="M17.472 22.812l-.008-.042a.21.21 0 0 0-.019-.044c-.015-.024-.023-.032-.03-.04l-1.52-1.24 1.386-.934a.19.19 0 0 0 .084-.166l-.014-.33 1.837 1.402.036 4.26-1.7-1.423-.062-1.44zm-7.398-4.772l.852 5.823-4.038-3.804-1.17-5.648 4.356 3.63zm6.904 2.212L11.34 24.05l-.88-6.01 6.27-3.57.246 5.78zm-.725-16.975l.335 7.84-6.635 3.453-1.23-8.4 7.53-2.894zM8.335 6.16l1.2 8.258-4.562-3.556-1.612-7.8L8.335 6.16zm.07 21.225l-.862-4.165L11.386 27l.615 4.203-3.596-3.817zm8.885.152l-4.872 3.88-.648-4.422 5.333-3.816.186 4.357zm6.116-4.876l-3.8 3.032-.036-4.275 4.1-2.926-.253 4.17zm.53-2.428l.13-2.118c0-.024-.002-.033-.003-.04-.006-.032-.012-.046-.02-.06s-.02-.028-.032-.04a.23.23 0 0 0-.032-.028l-2.56-1.69.037-1.856 4.03 2.51-.36 4.153-1.2-.828zm1.58.747l.352-4.068 3.18-2.276-.534 3.955-2.998 2.4zm3.97-6.77l-.006-.03c-.002-.01-.006-.02-.01-.03a.23.23 0 0 0-.027-.045c-.02-.023-.03-.03-.04-.038l-4.368-2.42c-.06-.033-.133-.032-.192.008l-3.674 2.246c-.006 0-.01.01-.016.013s-.013.01-.02.015l-.016.02c-.005.008-.01.01-.014.018s-.008.017-.01.026-.006.013-.008.02-.003.02-.004.03l-.042 1.97-1.494-.987c-.062-.04-.142-.042-.205 0l-2.15 1.314-.093-2.186-.007-.042c-.002-.008-.004-.013-.007-.02a.19.19 0 0 0-.011-.024c-.004-.008-.008-.013-.013-.02s-.01-.013-.015-.02-.012-.01-.02-.016l-2.25-1.514 2.094-1.1c.066-.034.106-.104.103-.178l-.352-8.228c-.001-.01-.003-.02-.005-.03-.006-.03-.013-.045-.022-.06s-.022-.03-.032-.04c-.017-.017-.022-.02-.028-.024-.017-.008-.02-.008-.022-.015L10.873.115a.19.19 0 0 0-.14-.011L3.036 2.502l-.05.028-.04.037c-.006.008-.01.015-.014.023s-.01.015-.013.024-.006.02-.01.03c-.006.03-.005.04-.005.05s0 .018.001.027l1.718 8.302c.01.044.034.084.07.112l2.33 1.817-1.685.802c-.02.008-.022.015-.026.016l-.027.023c-.022.024-.028.036-.034.047-.014.028-.02.045-.02.062a.24.24 0 0 0 .002.055l1.292 6.25a.19.19 0 0 0 .056.1l1.622 1.528-1.075.658c-.014.008-.026.02-.038.03-.017.02-.025.033-.032.045a.22.22 0 0 0-.021.065c-.002.018-.001.036.003.055l1 4.842c.007.034.024.066.048.092l4.048 4.298c.006.008.013.01.02.017.02.017.033.024.047.03.027.008.05.013.072.013s.038 0 .056-.01.022-.008.027-.015c.008 0 .014-.01.02-.014l5.223-4.157c.048-.04.074-.097.072-.157l-.122-2.85 1.74 1.464c.02.015.03.023.04.028s.02.008.025.015c.02.008.038.01.057.01s.037-.008.056-.01c.017-.008.022-.008.026-.015.01-.008.017-.01.026-.017l4.186-3.337c.043-.034.068-.084.072-.138l.127-2.09 1.27.884c.012.008.015.015.02.015.007.008.015.008.023.01.033.015.05.015.067.015s.038 0 .056-.01.02-.008.026-.015c.01-.008.02-.012.03-.018l3.415-2.722c.04-.03.064-.076.07-.124l.604-4.47.001-.037" fill="#231f20"/></svg>assets/images/backuply-black.png000064400000036772151526424660012737 0ustar00�PNG


IHDR��gsRGB��,	pHYs��PLTE�     �wq�tRNS�Z`
60T���K��������ͱ{C^v��9i�����oXm|�������xc�N��@�?���Hܥ���:ay�+!-=R��<u�r���
��3s����O[�fEd�'B�%�l�	$���gI~�1����p7]jأU��*("4����.�L��W���Q�F�ϖq�:�IDATx���E��[�LpH ����"H8B Y��YV$
�LX�5yC@.]9A"(
���Nw������ꮞ����l������<�WQ}GM��trrr*@�t$trr�<iС���i��F�����+'����YF�@���4�2�@B''���q::99��
a����Ә�8�+��eu�m�&X�@{�m5�Z��FYU�O6���6j�u"h�l5��.h�m�,�x�#˕�`�r���˕�`�r�4�˕�`�r�T�˕�`�r�t�˕�`�re��c�AG�r�(X�Y���p�Q�\9
�+GA�:
�+G�r�(h��AG�r�(X�mCp0�(X��մS�6C�n�˕�`��r
��__��A&G�r�(X������7���Q�\9
�����m��e�-�r,W���j�)h�{)�n�˕�`��^
ڦ^F�D G�r�(X������d�Ih9
�+G�r5��M<(ۍB�Q�\9
��)��m�Q��.�˕�`��N
چ)�
C�Q�\9
�����m։d�m�˕�`��F
��P��Q�\9
��)��m�Id�y�˕�`��>
ڦ�T��Q�\9
�+G���ve�(X����Q�6�Td��2r,W���j�(hpj��Ji9
�+G�r5e��7U�n��˕�`��.
چ��l�TR����Q�\9
VS�[*)G�r�(X�����Ѧ#�m���`�r,W�DA�`ӓ�֊�Q�\9
��)��m���v{��(X�˕�`ee��br,W���jz(hj���b#9
�+G�r55��4�l��P����Q�\9
VX��l(G�r�(X������Ɠ�V�Q�\9
��)��m�qe��r,W����Q�Ҳ�n}9
�+G�r5�
3�l�\$G�r�(X�+.�MJ���O8y��SNݴ��o�9���g�Y���ٞ��4ߜ�onv�^|�����7��s�~�9s���ο��uv�j�E�/�d��K/���,��|�Mm�,�l�](
^��J�����We�쮹&21��s�f�*7����B5�Uy�5�,E��<%��MW^{7�i��m�����J����P4
��<�Ö�w�����K���{?��}9odH7p̻�uS��S?��Ӆ ��8�y�����dF�ܝ��ʱX�������S\F?CY�h$�ls,�̶O��e(x�M�B D�t���Z�k)��׼y�q�J�~�⽚��E�tw�I��{%:
��'����)��	����JcA����/�����dݗm����`
���*Z�>d¦�y��F�l�(x��U��/��G��6D���+�}�2����y�q�a���+Q�zX�>ݲ��Þdh-�6��Lc�zIɉ����`O䶨���Hi��,�30����깛��/	[��Z� g�)��l��;�,V��Ѐ�z%A=�2nȸDH_�u��_�yV�Թ-�=u�����ج1����Y��W�a�|4W�_k00��ot,V���n�N9�~�2~8g��c)����,�?}r�^
{�|k�+���ʿ>���ͪ�'<���-�i���_��̑�A�b5
��z1��Ÿ�\��$D�R
�)�
><�;��=Lc�X��4��1��k�KFj��V�
�@�V/��[� �p��7������~œ2�I�o�އ�}.G�E��S9��zMG��ݠ�@�WsLi�'�C5�`L��Z�#���S�!���32�,S�%����×��:�q�+R���
_Aپ�ͭ`��TV9��^S�a��썌0��a�H�Y�RN.U)$7��[��)�S�d�t|���5P��ǯ�
��kv�\M�H��
�"��?9������R����b��%�+������� X��@�?Fe�?�F���Y�zw�����8Y��2���b)����*_�=�?��{h���
v��|�����
��'y9y)�&.�-:�e
��D���{��,V��۰�3�)mBv��˨X���̲�z��ĘCYwj������8<�HɯH��sR��2��k���$'��<�ܬP��MnU
��?��*1�	�~>��GL�V�P�
�=���b
+�K���*ij(ڑ��Q��2�(x[��� Ix���t�M�beo
�|B���'P���R(|��Trq%
������K6M��p糗�;�F��F�f_
Ϯ�»9V��Bwd��E��p�M�E��$9�3�ç�(e
���u(4!֝dIm*�]^iB��Ëŭsv<3�4۾潻��=d�R�Y�fw����W�ħjV��af��S���?׽Ç����8Q\��E��5��)vba���$�<|B�ټ~����=���O��؞-�Xݳd��m4�z��zy���/����2���
�~����^�MGg�T"j͉����e!s��� ���rP�V����d�)�:H�0p`�����7��Hj�:�E(5��(?��7B��$E�!�Z�o�:9��CD���L��F-�QB�!݌N|���g�${�
��O�mDK�.�X� �z>s\�C�9V��H~�W��x��P�Ok��8��d����T�ۜ�ۿ~� �n�{��FL$˖�I��&��فo_�U����(����txQ:�L�{@�7��%+!!�Iu_�,��5
��k/1�F
��H�0����RxS�%��)�����P*�Ԩ���e�.�Z���'�;�a�q��k���܏!�p��2�D��d�/�
n�:�c��G��B%5)F��8�Tl�ojS�����P�P��S���PP�F0u�P�>f��4��HT��R��~f,S��3>��(��_O���%I�w�NY���SM\jL��V���]�L)�B��s'T_ث���u����O_N�<�I��qAw(i��bˇjI6w������t(P��C݆�]ՑBA�1#{%%I�D1�3��ISva:���8�m�x<']o�D�Q�qw�b�S�,Sp;~;5�W+�5�\�С ��\��в��2MA�1�"�E#qU���� r�-�CAI`��0���^
�]���pُ�	X|�U��e����yD�h�_J�H�p�_��E���H�Ș$�Ͳ�����:���{Dz3������!LR�<��������/']6���`^UӲL��3��F�˻	���(x;�Ŋ�����M�BcDvK7.Q����d�*xoD3���DeJ���t|e#04d�x���E-S�H�9���0�^Tv�Ҭ(���c!�1�!�����j��$.�J�r�(�8l#>r��ڤ��:�z��!;�>��L�@�$���O��3�i�(x*��	���bsx)�B��7*A��fVx0(n��WRp�|M�z�8E�l|��6��fU�m�����G�2E����~O(=
�%0�%}��Q	�]\
��u���?���l��:�,�]x�A���
��CL�L<�KA�ʈڭ�Pե�x.�#����a�N&�[���y�� ��G�7��‡�'�ಠ�%`A5��^E��=�ëtԔX��/nd4V�+KA�C2#���_;M
���A��B�j�`)AU����>z�~^_Œ�i/�?��I���a�vT�a%��5)������UY
��/�&�X�B�������k���e+�F��G����^�QK�/j�������‰!����,0
UU
r.e��;)t)�*@}�/t��}i*�P)�?2%��>ʊ�[���;[�-t�3�`�Q2�z��?A���>O��Z���Co&YU
jƢ��$��.��I�n&��t���M��Y��G��%�f�t�+P��eA|pZFA3�R���Q��X��p[{˲��80=>,s�N�KA|c[3
ӟARG
��P�T�*]Q}T���P�ì�O��t�.N�$J��p�o5kP_Qt]+6��6®g��)��g3�d�=I�qR(n�k����Q�I��\�(YR	�F�6�@ϥ�3~�u�^XU� �2"���VEOM�2�j��Mtm
��S�(L ٗ�P���j[�&��j������)O
�؋"�ڤn��Χl���w�;*<ŢLA|eD��jZ2�"�����ק��c:6"�o��)�%Eb��ʅ��/kF�8���1d��Ub	�~�v�R;�ѻ����	^d�OA�?�c#�c�K�sM�B36���(׵�؃����u_@)�sJ���q���U5�jR�J���"���OA�kT»�&�g%�
�H��3i�>���<tz̠����`a���m�	'֬�hդ�{L�	S����P	��SO���2>�b�>J{	��^�ۿML��
���U�)�N%
��#��+IA������x�Q=
�*>3[D
F�X���eA�ʎ��#�(P��u��QSGJ���}�CkU���sQד�s(�8*�r���^��,��ZB��ʘ���|laO����S��Pu�P�lDU��iU���0�A��K>Ρ �	��5�5&�E�2R<U���`e���Q�����)]�U����=ܑ�����;eG�7�sP�Q���q���x�����>��p~j�<sI��ס��_��S�=��}��JRPv���}(;z�͢ �Q�„�I�B�2�2�f�}�yf:�}Ċܠ'm
��(4�!)	���+I�_3
�kPv�1O��L�5ct�GxB�x�A��5S�*~~p�as�RҦ�e(�-��)��Y�H��TE
�8�~6黟G�kQj�����*堣��/a��v4:ҧ(?��|iSz'��4#	�32��9J�0
��
�4��GPJ!(փ���9�(�$%�Ƹݦ��F��f<#E�gcډ����Vm��S�����5R)�q�6<�O��Qz�Q���O�č�1RruL���v
��y&t��얹��f ��H�l�)��jR:����V)x:��@p�L�d3)�GD>�}T�H�$j��+d�j��rޅ2䝑]��[�_B����R_�z_����!񻩧��6�t
ߋv����J�F��R#�F�.�g�]���ev.�"	
�'cK��"� X��U5�*R0�^�
���4����\��?�D�NU2���:���<��TS����8Ԙ��@�����Pp+2����R)�?.H,�}M=ͥ ��G��"G
%�8|X��I���f_S�p��Yo�ϛB�����K�(R?V���%V���2����~V���eQ�n�-p�P/
���j��k�s�ಲ2���+�=j��+�>���4ußeTE
�9�O
G���
*�KI"pRA�H�$\��2g0z�O����P���K	�=_̉��(
^D�a-o�U������v�I��)�}����hQ8��ڠ.u_���@6T����|�oܙ��"(x
��%�@U� ��P��y��O��@JI����*�E`C�1��Ry�=�2T��_2;�$(��<��nN���h�:3!TA
���%j$rE�O�#��~/L��l�#��Pa
��.u\��`4�F[��d8�����sT\Q�����@9�'���6"���)�$L^��gI�0�5�U�Л&/er3l�i1l����yY�DB�<��7F���U�Qpj�ƂxdV����"G
�p�81T5N�Boz)O��-v�������Lu�X���	�v�i!O��FA�Μ�1aˉn7E� S�`�0/44F�B]�:����A���o���	͈�ʵ4h���}�s���"��� \;,qg[ZT�r a�z����N��XPt"'�}���>���,O��Ģ`��_bǂ��k�@�Ō����0=�}X䴽F�d��Ʀf�K�3��h]P
��f���.�B�A6�������M�G�<K��)�C�$�MŷQ��.�y��i/��g���#�ָ�
u)�3bz��-�0��t!�Rҥ�M�G�+&�Q̭S�X�'�y��#&�Y�d�6��;G)�0
�Ƥv�=?�#?|R���'��*0�.��F���ĥ ?RG)�kw��:�	�ڎ���&���V)|0�	�ƣz�K�.�ȄOM��Z0�����j��KAxw�D��bS��4XA
�;c�3#F���(L |���B�T�n�
�.uB��P������QW�i��K�����U$K�2-�@�?P� s��B�S�1�?�6~6���DY�AC�ȧq�!�RO���6�!����9]
³�J�u�I:\<�Ib���4XA
��f{9j�s���Qл�!��q���HA��iꈺ��A�ZT���
4#�r����y�
�>������]��`)�k,�5
�
('Qth=z2�4��Q�ka�~-Q��0G~p[���P��MJ��ס�-���>�%�)ki��l�8�;ʐ�����������F�k*�&�`F��&�Ry����a���ή�0/��/��-����CF����h�����yb�<�2$�9��� =�&�F�0jV�`0AS�zEQ��F_"f�3�Y��
K;*;�C����D\�z��C8ki�$���� ��Nze�4�t^
�f��S�)�Ģx.�g�AU���K�96}��m�G��(+Q�|��j�Pp��c8pki�$Ѿ
���d��@l���KA��F��cه��
��4�U�늺�+9����G-퍑P]��(\�|�U��h
&c�=�bp�$Q�޲c�t�XCn
����c�gī+E3AW:-R�j0k	u�<�c��(���^��(/Q��jvOzg9�(ع*��s�9��A�Dq(��T�����MA�~���.���fFZZ-R�j0k	u�<G����B�h�E{��(JC��b��.��~�����q�A�D?
��Y~ �.G���S�a�:��%t�P)|��j�jV�Y�P�K��$�C�gГx��;�����Ż��|���gy�K�&)���P�,<�O���?�C����,9nii�H5���B(اr����e&���I����FO�����,DA>�i4��~´�á`��鯡�h�� �f�ܱg�K%�lm##-��f5�u���0��X��|e?z��X�d<�B�(܅-�� �G|%�,ڋhhG�CoD]��_�R0G;���+���Y��x"~�9R�*���8
"=���n�>
KVu���o����U'��	{��]D���g<ϡ���w=ʏ�32@AԂ�,���������;��Ho�����5(�-wM?7�E�+�t(�}k��4�(�����2�C��ip��/Dabq��w�;�i�&FZ�-R�j0+�ި�q��s���>�`X
1�|�?\T�EA���� �`7�x�����E���	
������P�&��m`���"լ���&1�=	���˂D�a���=
�#�z�{���<�!�X<�ge�~e��޹ ����!�БB �HK�E*Y
f%<ju&7;���a7�.��)����Ѥ�
�O
2N�z�¢ �,��0;�y#|
d�����O�БB �HK�E�Y
f-(
����!���}����ĵSGH�ݡ���w7������9�6zƪIA}
�i,�O(��GA�<�,�(7S�P����?�`�{h�͋��[���`ւ�w}���0�'��{2T�C��&ǫ�网ͨ��
��.�US_D럼����EA�����2C���~xR�3�H�6/��n�JV�Y��T�������.z�IA�[�8՜��2��I��ԩA�AdoB���<
�ɲ�ؠ�6CA�?2�Ȟi�eۼHK�E*Y
f-ȹ�q�����z�h=�+�t��I��a@�iOo�G�)�W�ԗ��>����v�(Ȝm�$��f(�+��?ʮ/��g(ۼHK�E&����j�G�ף.z��U���$N��I�>AA>�է�wQ���y��u:�Xmp)�.�bYPD5C�����af�.q��6.��o�I�EAި�K������CAY%�Δzf�eP7��� \��V��=m#`̤ �\�OQV"��(�V"�ـ#*�
�q��E&�$o�d�
ʉX%�;
.�IRnGi|�;gt
�8sɡ�>��څbY�s�^i�)Ț�Y�*c���.:[za��/Q��6.�b��U��ৌ��K<��q(إ� ��~8%֏7�	ʆ��ˡ���<�/F))6p)��������LQ��F�
�u�#�P�q��E&�$9C�/`NĹ~HA�bJ(��H(YZS�т�fEB~b�@~,
z?̱4�B�2�0�s .9Kp�\5S��'8��P�_��b��EZ���j��D}�_U�6�#�q�,�,-�>�8]ӂ#0��y$��)-
f�>	�������Rп[�jL�?QcGa�)qv�F�Q�m\��i�ɩM�F��Lp�A�Q������rn���H��&_ �*K�������̥ �s����$�(�J�K�9��v�6.�b���TC@Am��
�����.m�Jn��d�Pq}�0)�}LTQai�h�¿p��l��gqK�[g������3&�-���EZ���j(��^N�HUCDM�lع�P��|��qL�X�Z\�Roh7T������ש�ar>����+���</Lc��`�-�I�H!�m\��j����hYM���j�mu7��I�Hr�^���{`P��)H�͑/
n����{�,� �����:6x�ƙ|$Ld����^�'P��q��E&��@Z�6�<n �A	vѐL�@�(��W>U|o	��z�OA|�E�����3��Y0���wUI=R�lNٽ���|��EZ���j)�kDa��Ʃ�$0�FݙH��)\k�۽���
{���M-�����K�x�V} �����-�G2#xZT� �k�eU���EZ��mvZ�j)��� �58� 
�r*�\J�/q�3�'.!���*�%nu\H��AAҁ�li�/0��b���'�擇����F �V�d?t&)��'�]hdei1[Ķ�i1�!���W��Q��Ub�Km�x)10Z#�L�+��
��(
�fy(�}F�*Y|'�(���}sQ��T�M�jD�@��$)8Rei1[Ķ�i1��(��_�R8�g�-D!���MKű�\&	;�	��2'�g���\|���dip/1��(x�y-Q�#���q��nܞE�%�uD�3P����vζq��Al�������e`�9���NA����T�`�o�)��;d��"�OKŹ�EAo�B1�^�SG��g�g�!u�$Qp��v����s�,�Q
�GX1��#�H�y��Al�������u������:qJ�x"[Kءj�v��|�~��Aj (��� �]֐-
��A�Z[D�ݕ��[���l��-F'eH�nIA�ǹ�5�RPx]���H!�m^��l�f�ŬbG˻5�Q/�.�X�wY�d�����[2��1�UV	��a[�	����]m�rN
b��ҥA����A�>��t�m���l�k�h,xj:�I����tS��c2KAᑡF�3��l�"%f{�6;-f5����O��B�-{y�/X1�.;A�anA׆����|d�@�kP	=��������\�]²�R{/���.��򿿐]�8nc���=xE��,z{�Fl$�
K��P��2K��=EɑB$ۼH����N�Y
4��̜����v�x� ?-p���;ð�-s�5�E1�Ba�2#�~��7��~���
�F!yk$R^
z�劗7�uV.[��?�y�N���O� ̇Ǔ�?�5��hF�AA
�� }��
��Vq�c���N�@:1�l�"%fs�6;-f5�ۥ��|_�b獟���=Ϭ;eSK�a&Y/
Օ��l6���z�K6�����ev�=;��(��}U~BQ��87�eL�� �H]�p������E?N.`@��l����_x�I3��d��g��2L��g阴�c�FR��mvZ�j�d�!?���6)�=������0���2R~
R�/
歟]�=/���A�/�
#���T�0��jţ��l#)fk�6;-f5�����:ZT��9���j�M��]9
��(]
5@��D�¥�3�aп(����G[�(N�0�Rۊ0MA�~#����H����N�Y
�#�6���I}U�q2�0b�$�P������g/?)a��޷D�¥�n�����Wʉ�2�`t֙
#�h�^��2MA���v��l#!fk�6;-f5����裫��V����(%堟�����_%[���p)���	�K�y^�ŃL�}C�J(�#�e.*�a0MAzDz=%��H����N�Y������g��+7��ݡ���t���4����s��)��6�
R�K��]o���o�����ߔ��M1NA���Ha ��H����N�Y
�I������iy�ɨM�*{IXp�0����9'��%�77�
�@*<���R��Q�.
o�
��<��R�)H��Ru�0�mb$�l�f�Ŭr�?�m��Y��u��]V)�8��{.�߰1�(vy<�
z��\(~A�(�P绱,���-���#��ip�$��{}� �J?S�Ȉ����N�Y
�����ڽ�?��>�ю�Z�wKdsbiWe�U+m����J(����vjb�y��Ya��`�}��@�/�h'�$�G����62�b��m��bV�b�>Q�^&\�RjJ<(`-i�L��`��x4���O}6�gC�(H]~�\(�Js�� ��l������w�滟�Z���S/�j8R�63bb6�m��bV�.�B$yFc9��%ӎvW��FK�)F�����[��~k����q4�s���ӁN3s<$.PJAo�=l�֚s!��%4)e�11�¶�)1k�]
^h� �USÂ�{��@��׳)�ɿ�?�����9�QoU���x�=�|ɥ���A�K�S���n}���So�HP�(Ǧ��64bb6�m�Sb�B�<�<{�ֲ��h�D�����̇�G��qRa��KE�3��G(�@���R>(,K��������ւ���@P�_�8_@��1�%l����Y����O��%�W�?�8�	q�`@�a�]V=���<����������O�w�x�?[U� Ӻl���"�d�R��������K�x�*[���z�G��r�p�e+�+����N�dh9-G
C٦�H̖�mvR�Jhj��7}�)�^����,ei��7זk�CͥZma9�1�[�_A�y�Av�Uѯ�,[5�Ԉ�)�E��8
4���R��rt+�Z;6#���P̦�mvR�J0��|p��n�l��2��Ę��=���o��_�|�Eg~~Բ9&��KO���Λ;僚.�燚{
Ң`���<�7^v��w�._of+$
�-�mn5�bV�ɩh�nЍ���
�x:D�͍���P�J89������F��@cn~(�Kpr*XGA�*x9;3��h���~	NNk�(xf�:��q��l����>�%89�I� p0rJ��l����>T����T�&������gy2�
�H�m}�</�ɩPM_2^���y�NNEh�(��!־ۜ�m|L�̼ߩ��\OV-h�TΩ�ov�TJIqM���X�P��12�v�T�P�寖I�
AQ&/�)i�(���ț�m~L�L��i�e
vJ���`n=���<�T�	22�n�Wv)X+�
��y�	� ��@��2�2��Wv)��\��"�_���
�+0��l3d�e�%L��R��(=Xs�t��'G���T%ω�lCd�e�%L��R0\jy��9
V[����r���m���̼���U
�˂���]G�j�^P���m�#�-C/aZe��#�5+-4�6S���8��;�VU��ɿ
��`}���\i.�(_�{S�!ۻ�V�+s[��W:ұ��{Dl��얹����L���A�͹�-������Π�aA���]ÿڱLw��)gQ�����g��Ճ���f)��d??���I����tc�f���{R��5!\���}��l�dle�L��l�;��>]�˟:�����]�l����$���|��R���F��4wT(>�LS����+��ϥ� W��Ɯ,��dP�Io��2l�dLe�L����R�g�"�,��""c��Է#6DZJM����B7�WZ���㮄�#���ğPp&�}��HCSp9e�d?܇��6[�m���̾��T���_�*�A��ɋ��f@.����!��j���J�A�
�,VV�)��oz�~��0��i$ۭ�ai���y�����
��J4g�.�6Q�Q��*�zw�=�k��O�p����-�QS���r����"�6�)k���K�t�97�gt�0�q�������$nI�����(�V<
E��k�]�xRx}b(��_4_�m���̿��S�{w��ط���M���h@9�3��p�8�P!d�V!CJ
GY��mH�fܶv���(��m#Ȧ���X���D���ˠQ�
ގ6F
��E�f���+�BE�R����"J��§�=�tf��*����ZD�v
�q2�0�2�$nE�f����%��KP��H�
dJLk�)���:���lSe�T�+�>E��{k#*��m�F��_=o��Z��쎘�W|�ED�Z��Dk�3)KF�wU
.ų�0JCQ0�Y��\��s
��7��SHy��2V*�
L��#��r�����~��Z��1����)r-���#K�H]k6;��0��qY
�el���(�`b�@����э�=�PT���2F*�L�bKj}�S�hp�r�I���AzZ�����o:��X�Z�*���
k���(�]vF0���/:�8���W�m����{ӥ��XFI��'b"̤��I��N�c��'U)P4*@H��T�.OY�C�3/��m�]q�{'o�	Xt
l�eLT�+�*e�D�1$&����e�|��[Ȥ�i��WH����ٹP��-�x-N��`�
���4�ʮlQt/:>|B����b�c���X��70U�zS�# ~@pi��F�<�;�tB`��LF��J�?et��Lu2̞��/>5=����כS�D
��+�ۄ��Ib
�C��N��˛��1?d%�`z}��`��q
vAR
zK�3�+R
�H�?n�m�T^���)����H��W�78h�s0G��Vsx��2�Kd���Y
���`S�ɣ��v���L�U��I(X�/�
W���16Dd�A��Zc�ҁ
�D&��`
΀�j��O1)��U)xA9��&M�U��I(8:#������`H8:Ü:��S+VA�а���̵G\(Ң`�Xw�}�W�I���xY��fMeU��5��(qU-BC���\����U䐘ˉ�"�  ��R�1K��I)R��#ݠN��"�U�Fd���5a�U�E�qSM���C������BJE�ٶ����d��E��\��Q�I�L�Kt^�&W=��h�(��T�l��*���C�W?q!$�P��o�!���Ts#OŻ#kI+����9��`꜡`�ƞ�ݑz��u��FKBE��ee:US��?
��#N]�]�p���P#�e'�31*	(�Y�\�Q03�[b1�$>2�vc�K`}!��4eWE�"
���`�,�ܩ�,4�(�S&>c
Pqy5�ʘ�[����Ґ<����k��`��r������0���6:Ș�`=nG��?Ӡj���6�L�L_�c�m�TGv��Q0�%�I&�J�Ӡ���X�A)���f��xqI
&n��z
��\H��=�,}�EP0� ��25_^����H핏
~(��g�Yf�>Ր��t��z�ūil
�����In�8P�1]*��0�$���� ֆh�=̶3B_�c�~��8�S��x���vg�m2�#N��k��

ǂ�|d�6��/��?�
�5����I&���}�E��>Q�;�� ъ��#X�xI
F��l9E��(*H`�B��ѳ�0�p�֎[����Z"�Ht�gg?XJ��p�!2�S[���ʎ0�ҏ������7���f۸i���d���{����썌��
�
'����f+��$�����Q������5��(r�D,��0r�Z|�.��9|��_��)��"�°Q��Kѽ�F&!�P��W�7�֛�l[֗mY�톟pE�"�2���{�aRlp�v�h�(8
q�����Tdk�-��<��کx��վz��^��Fz*j��^kf�[a
������s��s����Ϯ�|OU�6���v�O�
vnR�۝����aٻ�qc�K3�R�
�fa46���N��	�%�ե�گ!�`�?���]�vw�I��+ثw㌜Q>@�dD��T�l7�4h�V�%՗�zc��U0�	�]R����L��[�>�|�,�����x:0��]�s��$[1ui��]Ѫ�y���r���rwTڰ�����O�W��Ь��EY=*��8�4Q��ZTY�@�M��d���
FLZ񆜜
�m>/�-�S8ouC���6�
��uJ��t����4�|srrr�|!��NNNNS�趇[trr�B���ҷ������H�s����Tj@A7trr�NE��nM�ɼ�D��gu�IEND�B`�assets/images/ftp.svg000064400000003414151526424660010642 0ustar00<svg version="1.2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 178 179" width="178" height="179"><style></style><path fill-rule="evenodd" d="m66.5 4.1c22-0.1 23.2 0 27 2.2 2.6 1.5 4.9 3.9 6.5 7l2.5 4.7h20.8c17.9 0 21.1 0.2 23.4 1.7 3.3 2.2 5.3 7 5.3 12.6 0 4 0.2 4.4 3.5 5.6 6.6 2.3 6.8 3.8 5.6 34-1.9 46.5-1.9 46.1-5.3 49.3l-3 2.8h-58.8v14.5c0 8.2 0.4 14.5 0.9 14.5 1.7 0 7.2 5.3 8.2 7.7 0.8 2.3 1 2.3 17.4 2.3 16.2 0 16.6 0 17.4-2.3 2.7-7 12.6-9.9 19.1-5.5 2.4 1.6 3.8 3.7 4.8 6.9 1.4 4.3 1.3 5-0.4 8.5-2.5 5-6.3 7.7-11.1 7.7-5.3 0-9.5-2.4-11.8-6.7l-2-3.6h-32.1l-1.7 3.5c-4.4 9.1-18.3 9-22.7-0.3l-1.5-3.2h-33l-1.5 3.2c-6.1 12.9-25.6 6.9-23.7-7.2 0.4-2.9 1.5-5.3 3.5-7.3 6-6 17.7-4 20.5 3.3l1.1 3h33.1l1.6-3.3c0.8-1.7 3.2-4.1 5.2-5.2l3.7-2v-28.5h-58.8l-3.1-2.6c-1.8-1.5-3.2-3.8-3.5-5.7-0.5-3-2.4-49.6-2.8-65-0.1-7.9 1.8-11.6 7-13.2l3.2-0.9v-9.7c0-13.2 2.2-18.3 9.5-21.5 2.2-1 9-1.3 26-1.3zm0 4.9c-24.2 0.1-26.2 0.5-29 6-1 2-1.5 5.9-1.5 12.5v9.5h111.2l-0.4-5.5c-0.3-3.1-1-6.1-1.7-6.8-0.8-0.8-8.1-1.3-24.3-1.7l-23.1-0.5-1.4-4.8c-1-3.5-2.2-5.3-4.6-6.7-2.9-1.8-5.1-2-25.2-2zm24.6 33c-55.7 0-63 0.2-64.1 1.6-1.9 2.2 0.5 69.8 2.6 73.1l1.4 2.3h60c53.1 0 60-0.2 61.4-1.6 0.9-0.8 1.6-1.8 1.6-2.2 0-0.4 0.7-15.1 1.5-32.7 1.8-39.4 1.8-37-0.1-38.9-1.4-1.4-8.6-1.6-64.3-1.6zm-63.6 129c4.4 4.2 11.5 2.2 12.9-3.6 0.7-2.8-1.6-7.9-3.9-8.8-8.2-3.1-15.2 6.5-9 12.4zm57-2c1.8 3.5 2.7 4.1 6.5 4.2 6.9 0.2 10.4-7.9 5.5-12.7-6.2-6.3-16 0.7-12 8.5zm59.8 1.8c4.3 4.1 11 2.5 13-3 0.9-2.4-1.1-7.6-3.3-8.8-7.8-4.2-16 5.9-9.7 11.8z"/><path  d="m51 98v-37.2h21.4v4.3h-16.4v10.9h14.8v4.2h-14.8v17.8zm23.3-32.9v-4.3h31.5v4.3h-13.2v32.9h-5.1v-32.9zm47.7-0.1h-6.3v13.9h6.3q3.5 0 5.4-1.8 1.9-1.8 1.9-5.2 0-3.3-1.9-5.1-1.9-1.8-5.4-1.8zm-11.4 33v-37.2h11.4q6.2 0 9.4 2.9 3.2 2.8 3.2 8.2 0 5.5-3.2 8.3-3.2 2.9-9.4 2.9h-6.3v14.9z"/></svg>assets/images/wasabi.svg000064400000001417151526424660011320 0ustar00<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64"><path d="M54.577 9.322A32 32 0 0 0 9.322 54.577 32 32 0 1 0 54.577 9.322zm3.458 19.722L44.256 16.54l-14.1 13.316-7.4 6.962V26.44l11.222-10.665 8.382-7.92a26.316 26.316 0 0 1 15.675 21.189zm-.245 7.547a26.08 26.08 0 0 1-2.755 7.858l-7.85-7.16V26.91zM35.963 6l-5.93 5.604-7.297 6.92V7.37a26.288 26.288 0 0 1 13.236-1.368zM16.996 37.006L6.12 27.242a26.08 26.08 0 0 1 2.858-7.986l8.02 7.198zm0-26.613v8.335l-4.67-4.19a26.33 26.33 0 0 1 4.67-4.146zM5.84 34.704l14.094 12.642L41.42 27.124v10.198L21.6 56.072A26.307 26.307 0 0 1 5.841 34.704zM28.01 57.91l13.415-12.684v11.208a26.099 26.099 0 0 1-9.472 1.769 26.533 26.533 0 0 1-3.948-.292zm19.16-4.575v-8.292l4.575 4.142a26.557 26.557 0 0 1-4.561 4.151z" fill="#00ce3e"/></svg>assets/images/backuply-square.png000064400000125762151526424660013161 0ustar00�PNG


IHDR����ߊsRGB��,	pHYs����IDATx��t��u�k[��nױ,;^z���87���W�;z��d�*�A�`W�EɎ�:�}��8�ϲ-�//"�^�$���$X@����o���|`���˲�2�޿��93��GD"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"��_%4lD���*��;(l��^'���D����V�����f��[���g+�D"Ѱ����,�H)ډ�E�%�x�J�����׋�mb���I�-�|!��\��KQ_��[�N��H$�D�
�$@�-t��n�r�b�B��ñd�J�(݋��e�}���뱿^~�x�~,�����z')o�B@�1@�1����:D��k?���D"�H��	��8�ց.����:>��nh�����Cjf�a+��Y�\��^7^?��.�#,ȧ����;��w�|߁�8���k(�D�q(�i��ݔ�]�;}7������y{�ۀ[��U٤fW6��U�\1geK���u�������{ߐg�����͘>�mt���{p7!��i��X$�DcPУ�i�4�zK���~�=��m���x\�Yu\�]uB�]}�D+Ǽ5�0Z]�����}�q���o_�O� ��]g�|��-�}�>p���S����D"�(Tr��O26�0���*�:��	p{�m��	�]�^{Z=���zf�Y[�S�R��G��a{x]�p�^/^?�O��!o�yW'���#z;ܷ��N���r���g�~�i��D"�h(�xwaJqc`ӐZ���9�F �ν
�g�+�E�.u��8A��K�#�h?X>��]=�
E��W���B��Y������/z�>����cOυ�='~^xn�f�9��L+�p�sf����d�=	pO���J����7$�nF�:��H$����M.�U	�T*���N��-���0���	Z����n����}��/q<��e��p%p��Y����|敾!Oω����<���a����ޠ�!��L��R	�W���U���~7>��cN{I$�D(�p�#�E�&�5NI-޳-��.q�8�[��&��>#�Q2��x��P���hT
�����U��~��x���;��(���z���<^g'�~�������Uy�~�ů3��s���?7z~sV���I�u��x��ih=h]�E��.�u�=)p��s�(�}[BN����I�ٵ�8�-�H$��R���K-�{и�Vv��'��9�q��nx?���^�7���_w�]>�F���g{��n�?g��y�L�X��x�{�ϯ�ý��4��c'��k/�е�o���;1o�U��*���io�D"����э�]�/�J�?���!n�>?m �;�g\���fx�����m�~a�7}ĭ_�S���
�y�Ż�n:x7�O�s���	��6������Gr��2!g�/�s�~��=�i߉D"�h�N��R��^~��7�u7>��q3N��!�ct{n���7����
@���E�ۣ0���^�wu�}��ݽ[p?�w�ν�(��m$o��	�;����vD��N�Q$�DC��}��Q�g����g��o1g�'���n�[��#t�}�n:���
o��~�{�G_���|�.��{��=�߽�n��|��›0ϑ��E:�q�
�9�����p|V��qY����H$�@���W�>�� �q��[��8_l;�����{��ف������p�d�p�^狮�N���սw���I�]��Y{�/�w��}{��>�D"QB��b�E��y�>����ݸ5R����!�݅������10��^�W��:��;��]g�����V����Y{�q�9gw�}�J�����{e\V�W���H$�{�{E;�;E�C*� _�	r�q[7�:ĽG�uޣ����:�^#zw���<��8swߖ��]�\�æ�=��vt�I��~
`_�]#w�D"'�b]��}��x�O�����7��g�!�W>P��4p�>?X��X���}�v��v=�'̲���`w]�ۮ�������^괗E"�h�)��qJJ��RK���Vv��ӑϤ"Ng��%��/��m��Pg� �o<�oBC��_�`X��L8\翷u>�����^��<�8l��z�z�������:�z=g�vZ�g�)�5����5���5��'�Z��ح3vxF���Q�{��h�����H|���s�ދˮ���E"�h�
�A��{��M�yX@����!�
'�a9�7��-�	�6�o �k���Z`]��um�Y��Gf�8���Բ��>�������&�7�z�S�����ߋͪ~�i�D"ј��ϡ���;���Ϩ8�y�]�\ �p�`��ݳk���`�j�g��$�B�N`߫��u}�n�=>�>�V����e���p��Mu:D"�hT+�t�|tU�论] �<����X���w׮����>�~N�]c��O�~Ā}�{�1|w|�����&����p:D"�h�	]�7Pd�D�&��f�f�O;k�h��}���L<�b(]�^W�8����Z�j����|��:_����c�Sq�u?Կ�tn�D"ѨQJɞo�k��(7�Oh����8Vwf�����݌�{���}޺v=�_s~j��|��1|]��X�=$v��O:�+"�HpB�E��(�G��6M+}�`�	�s���v�;
-�{�}�v�3v�?�zc���6�[W��q@��b���s:wD"�(��R�79�d������GO�\Ѭ��W�����rw��z�A)�ՠ�e#�������>�|�C#�n[�?M�#1�¶~X�8lkLkNP���<��c�+�:��`_ס��Ϩ9����cn�cn��籧��_J��n=�z.����]q�u��j����H$
�+OA��)��0-�I.��m�U�h���s̭u�8
o�{����7�g�i÷��k��!��!my���,m i#9s�1}��z	��bt����ٺ���Ϯ�5����&;vy�W��%�H$rD)�{>�b�
�Zt�\Dg�w��rפ�o����g] ��K�ܭ�
v�رq�
$w��P��Rw�G\�zr�>[�<�����-u�n]�e�,����D�Wj�iie�OϨh�1�s��
�9(�s�5�C�}�Y�ӗ��y(}��˜��T��)�xu�jE�ĸ��X��q?0�o�W�7cx��w�1�.����?���<l �b#9J�4g��4t���SЭ'��w�Ă*!�Aţ[�C����ͪ)w:�D"�hD���)%��RK��V~�+��L�Y9]zCQ���Y'uQ<^��0�Kv��;��|EE��۳�]�
$m$iCIK�`�B�NNl<�M����^��n=�`�J��P��P��U[�N��N�H$�M�lA����)��r�ۺ�mo�wr����& �Z���vW���
�m�+��u�x�Q@���x��v�n���l��O�b��Op�DcP�h�$��@FZ�a�t���7�ϙ�}u�7���^���, ��3l����nP��z�<A}��z.��m�ˈͪ���O�dn����D�a:�U�l�\#�U��讼�}V�_W. �����G���y��S�|�s�&@�P�o@��N�H$ݓ�|�LAZ������o}�����_���=E�`�[���;x���}���~�~;6��ǀz��(�DC:����<
�?��G'sS�d4����[�
�ҕK�D�3��[����<݂/�F�t�����	�	��,�+@�'���1��p:GE"�hPJ.��������wάl�!���u��Lj��`�+wc'�֟�n]߄���{���f�k�׹��e�.@�C@�N�H$
��}�SJ�*��ȅ4s^>kU��M?劾������ȃ�'��=��N��'uF\L(��[��-+z$$��_�]���-���Q�x>�
�3؈���bc:g��3*[TZE�~X%�PI�{Ub�nt�;T<���f�_���f�ӹ*�D}�a^v�m��+��'�S��u^~���o袹�
��r�;�=������u�.y���
*mTg�>�W��F6�\�sA��@=��N��"�(�T����_H-=�+:K�0?�wZ͡��^ۡa�
��N�k(�]f�yӜYRG������GBb�@}��ɛ4="�~w������W͹����x;�~��)5��Q��Q)%Ur��S�m�:u��;�/ș�H$
%�x4���i�Mf�hQ��٫�h��O�Z�ǔϚ�ou�܀��;s��?/�?o�N�%�Ɣ6��Q�
+A}��'�cꥀz�>_P���?�t�D"�GRJ�?I�h��d��V?�Y���y�%�d����F�ܜ�ۺ���v�߱A�6oD-�[��4�/�4�6�4��#'�V���A�P�i�z��@}%:����>���9-�ƙ�����ȏs�a~�ǎsЩ�[w�Ǒv�?��O�KW.�1���6����l��I�zZ�P�3u���q:�E"�8SJ�O�=���m/Z0�����K���=���\�����'��z�.@�D#'�|"`���|�0��ں�vQ�\��%�Tp�����iP?��P�:��N�H$�̧�o�?�f��n]~��r��}��۠���W.��C}w��y���ӹ.�ƨ���~<���)eG�%�☚a`>�~``>0�G�A1{�aN_�qS}���'Q��30�Y�	�Qڿ�m��}�����߿��ԟy���\@}�>P�e��f.�%�I�L=P��A=fy�D/�y8:s�ǝ�}�H4��
0��_�Qi����a���\b̆�
ؿ��[�]u�SwC�̀P�%�g�_�7EgV����DcH�yPJ��w�*���g��:sO���K��0~�g���W�wu�)m"�hx�g�V4���5�W���;�o{�\@.1f�n�~Z���;\P����?�߉���1�k�H$�J-oʞ�0��W�Us����W�W�GK�o�o�"�w��.Q�HH��0��]�G|w�-΋g_�_�_���Z@}5��P����@�P/ح����m*6�@=�����U��ӵ@$�R%�z ��iuڊ�C3�Z�U�����e7�_�
����*��	�P_^wP�P�� �F�PX�fyZE�ᙕ'����s	��1x���{������N��G��t��H$%J.>�Ŕ�#��i�g���]k����\@�K����`�#�4��|@=w��z��ztf���G�2>����D���\z�"���\�h?�f���F�4�~�
�g7�4�P�P�����1�	�q&�:/�9G�ԟԟA��C�5P�ܚ����\j�1��'P��z|�.���lU1�z���+����e���t��D�Ģ��+Rʛ���8�fT��B3�o�_җ਻00V`.!�G���_e��Yw�s��̀�a�zB�7Գ��%9@�rTf�/�iN�
�H�J.9�W)eMMi+Zs}	n��.8Tx�i���KHw�U�x#Mj7����g���w@]E-�^�t��D���������Ԋ�c����(4Pp.k��v]�|���is		_1D�������&���J��|I.6g���7��<=P��t�H�Vr鑤Ԋc[�*Ov�\yF�ZӦ���_6���7̹��\Bb���orNQni�_6Podž�,O�hZ���†�@}�������uG��N��H J.=��Z�k�%�s������%$�����<�P?ß2I����}_�;�Y�+��D�q,�?�\r�)�MծKp�w	N`.!1���W�zB�SC�o���Kr���w}I��y���e���/;]WD"�J,>8%���Ԋ��i��(gQD��j�z�яWռ�軨Ql����w�"��		�A���!Υ
�<���o�]:}��]�%t��ѥ�%���	t�����Ģ�z#��ӌ޷��]E-���Q]�t]�D;����cw�V�T3�ܜa~0��a��u
����}C}�ul�g���f���vZ�)@��J.kB�~]�>@}7��C�do�7��L��z��H$aa��M�RW��`�6��3��a��
.2n�ӘP`.!q����0�o0�iCMS2���F[C�U�����ң*���J(ث��v�K��o������UGFfl��k�H$򳰳�v���N#�i�Oc�Y�ys�|}'w���x�m/��%$�=�pNY�e�����P3��]���Ϩ:�h��R~L%�Q�ET|��G��3z��.�`��G#3>���&�eag�v���N���ܼ�}n���s�KH�#|A�&O�4�?Oף�F��n�g�]�w�K�w�ވD"?
;��������Ug�����_�.��$$F,L^
�<�Pף�$��G�v��\��;}��N��H�'%�z(��)>��x3}D�v���ߑss		�F_��7}���Vk�Ne��{����Ȍ�9]wD"��Tz�ٔ������;3�ӟI��u�Q�\�h�G����g߰�GBB�/ar�ƹ��{��r���^w]�y5cU�J�:�RV�P�e�*�G�U\~#�t��=*��+rY�O��;"�h��Tr$3��ضT��Ӱß������l�
s=j�b"0����uӥc�=�N@�����P?�R+O����*���o�����=:{��B��Y{2rY�?Edl��N� �H4LJ.k�%%Z�).�ӧ�@E�:�yt	�u���;C�_�Ġ��֥���>�@}��+؈_�
9m�S+O�d��^zD%�[�y;ULN��-�z�B�~52�z��5H$ݣ��O*9������RW��Uf�N���ѷ�]S�^Ew��M���T@�9��`��Hd��
����u��K��X7�����\Ws�_E������M�U�F�~B%�6�K?�
����F��C�d�/�YV{-2�&!"}ӧ��G"���$�VrY�Ԋ��*Ϩ��ڹ�y��.�����R�/|C�ڈ�����{��w��PG��{�o����/��|��s*u�)�™$�™�������]*&{;��**��N�ڣ��;]�D"�=(��iRJ���2���V��b@E�v�T$�v�՝�5z��ڷ�zdž��Q�5�_8CP�
8A}��+ؘ_�
zZ��ZqR%��/�I(<��M��������ѥ/�H�p��uI$
Q�%G�I�4eEkWZ�Y5�?E�����Sq��?u(�x�E�D��Y�
:���Ǘ����1�5wX��k6x��k�e�/�k�kf�x�k7�����Wլ��ѥ�Wi+�Tj�i�\�/�%B��O���V19�.]�KW�
��t�6�D�!*���<���mJv����5�,�*I�9�-T�"�U��^����o���8ق������
v�z�Fo��Z�z�7��u���;mرqG�ޢK�����=ܥGg7���[T$��e5
t�h�;��`��*v��|-m�9N�Yk/杼���ݝKa��so�Sq��7h��:�����=Mb^�������[k�ה�tl�i�N�TsAyt�U|�~t���w�K��o�.�����Ӝ�S"�h��A��h�N�k}�ڥ;���6��Sq��ǺN�?�4��
������[�K��k<�/ȝ�;m��ѥ�R�~P��E���֥�S�N��9N�)�Hԏ��_H,9�HRٱo�T���1j_kF��F�s�����"��v�w�R�Q&vm�|�����\3ә.���
�&v/X]�sA�6�qO���P�cl��伺tz&��/8]�D"Q��!��T�h�oЎ�v��Q�5[1�r)��a�G�7�E�:r�%.�<v��1Q��p�3�{����U۔���?|��o��9�
r�rV���?�������뜮Y"Ѹ��K1�;*brvn��ݵ!.�qC\��
��7$ڐX|tCR鱃)�'x�Vu������WԜ�ԝ��&LMw|�W�t���a�kBk��}����ȗ��\浝�꼚��]ͨj�5O�<���=�w�u�����w��@��ۮ���	�E�7��幯�ОX��c����מ��R�ҏ(����ݥgR�^�"ҫ�u���Dc^QY
��=*:{GTt�Ψ���b��c��}�u�W�U6��I%��`W~R��8�R��s���O��ut�Jg�H~��P�xӎߊ	Gìքֆ�D�E�6��u
�X':�KX���:x�S+��T��d�����������_�F��~�~�s�ϣ?���@
�?�Fo�NkH9N�ξ�&����.�jC|�!�1|��.}�V]zF��^����8]�D�Q/$�G������p
��>���
�o��c�z@��y"v�Ie�u�洓��Ϣ�t��1̯�_�0_E��v��,�9��o�+sEY�����k�u���ߡ�G�_C���z�͞@=P���#�m��Y��f��A5�|@�"���4
5GE�K�@��w��oz��Z(�z�����'��8b����=W`����aN̄���x�)�ǹ���8�	L;�>a�e`~K���Ü���m�+�n�@N�Ւf�{Ċ��o�����_�M��7���C�}"P%����>��K'xv黽�t�Z�.
UH��G����3�X����8�����܉� �$��).�ܕ�:��V������,��T�b͓�&s��|B�a�`���e��;��?a�~~�;���S��7�K'o��ү��׼�.�	��H4j��	����F�^#t�Dx����^~�q*蔬T�-�sW�治8�s�� ���u��4�o4������(~����/?�}���9��5����^]���v�4z/��(�:!yCq=�.�$~�{��'�i�n�����x��!n.81�m�:u��Ka�
�/��9u\�
hl
	�T��i���?��K��}���~��/����saA��@}T�g�>����u�t�ȗ�(�G��~;&��mڷc��:��8�R7U|����b��$:�ɧT2�V��Q��D7�QpS��3��OW_�n|um��S*�T�����oCSb��~e�
V�H8�c-�u�5����u�e`�] KkN>H�[�'y�G�æ0]9|��KEe�@�n؈�8��ϙ�?o#��/R���:���>hx��<���E]:j�#ՊTt��;'��P�E���lW�˷�*<��!,�:'l���)��sv|6:wWtLncRL��ר����t�ĩ��f���+��p��}y@�K!�F��[0�I��-2kۿ�8g(�ş�����?�M�>��s,�P}��Au�jKj�����ny�Q���3j�K�	K��I�I�(����sv :6oo[l�~$]Lċ�1 ^���(݂���W��j��3�W��6_c�A?�_w��v�z�l2�h)� o�������[�#�H�珵�ֆ�i6֋֏ד`��
������
�����(�+6�:��i���̭��X��w�a������;�=7�W��0P���
~��|%�
,O��Pf��g�T?��P��>:�5)�]z�^=��B���.=]zzM]��M�-���q�H4f����br���N�;ޝH�[�\���� ����?�_����\�C�Vp{])�Sx�
�_0ߡ��7P1�AIJ�G�3�>v7>Ɵ�1������}���@�cy
5����5ܥ��.�5hD�G��ѥ/�.�r��j���᭖"Q�
�42&oO@^
��/<�Ս�"�\�����U��l�܊9� ��Rl$��ۀ����5�������{U�>��w�>��.����ں�ӥ���'��D��L�v���ag���n<e��8�5J������Rd�����}��k��s�}_��>����h�Av�+��%�]zw�[���Z�:'lɇ_No�D����/���o�-8�Wx��.&��7s��-�<�JBN�n�M�p7~^�R7�dJ�gP���l(�L��B��t��JFW����=b'��׽�G��0k��q�֛֒֗ן;(��|��B%%�	��ɳn%S�mP�[~���sa��z։��~������$3~�וƗ2��)�u�_-�(����PK��КQ��ZD�)	
GB�q�.]{k��B�n|��ѥ���\	]�����H�P@������7ę��n����HF7��—b�q
qt[�����
q��b���\�h`�_a�`��?����I��7�)��ny
u�j�_
�ի�r�14'*�>–�[Efm���*x@�U�K��O��D~WT��O�ܱ1y{��k��ƹ>vv����ƽ ޫ�|��`�����an�@�����!���[�.�jw�X�d��)�eT�b�c{ౝ|9.|�f�Q��E�X�'��| ?� /���8�j}��"��s�nA����p�Gq�
����ώdN�|��}��k��>��K'ϡVQ��.��O�#l�5�s����4t�υ.���H4,����[m�uF���z����3񻃸ӅA⮊������uXz�W������d�>B?o��M����]:_��.]�-��3���师宱{{����GF�s"�]+:��1�{Ka�q�~Wx]9�J�)Vt�
 ��W�y��*���m^�^�֙��z��~˄��ݮ������k=�:�:b]]k�
]L�:�����|�O%�楀y��s�,�<��FIJ-?����ݭ�&�u����n+��\�'R�H�������C� ��&�S�^�+��8��q��	@�בּ{f��Lzz�v?�d�ם�H4(E��JL��1o��q0v<@��'�ѭu
�d�<�J��S�4*��J*Ԕ,T�)q��s!�ά��9�h�l��1f=���5�τ���]a���W�(�	�y|1uIG|��y�I��)e6��/����(�x�_��=^w;op���+��8(��{_<?�~tyQo*هk��nu�%Wup}�k�F�^�nt��ѡoA�^�B���E�C1��a�.*�TT���L�,��C�������~�9�_�Fz�ޗ�:��띀�Kz��@�'ɏ�Q3P��~Q-�u�G����L����[�Gc���K����i��-��п���;宜�ģ�@~ o�����߸�;��~)����F�ǝ�_��~��@=��7ЩnQ
�uJYy���q�N�s����ƃ��K��.���%�b���H�!�u:v���6�cz�^~ʌ�	�l��A~S@.������Η���4����~��1�3�{�~�k�����K�U�M�N{N$�HT��O�+]�ñ�o���㶮܌�#h��a��6Zw:�%�],��+(�>�t�Fx���uE�����}�`��۬�;}Ɍ]�Е/�I�b��]�%Ϯ��w���Wy';t�;��#R$�7f�G�GP@Gŏ���������{ ��ɣw7v�.]�.rN�9����$:�`�`�uV~N%�+O��p�+O���k� �Ař����Rts��$A�fE�ĸ��X{����%
�J[{����7�M���q�y��y`	�G��
�a˶���G��Vx_������i}$�>BGV���M�+�ly$9�w��筁�>E���ƅ��vO�8���Nr��1c�H3v�/|�B��wȒM//��~D�Ht׊�������1�������`~0?��zE�
;S�*tP�.��t�3��F������0>u\�uz��c�+wtX@�Gb܄Ys�����d�:]$�
b�|.���*�`/���V�d���el�mhz��;�7�"�����-�o�o�/�T��pnQw��+[NI>�׷�gɯ�mik�С_��ǛN�WBY+<ڢb����F��e[ѡ�9z�
YR������Ɛ`�T�4�c�zȤTP�Nc'��|��*t�+/q�I]}��K�ut��Gё�3��o0W����P0?�t�܋�>��y��y&P��:yM�<Z����P}�/9�6i���UY;�G7�u�ś袑`�SpdG\Q34���֕w�ە��+�b3�ï0��?�t���~�7i�B�#"�w�o�\�H�
�E����"=vg�f����ɧ*4��^#@��`��G�|>���f��Y
s:�jW����~��Eɟ擜��{�O�.
�!|�ݩ�����C�Kj~س<v��k�~]����~�i��ưP,�`Sx�-�n��yB�Y�Xٮ��.�d�<e����J���N�|��/7Qa���U+z$�e�����I����Ţ��d�*�*��y`N>�|�"��<�10���`���y�O�?�����E>����䑃�)r�_�;�$���˖�������zP}LD�_�׾̓os���;Uزm*4c�
YZ���T��ś����h+:��K0�I��8�yye:stN�U��;��t!d�7�})(�7�sF��Fq|����0P�	=���ayYO���k�s]�5��'���{B�5û��]:G���C�
�cw��?���?��ţ.ֺ�F��M��))���y�v'�N�+�����꘽/�yL�s�(Pw:�]�-����6��օ&����G�+�ۨ��l��w�.]�.^�l_�c
�]7ٱ��0?���`.]�� ��`��o���p���cx>��sj�;��>��mc�S��{}|��؝�t����|�G#��?�w()��I��%�*�0�00��`~�
��t��FN�3��qw��H��0>�',�W���O*�
�KDW�'i`^~��w�J�"�j��G�<0ϤΦ�;4}�oC���OLsJx>��9�ϫ��=?z��<=7ݒ�������W�stZ�Ċv��t)��^>��\^����җ�K_R+@ݻ"��<������7�
�N�.�o�ݿU$�PHx;?�\�o��=�����
��xN���q�;�s�������fҊ�Pn����|�ӗ�X]:���.@ݻ"s��UT��f��c�8/0O��#C0e2̙b`�JŘ�K�&N�Ac'+z$�}/��G�/��O�뜑n����x���O�a�a~��C��ίs���&�#��z��<����L�[�֏^�|Ng�w_F
���4��-��{|}�}n|��M��oy�v�K�Q,���y,`�J��0og#��y��~�o0?�������y��s{��}<�������Q3�vj�w��g�6]zD�^t����u���N�H4��?��̻��M����7�S��`�P���S�FZxn��=��3z�����~��H�j%=��UWUw���ܥ�@�ެ���H���@�}.@ݝ�t�|��:s���@�W�o̟v:gF������(Pa��_��]z�Y��Tsy��Pם:�Y�s?<�<�:v��wBi���"�io�P�9�����;|œ��P`.1����Q�~	�?�tތ&�y>��K<�v�����4���]�9K��|_��
��|�n]�}��0G��mכڌm��SC3��"'R	�!��
D]j��`�ǝ��h����y�����P��=�0X<}��K���v&}�v���$sRq�YS9�a�W���a�_XI50OAQK��������$.�L`�G�Q�y$�Z���в�!�[~��~��y3��:��x�7�y�s��O�@�A�b�.�=<9`�
�ݻ��RMM�����S͍�c���h����[�Э��G�U�4��jTa�4�g�#/輝�l�
��t[�B�
N߼���u��?���SAKj��:Ǽ"s-��o��0/�K�r�|`^���W��5�G�Ӥ��͑�Nn=�>���#��&e
`��t(U�y%`^a`�g��y!`��b��g�˭[�
T�~����A�k�(݅�\���:���y3��ih=h]h}h�$χ)�<0ڸ�Ɩ���L�EE4s.D�����}��\�<����G�h㻝�|gH�֭ț����������}�i�� ��30�����y��y�%����o0������|4m��<��ܯ	��^�@u�sara�w.���ܭ�h�(/��܏�O,7�}>t���o��<z+x��b���8xq�_;�G�=
���!i�0?9$�sbKrKx��`ގ"�>
��a��_㹿���.P����P_m��ʉK\{*:t���)�
w��1O����i�G�o:�卞ݻ�z,�ts6r�q���ŵ��/:�M���f�st{���\�.¯c�F����هWf��Y<�����Z/�[���>�~Y�
��e�\p�#�����nx��o�u�G��p���!<��r!d���K�/��h���?�"� ��AF!��-c�<���'��d:2��8�����N=J{A��<�A~�o��$�$�D@"�*Ј<�w1�(B�y8
O`
�����oy#hI��N��X���X�7t8��C�D�E�F�G�h��Z�^j��s�g~��gK��jn�J�	_�̵��ϗ�:xǝ�|,���>��U�]Ԣ�h�l��#�t�_�;���l��5��.��k^�eG���-��96��pڟ�����1�p<���sKKx��`���B`>22P�֥ã�G OlP�|��sfe'?�M��|�|�/��=�'����M��]o��
`_�?��O_\�I�}*�	��ȼ�_��GMO�=2����.����N'�D`��`~00���93������}��U��G(_��l�`�:v/�s���x����<��\���=��~�s�.�yv�>�~`�6����Y��*��3�VTAS�b���&i������̿��!_�:��z܏u����^�;����M�ܱ��ݵ{v��}u�4��ho��}���7!M���VNn��t�>�}����^���9�w���–[t�[z�|�0���g7�#��a���A���H]�6`��q����|C��΂
|���<O�bK�"��0��s�,��ݺp�7�D7� �h���L�:��u�'xX?�~��Zk�nrI��M�s_�š�wʳk:�h���k�X	���pO�������e�9w��p/>�s��8�cT~3�dd�a�×�1�	�gl��D���}����ѕ�p����&�i��KE�����E��/k�Ŧ�O�r')�G�T������ߡP<�t���b�~�uk��9�L>�
w7���Js��x�p?�M�%]�+B�^��vkz�{�}��v���g��}����q��Rd~se4-K;5:s���E_I�=�Ҙ�J����P4��Gb܇�|ay���"��’��B���x�8�X�\4`�G�X��P��(!�y0v�AK��;`���k?�t���x��ǰ^�������x=i]i}y�K!�d�n�{^�ܲ•c��m��y�L��4qC�s��Ý���K:7���Y@`�؉Q{�{�������Y�o������>}q�u@}�Ӿ��=���uQ�������t�@��6�$�D��+�7�(|��\���;X���̱A���۾ϝ{���^�e
wt�ă��vfCL�E���=��~ݺ{��F��[H��_��[���~;6�N{v�
���ZU�r<ڜ�k�[	)0�L�
������Q��M�:��y^��@�x���:W��|�յ��#�a�~��^��zo�u��~���Э�4mQ��rڻcJ���F��RQ���
��̹��D�$�����2
�(_r:OD�%��X�����Au�@`w���K~��#���1�.״�֭+t��_���Z�цCx�s�
�+��'����j�ss�1$�$8�:f0��t�hڨ��~��W����=��^��յW]�{�v�;�$ʺ�����1��n��/�O9��Q/$ ���G�
F��H�$t��Oh�h!iQiq��I��0�:+z$�u��?�P�/�(	(	(��(�X$�|4?
0�40�C��<0Jo�3}�7����t���.��$��X�;�޴�\W�65m�
�+��-��-=rؕ�V.��"蜦�]�5�=���#���9���EE�7�p�S��P�c�s@}+:�ͧ�-�{s��i��g:��Q���E���
��R�� �F�˼X�+iWF;4ک��R��^��=�:��	��~I\�����~`^�����kQ�H�|�<0�̗�g ɗ6�M_�����t~��^X�ob���z�Ѻ�����G"j�]_��8�Ǿ�y��+�o�t~_�;M�_b~Ėu�<�1|u�'t��5ꇑ���{�����Է#��[r^M[T����5Ӧ.���}��,8���S���Ƣ��J6I4�^E`�aN����B4|�z���]�>��p�/�|�c�vSbr��q�ut��ֳ��5t��v��ߦ�\P�;
��|��P�
E�_�O�p�D�f��mI&	&aOz���M$��zC�z�/�����w���1�;w�m��Gw�~�o‡e�n}�n��]#�śo���S��o��񈼦�x�Wu��F�^	�F�s	�>�0���0�3�1(��$����K��C�5���֭S(hqu��ZШB\#x>W�n�׀z:���6���>H��-���*jU�%gUvQ���idB��C���J䅣�V�H��0���x%������D�E��AюF�BG"�#�p�$p0`�a~0�`��?w:7D����������B�!����G�O �;�}�]n�]�\c�ġQ������։=<��j��Ь����l:��j�9WG]PSժ�k��ފ�o.�,<�B{�S����J*ZZ^�^	崡$!��攴����2���sC�?a���?��B�>Z��3�yZ��P�����%�)�vn$��O��Т���À�ԇ���G}��~P_ᴏF(��@Re�;�UtJ'�D_��Ls	?�|#�U�n	~�_l��氭��.���	��7zw�h u�nj�u���5k�g�s����ӗl�7�e�}���r�ǎ�Sy�j"N�hWwn��>WH7�,���Fݻ��5=�2���	�Ǫ[:Y���w���%H�"$*|����<0�ܧw���i���ǴE��v:/D#/������'m����]e_��ߪ[�z$5)ö>k��:������]+bJژEQ���[�9G�^�F���l��E����©�q�ǎ	��ܦ#��qw^b]L���#�V{�i�H8����[��os��c��'��_n	�G{���;�	궚W~	���et�YE\�,8�ه�P�N}�v{�NgꙀ�ǝ��#
�9<5<�XuD��Ktv���䉥K;'����m���Ac+z$�]�����
$g��y��C>�F1�BQ��#sxM�!)C�`>;�i���5uQ�7�.����y!rN��G�o�/o�o�?�#w]�P'����$�)Pö&>��MS;��9�+:U,�@=���w��E��C��G�أ�2v�~lW������EuG�,�Y�QXnSrD�q<�Sxpm���2vJV���I���N�D±�~�w�?�';����2����)P��r۫�h��TG�m������Mn�g���A@=wʂ�:����I�EIw�&a:]ݹ=Y��9����}��/��Q�	��K��}��C�>bp�z�G=�d��ژS���6���=��|@��N�xD�{�t�tw~�ݝs�tٺs�$� �4�:f�9`��ԅ�S�D����<�\��c)3��nF�t�7�i�<�_�˜����#*��g�ҝK6���o�O9���|���@},E�#x���̹z;�uvpP_�/��7eAMՔ���i�U�-?�,���WHw.�;�����O8���#��	��_�v��X��u׹���\?P�r;u�P��k[�E���H[H֡��r�?�⧑�gP�ۑU}p\k�!a���.=h��qfͱ�����[쏸����U�y'��,>�"
O��H�cH��*0̃2v#�v ��O]��S�ˏ@
Y�է���g��o�;w�ʾ��~y�0�c��՛�X�.fSlE'6q����[�Eg�<��y8�Bs�Po���G�iT��wR�QS��Ք�j�����7}�i�B��<�w��h�BIAb+�b��$�8��ɵ净�� ��s:D�O���c����&PKq�Po��[�
�f@}��>V�M=<�x+%DTq?��rӝWvIw>�ï�9�\>�&�g�g�
ԥSS�?�4(����}�\�����u��z��7����d�zx��V��D�t .!:U���\�>��o0o7c��q���#ө��]�>����P�Q�o�Kr�5����#����zD�V+	����&�x������e�.N��;�������bxդ���PG��G�Q���U��w�it�}�V��&/��@�i�	�?�/�`WE�握�C��\r5E�Ę��&qh���y�&71(���K�
�a�y(�'����3(yv������[���6��o����߰�N�t׵���޵�^ߤ�n�k�g]��u�bn�t��̺.�yե#*x��l����5i;_�CMꞼ���Х�pڿ�$�����*�謊,���Lo^�>�o0���đϙ��.��)����e�@}��P����9���S3��a�|���P�i5|IP�ͤ�ձ�^��	�=<d�d7�iX����Y���K��0|}p�ƪ4Π���r���a֘�kN���_u��dY��ވ.�D� YJ.�7��Qay�*4�E�|�!���F�	���sʢ��OY���N{^4~?~�|��$��_ɷ�_]����ow���:�w��Z�Y�n1�b*���Td�y4�m�8��g7�F���k��@���6Nz��Q@�����7thα�;y:��yq�1�U~.�������`�#��/'ϯ��s���GԸ���?D>�����7
�Q��ԋ�Bt�TX�qԪ&�Z�d���h��P��>y~�>@=�iZ!Y0{n��
F�c�G��O��L~�]`>��o0����$�����9>}~�%Pk1��Uv�}��Vj^��Q�rQ��P�2�����W��y������Ԥ�5s����y'���QԮ"񆣰����3�zt���
;�UJb̅Y[�˥��uGR� )b��H�(�H_]0�+
��<0̧�����
m���&/�wN{]$�O�~�|�F�%�����o�9��|�{��'�/p�G��\���*�v�Ԯv�]�y'Q����#*(󀚖�uk�-5ٌ�'ͯ]�.}t|�o�~��رD`�i���6c�q�}���`Nc���?>i~�G���H�~~�8|������Q�uL�0�:��h>O�K/�jXX�i@��
�nF�:���_ׯ%;P��1�'-���.�'N{wP
�m�?,���i�M}��e�.0��W�o̿��E"o��߆7uׄ�{J)�00�]�bmP��Aݪe��Ux�9�����cM�����\�w�0@}3u魓^�yw�˛��i��즯`w�(���A�����/ �	�0�i��D}	����|A�>���j��;�J�tZ׳G�_��o ��5n����/��_v��"�@���?__�P?��^���&|@ݜ���y� G�.}A��I�k����o}
f�O���s:�N/��Ӈ�o����Qܫ�a�C�Pc"�zҺb}i�c*�y��W��'D��E�\fo���t�D�<(먚�y;�}y���0_D�٭?��`�O�_����|�@pN˟��1��|N��ȒK�]�8/xl�5�۫.Jm��qX;pM׷릾]R�E��s�X�s\׶e�:u�۩���_�=>��N�֧BrND�柆��UD�E���(�am^o�:�@�1�7̯{��}�00�߃,w�'�oڡ��+�'܍׹*���r7-�W�}�E��Y���c�ҏ����=\�&��MZ�EM�_�&�\S�_{)8��oCrO�қ�7C�*���\�QmZ*�bر^&��6�u�Mk\0/�ü�������r��"��
P�
�o��~�.��(����{ֺ6E
nH�	�Q�v�K�a���j�ڟ�O>�Ҧ������7�HӨ�GL4n/�jL+������E�z��0?n3�~̷߁��s��"�p	~P�3���@=���D�k����3z7���ܥOC�N��ɋ��I��ѥ��N|��3�z`|�
=no3��W\��z�$��V{����J�L}Yd�1�9[�1�7���H4\B1�&���4���Hs�HC���cd���:)�2����ݫ�_t/��轙k����.}����.�K�/=0��28��~F��7�`wAg�ԡћ�7k�Ca%���ѣ��
S�:Ga��iߩ�+	�F/>�DeSӗQ�Li���t���x��I���3i�93�9���w�Ђ���F��G0ԯ�:I�uyT+)��Vx����M׿���]��ZxNa�U�� 7m�A]��K߮&-�
�׫�_�UO�T��WY!y�o��:�i����b�1�
M�Yv
�����E��7��Z_���yHM������E
��_u��"�����W��� ������ G"��y��Jo�K�̰74w�����u�.]73�K�ڇFF��Qu���d�K�3������S�9^t@��=���
�:WP������Ĩ��XSZ[^c�5�ydv��Wyc�?�<�y��f5=�y��KEw�h�O'/l�Ҥ[�R�H4�
�n�?$��K��g~V�nj�e��ʝh���M�����U�vQhjʻl5�f�K_�ԻK_`��j;Х�qګ��O��&�Q�t�}l��;�̷y�f�w�ŗTX!v���;=�2��e�9}�c�F]�N4n�Z9��F��R�P�x6@�K��9
���ƳR�ފ��ij�Y���;դ����K]�K5?r̜A˛��y%��-�hz�l��S��ɻ�*1��	mb
�n/�_�Mm��Fv�o���B����+9$lr���7�ȿ!W�h�w�kf�&H�f�
��]����.�&�ܥ�K���/VG>��O��1i�AŚ�vX�y��Ü���я�:��<�	f�S�P'���,�9�:b���8�k
�X��[8��F�O��2E�$!�f�i�S/~8�(��B�� <������s����:8�	�Wٷ�_�x�b�y��	ذN���´e'�#���<90!$���������J1~�h
]�
��c�]��%�,ݳKoE���'_Pv�
�=��<��p��Hz3Ա��Eqѧ�SJbLD�)�m��"YA7<�x��az(L��=���tyZ&��<tijƁ�)��,�S
SWO^��z��]&v@��Ȋ�:6TO\��z₭�-�H��_�G�V?�R
���kć�O�@��SF<1G��<��s��E����z�f-��q�#V��ELYڈ�[=ކǫ�-;\=}��jx�9P�w�9Q�ܨF�T#W�E�^�ܡ�\�]7�vv�z�Qoy�C�1�t�Ahn�����젚�.��|�PK�O�X�Џ�`�@z�aE
Я3�Ɵ}�F_��
�]i�J�λL̷<[`�f@��9eD�g�����E9:[�h�4�����4�S��$�Q�?z»k�+@�ԓF<1G��<�����L�N?�ݮ��uq��ث��+��p��Fߵ@_(���E<�Y�U/�s��� ��[�C���zF��tZk��e���0�?�46�j�������8tt]!yg�B۹#�B�@���b�1v���:�*
�e�+�7��|~tR�N�;�#�iO��x����+8�M�x
w'��:�����}h��L�M}��n�>��{��?���>>�=�y�=N��a�SP.���&�k�5����0��K/��҃]]�Q�m=��s�!i��h�IC�m�qT�=v�|[S9��2o����]]�����[y�N�:�%1�5��q4`Bo:�.��uW�����Y��K�A(lI�{]�.��!���iOxF�g���-\���Vg�a��9�
u���&3��ǔ�n�ds4���h��p�.�$�p���*M���,�J��Ԑ�!G4��ygUX}㲊(��T���{�i�%��Sc&̚bmi��*�y�#��2��:{!��
��xQC�OtBr�[�oO��rԵ���q�#�f�A��L��J�Y��@g���"�]�d���f� 7]���C�g=Wz���=�ϝ�?��^�8��A�fo���u�<�ϝ9���x��e'o~uͼ�?)B��uSj���.��jb��Zb��
/�Gy�����7ג%{PG�,0cw]C��h��i�`T>��]�5�Fn0�#a�H~c�c�Pc*zxmi�#a�H6�-QN�F]�p@=��N;S7aw�`oc���(�:+NT�e>�Vj���ξ�B�3.��5�������]�S�ҟП�Ix�Iz�}���t*z͓zh=�{
����<��>�^'ϓ�9�\+s]/��fFpͼ�nJ�]a����T���hr°��̑�'������T4TG&-ޥ&�1��Րk~���~lD���w�0*n�x��������%�\��Eua�&0�o H��7:�<��!'"�3���K�"w�K��o�7�K�MS�&1�i"B8ݻ �H�ǵ6���}M�^w���$M�<`~��R7Go�ekt\�������?�A�ud�i�5���?����G_i�L�%@���6�/�띩խ�3د�¦�| ��x�'��Κ����d��ѥ���b�}��Lrü��7C���H:�~�����y��
�)'z���t�c ��ү�ȿ<��=��'�#QC���!#�\o�_�@��]L9�ëK��xu������a����,XG|\`A���x9�Kw��lcw���D�U���@C<���Z�����R7�{��c��;��9:����[O,;��4���M�����65d�UC��2�@�]��G	��AX]����ĸ��92�pq�Ox$�d3v�%�}���L��J��s�/ֹ�' 1�����7��c3�FǪ���{�{�N�'�r��u|�{�
5d
���=���"�eQ��3��Ko�t�xc�x�c5z�a�����q��-���q3��Fd]��0t[�q�z0v�A�]OG9m�>���_MB2ND2>�d|
��}Ț�u,��+=_zή�B�\_��k�G���<��s���[.9���\������T��Y򰻎�� �L�lRS̤o�]��
�)=v�~��'^����:u1�p�������p�*l�����|�)�.�`w=��i���<
�� w
��Ax�I�\��s��U[�$+��a�
�V'0�a����j	5f����LYv@��1v��D�=��r�v$������J4b���eV%1.��
{�.�Wx�>@��
���{:������}�"�O�:����HD}!�>���:����3Iו6~�������Rv�U_8��J����0���;��a�a��Xc^{x6�jI�
SG.��7�i��`�>�H�]�A#�	�ް�p`;�9��������Y'�@_��$b�=�C��z�W])��	�^������qv������]Gh�~�o���}�}��k�}�M��k�	�%e��މx�}M���C/!;TPn�(@�k1���Y�;�9���+�v��!��I��}�4����_e�p9��g��i��Ԕ3v_�[M\`��/գ����|�&���!T����n�b���Eѣ�
G"����aH�P$b��t�g�>%�YM�'�?�����Y�Ix�I�
��9����+��"�E"Ѓ�H|{G����|���B����`��O]ޢ������{��w���oC-�栖j�~M>���
�D��'ѡЇKx��������:��:��n0+���Π�v�j�z��?�jɋt	����K���﬚�݊ZrLM�8�&-ݏZ�[=�`;��z=�^+@�����;!����Z�k�~�6v?b����;��%�����z�z)}֎�
��I�
%!1��-G���g�uX	�^��yzL�@_�/��-w}>����n��Dϕ�/=gz���]u�jJ�.��{DBb0a�%��s����M�'q�x:m�	5%�	�� ד�=�ɇ�'���ަ�~I>���
��K��0~-7��}֓�z�G�$�0��>ԓ�����S\O꩞�'�W���|�t=@�C��u�B��N������(�y�
������P$`0	���LЧ '��v�O�Ї$<�$z��|�9����+\{�����䖮'Ũ'��UP�y5=����ժ��9z�5q�~��F�Ԃ�ɗ����k��t	����		�%�f��I7:t�
��~@����i٧��jr�QԔ�}'��M=��f���݅�		�%�fx�Ԕ�9:���:u�	�	5堩)��gj�]Bbh!@wBt���NNXy�������B���c7��)�9z�Y55�j�15)����dj�nԔ��T�fO��m@�I/��
���&��f$$FWP�Px��L�A�#�����T�g
�>@��?
�?�?	�?��{�����Dϕ�/=gz���]u�;�%uEb􅽦t��8�)��T�>@��{NM�jU�35П^�5e7j�v���[QS��7����|G��)vԑ�8ql�;v����}%�j��8��`x�Y�(�K5wJ�T��ü�?�cf�Y*�� x�	�`<x��8%J2��I���j�$�$%��y�߽��oW/��Uw����b2V�=�s��>��{��@��?���=x
� wr�`�
M7�����|��~�I,�=�c�.}����}��@_�?
��$Ѓ�:�U�W�Y�[�}��HM�K�0&�#4��b���i������澝�il����F���W��+	t�h=	�t�z�?U	�s�%�C_��@��`&Г�N7�g�u�M}��M��N��@OB:�ܾ�rq�\q9:	���#I���$��ts�@OB:���Ù@�%@?3'�{��v��m,�@`ʯ�ȝ�,��o��n0�o����a�=�<�<����g��@_b�����z��M��Rt_gow�����1�m��SuE�~���T��@��Y����л��i���_6�?>��tÚ@OB:�ܮ�)��2Я�:ݐ&Г�N7���m���X|�c��	�)y�/˳�0��_�n �vsWr�������{@�}'��@�
���M�z}-���}%���Dχe\e|]�c�e�e�eXS膶�n�}���[��n}'��
@��o�7Z���@4J�o=e�~	��)�?I�Ӎn=	�tS;�@_
��8g�>�~y�]|7̓��[�
M7�o��+9,�����}��<K�A}@��{�����@$���2�2�2�2�2�2��)t��n��u�Us��R}�z?�����=z7���
m?W}����F3���t���j�o9a��w���%�M->�؝@��z"��v��~�m�z������4 ݐ&Г�N7��
�c��t���qᴳ�2�s��k��)�nT�I�@���i����g�n=����M��x�N7�	�$D��M�4�����pH��#_瑯�H�@%`{�Gt��÷ݜ}�+y,�,y-�-y.�����~����@�$�	�����\KXO���$���u�U��C�}@��^�@�л�:��Ў���U�]�U�m��q�qAK�˹m;ch�|��Y�����{o�����}��@��o�@_�����W�A��|X��:�Y�[�]�_恵�nlK]����d]��rS�)]�@�@����@_�����[O�p�F��;���n��ПП$��F4���t���@�r
@?�Ex	��=��nh�I�@���
t,���p�w�c�=�}���	or!ҍ`=	�ts��>r|�80��}�.����<v��z"���v�]�[O������ҝ�����5s��o��%p��ְ��t�}��W�[����$�f�Y
�,�@���^л�N��@$������������?���6	��Su�:�З����o���w�]z'��з���%��ͳ�]���鴛@OB:��n����sw!" 	L�c���x�\�t�@OB:��n��9�[NZ��µ������
����{n������H�P>���������?����q}7��@��o�G,�7��|@_i���@"���2�2�2�2�2�2�2�!tc[�lnMՕǮ�_��	�o��M���7��������#��8��y��S__���3Kw\�b|ϻ���o���b��o=	�ts�����z�4���E#'��b����X�;e1�cwй ��0���t��]�)����i���ߘ0�����r�'K����w��<��%xt�>��D�M�
M�Է�<�|���X����g���^�@�л�N��@,���2�2�2�2ގ�;�t��_Sn�Ltta�Ю+.3�]0z?�޷�0����лV�d:-�;b��	��O��ǂ����zl���Ⴄ�m=	�t�z�c�;T��y�=������@�p��L<@Ga��'�܎�S�U}w"��]:�&Г�N7�+k�M����M��S���6j���+���#��_9����?v*���;�(&Г�N7��)��jʶsnM�wk��
�mM�蓋r˩m�����sa�i4���t�y��R#���\wO��4[N���r��m�����ۼc���Tq�~���t�@OB:ݜ�노2�K./�Ge����wPS���������w�W��ݚ/�6����ӏn�pyɎ��
����:: �
��2��1���t�|��O�Sg���{�,`��nzw�[�b�t�{ֿe�׾n�V�l:�9`��i��k'�	�������������;�tC�_On���v���+F89���7�A8fz7��}!�%��EԔ��'�L{�g��]�#���z���Ks,L�K���j=	�ts��˻���{F89��<�~
�d�>?��ӹ���V<�6�����&�0O܋�yjp�E�}�prw#�ݻw��w�t�M�'!�n>�j�py<�֓�.��@=�6[=y�֓n=�X��[�}����?r�� �:���c)�B����8o��G^��@�T�@OB:�|�z�q{���ӷ��wܾ���^��Z5n��~�'	}�����r���]���;v���i=	�t󹲖ܜvܾ��.��7��?��<9�����/w��q���q�cw.P:�&Г�N7�m��8nG-��%�&k�<?���_�۽��QK�&�>�Y�ȩ߿���]Ƞ܍��~��S�9�Kw�x>)64��vsr�9d���� �a?�ӇE؋E�
�w�z��n��F���aW_����n${uD'��Fv)6�Kw_7K���Q2�.���A-9az6��Zrȫ%����_��|&�z��%x�tF:%��s���N�	�$�zA��M��:r�֑k����q{��iӻ����p�t�;h�ּ
������%�QG��y�ksR�/$�A���1���f}�N7�m�N��}ud���l=g�����w�~u�;no_�\ʀ�?��"�ܥ_E��K��l=	�t�x��Ǯ��:n?������g֑��w���ϟ6[/�GKv��-�����X���B��#/ ���t�����r��O��{g�@�&@ǝ�f}�Qӳ@_#Ͻ�Wb!��B\���#Ѓ�o3�>r�_�%;+�k�(��!rܾ�}Ԑk`�{�~�{7�q�����կ��G_2���:�:\[�g)�Ɖo��=�8�.��P�z��{�����*+,��+�~s~��}��+��C�˟#��:�o�tث�IuO����O��L��T���{�~�-�o������4a��9܉<�]:����a1^�s1vL-Fy�E�n�t�	\	���u���fvp{	��Fr7��w�;�{�S��`Spg��r�z6N|�w��g��v�3w�� :�D:(�c���yvY���|��C䣛���ep׵I��m9oz�M�{�aӵ�Mӹ�U�%�ȋ�m����,�@�O��IL]�}��n�{��<�:�����֏g�lj�Q?��Q?���
GP?�~���1n�W��Ǿ�ds?K��إ��W?v��!���9��N�@\���k��r
�|TKǢ$��7_��k�Z�jǞ[� ����X�k�o�s�lv�!x@�z�ݫϥ�e�O�5�[/�]��%��]��v�N��I�rQ�ts�:r�:nL�F�`Q�0=�Gf�E��{����z��O=,'r20�
?��f�w���|��Q�Վ�n��Zw��ױxu�;no[����3�����I��9�]��jNaw���u�����3v�\�tܞ��lwQ^4rs:u�}�;6sw�/[���@ Ԇ?Am�@m�1�	�N��s��o��<0��M�qݱ��1�qݾmI�Ǫ��x����<�BX��K��;��wl�K{lvi��7��.�>��.��7�'�u᳨ف�>U�w�A�t�=�;��;�m# ?�zt�d�~C�=nw�!�@�䋸;Yշ�S/�\�����>2ܥ���b��;����]�}��.P����C��W�Ǝ��~i�����Oc<�����]k�x�k���׿�t��w��
�ӽ��O�m9�4j¿F�;=�K��ɧ��w烾�\��x��Km˟�W��3�I�:��F�M�丈�8=׳��ݶo�^~��|�;�K.��`w_v��~�}�uAY�l���A��G�����&Ǐ޻5�zP�Q\�A�eϳ;�?����&��x���p�ږ�7i>V��S��w����@GKة_Eǯ�Ay�x�Ƈf�;02@RXņ�c�m/���n>�7�7̀�o��[�߾y&vp��*w޲X��0,�Vv�L�.K�=��@޽7=p��Ap�N�p�\�j���鶦V\6}[. �O�y�����կ��G_��?o��gOawހ@�x|Q����,���N�%w4�"�W.b.d:.϶Ho�7��;��7�������	o���rww�^��f�ow��c�7?X����a.u`g��o��#�N�m>�k�c�ܜu��.�N�o��ol`QN�7�rs۹�Mӱ�UӾ�%�&/�-���;�]������v�na�;�w�\�t./ԏ\�,y�[��;o�A΀�܁c�
�V�Oz�w}|��_�eG>	�s�M�y���5�nٝ�q׃��'v؝w�w�˟{
��'/��o%��Խ��?�?�"x�]Ը��t��9���]q�]^��wߕP/��~��u
�]���>�@m�/w}�#䗽u_�S:�:���K�ߝ���~�L�K��ܱd��_�;�ɣ��3��y�F��2Ы@�*����r��\O��n�e:ȯxk^n�]��w3ϵO����Ͽ;_���'i&�-ܱ|�g����������锸r�>����Ƨ�~uw!_Zض�Pw�d�\�_��PƲbg>�F��N�+�n��;6�fu�Ο���Y�z7��_��iG���E>�[�\�t�V@}�7|p/�y�������
���;aN��s<��ܝ�	��,�y������e��z��ㅞ�������;z)�,B�z���6h�yn��lC���Y�Y,y8��-/'�;�.�%W]�ž�uڵL�qro�d���[�T�v���o�'�4-��^���a7�q�ڿ����w�Eӓ?k�7�4]��N��;�;o����γ��8���˞�n�U]&2���^y��}Ɔ���!���=�+�n����ԕ�0�q�y�����r���]�7�M�uw�w�������Lv���_s�wކ�y�۝��8��ۋ���I38t���ͧ��9wH�n�.��>Ow���E������~���ǂ��i��g���cV	rœN����O��?�4�;�ldSړ?��	�;��7�;�ݝgW� ���Waw�����z6����9�/p�#/��4�LR��}`w?2��2��_d
MGh_�=�G�<8�[�4�[�~���q�g:��Z�n.���O�ۯ��n	�z6�2����9v�+�M�
�Η?o�}"i�Ƣ�����	���%����t�8Y u:~W���s�~�z��m,�_�����퍺l(]�&�Q�/M���\^��\�G��M�wL�Z��Wcw�(v��v����e�л���x�?�l>��L��O��)�\`��Nziz6�o�}�s�7���;����O�G��7syNv��"��W�;r�g%���Եa�>�(�]��QX���*��dԓN��i��=�o��<j�*�ڻ�1�k��U�����E��/L`w�o�;�����/wo:�P��A��{�1	u���7	u��i:�a��������3s�ˋp؝�M�\ML��|�kñ{�7����Y�3r���}2�2�2�2�r����t3�I|\lh��i:�o{OĻo��s�7\���I¦��gM�Ɠ�s���X��i��gW��,�^�[�@/PP������z���N��4M�Al�1	�[_&a~��m��Lϖ_�ɀQ��}����Xsȴ�z0�d�E��/����e����i*Ե�x7�0p�{���ݳ@�;u��iZ�`~���o�%��<v秱;?��;؝������Ws���������Is45�@}���M����
�]���]����`�i����0���������`~t���q����;��h���P�i���s%����gM��[��~@�;j��G��_O���������+��:M�4]��`^�ss����Ź���p�˞�\��L��oto>}T�_h�>@��4Mӳ���;W3`����U�k�o�>7�4�s�W�_Q��x����ΤY��\w�]N�A��|���[�����N��0)ڣ���?y��i�^��,.���Œ�7-̯��m�;���w0?���	�̏bg�6v��#��y���=���{���4+Bk���uGWvn8�l��m�޳�2v��^@�O&b��Ȁ�,LP��[�߂}�7�Xن�i�^p����7M`.�S�-݀yצ��sC��懱3?���k&���f�����e�m̿�4'N��&@��2Ի�t�P��*�7,�oz��:�N�4�������9�̏���MV^��`�fkn�SIs�aվ�����1��
�o�6Թ[�i�^8��+��ۮ�%%w�(l��5���7s�拗�h�5�˞�x�\lh�_�X��w��`��ӡ��P�'�i���u0��\�z0?md���o�0o[�*`>����M��V%�æ���k��k�G�}Z�W&�.�ֿs��4M�M����>��}g���G�̏�o�o�o��0�^����U�
$����]O>۵��{.���D��j1I�/��|�G�4M�M﹞��a���'&a>�Kp����ֺ��/%;�T��#��3����t�t���7�Ko�k��	v�����G�.���v�p���YW�0���0���=ßv�R��'�d�G��O�Z���#�i_m�n��i���۳��a&�f/�7
�寧��h�6`�C����q	�����09�g�,w�}�a���l��i�q�=b��]�W�/��w�{o��p�h?ߚ{���.{�-i�-8��;zwdž�?��x�.������%�-G+rW&G-2���^�hyA߇�`�|��?淡i��Sa_m�Zm��p��ˋo�ο{G�=�0��/L{�8�<�/�?�i]��-���I�kV��;�׽�ٱ��_wn<i:�g�6��$�P��A]��\�_�P��KII?�w�4M���-�g��
��K�����~���y��p0��M��5�\���07��-{.�4����y�c��:6��A����hE�Xܷ�����ܭ�4M��rW���+/�]w3'��es��|��|€��������?��fU����й���΍g��z���ַ`��U�U�u�x�o��w"Av�r��w}d�+��i:rۚ+5��c�1��h�V�tkw�n-�AM��*_I�G��w��aW~ ����5��+��s�_�{�,���-?p�5�➤�Eͣ����ӱ�X��}L�Ll��ӟ��`��%D%�w�4M������e��@.�ʥv��K-��Z�H�ݼ���򏬜̏cW^��y^�?���_�;`Zs/,o]��%ifQUԾ���w�;:�	=!;s���wGWޭ�	�����p�i��3AlW~�}�Zޕ�G������+_�_���~0_�h��&�*J)ܕ�`B���;L�&�#o�~`�����8���M���i:R��+�>Ǯ��O�z�r���-�蛀�k����۫���Z��O$�(�F�w�1�1�vn<��??����cx��n}�o�4M�5�W/g�|�������]���}�{�~s��WZs/^i]�|>iQu
|7&��c��?�K޳�9�᫁ݾ<�];MӴ�5��ݕ�r�]��ߎx�ry�}�}\���5�B������o'�#*$��9�?��=�}��������Ks��}�[����	w����\ �?'�q��HL�Yy��h��o��CvW>��[s�7i�P�m͑/��;�����c�ɷ:$9$I�O��n9�ػ%�$��E$Z��kD�Ǜ�ַL�.q��L��)﮴�i�nBWԺ�:���^׷����Λ^=E]u���5��u��=^��|�����pʴcWގ]y�ݕgW4��W߰+o]1~�u���^|aѲ�J�7T�ʮ:�5o�ݶ��{���]^��*��{쿜	�J��
��w���F��n�6A�{T ��\�ױ+o_w̠v�roW����[����E��Y�l�=�~��O&�*F!)����W�o^��я��۬��7;w��i�nt�p�g����[�]���ˮ<��������װ+��EIs�JPH�;���_�`���`��*���=(�	{�����(�gߍO�\6Js���r9^��n]��{����_-��aW��ؕ��ʿ�4O�	`��~	t����Q���3�����������:���*��4MG��j��VU��Գ��v���� ����x��kؕ�Ǯ�<v�2inP)�>���{;i�$���݂]~Vp�]�4��ܹ�x����=�Z�_3ݳ�ƽ�ֽ����a�]}�w���i�]��E��۱+oǮ��Is�j!���;��mk��n_{���Ӟ�{�����ݿ{�<����4M�	��>��[�/y5rr7~~��n3@�{N>u��!@�����j[����$�)��H��"����i��+�~�wy'ߔ�c�>𕐟
�4M�Q��M֧��?��ޑ�l�q� ���N�Q����w�+_��?����.ʽ��.Z�|[�<�\ٕo|"����޺�m�ỰkϹ?h�V��8S�.w�g챼$��_z��,�,I-?� ?[(�.ϐ$��W����u����?��I@�4���3Y��u�u�fm-�_����9��I�C�sk�Flx6��j�n�tk��|u�e��3r�h}�
9Z��܁o�w�w-������>�4�&��+m��.�ݶ5����?�&�wI�I���>;�����Ux��'aO�4��uh�A�R��p�C�}��@\~��-@\�5�7*A�����Z�셻�������V��#$菐�?�]�?�����$��{w�߽_���!�U���\Q\x[���]��x�j��A|j7��׮.~��u��?�Ԛ����{����*���]}�xv���H��mk'η�=v�M��$ɱ{o����B��t�[�8�X(�X0�]�i����������Qݚ�֮�g�Z&5��B��57⨅���؍/�[�o}�����E�ǟ]���ד��5���-�}�[H�o��B2/GR����gF��r�*w�3���v�L�w7L�4�g�9��Hj�4��rk�lV�i���	���M�
�e��͢�/m\�=����^�T�u��TB2�߼��C#�>2����,����|��i:F�ꏅ��.��W�Pòe����/�#�� Y���Ȣe/rWN5��:���1�1ŏ�}X 7��r̳�=M�t���g�=Bw��˻�#�o���!~�1 ��c@|{ҵ��"W������w� |�,�E�I���=�*�Ȕ��4MGh���Ao�������.�5�q���;��;q��;�����pw{/�I�NW��4M�	��)O�����v�� ����(EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE5����da���I�IQ�
��a�SE�\�$'�0�E�T�h�qRT�B�9>�t���.v����@�gV�M�T�
�[P�8�N5��.v����@:��"Щ�$}�O��O���b�jX!�'Щ��"��N�qR�@��]:��D�/`�ɟ�I6UL�S
+�oA��:�R��I:N*�T��@����o��E�T1�N5���E��TSH��b'�8�D�S�.�ZH"��������*&���q�j
)r]�$'�t��E�SI��C=T�M�T�
�[P�8�N5��.v����@:��"Щ�$}�,¦�	t�a��-(r�@��B�\;I�IE�x��*&Щ���q�j
)r]�$'�t��E�SI����_�M�T�
�[P�8�N5��.v��B��w_6UL�S
+�oA��:�R��I:N*�T��@���,�q���b�jX!�'Щ��"��N�qRhhh��*t|����p�k�����Eѯ8��3����X��r_�&sT�ͷ3˘��c�oL��21�VP�8�N͐����̿�SS��n��-h�	t�����ʤ*{�~.qwk�]���,�+�ce����"P�|c2V�x���#�8S�����21v/���l�^K�f����Or]+�tj��&O�t�&
y7c
s�Z�ti6U<'���Z�ax.)�U�cr�8�`�~���Я���$�g���xLF�|�1m�te<e˚�U��f
c�?�QM���X=���·����a��ͩẚ<3i�eK=.i�-$khZ�dI6U<+��g�)>_�C[�Ƣ���RD��w�eL��Fvl�&0.�f]E�/(ډ�v5�l�7��k�temm��u[S{�c�Q�pX}T��&&���:�k�v3^���'k,�t��ipp��*�t�o\R|��s1�C��:B�XZ�	��X�}((ڈ�vG�yBrRym�����;ɓZړC~�k�3�q��SS,6/�]�r�j�3���z�[YF+>w���0�1��!
1d�8j74�=����L��k�0�^�����j������&��k����*qjּ8�ǻ�j``��*��}^�Q8�8'ԯ�<'�r
�u�R
�@\��f�������D�������hsTWh@�c�nO����	��s�Cd1Hn*��؆�ƨYs�͖���"l�x����s��p����u��Ʊ�'<ϡ�>_P���a������p�@G���>��ޘ�=��I�V�g�H�W�8^�ŧ��$�T}}}E�T�(��K��-�k�a����=�m��H�Hll�����^�ϼ�|��徖���}�}�홺�K�q�'*ƥrLr���S^�.���E��Q�^ʮl�;���Y�giO�O{m>jkY9��e�>��HހW���q����D�RΉ�m&��"Uooo6U<�*�fV�0�yxBѾߥ m�e�J�ҿ�����,���/hñ}
�8\�5F;��yƥ.��kW�C=mT��0��wu>��芚!
�v�V���jY�up�˞���h�v�lCS�b9mf��O��H���S�M.�y�f��{��d�ó�k���@�<d�Î�"���X�~�8d\
cS����n��1��2~u�8)�p�@��Z\�]�$�ZVG�-ʹ�V�}qh�u�l#�l'N��qi�z�O�jH���α�+�A�v�h����O�������bhQ�i�8�1��n&z�5�a(0�mk�0�^e��LHqhaWv��oq�O��vb�	ۘ&�^�Vwww65�;!��i?���p�o���H^��u�E��W����y�K���o��ӧ��5�;Еc�e}�X�&œK>H>�ܶ�M'�v�u+S�T���~Ū���"l�G�r��G.��P�yȄ�n��O혧�Go�B�E�j*��\�0~�2�!�O�;�m�*�

��X��,��S��\��j�sBh'����̷R�54U���,�&��4��#��J���"�Q�9��,s`�c�9�0��c`��3Y�`��d�#�f
�t�:-���e��F�JGh�l�	�-M�"9md��nΗ�����(�&�'�H��q�L�x2Q��З����-�G;��q�zޣ�.h���2�toT�\ñm�j�%��ֲ�j�w-S��Ԗ�f�sa�7O�5Z�S����"l8���b/TQ
�))�J��T�����fB�E�@����Tv!��i�J��m�*�

��X�Z��v��4� � ��Z��"�K=T�м/Õ���V��ұ
�jQƔ�?�����ָr��,�_+�e,�����{ڜ��hs4��µ�X��4m9a�e�Ӯ�LXmV�?�l�E��R6�-�F�BJcs�+J�/9E뾓�z��{�s���U�q����p���X��e\�m�*�

��X�kل2�Lm�Z3��д�
�<+�1����ŋ��Qډ9��2�B�qE)�eX�ߺ���mÿD"����@�k�q�N&�\+�5;Еc�q��s�	�]elye\uC/�Z���OSeJS�����c��6[��5�d�/E�~�?��7�?/�>j�o;ʱr�#�������.q�t\k,��"@-�{���8!t��氲�\��j�v�M��D��*i�<GW.���R������~��e�����7�k�@O��ir)�����f��JM��2\Y�-*�F�\B��UƗI(�8;���.��X3u-z+�6�B����v>K�q2v��Z�2gb:�Ռ[��)�*�S'�x�z�HنR���j�Yh���[M{�0�k�{�E�(��"�v���b�ǁ��^x.)��u�A;�M�@�������5�o(�p�s�6G�;\kL9_����&�N��D���(���8e~�:n��ϨI�GT��™���*���lx\K�9I�ٜ��\�Ø���U��x��-�e��f
�t�9��+4��Zc�9���V�U]�'eNHݪl[��u���Q��iޯR��������~bm�(�"hہǕ��횿J���m8!gb����r-�]�S� 2�؁�6Gq�t\kL�^b��d�*s����$�v�>��lG��������o}��*N�7��C+�V�\O�nR��l!�6Ҥ�պ��"���hs4�u;�h/��P_F�_u]نR�fkB�~�;�oy�Y�FS�H�P�M':0h���1������%�a��sq&�1MZ�G!�qO۸(�3v���QE\��S����v�2�
u��i�	�W�������s�q�cC��f6U��"�1�1����)�J�k������x��(�8�W��؁�̳Ѐ.u*��P�&��eNH]���e5�D(��,�+���oaSʼn�G#>��K�v4��Lظ��G�ִQ3�m,Uۨg<�$�Ҽ�-�b�\ñ�L�ˡ]�׉]Yc�ڜ(s�	�KsŠ��/��3e���:������E�Tq�o
��	E�5���%E��ό�ر��5{���횁nc��F��O��T�&��g�Ôr
�^�n(�

�ʼN��+s���m8!ui�2�8r��Yˑ�/���׿^�M'�CG��k��)�_v�}���5�q�t圛(���Џ����vN�yP�L�c����A&kRWh@W��D7'ʼ�kL�m8!ui�8B�۶6j����b��k_�Z6U��)��T��a��cp�o~�e,5ǁ��U��	�k�	�(hs\�.ȉ	8Q�+�p�@G����B�]���K��v]c�l�	�[�ő���Յh{�b���^6U��o�+�״�	���7��*��/���&�E_�}/sPR�����X)�p�@G��Q��9�S���i#��(󩮯�)�p��ռq�(뫪��|*�Q�S����-¦�:��(�j�vVy�18�$A;�2��"c�l�	�k�I����Hޕ��d��&u���v�T�+4�+�K�1@����Njֶ̯f�(����|��L&S��‰��]G_��k�-��j釲�5�����4)�yF��x�P�U��S��c?j�1U��q�1���^
�i�]]?Z�l�	�[�biQƓ�r���_�����a���P|ye|�>3��n��0@k�������d���;7��-�ߔ�%.�375�oo�mN(�

迣[��LXm�O����Q���-M<EE<���p_�+�_�j6
'�[_��kk��O|��Qe\5/z|�E�FS�;��GA��9���q嘹�V�DԿ؟�q�Wh@�>���iֶ�Y]���1pB�&��zjx����Sj���|��٭I�����<>�Q�;A��kBW]���Ǖ�4�&�CA��y��e�Y�N��/����1

�֘��BXm�O��랧4�/&M�g�����f�Uu��_�r6
Ǿ[C�-Ү"��7�LV��(�UoL�u�߫l'R��PP�j!��8`��N�˥m����r|B:�5�l3���k���HK^VĤY�3r�[Fٟ��2\Y_�]��96mQ(�p�a�uc�W�I�5��}��r\�E>8b)��2��UƔГ�eڵ]�#�4��,1�(��U|N;n��'�����"l���.�)�
��⺱�j�V<`.��mO�V&�n&"�_P�1Ю-@n����{˰2'�*��*)c

��$����v&��R�qiXS���f�2\Y_�җ��Q:6����6&8���NY5�]�KW�ƨ���>�B�E|f,��"��Ѣl?�)ǻ�Ѐp>�\ێ2�P��l�	���qe��e��kkb.V��[�U�M�b�k�2�B��w��τ۳Yci���C�@0b'��&"�E�j*�iY?�����\��Rvh@�a
��
�qBj/��Y�y�����-I�%їT�7�7��	���8&'@<5ł�e�׏|W�6
�@�עp�	��^R�oͻ��P�9 �L�mWđ8��Z��j{�����P��l�	��b�)�"w�4����/aБ��c�8j�*>ۢl#����\�aB:���fC���.(�V�qg
�(T�+��ڭ1�C+��߅�ڟ%�1�qϋ�='��Ʀ���qK���o��oaS�s�SC]Gf�����H~$���!���P�ݸ�̩��_�{�a!����$�;��[dk��Ѐ�k�ո���b��'Hm
-�$���/ȸD�f�N���^�M�vB�%��1��#*|~���П=�Y�ncZQ�y�vl/���uݸ��E�B)r��B�ڶ��j!�3�C��	��P
s=�X��A�'_�6�0�_����w.�>�V_�����á�X���ᒲM�;'�6��3��w���s�C-@5��	3��x2�^;�u�=>_P�'4�)��;��:�����v�F�w�Xq��XS�F��� �fB�?M�N�m�c��Oƍ/�U��B^m�ּ(�
8���$���\�}-Cj�64��~l��
���cs�?F
�m���h�l	��x�y$��R;J��v��)ڋ��ekXC�� �l�	�݀1���4o�J���狰��Q���]�}IѾ�phwf��p�����~�k��&�Ё.�Z�|�-y���ͬ����]���W��zژ��|�1��vk���'m6?���W��{��!�0�i�S�ݸ�_Ug욝/#��9�Ѵ�D�v�%�&j��TğZ�s�=E�T�(��+�V<�s����שt	v"��㙰cS�}ul_�5�u؎��o#yQ�����̗��9����HI�Ou���h#�ljϺ�|뫼v��7j�� ��k��m�qVmϮ1��'�Z�ִ�D�v�8�֚�IǞZ�گ�Z6U<j�6��ۨ\�#�!\7�`���kciQ�}d�<��R
Ƥ�0>_P�����s���\I�8F�y�l��u���ڊr�jbp�j?@��ZW�\ұ�V---E�T����K�n���$Я�eZl-��D��m�x<�1�.���E�~������a{���6�Q�gB��Y���N`��e�8�(c�J9g��Ǘ����w�]�M�V|&��LX.���D#���د���-�Z����X��J�7|��h#�ﴢ
'`��I����ȟǶ�QM��7������ފ�Ĺ�Kw�P˔�8Qǡ��Y—����5�~.O�P$"WE���P��)�/�|s=o�*�nc	��+@����^��1#ƻ�sYۏHs΄��*㠉lj#��V[���M�~�W��*���)>�%8'r�"�����183Oۚk�z�cc�۹�j\f����/(ڊ�W�d���x=c`ۛ�h�ι�U]m
�6_jjϮ;��k�X��Ve\N�1�'�m=H:���s��\6U<�/�+�S�%{��a5��R���
��8�S^/�1B�yx,�q��8\��zU�
�=eLY�Aƥ�|>O�0Gc6�G��Z�]���pk�^8V��R����\�y��9�t�N���gs�l�.ٿ�S����…��*�m�~>�}�Wv��Ǧ<>�p��MS�Q�d�,H>���gRq�=���Q�@�o�5Բb3��(���4�$dl�ق ��)'}#N��}�ׯ|E�2�د0d���2�y����}A�O��g.7Z.�
�Y���e�&kY�}Y(�c��Y��pEQE��+�2�*&R$�GA1g�ԞQEQ!뮻��M�)��P�_��(�ZH"�K��a�|�sI�JQEŨ�|�3c��b=%R�W	�	EQI����`S�z
�yps%.$+EQ����aT	�LұREQ1�S���l��@OX���b���EQդ��'?9�*&��r��NұREQ	�@O�0�y%�U5�����O|�c��b=!a�pI1Gb'�x)����D��S��0�s�����;�s6UL��(�����X�9))��o'�~QEQ	�@�_5���CQEͯ���c��b#Da<K�1�z��QE-t��+D��u���CQE�@����`S�z��x�c^�r��BQE�Dz�
�9EQ5]w�q�l��@Qϒb�gs����SEQ�E�ǯ�@���p&��)����J�n�U���pUm�s���,��8EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEU���<����IEND�B`�assets/images/pagelayer_product.png000064400000006434151526424660013554 0ustar00�PNG


IHDR@< ٓ�sRGB��,	pHYs��7PLTE�������������������������������������������������U�������������������������������������������������������������������q���������������������������������������������������������������������������������f�����������������������������������������������������������������������������������������������������m����������������������������������������|aY^�tRNS
.Ng��y]?-r���Mf�����Ip�&�Tݬ
���4��8�� p@�i��(�ϯ��	P�����`��Q��*�2b֊��+z0�E߈��%��e0���`D����"\O�[����ktPu����6�� ܐ{3�X�dz�}�!���=��$�o�1�m/V��aB����RH)z�xx	�IDATx����LJ D]d��"����*��R҇ګfaP�;�����&��M4�ѐx������]���oU��ә����VUW���z�jh�Т�->f��T�?���*|TD�NX�Z�O�M��\5�V����֌ڲo�֞�C
>��z�B�:my�L����c��3��^65j�X�7���v{�Yg��̱��9�.�/��M�6tL��ǵ˟Ԗ�Fm�Xj�[{�7>
3ը�Z�d�W~)��p�V'���.��w~���
,[�q=�?=N7]��v��KH�3P�߸�cp�R��.�29�ӹ횬��`��
[=>篸RA4�m٦�O��ٹn����I����3�$h7Lp|^�G�w��e����)��z���x��oӸY�����7�D���L7ٗ��S1�lv�78[o�Qʬ�9
�!H�X���F����_��O%�����)�bQl��q8{&s���e��_�rw�\`���#4�(v�ȴtf~��x��X��&?-`�t ��(Ik�hjdU�6�4-D	f�h�F�Z.��˪�j�ߏc�;Wj�pm���8�U�N�b�ny��D�Z��;�(kg(���d~"�u�.)G	x������8MHd~�b�ߍ��Մiwa72A;���D���ⅿ)�m)==
�_0��Hց�s5�lH��Ma��^�~%s~��������˄?܍���`@�A �|��v��m`��-���mG��P��›Ҭ�r��G[!��%[
�������oK������)���.ш
���c�2���w-`�./d�1}����,�������c3�5y�����MK@so�6�F���QV�t2��t�4L��\�����u��K��	����~i���9���2ζ�2D��s��#6��u�&�#��k��E����8�(���"(���ʴ����a?���E�r��=�`�L��I�nA.���Q4r[؅X��������L���G���eレ�D"���s�|n��&�w�.�[�mV4P&q#>��h���tܡ�T��L���=��-��@����@�,,�V�m0�M:4��E]�0��~#mÚ�pPab(d>��	��'�"��H=�_��?��� 9��8����C��f�m��z�����^�-���c5�|J��B�&�o>� R��e�oF\.��w`����x�M�e3�`���BS�.\R�f���Er�c�q#»�r��MX�@����IhŤ��p�@QHVa��0��92��E�Z���yC��s���:��\-@�)�A.�(O��J�����۟�W�ԯ��
��IeK�X*���%�R���Bz�	?���s"�^������X-��)rZ��P.s7�F:��1tb�l��=��,KJS�F���
e��a�v���C��E��)R�Ֆ#�1̴�eeȅ�^ɭnd_|�,���/�k��|$0� �=�y=9�tB��L�`�ra�������{e�īe� 8��t�V$�h�e��:á ���6:��I��]H	WG��d���$��^���b�@�g8��@�@@���MXʳŎ�(Ѡu�:���:�WP٬qf���8��)GlЩ�gH��r��!.�xK��a|_�~�vF����,��%?�aBe� @��/��{��؄����:��r̭^�yKqL��:���53Ь�L�
L����-z�S<j�{������M�=0� \��|�\�s/���4��0D
/paf�!
V�;&=sK�wZVT^J
ࢷ�0��A�yQ5����oӎ�.Ȋ�Ix�b[��P�����<"+�š�l̏���_���M�â)jb>\�2�6��q��L���{��ՄrQɄ�HK�����xX^~�6���A�l�D"\��T�t�F�	�wny��ko�VÐ�6[ �||l�k���-&h�riE:�|<뎗�c��p�B���ë)�v��G������qB�����b�c;�ϊ��n�c;��'�Ry�h�L����ݵ~ˑ<L��s����NE���&Q��Y��{ѽ���ndv�_��b��Q�W��4[f�H�V؃�@��Rm=��?X�&Sc��(d(�k�m��a/8eWX������舕�M�#UT�B�L�<<��>��[��fpH���o��嗆zQ�3Xq��Ї�aV{��	p�gC^����q��)6�u�Q�0I���n��O������Do�袼tu�"�/��TW�@��6ƍ80����3�0��{q��2�.\ze�H���{8�dg]=�Y��;fGi���+���\]�m}�
�+��u�pǮ��?��i�
DqFtJ��IEND�B`�assets/images/local.svg000064400000011412151526424660011140 0ustar00<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->

<svg
   width="136.24948mm"
   height="102.52596mm"
   viewBox="0 0 136.24948 102.52596"
   version="1.1"
   id="svg5766"
   inkscape:version="1.1.2 (b8e25be833, 2022-02-05)"
   sodipodi:docname="folder-2.svg"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:xlink="http://www.w3.org/1999/xlink"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:svg="http://www.w3.org/2000/svg">
  <sodipodi:namedview
     id="namedview5768"
     pagecolor="#ffffff"
     bordercolor="#666666"
     borderopacity="1.0"
     inkscape:pageshadow="2"
     inkscape:pageopacity="0.0"
     inkscape:pagecheckerboard="0"
     inkscape:document-units="mm"
     showgrid="false"
     inkscape:zoom="0.1767767"
     inkscape:cx="1394.4146"
     inkscape:cy="288.49957"
     inkscape:window-width="1366"
     inkscape:window-height="705"
     inkscape:window-x="-8"
     inkscape:window-y="-8"
     inkscape:window-maximized="1"
     inkscape:current-layer="g26429"
     showguides="false"
     fit-margin-top="0"
     fit-margin-left="0"
     fit-margin-right="0"
     fit-margin-bottom="0" />
  <defs
     id="defs5763">
    <linearGradient
       inkscape:collect="always"
       id="linearGradient24461">
      <stop
         style="stop-color:#f0b000;stop-opacity:1"
         offset="0"
         id="stop24457" />
      <stop
         style="stop-color:#ffca57;stop-opacity:1"
         offset="1"
         id="stop24459" />
    </linearGradient>
    <linearGradient
       inkscape:collect="always"
       id="linearGradient18844">
      <stop
         style="stop-color:#f3be00;stop-opacity:1"
         offset="0"
         id="stop18840" />
      <stop
         style="stop-color:#ffe457;stop-opacity:1"
         offset="1"
         id="stop18842" />
    </linearGradient>
    <linearGradient
       inkscape:collect="always"
       xlink:href="#linearGradient18844"
       id="linearGradient18846"
       x1="255.0554"
       y1="380.32211"
       x2="113.33793"
       y2="61.10984"
       gradientUnits="userSpaceOnUse"
       gradientTransform="matrix(1.1513518,0,0,1.1513518,25.547957,50.663525)" />
    <linearGradient
       inkscape:collect="always"
       xlink:href="#linearGradient24461"
       id="linearGradient24882"
       gradientUnits="userSpaceOnUse"
       x1="110.23297"
       y1="63.961735"
       x2="111.61922"
       y2="-1.1827331"
       gradientTransform="matrix(1.1513518,0,0,1.1513518,25.547957,50.663525)" />
  </defs>
  <g
     inkscape:label="Layer 1"
     inkscape:groupmode="layer"
     id="layer1"
     transform="translate(-39.387094,-45.946639)">
    <g
       id="g26429"
       transform="matrix(3.2654217,0,0,3.2654217,-235.56636,-248.9853)"
       style="stroke-width:0.306239">
      <g
         id="g27277"
         transform="matrix(0.26598227,0,0,0.26598227,77.406226,76.844109)"
         style="stroke-width:1.15136">
        <path
           id="rect5792"
           style="fill:url(#linearGradient18846);fill-opacity:1;stroke-width:0.352589"
           d="M 26.389801,71.755252 H 45.788224 65.186647 84.58507 l 19.39843,-9.897057 h 19.39842 19.39842 19.39843 19.39842 c 0.0583,0 0.11518,0.0059 0.17009,0.01705 0.0549,0.01118 0.10783,0.02767 0.15822,0.04891 0.0504,0.02124 0.0983,0.04724 0.14304,0.07744 0.0448,0.0302 0.0865,0.0646 0.1245,0.102643 0.038,0.03804 0.0725,0.07973 0.10265,0.124506 0.0302,0.04478 0.0562,0.09264 0.0774,0.143034 0.0213,0.05039 0.0377,0.103323 0.0489,0.158227 0.0112,0.05491 0.017,0.111785 0.017,0.170087 V 167.86507 c 0,0.46641 -0.37549,0.8419 -0.8419,0.8419 H 26.389801 c -0.466412,0 -0.841899,-0.37549 -0.841899,-0.8419 V 72.597151 c 0,-0.0583 0.0059,-0.115182 0.01705,-0.170087 0.01118,-0.0549 0.02767,-0.107832 0.04891,-0.158227 0.02124,-0.0504 0.04724,-0.09826 0.07744,-0.143034 0.0302,-0.04478 0.0646,-0.08646 0.102643,-0.124506 0.03804,-0.03804 0.07973,-0.07244 0.124506,-0.102643 0.04478,-0.0302 0.09264,-0.0562 0.143034,-0.07744 0.0504,-0.02125 0.103323,-0.03773 0.158227,-0.04891 0.0549,-0.01118 0.111786,-0.01705 0.170087,-0.01705 z"
           sodipodi:nodetypes="scccccccsssssssssssssssssssssss" />
        <path
           id="rect13784"
           style="fill:url(#linearGradient24882);fill-opacity:1;stroke:none;stroke-width:1.15134;stroke-opacity:1"
           d="m 26.275419,50.663533 57.211367,0.06546 c 0.229329,2.62e-4 0.351923,0.09679 0.351923,0.09679 l 0.902168,0.441194 18.424223,9.653999 -17.910226,9.191821 -1.318012,0.670143 c -0.772751,0 0,0 0,0 L 26.392068,70.76949 C 25.933414,70.769383 25.56417,70.472451 25.56417,70.103482 V 51.399695 c -0.01166,-0.544365 0.711249,-0.736166 0.711249,-0.736166 z"
           sodipodi:nodetypes="ssccccccssccs" />
      </g>
    </g>
  </g>
</svg>
assets/images/30off.png000064400000147430151526424660010762 0ustar00�PNG


IHDR����ߊsRGB��,	pHYs��νIDATx��	�\Wq�=6��E���,Z<�F��h�I�$�L^� �%	�|	$!@X8$�/I /�6^dY־Y������~u�}4����9����Q�����2K�=��T�:uZZD"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D�H���ׇ}}^��?-��?�0w���ܹ�"�?/)̙3�000�fF8o��� �9s2�^��.j�ž��ùs�����p`����7P��_\\YX
}eia޼���J��p���pp�{{'��]��� �Ι�thW��|o�����ˊ��+�=�C���qc�ߧHt�	g[��wQ~����y'���|_�0���a�v��0XO���l`����Q�7����/ق��ix=���p�/����o�E�����`/,^�����o-,Z�2x].X0#\�L&�&*��Ƨ�����Y��fͺ����^�?��7�A�9�KF���~V��`��/���p�7�c�?�:�x�?,�g��<&��ӧ�绻_Z�1�=��3o��|���s/��C;��lΜ�R;���s�j�'�a�;�m����	�|}�(��n�%�{Gf�|.L�o���Q�߆A�@a��ST����Y���@]��.a��ŋK�dɨ

�ťK�����o�,]���%Kn����f?牪p�� ��//̘�I�?��>B�)���P��Gl�"��~14t��.���KW�7��f?��0�m���0mڗ�[��!�u /٬Y�Vm��Z��m\n[<�a�~�hӷ�8����!���?����`�A���3���ŊAIM�iC��8�7�K�lYɖ/�^/��_X��C#˗���S���U�)7�����7@������'y<��u3�G�Ĩ���_����9��{�)S�Y�:����aa��E0w:��:n��ҥ[�c�%K�6�9�D
��;G:;_P����i߅U��K������ؓz�I�n��̕�XW�Tv��j�w�^�Y#!z��\������Q���^��zz�X���/��X�,X�]��g�L����)tu��)SBh�)������z{r�t�`o.���Ϯ����jXh�.��
m�i�/�s�]h���
~m�#x�?�g�#x�%��<�Q��b��f.QYOf�3��ܯ�s�?Ϸ��Q��x�Ҡ�L
J}�m�z���M�1��B�6qG0ׁ�jUX\�Z�Y����Z%ޚ���3��-`?��b�>d���@�vW�c/��+V<��Y�rU��sU�۠Q�y�
`�a�/7w���mg���K�f�
+V|8�?r��e=vtL-tv>R�&z[�v��#���#�lW���tS�p.��3A�Ap�\{{x`"�eg'?0�xY6����9���4���5�~`A�۷�
}:�/�/����K7mݸ���/\���oV����p�쫛�&�ҹ x�\ng^�
�j�P�N��Df�=uնT{ڀ�e+V���E�x���a\v�;;�<�S@W���*Λ��f�+Nǃ`�I���\r���;v,������@�v�]&p.QN
��@�@�v-��F֮��:��r�ҾT��F؉�/=NNF�0��_$\�V��������)�n��T�<�拟�9�u�v�ݳ�Pą�jCâb�GV�X��眖.��\��r������z��3�?�k��"t��[�x�˟�//�@;��`'˦�~��w\�����I������4q�}�:�>�Z5�����r�� ϛ�<��c��Dx���]�3zSX�f��Ι3�*O�o�	�a5_�ѽDsF�v7��)����6�~%����#��U-��z!���n���:��
��������
�ՠ~�u�[�u=|J
R<Pmp� �ԋOz��6qۀA|��
+�[���	��Wʷ�<���y���j���޺q]��
u�7Ђ��v�V��y�n�$����i&�������[���M^�iA�z�}�ʕ�h��O�B<7ϵIR��.�?���7�u0�]��P�8���+��*5X)���yW��tV�����q���e���[��i��MO��^�L��Q���F,��m�`�����o܄�O�_3Q�Trp\
�.P�B�����pݺq穏tv^c�@E���#�'t�qL��M7M��Vv�v���V���>p9�s�7���mٱh�6>�[n�4��������Q�N�����ଳ��Ew�L�q�A��kߠB��>�%�v���ի�|�X��Z��ʿ��Ӣ��ޖ&�����ի����W�6Z5�V-!���ۚ�����C��g�~A����ꛛ��5����+�]���ْh����,�(�?��DgZZ�>_��S3f=�&wר�Kd��$IV�B�2�"���U��7�}9���J�scj��"z���-yN�u<������	�(���nWAtA�\8O�V}``S�?�����^�ud�`W�Q�S�+p�[W�]�6����
�8�9W�は&l�5�֯��H�ni��Ɲ'���y?��Kw�
�.ɘ��>��ʼn�୙u�.��]��f�3�	�[
m^ЁN��S؝��]��q���#=�…�",��zo���Eg�ۿ���U@�!)�80��ٟ��n��n���M�];�֩}u�U85p9�S�����ӷe̚�&��s����֯�8�n��f�
�xc� �o�p�$؈��[�NEq\'g#�E����Z�]{l��Y�ik��D>Qns�ŜS2�m�ﺰ�ƺjK��n[�c��Y����c��_��Z�B�I�>0��f�+N����� W�����V�F�spǦÞ�8�7
�8+�8{nj�saw
�%O�h�f���bҩɓ;�OlW�2����Kw�ؒFu\B�:ܓ,�\�f(�ÿ����f�{$h��/���\�b�y�O-�8��,�H�x�sPO�֬����R�ۈ�����@W�?����p|g�(��c��'�aO��V���;�<6�]Ԅ@
z�����\��l^:��k�l������?�yG��j�
�sP��8����n�I�N��w4��O��:}��ݴ��v7��8F�^�v����P�c۴X�N*�Y��f�'h�ן��"���s?���wEjwK�S��wh�����1��T��"g����2
�qʹ��5蹕���lP�&l<Y�����w����u���*���q�����ۼ5е����#I���k�Y��)������Bݴ�;c�K�MR3���C]ۦv3�VX���p��1UT�B&s�� 8Bn�m�%�	��ѽ	����u@;���wkPW!xu*Y��ح������@��7Ւ��Թ�|/}ݺCa_ߵ��/�����T�$U����+��o
O�Dv�,�����p0'ȩ�?._�kt��_M���4Ʌݝ��9�'��Qm�A]�Ρw��^:��F��I0?|�[X���G58�������wEk��}�*������:���2�w
�I��|x�Z�:��2aǁ�:��v�5��(�.��aԱ�^�>�k���ȍK����S}�u�cl��٢��?�=�i�j{�;?���I|�f����GA]�m�n�bݖ �z���c�K?��uA;�'�q@/ͅ4��]���y�0�-��[���N��LPp��B��Ÿ<�ܤM@�:ac��[�kN�CC���3���kE�p��#��;A��4e�	��6��P�-��e"��_�d+�G��j�c��:�j��9�K讋2j�fk;��TN_���)y�_mT��4����O?�N-z(�ϙ��ٟ��c���Ce:�uo��:�,Gy�:�U��_/���]V��M��16��ܥD�5k~����XK�Շ|��C�;�v
��&|
�T��5�c:7��A�VEN�7���+�7��r(�c�^:���t�9���/�p�)���a���^�yd#�7��ʙ Xe����q��X�\����:�Q����7#o��9�S���1
�:��i��[��u��	�q	rL9Xm����/��o9��p�ujƩl���ZK�O��q��%�cL�㒈��V�z�ث-�Z�#�5�z����MW޹��Н�E�:��i�v�����6��G���z��I`!�&j���p���@����l"M[ZZ���yy�p{�۠�e�S޺vw
�6�h�����3�܄M���~:� g��e�k�\/�܌��ux����}@k���X3����W����{6j�u�.�y�uͳ8T0�"��|*�+̙ŚqAF%�E��̶��A}ժ{��6&���79�ַe��x6ž�1QAT�#��}��)C]{R��!xjՎ�����1�%ƕ�
�ڑ���-A�uf]��w��O������b�T�����M���{P�=�CE�p��yB4A=�ެ��gá��yK0��q@wM���6���i���x���U�{�lYÓ�cj��'��
�9s�mm
K�9h��}qc�:ؓ@�J�����N�d'��8�~w둎ZBtI������}�P&�L96�b�4�'�C�y��)���E|��	v���A=��leҕzXX����G=o�1�M���nkst�3�"/��qҭq!��+���a�5Y��h�N����,�H�(
�W4��,ژ����es�:N����v�”����Feߚ*[���Z��$D����۶to�B����1s��5ݥB�i�g`�A>���1�&v��P���+��l
����u��	������S[m6��j��l�>��2�k6AC]3Xl�{��bR>��>#Tt�w�p�huğ5����m4@g�S�bq�wV�[WXS��	�J���ѓ���d�
�$��(�._ް��d�sU�>N��Kwz*Ǘ��sr�����8�i�z�	W��=�O�
�oE�i[�=��
~��������r?:W��A��0�eb��q^�j/�K砾b����$��gm��
��}a#?��Q����0�F�:�~���MP�u�H�b��>l1[��;j�8�t�T�+�Bw˗?�Q�c��E�|2�.@��#����-^��ĩ#^�
���+$�DJ��G�~!L�f|�x��
�gc-�jjs���x��{?_1%�VA]ey�z�z�
C]�q��K���.���s�S=N���p{�FQ�z��s^�#�K�����lP����gW�[5u>�f�-DIj��%�7�<����u���t�㨌+Э�����d��\��u���k_�ڪ���5��V=�Z�������Ng23�9�H��nmw�6m�X@�@����]�s3�`��[�j�ζ�o1m3�{�v�\8s�S�z(��o�z�,n�=.�m`��i|��t�ʖ�Ez�qC�q�I��jCVȏ��������
t�e:����d�wNy�
��\�Tc_��?��;�� ��K_?4t(�:�)i�xN/‹�T�wWn�bg��8���%8:m�����w�c�+[��i��I�r��9�4y�Ћ����ը�2�OR@�z�oiӋ��P�N�
�� �۔ą�lI]�s	��4C���]X��z��#--O��s��m�+2�M��#_xbw)񪠎���۱w��ԧlg���B]����'�9��.|y}�x�G�?�c1�s%~�vs9?�?@��^�P��K�P�^j��^�<2iҤ��0�[�'��9n�Ϟ�'�4��ŋD)<��t��z�\�]�zC���9���$���M%rQI]��W�>��=zw9�NA�U�/}�ֻO<�y/{�|�f
�j�^`O�N�Q.7��ɾro��8ܮ�s�g�@��5�/Q��t��zE_�%��'\�^��),Y�4�± �'t.���riw�q�t��Ш{��ij�����ci�	���g��1�T�l-����/��{����ږr�m/���q�=�]�r5��$.*\L�?[r��D^z��X<i/]�H�����}�1ԩ#���J&�aOA�l����7]��޹)կ��m7P�_+�?�eX��-���;��n�^`	*K�\;;k.�@��t��*�v����^�����O@�ՙ�5���q1�5�ͻ��6��d.�@�xA��r�B�����{�A�}?��б��K�r{�x���.^9y�dL��m4��I4I_�j��mٱڄ]X�to=��ᖖ����)����T�8@7f:�&��Ke�L���*Ԯu  @nZ̠(��C��N.��w��ۛ�@���od��������g�S�t�B��'�t��ui�1�����P�P�^�{�d��ZۄR>��o��&[�_@��<�y�Y����=���ٝ��v���=u�Dž9qnR��'�:zO�۲c��T=��l��]�m��tc�5��ƕ)��{�j��;(��p����_0G�]��g�A]�/�лK������u/��3���Ћ���m9z��TuIk͉�^���N�…�ߌ7�˽��_o<�>�l���oO����,��w����qTؽ^^�
�8���r�%y9�R��K�w�É4�d]Ͼ�'8�s0Ӂ�G5�	��>��-pFA]y����Ny�����$�Z������{�9����p���),\����p��T4#U���f��Thz�:���_�B]o3d�E�^]K�`�W]u
x�{X�S�榫uGg8�:uR��W�=����;��8�=n�=����;���ac��4A�&/�K���c�𜚠u�+ϫ�@�g��s�:<��3���,��qP'�t��:@��?m�
��/�������=����`��v���'�_-���zw��-*����{��A��O��e�i��jq�f��M���	�ܘ���mѢTk�;:ޥ_PS�@�sj+Ξ��4߫�Az(�y��;��
��
�&�?�G�m��?v؏������-`�����8g�;����p��z.]��9��&��D;1�U�<o�^��+u��HX�ɒ����?�t��	��ҡM��}�l���
�ok��^�����k}���C�z��t=�Ґp�/�.�+�^�ooJ�YO���<�Yl��l�TC�f�Se|����awmL�PGVX��ϓ�V�ٙ��t�:�œ���D�2��go[[��x��l�w��c�+�:u|
M�G���_�>{�������z���ʿ牖�_��io��pt_��I��&O��/�[�~�>�x\�{L������}}
<��������n:�t��=ϩd���¨�jw,xN/�#ԬL����0��
��g�9v5�&�Q%�|.7�^���]z�w���Q�w}�z馢D6�k��@�7��~��A�,�h��K�	�8g�M�t\����Q��V0�ѿ-X������ঌ���7��SsB��Iz���*�vC�����1���N���ە;t7��@.w]�?�I�;������8��4p׫rٱ��'i��z=x��|��mG��%6�#3j��B�����^Z�wv&/�
��]zߧ�z��҇9/�p.�*������Ӂ>8x_��
�B�J���n˝��S�q�U�$�"����E�6~*If�\n��Ū�du�'�y	�
��Y���R W���}�o�n�f_���m9L`�f������(��)��)�
�"�:���՞��'h�����c����)�����m�e:�K�p��5�^�E�#�۴磢S*��w|.��3�������'ι���

�T�K�bLq�>
�ԁ�h��ҵ��g��^��}1i{����9#��B�`#�̙�i�GQ�)���&�l�,�=`��lvͶ�n�KA�fJy�q�j��y�^����'�T����:>��&���~���n=׀}Fj��.�PB`�^�������3���]��h�~����~?��YP��\����0���@�$:G|�_�6Н�\R�~����<�KWP�^(���%I[��wt���l����9�w��Zߟh��&�mmm����(����U���N��93�ѩ��L3
��{�P�g���m��vd�I`��Ǻ-���ov�{��4��g��>�5WDsUt}��*������UƻS��T���=��:���}M��
���8� azbtv˅�Dϣ�PO�Lw�}t�G)/��4v���v��Е�2eo���`NW�;N�&��D�S0��i+0��[�N��qv,��6
�8wn]�O��y/�E�|[
@'��>A�aL��[5�?R��	`~��)�y%z�=���'�Q�pr�	�4�?�����xp�e�E5����bl��B�⸳��@��45�)��C/vu���θ
|8�T_D���&5U�;mW�R�eb=�[QՕ'��/��Y�w��`��0.��:����d8�;W^�s5Qb��ӓ�L�Me�+�N~`/]e�'
�s�q�|�����N��z�_F�>�e����m@�kTSLt����1ͅݣ�RPW��ܹ_J��Ž����K��u|{�Q B��Mak��IߛH�t���.j���D.��z�=7}���y4!���A=�x��@@�3��B6�[s���{<j��
A��ۻ�σ�#t����q����QG���%U@��0�g����6��.4J|l1%���O�P�t}L���b���s?��-"�{���zЩ�h�P�~��٫��/�hL�}'u-&���6Q�����ߦﻕa_�^�b��'s�@�5̝�#���{<���a�S��.8a�c�c/]=#vg�ݹ"3�QG�Yu�E�~�C�5�q�F�S_v��}'��k�I�֛רm"�8��=u��>��-�/���2
�6�|���&yO"јRtq.����V��躗���r������Q�g�������N�wl�K��P��zlR����y�*�k��j��P��(�}'�;7vM�㾿扠2!��	oM�J�:W
L������]�z�t�%��AAY���O�~�H���s�;/�15фLBwr��*`�n�M�k�h.�U�zࡏ�`���]���[��N�kS���П���(�/��yp���UT�^:��}��;����������X6;�3�m@�N�8�'ƍ
�S'3��j�hΜ؉g�{_[q� u�.�p%���hL
&�;m�M�0��s�`��7��z%�Fž�����N�܎��-��� ��\��-r.��y���t�#쥫���vO����u��t�Y��j��z��.@�[T�2ɉ���tu9�S�s:���Y�	�#��/�������ӧ �Ι�w��s$�1�.s�H�p�Du���u��s�6װ�����Q���^A�\M������Uyd���,�9��)@�.2R{��x���rY�����3ޒ���8(�kf9��^:ޢ�nj�=��eb��)
������R@�J�u��%:�Q�퍕|��6��Н��`NWa�-���Ƭ`���q�D�|&�s�
���`}}o��sؖ;l�sUڔ*qj�:�LY���
����1tv��G��N�b$��z�/�z~Μ�H�y���,����aw���I��O
��
��@Ǚ�x|c��`/�=�9ӹDq8}���0w��:����>K�hL&�;�I��F&�;7�sY��+a~:��}F�����z���b��o}���l~U��c��K���SM�3�3@���$�����c�v�n�1��݋�o^+�=>�s��ր=L�n���C��pҤ�������_�
t|�����Y��cj���� �=?W�֍*iL�q	���8���y��
�|���@��U�6u����3��1.�1�����@Waw.1�
tKb�|8���&���b�+�S��TV�ލ��GOP��,��3�및t<��!�Ϟ��}��Y��_�w��������R�6���A��SA�֓A�A�-x��^X�u��SM	3֪W��v��O���7��yx>�<)Ы��Q��bX����k�}����f�G���)��{�?K�y��~�a��Ü�z,/�꣖�t��`���7	t�~?ud�ﹾo����W�B����9�DuQ����|.���J�o����3Ap;��?�;C���d�ْe*�j��Ω���K�՟��n�o������h
����p��'S�SJ�s@W��q2ݍ@Ǚ�}t�Cߙ��>��V@ߏ�n*��KW㈫A^�[,������3�߉�y�V�s�j-P������[5{��b#?kV����δ�\�����}؟���}7��AZ<[|��/�;e�}�X0O�W�;���?���|���m�9U0�t��	t[—�^ye��1��8���)���y�t��{��-����߅���y�r��:��N�t��_�~��R:�"����ƿn3f�������gN-N{O���}>]Az"�k;�������[a����cAp�� 8B{PN
:}��F��6��pv�1]j��l�n/��.kD��7�@Գ�&f:y�*��F�>�����z^�ѵX@�>z$��R��K�.�<�9!K����+�s��Bu*�N]�B��qU]0�z��u]����A0��y�/���r���煤@�<�M����,�1����ӧ8�]��%k�EF�	�mm3����€��q�t�����g�'��M�3�/�7��'Ԏ������F���;D�<
�WY〮 E�=4Ti�P�@��t�<Xt[$�裵�K@�9�=�g����{ʦ���s�`Y�����/�I5F/��+йqO�y=�n�p��tƌö�N��?���@�cj�ڴ��CqT�H���r�11nй�)D�M����-�F�������=�k�N�3����X��nK����:̗.��Q��I�o"��Ϣ��e��A�T��;�g%�̇}�5:�1�1���Y�S`� �`^��Эc��7���9�w���0w��K���HtY{#��'2�=�q�tW������
4���;�\|"
�p�~�w#�~9ܮ�s
�P�@w�u-�Sq����^��{��Y��3�d|�5��A����<=���M���S��ێ�a�O�~���M[��.@�1�+�z�H�iO6���+w����q���] �q,��웛`��4<���m�����ǼJ�|�:�t�
t\TFY������Kq�z�H��ۻ&��>�q@ߥc܍��_�T9
������w��V�5�Ҫ��?�r�����k��O��)�m@��N�$mw��v�� �����To/�<a,�]a��s0W
�拃��'ܤ��(�<u��3�x_X�?W�v�˖��(�'�ճ�:�o9���<����'����@�0߅���w�Q�ShlS@�<&�m0wI���6b��t�e�O��}ӳ���f#������O���m.U(�䔧^��;m����
s[����##��=�m@��ܥ#�J�R	q�;�a^	�1
t\-���W�{E��}4�����E��B����4Uj�� �a��0w��q����G����=����8q۽�A���@��?-i��D�@߉9�	�'���҆����0�%\ϛc���F.��G�V7���xނ���pWp��v���Gm�ݹ��z-�_��{__M�k�{���N͒@]-އs�޺m<SI�I��r���K�2�i�Lx�l�+|�'�A�z��(�/�D�*��� ��x���Թ?;`���Ip�e#j"^��pp�ofm���c����0����z�z�@7]�Z	����f�/Ё�a�#!ԏ����Np�bs),u:��q7�G7n�ټ�)S>�=�p���Tf</������ž��#s�<��mŹsߓ�+��>��`߆���0��w��
���'?
����o�?���y�…�4�=�J}�6���A_Г��M0�9�ag�5�n#����2�ᴁ�zA_��ž���S�?H}2�q�n����q�mk�C��ue�A��e���#�9s���ijmk]aooo~ΜW�}0��m�͗�eѼ��`�"ZTB0���7������(,b�����C{���P��X�v�u�
��d.҈:+�����A5�T�6udM�S0�@O��5�
Uf=���Z?��{	:�9{E����y�6��)��&o�tV�o��8���X������I��V�=�Y0V?����^q��:��
��+qm�:�áTD�0�~��d����o���(���.�ԩ�;wb\�'�;w����0�P��հ�1.��ya݁�K�Π�s�%�7�8���t=쮀>0�t9�M{�`+�횱P��؉���I�Qж]�ds8���z��0�#��§<�j�η�t>�6�6-��ma|.��y;ة�W�Rw���n��)�s�
ኑ��]��t�7G�-{v��}u�,�%�s��!���� ��
���tS�]��q�:i�hQO�ۃ�6��q�+J&@��ܹM�<�ͮW@����	���L�g�1�=-3]��A�譗����v�Xg1�^�:�]I��7�g�x��)��6��n�ҩ��幡�|�~���LJޣENښ�>'��u�E�'���d8�w>�Aφ��74�=(=�ɼ��:�X�4	�u��a�?�踪^���e#���s�~<����n�����f�ΙN�P`W�_�I,ε�\�����H�1lm�m<�.p�>^���Ou�ˉ��A?�@���%�{��`O
u���p��r��q��K[���=捖
���N�#��8�x��&�GP�
�T�����K��?����vѵ��~C��$@��h�W����&��p���]����Vd&��}un�+�c�cȻxW����r9��.��ϲ��8s�Ȕ)/rm������wwﭺP�����q�)<7�\�l���rQ��h	W:�]��Cq�U{�;��]�jz��*���#��l�q5����qK�6��+���oK@�`��~9�>8��4�x��s]P�V9�V��[�թ�(��� o2
���S`�����\�����@7�}4�n�6�LyFaڴ�c��S`O�6�#o��?�ž��Uaq����e���zL�v�.�k��ͅ��L�+R)��s���+�Ѱѹ���?o��)�l#h��s��Ы�p�s7�q@Ww��PWa���ϥ�<�d�/Q���M޺�(�
���]��0w�����r_5=+���z�Zf�=>�;:.���ֻ�î����el`��n<�;�_Ou
�%;ZX�jnz��
W�G�d��P7��(�ێ�p����t�f5�sQ-]�0��`��h��!���$ō3�o��õ/��!�Ѱ{�Ǚ(��?V!w�[4K�7�]��]A�[xw��Q1�{1Y���8`oo�F^B���o�^(�o���
wSRv|�C]�c�G0ׁ�fM�:<�r��z�,tI���f�ꜗ�����zI�e˞���pɒg4������zz\��g��
Z��������
�z݀��/tu�K�?���z.;<ﷶ{ޓ����0v��6�1�]�!o;5o��ۂ�;���f��--�\��P��ρ��}8J�3�M��1-�ٹǥ�|"�S����M`'JfWE;���=�摭]ٹ�U�֧��0m�d�������8��	��մ��KVݰ��tvWT�Cw:U��t�p�ŽF�L��ߪ������Лts�����z>��P?�]����X��	�6��� o{o�L�Ix��c�	t5C>�3��
������]�uW`���ŋ�p����yP�$���{�%�GvL*��"tnO֖$�Z��l��xpb�_^�A���Ug�ϡ�IqԄk+gA}ٲ���o�fo5�j��]A}�:���ϟ{���nϛ
c�'���C�;��v�m�	쌷~�T��<�����Y�
�I~ƶ�--la�𪫞sؽl%;Wo�;�{�S����c�Ԝ��t�Q�+;._ޙn���d:��NAߧ��N�ݴ�Ny���w�K�aw�z�$@�dK��Y��F��6�
5���*�үI�>z,eB��,w�Q(2
�|��hWK�U�w�睡�^+�y�w���v�[���y.���;%�{1�W.�s�o��t6�SP�n2�1�)o��:η�^�[w�
k�n
׬i��愐�C�@7�޹}5�J��-�{�F�s^:�g��W��>��7��F�_��Gq��Rc�:��u������v���o�ρ)�㱟&�9!�;�mwi��{N��s\??@�tQ��=��B.������Xɮo=	�9�c�S�:u�K�@/ü�~}�֭K���!=)�t.��u�ޚ+�MP�
���8*�^�xU@�L��z824��z���l�%*��t5�&:�m����US��H�
:�ҡ�DbӠ^X��Í~^�v��΂�/.���P1s�	�q�^��z���s��ﳕ��n�'���R�����~���)�'1ܱ�N@�t����u����^���^}J�C�2�M^���nJ���(�����j�wv��]�^Y	-����%u��E
�8�.@�t�Ț��p�>��m�H�ԡ}��6�y��1iR'x�o�����:���4�n������}�d${ù�+l7@�k��-����w��|�fI�vIW��a�
��[��4�QW�����~�caӯ�Wڂ������$�tW���ԫBN��]�^
+uN=,
m.�˾ϮL��)쮀��oЩs�c�4�od��h3���]A�|��74�yq��ښ��ፏ����9��t�<�/��\�k?Tz��?m�~>�>�`G_�8i{L�\.��vI�۠�
v��qw��?S��sP�B��Kg�^�ߩ���(m%*�Q���n[��37�MY�.P/(8a�S^�)4��!�{ė'�’%߯G��f��4�S�����P�h�z^
誜q]��a���h�{��\������;�.}p����/���Wz��dR;Yr���J�Xo2�n�]�u�a�x�$�:
v�]�;w�%���}�нtvG@/}OZm~Eh�v9
Sb��K�3�m`�A= �w
��%��$�c����e=&W�z��q��g�p�?�]��t�T�T¥	��_���~^I�+��n��-��y��=�}�v� <�/��;=���M;K���<x�)x����/�~s�7�z�'a��{���
��<�y��ϵ��`�8�]�Z���F��>������T�n��K����v��=
�6�㱐�K_��u��N0��ϣ��X��[���z`?�@}X�p��w쥫[؝:
�G�WX�x_�ٙ�L���:ܔ���Н!5��I86�W�t�$f�B�����/�����J�� �*[Q.!���W�~�� �{���^He�SP�<n⶛���ƅ�(����@��e4�o�{�(q�w��u��1���&�39���䢎gI�K%�¦��e����ub=�(&�7[��(z�x�c:u�$6�m�h�����$��%�{#�]}�����w�oi�v8��D�[&]�t�Q��%2f�/wm5sL8��^�z�~��bQ˥#Q�S���Պ�g�
t�9�۠+�N��)��
�E�N�}}7��F�Z[;�5l@�!UӾ�8�:�Iy�8!�n@��>�wT}d�b�3Ԣ�����]LP׿��(\��L�~�T��$WG�����<o��s7]R�JjLP^����5���k��c(o7qr������LP7�ޝ�tʣr
���~���V=>iҍ��,��`���}�������9�pW@ߗR����`���,]�����J�q���(�K���M}���ϱ�8��ל�.���^��t���T��t}5�钛Ct/�K���p`�-�+*k]�U���v�w�c7@]?���ޭ^�)9�vgn�zt�x��Mi���--W�D@�^�+�#�G��#����,�����v}�|O��+�[���r���;>	ЙKԿ-h��4��q�� 8��&����{>�����k�~2.b�Ǿa���;��̫*ݵ��u��N�v�����)/}t=Y�~u��˸�>�{ޞ2H)Ȧ	�$`砮g��л��Nz�i%�qf4��oΚ�V;��}t�f<��0�s����9���j�K�"���дF?�+AG������%��������ʋdl�ĩ��s���s��U���t���-�|�}e\k_6;�&��O�ռ��ȸ��u*�^� ��tC��"ufҥ,:�X ���@?D�1�:��tT@����5��b�Γꋝ1tx6w�ּw�d�@W�E����������&����`~�P+��f�8e`��ORW�&�2�@�=r._@�w������Ȝ�N%�Ug����}eB�PK˵�2���+�x�Ka�{+�/��`?�?o��Szv��j�<u��΅�I/���8�e-��5
�� He�����:�b��M@�bR��X�p��翋+��4�@��U{����A�w�c����.��hlҁ�]��WAz�zbZ����W��x�̷�s��|��`��;�k�����x��K#��n�v_���z��+N�r���������+�0~��O�B[���c�ǁ:�Sw��ɽt}��$9�.E��&u��Ci<�]�ww�@�o�:���9�Y��?#�@���	qU[z?2=�-~˖j����8j�+�)�����{8��\��{��u�Kg=b�i�
����b{��g8�6���:�ҩ{�<79N]زnݺ�AT�N�|x;=�<oL�����<��H��n�1@jL��j	�S^:�K7asM�s��@���~7�g	�7L@�O�Nc�c�s}[�z�$�r����]��P��8@�L��̓�~V]0'<�
t���!�]�b<��t4�]��{�f�*Z�3й�2e��W�N�[�#vl�,u7D��8奯_�{�z��a��
����>�3�V���$�)���ߎc/ݶ�Ne�;'ǹ^���/���y|:��2��XУAH%
ڊ�4	�����)�ԢQ�38����ˢ��²ew4�YMdA?=��Q&�s@׿��9A��~�+u�+u��z��n+�
_��8���;?��N��q�*��%9�drO�xL�wrG٨clGs�����8���ra��1N���T���3x_��2
�q��
զ�+���\���s=q�Z�/|����/6�YMT�d���W�a�V������\���O���Mw��E:�_�t�]]ç<�)q��� ��S���佊�g�ұ����=�{�h��tS؝L�s�h�cGxb�����d�y�T�sؕ;�t|'z�jq����f��@��|�^$��p�{�8܎3�+=�����g�_4�YMT4���)��7���^|��}��M�.WD�@�0�nY�p�gy�n;;_u�c�I������_4����΅�M�f����5��5�ck��{X�;���=��m!w�H��Yt�jq�Ytn�I@��{��@���P޹n׷nT����8�a$:�����&��;�6,p@�s�N{�cj�.��N��z�@7�}^�G��x����w*��L:�z�jU.�g��рn*	[S�;�saS|��s�a�]��aW&�4.й*hֳ�� ��p��"�.��^ 	{�z���?��G�z.@+�X�F?��(h��逴��]
�\��}I�s�/,�/�(��K��r�$�q�����N=��+����EqX/�s��D�$��^=/�g���{�^sН��]�����Nk=!�T)��s�έ�����`��
��2�S=�F��G3�t��wَF�+�A�޹��[6��`��,]����j����p��S���+�}%�q�9P�_���c/]�G7�s
�I�� �W��H�^:vW�k)X
�#��=;�g���{����zU�6��[�S؝���9����x:��VBsI�3]��l����i|�8P��^�\��48T�ۍG���7	��X�i�H:��r�a�߄���9:Dl�.��Ap�|&�}O�����\��[:�Ma�X@���n)�x��p���:㖂ս��֬y]�� #x߹�q�\�n���pOz�����u����	q�aAP��S)p~���V9�G�&�9�$f�U�5�C��2�>]��:)�s0��[q"�)	~�t���D�a�{s\��tMjER��7�{�����J7��B�s��hnCP�O��*Щs�F�	G���kTؽu��ߕ�-Dc@��ă�<�=馚�z����]�pW@��4��vϻ��|�����^���@��/[��ڲ�J�p{E�q�����˗����4�t즛&A�>�e��^��u����N��$�����!�{�$	t��{�Q��M�z�@�
���G���pmw=9��v�'i�t�;��UM@w�9\��I/���kt�����+�g���n߆�+B]���l%4j�
��Po8�a���"[t'�}T�{�|����&�y�']�s�W��^��}���Ux��%�x�T\�+�G@�>�.@g�t�+Ą��Ma���v镨�:`:���q�]M�&���v�}����,���	q�:ԕ�^v׀k�V	
C]�kٲ�����9T&!�!O�B0v2eJ@/�X!WC&ԱL����`��j7��2ԃ�g��7o�GE���:�H���jlz�����F��kM��ma�J/�ӵ�I�uV�Î��L4��	�%J��:v׽tus��g��Ύ��3�}�t�G4��t=�_꼏N%~�2����:��P}�;sS��T��mK(�/[�X�hT�`��y�&��Gv��r��g=o������ވ/��]6�� {tul�&����@׽��V���Zڤ邇u��1�Ap/<����W��X5yǣ��ߩO��9Nӱ�X@��Maw��4�����gݞƳ���v3�?�@�P����U�UW�����5�C�>p�a�_����s9K�M�6���i���=�#�SWR���󵾿=��6��~��z���?U��z�ȴkЍ�-����5t�ի�\k�4M�=����;�Q�����uq�������a
�.Ֆ��$й�8*쎽tΔw�=��Wi=��It
�:Թ�8S؝�y�ZU��kЏe��G������%C�zB�_� tꅰ���F=����--�@[nsI��`~�e��rg��k>F��-���qq#�M����7��'Qa�T�����ѱ�^�T"�M�q�[�+Q��z����wv~�ka2ZN��|��XR�q�ə3\:���T5�	�v��9�+�\�?����ח�9�H[<��)�|�f�߰�+�Ne�ۼt�
Q:���iiyʱ �}�h"�/�0��X@5y��K��e�5�M4��wؼs�,)�<
�T�F���T�Bݪ���N��e��NU�Kt��
V�@�!whԷ��H��^������Lّ�6�{��S?��L��<���0&5�sF:���v����u�_��[�c���{ct�>�
�G^7u�z�=Z����=�g��oP@�0A{�z��lw.�E;�U�J���Q��t~|"7z�V����_�I��(�-.�`�[�g4�t4:��æ�5Gb�c�P����O�}��f_��'��w/A�&i���|wwl��B��)�S׽:߼���a�J��Mm�A��N]H=��JB�}���P)a�4���O���Cÿ���n���~��VX�|������ӟU�6mmq�ԒM�R����uvF�쑎�_����~n��߃�w�{|?��Ϝmo��� ���A�ءS��'&gj�~
hnPWM�6��IZ��^�������w>������۲����vrl	/'�źN��c���ٱ��l�w��SZ����w���]WI& ���<L'J��v���D�!߿��f�E19��G��Ei������ԭ���8�d����t}~>���yb���f��\�Ѵڧ�F��-{{yt�F*+��DrU��⚾��E�7z�{�L_������6B����	���H:7I�}t�KGV᝗��Q��ϙ�ʴ�L�?�B��KǗ��"3U�q���%���;:����@z3ا�x^�?������գ����z����4�ѕ�c���E�15j?o�e���N��X{�~��~���5���>z�>@��Wͷ�1G�*��⫙�K�V��`�m�P�J�u��ɫp�b�ˊT�ɺ�����VL����4AS�9M�x_TAKW�U�`^n�s�L�O�P�V�~H3�o�tCr��K����ɃZ��p�˶`A����_��!?0�!�߿~�G��~����f}~�O`�w�w��T�K��ь�31���'\ё�q�(M@��x�>p2;q%�ĻMI��-�����fe�_|2��M���fרꎺ�P߉�t���$����Fb��}t�jfu�ъ�f5LOL�܁�r�$��\vw:���k�z����&�ē4t��ą��d��������Oy�e��}}�&$�?�{�
����:��]J�V����)��Qm�Sċ�(?�K�;���ώ~G�ߢvс��rR�G_�~c;jc���IS���4�9;1�u�͔g�7���9,���ٴ�/����ԕ�΅�c�Gג����I�Tm�R��צ�N
�������KW6�M0��n��IX��6��s�.P�J�a�*�㎆3��DMy�:�t�+�\������/�f`�Ad:�k��M��M��3R0Wy�U�R�Iz��3L��p�<2��'1��p ,,Y�i������A��c;�j
�W�\�\n8�4)���7�8)s�\��	qu|��2����(0��5�����趒Һ�����N
�~��K�r6;��'��9��x�j2F��jR��{�����e˸ԓb�@�G�0�(/�2�u�{{��}<�:�@�C'���������zNܳ������E�_�1�C�@��>����(Q?�%Pr%�/�ΟC=��D��w��Νa^�Oo��V �/Nү8�f�ҝ��89��:}�@��>'��k8G/��8�v.�����NuxO�@]$A���^z-aw�x�x?�u��J4QS���t%P�?\������e�g��V�7�$^:z�=+�E��`Y�T�]�'�mʛ�
���4-���CU���ŋ��}c"�hd��Y�wN�w��W��«���^������u�S��^:��^uQ�POr�L��ibla��Γ	��D��phȯG;�]�R��T������c/=��w.�n����E�ު���F�}t�Ħ�Jy�==u��y��햇u� ���uO]��2�s�U�w��y)��g���2�o�k�g��sе}tS��3��7�TJ�Z8��K׏�-\8>�{� ��@���+N��0W �l$�{n=��l�n�5�ԭ��X�A4&��t�n�%�� �15'�c�'jk�t]5��PY�!_�6j�v{������\��u-P�{�M��@�{��Ĝ$�Jp
��:��	�Θԣo<��r�z��M���9|.�`@'��Ĩg�?7ʢ��a}���s��� 7��	(�>���'���ͮGߘh:��R�)���U3�*ZX�K?������FD|+�6/�,2��t=���	�O}'S.㈬�sp�#��x��7
��mTw��f���MP��M���r6�J�0y�@�<-W��	�ƚ���n�:�9|�C��#�w��y�ʦ�]�+��	r\�8z��O7A]y��`��Ι��)���������t�����,�Lu*�^׾1���]��ٱ�krhvu���o�d��ݷ�]���8�f-�����e��bk�M.�*1�m�'�O��|aNS�+�y>.���:N�Kt���a������u�8���@��|`0qPdžB���׳�ljm�`}�>vu=�Ny�8A�����Գ�`W��L�?r����o�x�Wg:�5��-�8�?o����7&�f�/�{l�X[��οn�g����4S�(Q�-�^z՘�P�,?mZ���s��m�qE�%'�s�,L�=�,I��vC��.\"�+�(I�uw��������t�N����
���,�w?�s�``�C�
�.	r�#3��8#��pN�u���TI����j:�ka;�A^;:�v5A?܇����ڽ��7���6��o�v�B,/C]��˖�:��C�g��~�tj,�y(\R)Uu�T�a��gճ�ꦭ��e��:Թ{�Y�s��Vt�6�@��q���r����s�ctӾ�s��c�U%��l�W���E��N�޹I�TO�)!ǔdIm�&TZ�6oO@l�+�m'"Й���hD���>�{�I���:;�����P6���o�t3�-�͗Ÿwt,
�7�Lِ��*Yg�|G�_�~~������r{L�
	t[�1��n�����vKM�*
�ucH�X��
i�{t�c�ǘ�M�%�u���]��*3�v#���:�^6�8�w�$R�$��pٮ1,�� �xN��{^�J42EqL'"F�7����7�o�W=��@߻�n�^N��
 �)�暺S����zUG��}�M%��na�n5`�[�e<��&�Si�t��f&ټ�h�@�e%����n2��h�=+�,���S��qg3���`=�Ky�i�^aOOݓm��ok������~:�Sw��n~r:���	�i(�c��P�@�aw�1��{�/Ƴ��WsZ�p;��LY����핸<3��C�6��P7�$r�\��<���P2)��/�n�h���3�\��$P�+Z��:���%W{�Q���<���zU�	S�{�q2�K	_
��}o&�
�{�a�s�w�U
��D���,�	'f߱��c�ږ��<9zbo�Okt�o:�yKp-���*� ��L�N3>ӣ7��j*��rݱm�M><�s�0�R:N��	��ɤ�܌��Y�B{U�@y�I��//��*Q�8�����œ�n�;��°��A��'�3�7��<��Nh0�]����.�н�#C�Ѷl�#:q�j�C�|����#��/it�����W�:v�o%��ԩ]�\0�~�Z��%AN���V/?<�;��q�ύ�J��O�c�`'Ž�k��v5��l�=z�Z�N�}�J�Rw���ң:J- �0�
ʸ]���M����Q�Y���Y���̇(]���~:�H(�c�����RZ��y�g���^:
��4�_�'�[MwW8U�d�}�S�֥���d�H�h�9�$ș�+ss:gI`��4Qۚ�j�����if��$hԯqj��ة�q�\�&b�d�Z.Nq��g7��.u>_]y�z$��n�w���_P?��3�\������ᙠwR�O���l�
o=qaw7�_���S1^u������$�&�v�2�H����d�Gn�a@��Wvԡ�]�d�SP�� g�b�5'%6�Me���ҁ���l���H6�0U� 	�q�X�S!�sZ��':�?��.�Ѹ7�5U���SP�`���g�l�鞶���@�{��t���㚇`�Q��q����}�;	a+���X��
�_p'"��D���x��A��ʽƺ]��C}�?_$����w.�P�.R2�޹��Z��r��@nG�
4a/C}``g��-�6��\�1�}�+@�
u�L��|"U��t�.��+�O0�5�ڊ�̘�������L��P�B~;�#u��S�ן��c�?�
��:��dd��ND�B����u|�5PЏ��O]����V��Y4��)=�ɬ��\�?[y�z�*�q%���57����.ѮD@7_���f�[b=������U��P7�zq�¦&B�A]�uO��q�LרƺU�e⦠^*�2N���쾣􋖖��w۠n�O砾�7o��/էl�)I��]ؓ�$D���%s8���5�?���o�g�*�O%���յ�ٟO����OA=F��u���.^���mM�4Q�2�O���S��f�@)�8P߉�N]�zX���&G��N�&p�{��לC���Ff��f�������g���~���;u�^��}�dI�_�n����mɓ�f������ƃ��U��=IY�)_o���z��m=	��w��v���"V.[W�����&/���P���U�1߯W•��B�
�SI'�$�'b�'�j6���8`�Aݸ��u������>��g�'��/$	�S�bm9q�q���b3n;q�*�Å�K��f��x�M�ݰ0�N�Ҵcj&��y�л���rO��+�Ny�^z�S���
��Ưw�l���PǓ.uS�>��$L����\�|4�Q�	w^S�����1��|�6���t����S?�z�	u�[�o�W�>��Q[2q��f������ww��~1V@�m1/��|g�m��&O�#�n;��Eʒ:f&O���ME�U9��g7��_ꂆ|��(�ѫ&^عIC^�������/�88pP�z�B����f�Wݓ�,x���Kǡw�ۈE#���i��4�db�K�B�ӧ����=^t���z�3G���V�绺�S�^���h�/2���+q�w�,��M`��.IǦ-���q|b���>5�і��>��>���Yo�;w�1(�7�8���bg�W^R�f����?������W�RPǓ
�h�W�2-9�S[2����->�6�"����n��$�'��q�Kr���5�|6=��r���cGʸл��!b��i%[�㘚��3
{z���YO�<�0s\�_��&��I���);�l?��sM`w��S�O�S���L��f������m@}��,,��^u��a�h�W\��e��г�uPz/�L���f��x�L��G!��z����15��4)cn�k��KN�/e�Vu��
��K�D8ujG��%A�JO�K�z��n�;���	�+�k1j����ɻ���|u��H����o��tj/��:��c;���O�]�,�\�� ��N���m^��u�	��l[�6��צ����cj6=��6��a
�\��3E�K�n}�|�<%g/��_�/lv{������=	�uo�;w��);���,8���� ��0���?�@��`��kV�c��;-�~e�Cq��j]���τ�\�K�n��&���c����]�iw)Ԣ�����^\=��ҩ�t2Q��7�ppw�t�̫�ǃ��M[��vHU�h�Ug/=	Թ�W�|1�����O�0�&t�Ǟ�����!��ꫛ�7�&Mj���^s��C��C}3��L`߃����x�I��z�׃� X�����y�rQ��!�K��
���-��
��r@7m}��nʕ����yJN^�
�O��Ą�r�*m�i����]�t��6Ӥ�&^
�$\1�1�9�.����Y�(����\���L�f��z�����d� ���]�n��M!j����ۑ��9�/������v����]���:ث���j�Ɩ��¸��>���I��v�k���f,/���cBE?/iKK�/=Rn0��k��+��D�!_z�]q&�$P7L��d{��f��F�����܋U�DT��.`�w�܎�z���\������v��㍓�}�sW�����k��KSd2�>��>��nw��l�v�c�(勝�����f?�h��e�f�
�����*�J��jlW����Ý<�<��Џ;��L���G��Lf��co�*%�|@>�C�q?�
�i�=ͅ^9���A����2���>ɵ�ޖ.:�>��';;���$z��[a�}��$Ǖ�{�-M���|�7��6L���=��g�_���9��
��t�M`O
w�9؛ww�����S����--㻼`�pk���'��R�?[D�1��^�V�/��	�B�,�z�����cL2�n��eG�ﺄ�/=�Rli��9.J0��}�e��c-nr*���.�K�B�zQ�ۖ�ͭ�7l�dւ�4�?Co� ����Pw;xWȻx��mPw�|AP����A�V�dc���X�F�,�~0��C��a�dL�q��z�5B����C���	X�ki����v�ilS@���/��v���N�g������)p�m�f���)�ȘԙE�۠Nz�8�(��6�u�ab}�L�O���	�>�a�S@w��>���N>�'��q�J�:��o����|�������f�Y���d��r;�jY+ԓ��z0�w4^
�3��|E"W�8���?��>ᚿb;m�ͭ6g��~�3�o� 	��h���4�j�۠�
&��=�I��ԃ��+��;�'��g�4I:S�����͓'�ܘɼ��w���O��
��$���þ�3����'|�)��E�\[�qN����ݻ��.�Ɨ)�NA�9����q���g��\�(A�m����+�zދ����#`_�����=�^O�
v��(#v�������:�������[x��XW\V�X��L�{,�Y =�}�~&���vضw\�΅�/MD��^�o„�aX�
 �b�#}�~."Q#�c���am�f��_��>�a<3�1-�5���i'��Ü���;�y��Oe23���E1�k��v����3���2������욝��s�^~-��Ͽ��K��K�����y������^_��:��9�L����ٹ��yE�����\4��y{&������WAz��
;����!�@��t޽���~�����{
��e���=l��ɓg5�s�D�A{��i0�/��]S/����8�#����m_�J�W�f_9L�8�y⦛&5���D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$��ӧ�����+��=����b�;���pa�܏>
��_*~
�[�y��w��]`?��0����	�O���w�>
�]X��Å������W��-�9a��f~�H$�ƅ®���̙�{z�Q��T�����9s�^w�����_��sK60Pi���6o^�͟_�.YQ��K�hQ�-^\�%K�/�	�?��o¿}��vx]ΛwS���H$�D
W8s攑Y�^�~_~֬��{z�f�/Yo�͙S2�q������64T��K/Yahh'طG���;�d��Å;���E"�H$JUawwW���m���;
3g�f���g�0�ԓ=�����A��˶lYX\�\ٱ���߇��
���f��H$�D�^{�U��S��O�P��7��K6cFx	��(���'�z/��X�^��{G�//|�`�ۨ�:�'s�
����N��;�޾�؅��;:6�;;7仺6�Nݐ�6m�
��o��
�36�g�ܐ��)�����s�l�����C~��
���
e��%�7/�͟�fi���,0�…��hQ�-^�����Q?[�L�s��a�o��F:;_p�]9S�L����͚5���7�A�6kt��K�T��Ш-]J۲e������>�9A4�42u�ȿT�>�(X0/���&/},B���#�c�G@_���
+V�)�Z�7#�V=����
���Cz@O��,=<�+D�����”)!�0mZx��}J�%����o4��-!��}5Q�(U������T�3z���<?�����M?w�])��Z�js<���s�/�z���>��A�DwJ(�D�o���zCs�h(�����C0U
<j��P���iB�6h�=�-@���ի/Yaժ�#�W�;\�:��l�N�O�O�M�������)���cqRO
t��M@�,���޹�yu~���-�;wfd;zK���"Y�^��N�f			U���](6P�X���>��.���"Q�����<��"�(������[O۲e�zٲt�ƹ{>�w4}�v������;#���˶<3���_�N���gd���Ac��m�?W�0؋@}:.�B~�-�[�������WoLL=R���=~���]�=�k��z5�e驠^��e)u)Kπ���~�6nl8�����%���o8p�sv���[�P���}��nP�z�C0��=3
�����N���g�n5
�T|��.��t���b���&�}ms�*���jV*wׇ��s��O_����^�P�.��c����l]Z���t�'lӦ��ش�9����z�My�\to�@��B�.�{���{,ԧjPgza�C�s`�P����
����g�����;�v��~���-ԡh�UQ���f͛)⁩�z�;f:������R�1Yz,�C`�J�E�ة�E
�1Pπ�����ƍ�o���~�Rg>���`3���0[�P����f?]ЧjPA=愆����'��S?p�d[�W`(��c
�1�P��`O	t
���x�x`�}}�|ep�.C:�j�hE���k��
�‹#��+i����t�͛�׶l�n.c?�ظ�{{������r���� ԥ��P���+�
�JR����>2�J
?pI¶:�-�㍏5)�>�@�*��Ε۹^h�P��~`*YW��>~y֬�|ɳ�q�*�s{����=v0M'/����,�:����?�k��Tg�_u����Y�)�w�$�	豁]���	�Ե��E��@��~p��jc(ƝP�wE��C? c�6�bg�׌�_�)��T��̘qǥ���xю���%�s`�pO�X�k^͋#��1�z��;�-[~�92��^�KQe@%�7��KP�n��P�z(���b��:���7Z���)��%�|���ý-�����\<����5E�ո����~`*A�j�՗��N�3������v-ܵ��@^Z���u	��~8����
f��o����O�
��C��#mm��T@��e�m���щ���/j��P����FF~:���~9�V��2�C-1��	�x;�[>�-?`wI
������/L���z���]>qpp�Pg��TzA�;�{��L^���Z�%��:���]xg˖��ڇbu��%��^��4��%��gu�k��m��������������{md�;R��[����1�4D�"��CZ�s`/�S��x����ޕ�L��V�:x~pp5�Cz�:��9�k�},�cO�_վHZ����V�{�Rst�=��'�^r@���K�(�}���:v�5�m�tj���Y?�2���}���Ƚ)��M�Kyܹ�.^�����;�zJ�h��s��J0�Gk�5֯:����G]�<�Q>�,�z�9�S��}lfx���De�E�N�C�~��q�^��F/:��h^7�S9�}�NA�<�z��:�L-��-�"�v�j���4P���G֮�����a�S1I5"��S�{/� ��#6K�����_S"��	n�G�,=Tz�`�]���{�˜X�s�:u\z��������fU��+�S��'O8�{;��f����l�IN�z��Mp炰��Q�4�ʘ��f�;Un�~��蓩����<��A��l��X�h+��1���ew�G���5sxD(��PYz�\��A�[,�c�C��ppG/�JN
�x�@���qph'@��zT����E5�����\)[-�.n� �ƾN��T~p��Ǡ��A��5"Xu��B'~���$?�> ��c����׭�x�C�^�}�.�]��t
���2i� -��t\Ѐ��q��L�E¥w	��?������1oo�'�{��ق3�Cs�5`�
֡>�XmJ���י�֮���R*?x�=�L_���L,��~@�B�>��b�K�w�^�ڵ��5u�3�g�� 
�8K��N��1Ի��E��+��e��CY:����>ta�B���Qnh�!�G5�IP�֘�q�F'���I*�K`�0o�;��3�K�$�X���6��0FM,�>�-?�*��+�1
rk�v<��TP.��!���n�R5��@���d����B�����_.��w
u��C�Of�S��r����uﷸ�=8�]u��mЖ����C;I1&�S�:@��ί��E��R��k�ΠC��x�M}@u�S�B`�I(B�w49��~}�ѿ�:]���?�
�HYz����E�\ʸ{��?������V�8c�/,��K�P�>	���͛k��C���;`C{!��oC���q6��"�)�>4")�SG� ��op0w?�Y�|K*?8�j�N3FŬ��!�K~�
�@[),�3ܓ��5E�L�:�偁��o(K���e�E�^�~e����ã;����+u��Ε�1�'��hsttʌ�=���54v�p�L�~:u)�sG�Y�a�F��@�"��[/5̡k8[@�a>��>Qn>��^u@W䌚&�����U՚�>�x������P~@m�qP�yB���[�d�)B�����Ł�#xW(Kה�E�sY:��Lm�Nel�ϋ��ҝ�R��Э_���z�,=�z��k�}���g	�����9u��Ε�U{�T@��s e^����f�������]����p@���~p��Ǧ,N�H�_��	=1P��>]��[�u
u�u뒌�5E��m�KA�v�ˁ�N���BY���+@��Qk,�C�p`���g���`���/<��:��7�z(���N����9̟�՚�"�sP�~,�ޣ�R����mr�[
ښj���AuM@���9��a�e?c���L�/��A~}��?�H��9����P�xe����GS!L	u��k�D�e�2���^<7_����p=�����5	�����e���o�J���w4×L�:l��P��鱥��ir�>8���=yfO��`��w�.��U���@��W��mR��1[G�m�P@�uw�
P?�|�?��^ʓ�S��{����!
��1�C�LL5?�|/�m?��Gug�5k�K�&A/�j����.�D+]nf�tua�Ke���o%�1�9`�ۛ��?�(͔��:\9����>9I.���͑�oꥏz�?M�;u\z�]���`��b�#��Jp.x�����*���7�0s���.ܔ�\��96t�}P7IPUz�v��n��U��:}3[�ѿ&���j��V��~��Z�P�P�9�8nx#��)Ƹ��訠Ae���N��!г��-��K}���9��/����[�ޥ9U�Ft)���ȊS���u<�G���kΝ;���m����!�$�B�w	�!�w�8�S~�6��>��)}�$�D�G��-U��@�V�ȩLB����.0�����<����u\�Poi�5�IgZg��,�bs͚��S�QP�J�,]l���:e\cSlg�M��*�s��֩N�М���.|3���նA��aCx�n�ĥ��w�Z�i��d? ��B[~i��ǩ���Ƚ�S+[�dŕݻt%̹���8�7��F�C>�e�/Z��)�ӗ�LX�u[��N������Gr�`ǥ�$Y:��Qv�8�6ST��~���!�}b�uj�,�S>1	mgj?8���z�бԣ�t�Ž{?��?�����>	������[S�����Z�_C�V��5�E��M�㬜9q�sC��N�ߏAϝh� �OAݿ`���O��1��o�2�ܰa~/|�2u\z��ҥ��<f�&�#��T�${8�S�B7�Q��'��aj?Ȁ~�<v��˃��؅�T��j��U��/���N
���T�����%+i^2��&:��s
���MN���b�|�tn�-c�P�/����9u|�-���zg:z��y�_��_1�;���t����&�w�c�>p�X!�=T��.%�擻��6�/���c�G��!|���M�ԴeL���`�Go��@N��l��e������?Q�*.K/�&���Y��`�A�!�^�͑�EH7��x�AB6��-�$�ӹ�;ule��
k���G�c�S{�Թt�bٽ�`^��.�2�1͙Q=�b<��}��y�H�.	�&���:>�(�&P�S�ҧ��-�RC�Y�{���5r�]uN�Ϥ�N]M�㨒{hR\���"V��0��f��¤K#�c0coK*Aݿd�d�]�.�}Ͼn�lt*;�P�Y:�x���
��c���E�2���j�T��x�����ܹ�R�At�"Æ�	�]��LA? �rQ��k�'��H�&$��M*QQ@ǥ*-Ѓ��E��E���r��{@� B����ҡ1����6�$u�$'��5g(�g��>�Ϻ�J�sY�Tv�P��
��&��ܩ�ـ���� �иS?DeΜ���+���a�
��M;l���10���}bSn�������|��R��	�X_߻�ß��a�5���'j@�T:��)��ƻ����g��!�1�_��H��gK�4H�k0��n@��S�P�Jw�荍���~K��#�?+�ݓw�����e����PPWei�T�.X}Μg���s�{��
�s	��5HN?�w*�K,)�/[��2���뙁�OSc3�j6t�C:.��vj��vn{$С��2;�y�-�Ο�ɀq�B�BQ��
�H[���&9��8����}�;͵k�
��:Wv������#?�n��TJ=j&�fJ^~L�~�}Y�<�.�<��Bs	Re�]�� ��g�K
���ƒ��5!9g�:���I0й�8��B<	a�;�u
Щ�\s|�!M����Q��2�:~ٴ��P�,�C�S@w_;���[~��CBٽ�>z��9UCT �seV.��腡���ֿ���$?؆a�4$������c�~����QGg�y0�p�g�x�k���������\myJt���=��e��%��9�Sٹ/�c�c�S��'��U��vi�t۞���m��P������'���1@���c���SM ��J�z�P������_�����!C��"�m�1G�)�B�މP�;��l[_El��zsɒ�U�n9=���x%�L�u,�c�SC���I砲s����U-t\n��y������lo<�`�d ԩ�{�Af�Ա�@Ͼ~|Æ�\��8�.�S@?5(�[U@��v�+�㈅i��eL@���v~�����3�3s<d(f&�K��1#_~t�pP�U���;��ҥ�G��r=��-��q�x�	7��$^��Y��q�4𿥽'�%��.e�/10� ���B�b���Np3���0��^$K��`�]�:zcÆ?�F��tM�;	t�X�&�s�q��g�e����(������_oΚ��e��:w�C=4�@�Y�i���NUz���֙��G��r9�7.�dqy�+Qa��r{�#��P'J��%�J��[���s�-�,4�BZ<��-ذÖީ��,����yt�}����W��>�L�����%�ٙ
�E�Ĥ;�,L��T ?L�����ު�2�D��ٯ���3�{|�@lsd�w�3~@��c��
�������v��aY~p��p�6i\&u��tv����]n��%K�T�\��2�8�Sٹ�<��y�iD���K�d�v����1�1��׏�]����wZ]s��dg�q���am���:����^�<��X���/v�>@��KP?�����va�d/���dI�ѿ�\诇JS����~����bKU1+[u&K����c���s*;�0�S���[�WjF�w��;� �t����!ԡ������l�}\�Z��=Tn�z(�gY4	�`�i�Sr���B�_�5��e�A�Pcd�i	�l�*Mӣ|��.�A�^z��w�f��ŋ���59�T�B�O:�I���V�'[���!u&K���A��o	������:q5�xS��$Y��xA�zc�����yk�3*����:����MP��@0/s�+��e���p�ӬY?S�<��~�t�A:�n�C�/�)?�|�C?(�I��a3�Pzo.^�|��zv�����:Bc�.NW¥vmvZ�ʖR�:���2;r	4Җ�fWz�t��{.���ܞg���U��at��
���@.��g
��hTnq��8tr�H0��$�Föe�]�5�#e���u�a���ba�kf�w�BoP'~�a�f���~��x󮻒��599�?���zT�3��@);O�"�����
�����N����3�N��i`����~���ou�`�{[��g��=���8s�k�[���z8�C�������"�ק9b�f�p����.^ܢ��z����[�Se���ڦ�X��{��@.]X"\^rÏK�\@�EV=�����ئ:.���Sq�[�ϝ����~�
��0��������-�ni=����8H8�f��!N�����)9��Y�ա���)������_�|��n/?���g��t�\:��^6�qPG@o�]��e>7��U����ut.�k��A��۝ow?��}���p��=�g
fΏ�ׇ���go;�<8��-go:��좳����a��]v1�o�ܷ��'���濷�Ff����?������B���m1@�'v0��j~P�;�4������~} �y�s��?��ϒ���?[���lΜ	�7o�,�^�?��I���\f�/�_�T��8*1fU[< NB��{.:�-�)����:�����lB��{�8�.5�IGب,C���׮�ڜ3��{����@o+��K���A�?v��dY��f�?�#�S1@?G��+�)�[�Q> ���9_��5Mq9��^tu�^����kK��`(��P����jΞ]�P��}� �ur�
g����zs|ժ-e=���Ƹ��#��@[�C��E�vHþ쾷>o�]��̥Er,��1��p�D~�~��$ˁ�I
"Z��\7�:�X�%�^�I�_�3�S�~�!=��{��5{�Tǻ�G�ݥ�8��SP���fMi�N3�g�#���5J�Х�S�z�Ü�fh�/g����Е�����@WUi�8�}�����7��x��&���$&3䀎;��z�P�K_���?��{��5��&u�������\s��C��@o<���R=t���1P���
�q}�B�RE��lJ�K���L�H?p�o@7�r0�`�"�ޘ��d�]yfQ���~�Z=�Dto�3��GF0�ewE�{K�=��=Щ,���$Џ��܎:5�3�ЏCSP><qIŤ~\_�Ȁ��!t�5]�1�}r"-�B>����~����ŏx�Ke^�e����r�b�P�K�>+
C�/�ċPo.Zto���V�Н5��-�:�\`��W\ٝ�v�w�{�S��<�%�#�g���ew���<�qc5�'���"���_Ə�Е�@?PKt�$����)*1��X~Gx�/��_�؀n�� �;0�P�z��`��G�@�z������9F{���{���.��~$��nw�U��[�kUq�=��9��x��e<7t*KWߴ%]��p���6pɗ��;6�+�:�}�:;V���4ĝ�Z?p�g@7�r�x�IT�MtnT&yăZ�j^�8�Ћpmx�s�~�1�@���?<�	"v��G����N5�QP����ե|Џ�t@���*�J��/H5>����t�]��Х~�$@�ۇ89�b�8�-]j@7�:��w���x��j�
��P5��*�Sw�r/@V��ז.���g�=��>K��Г��nw��c���j�.�e@~�u�>��_��SM �A\��##t�<�)��N�z[c$�gTr�Z���n�u���h�g�Z�s�qP�`�r���\�hv��u�2��@�Pǟ�Tv����S��>:wn���N�8y�S�q�)�.�Z=й����1�+��:�S��>
\���I��M� �{�5���@��l	.SrY
t|�5^���_�/Csٲ���Y�hw�=T�>�C5���&�9j�e-x]Sv�P��恞}�����7�s;�C�d�xٍ63���r���?6f@W��f���bc$�}H%'Tb�������J@�2�����8B�M\V�;�5�}��ċ�^?�Xe@ߝB�+��ϥk��q�C������M��(�SYz�x)
�83�r�(�}�e��|�])��'(Զ��@~`@7��W���:�Q
���Q��ܮ��p0�#���Wz��c�+�n"K���Z��8n]*�c��9���U�H��2���k�ƸX�������(�����]�)�@���p,�n@7qr��+\�}B	t|�9z�1�o�A���3�x�d�;�ʕ/�9�*����쎁.5�Qghۂ��1�:����	����gS?7	��p����6	й@^|aj@Wj��������M��V�!�q7u�n�*4QI���Ώa!�X��-�wY:�G�b:��E-Rc\��;h���U������Z蚫hKz� ��+�J��N
h�Љr�� 9�3u����U�xu�Y3��0�%��<c�U�n>��}�P�;ש�=�, й}t_v����7��ʕ���a��ƸR���M
���q`t�b�.5�vt����]�E�9�
�v9�@���8�!�܎�s��KX��=�q�=���5U�;h���=б���~��Ϧ~n�)���R �*M+WЕ��@�(�-D��h@7Q�[����NJ]j����f8�g�@6݁��t
臙��?��5���ytXv����>���~nЏ*��tm
��9��[Gt��
���rQ���M��W�~
/�:�K:�Ǖ�aЃ0�"�ƚ57�ac\����(T0
5�qewst�96W�������;�􎎭�1�'єz`���d@7Qr�g�9gi��x<*t����m���%��4֮���N]����
��t�
����g�O"|�R>7�)�t鞊����@DZ̀n*�=��'�� �	F��d�����
QCVcݺ�
�{=4\���D��t����|v��X��S>7	�����\CaT�)Tr7�'Ӕ:�k��8��9@���fĨf�I����^����S��������g�3(q@�X��
�f?��	t궵�Iq�.wzu��I8�5q/��Djw����xў?͞-sp9��tu-�g�H���&EMń��t��oM��0��Y�2�<�����r7���m������D.��&R{��G���U����t*;� �q76l�e�~�HS:wt�[dqP'�~m���N��4@���=��Q@�Y��C��m�gn�%.("�┌�“�ِ���=<�7��R�@?���L���K�x_(�!_�>j�<7G�}Q����[J.C?����(У������>8퀾� Щ�����=�!�'�X~5�s[Q��}Z;���!��@N_�s��[��͆�%2������Ȕz�]�ԴE��{��,13	���~�?���w=�wz�r�8�
�G�'5����o6��a>��y�QM=T�"�
�G����.@|-�s�����S����,=4-L��Sr��2-Y!�z��~(Х����2�So�����c��I�x������ Q�&�M)��f�s�ƍ7��q��N�x�L�ZĦ��YtiC����S>7tnZ\W���l(�r)xKArm0�@��D��Ɵ!����=:u:t�TJŶ$wT�͂.�P>�r�:��o@/I���F�J��b�^���y����7m�n��@ǟ7���M���:u��
�rk��g�@^̹?O0>[�~���Mt����V�4~����~�)��;���5k�e�;�-���.f�b•��o}Ӧ[�>(i�.޸Vt+���g{!�s;�腦R��Pv��9����\/���n��`�e�zt��zL����p�qpa7
� Xf��ya��$�TF�@��E�=4UK���?G��].��n�:\��`�����m��[O�Ε[�,��8�jъo
�c����k�3�Ͻ)�Nn��,�$?��Y_H���\�9qISc�Zz�S�lİ����k��g��dj�� �q����=b�i$��q�����h����zn)��g,V�pv�	���I�y�T'34��g�@o��hvT�}*�tMv��e@/G�\ꢦ.hItq�5t�PT�{�7_7z�L�����wR���裣H����j+	��
�3�:�1A��Ys	�Tv�a�A���i���p;Xz�P�>�.����m�u��eȁ��!��/I
��U���y��@߼ـ.l���z�:eЇ��zn�z���3)�C�KA]���	��H�t�x�z��~B��5[/l�F��s��n���pY:tMv�v����J�{�
���TZ��#kp����
艁�
���ѕ@w?oi��Vй3�l�;��i�9;tc�=1ԅ��R�W��Q�7���X1}�^t�.�,]u�b}!��)���c�
�e�����0�p�Lv~m�z,й+T���}��婞[*��.�3)����;������Z��K��M��E��-�`���s�`0�O�T~Pz��)	t��@߲ŀt|����b��T�-5���Oi�T��Q��
��!�ߧ5j�u)K�Ɂ�n�H;�����$��쎛�8�����r���0�$Х3��9�oe��z�|6�%�@��l�TϭL��(v�fgR�����TP��>������b���+
t��J
���AQH�Թ�tM��p��Ѯj�3�\b@O�N��|��S��@ݒ�u�l��{���9;����5�q@�P���=E���Џ*���^�;X��w�����^:��N�~i%����0(h�{�]7;��p����Tϭ,��#K�d�fg0�SP�`�;4�����#�{`�SY��Ґ��:���������	��
��K�������M�+���?��@��	����3�<w��5�l������я�zn��:;�fhT@/b���ع���z�׉�z�]:�ж�B-�BP��~P���5zy�U����N	�q�������'S=��@?Iv8S��$�a�NsХ���2��"j̒����L��C/踗�m�%���p���� g�eʕ��B@O�I]:Йwz�@_��5�K��x_���K��z	t��
�8�ǘ������}����ҨѰ�]ſ��ѯ��.�v�[/Q;
�S����~�����z�Iq�@07�G^m+}6�&<i��fz�$�?��u��)��q�\�P��~&4�{A��c���6�[�xaWtqW�P`�S
a�&�`$��r/I�*��>^"�;�
���T�]���اR=�2�N�A�Oqv�sԱI��
ؙe�eTp�4��HW}��<{�]�Щ�H�xa�-����9?��X�����A��d@���1��e]z�@�=�^
��%��u�˖}W��6%��eg�%シ���j�ei�u��-`ccS�1�eb���K+5��n*��ةŝ�D���$�T~}�臀�?���(��Tz��VO�@�P�.�����GR=�=:|�bv̥�)���Ǜ�e�k��A�l��l��:���n~ @=x��{��eȁ�G8��.��Ʉ������M�k�D�z��]y(�s�%�U�V.�S������ޒ����KY������GFn���/+5���q��65V�6����+��@�ewj�������6��f��؆T�mJ�+�r��
���~����yi��-]�S���h�^�ԋ��u~@-�`�&�5V�2�����?���%���=s �(�A`��0Հ�~������J�{_�*�9�KMM8�K �aR�
�x+й+`�
w臦#�;�
�E��;�֩;�9����o@/C�*�NM���Uzǚ�@�P��>9ld裣L�ܦ<�c��&�����U�ؠ���1�:�	>yi��(�;��X?�:c����Q�+V�ː���C@����_���9�������cy�'��ҥ#��[�@�Ρ�.�d�6��L�����`Wr�ЩNxn6��E"=:�?�������J?� ���p�7�g��zIr�G3�c�k�{�?
�ug0����A�v;��&`z�j۞�u��96�0�s��.����&����A���
u1���G]"�pa�T@�XW�00�t��Vm$�s�rh^����9x�:utM�
�����VH�w���:}Y���l�I��B@��襔Z�+D+�7��_�A��l]�?�U�Lt�,��m��?��&4P�]�˖���Ι3�x�?�:������ߞE=sZz��8���?�=�r����MQI��J�oߚ�ҥ�T�
�۟"�tXjeg�w� No�
t��Q�C�͛wk=���r��W�q�D46f@/C�$�sg�c�~^��!�-�@o+�@��\N��B�)~Љn���|n)��>��m�`�Rh�Tȥ ~)����s]���.�;��@�C�K��C�G
�>��̋�A��.��d��Ȉ��9s��L$����xQt?#��^���9�ZhM)������u��c����a�@�\@�T��4��κt�X��z�_�
���)��vqug��az���w:���YtjZ\��_G@�J���7��š)�e�N�|nП��4!��-[ԸOm0��9���z�l��6��O"+��{\���Z� йE]?�w䍂�a	ށ��d��,=V��%w���,
|t�0���|?��|�r�u���gH��2��)q��.u7G���T0ǁ�z(��v��&��P�'��o*�s��Q�:�%,�����9���]�T�\?��˒�����8<\���M]:�7l��ƍ7���� �s�Gނ��)��)�:>�^�R3�Xj�$��`��Ψ���9`o���]���`��sw��q���O�!���5��%�+R9?`��йE���:{}�BzYr�Aj��t�)��1ǣ��r��D�'�a@�:�K)���i��N��tq�T�5�^S�\Qn����86*��K���i{� ������Զ�����?�b`?�;
�?�wQP�
��˒�v�>:u]sA�|�l|�-t���?�!�<E0
�6�#�)��}��@�����x����]�w�u�CÙZ �S�VXrǁ�⡀N5J�4�A���09c�w@G�~���� =�=���X?��:1��>o��,�S��1@]�.ha��
袮�(r�9n��渫���=�u�Ț�9���a�s0Ot\j��Ym)��`'�)�3.����Q%x�fu��[��D@�#�*�fQ��k���	?�ew	�g�~]~G��ܹ�����"�}�]{=tAK�^m�4�A}:����0�R	n��dY@Wܪ$��Я��~.�sˀNM�Kt������ШT��'���P0�Pqv�	�1��)�߰���W��J��Z�
�a�m�E�T{���]Q�N��9s�e���3�SP�㸳��׎��@t?�,��5P���~��_&��%J�ttߥ�:u���p���N�ۏ�"�f���`v��87"�
�\0'J�\��eg0���W ���9چ/��a]���s���}(E��n������0K�ew��?�0��篙,X���e�j�3�w
@玮�ƿ����:Qv��@��`���Mh�y^j��r�o�����C)��1�GJ���1�A-�pz�ݜL��nfy��4���j�
<�
�����������?������N��p�|<J��-�C��g탎�����'>ut���q_�d^��:|v!���<!���@���u��
Et��:�GAn�H���0~�~��Ԯ����(�:ݥiqdy�w6���a����0�`vN�G��C@�s�1��-�8;o�p�F�V{w��w��r��Ǚ@�̸@��;����7�+��C=�Q�bnz�?p?ǀnj��Z�G�1��>��ӝ.C��R���{YY���#�5٥�0v�LJ�C��@%�s�~�V�[23m �;�qM
�
�J=�f��53�ќs�8_2��h9���h K���ڣk�<.#\�����5tn�+��t���Rg6>8;���P@�ĕ
��{GGw�~n�\�����??
�0`g��
�ze@ǓC��m��ˍ�*wg8���g����M��f@TQv�㨣k�Y��W�z�s�ܙN��tX�?����\vN5tqCQZ:��6լX��QC��������A�=��q��,x�j4�� ��/6�+���.���~��܈�rqÙ��Z�W���~��֎j�� �!ԥ}tm�;���2�w������>���О�a�a��sXnW����Q�1ԩ���WS?7t���m]�=���
� N��K�Еʀ�����Q�r#j�^�q>��[�1~�߀n��@��T��ѩ�q�1N���vt��y�(K��@w����)�0��s͵�b��o�tt�k�K��D��v�D�:!�r���
u����t��V�$ЩS]U�‹:�?p�k@7�r����1���%-\�{�ѵ"�_��8���>��B���9d�G�C�����Uӭ�9�E�Nl�s�;><����t餀��ީ��r��Q<{6~��z}dĀ��%���U��E��8�1��h9x$:�:Wv�㴍q���,:����y���7<�_@vT�9���]*������g�������S?7��$�tx�Oj�b�����S0��6�`P5�+:HL�]5i�Zw�t��w�5�h�B�]��^�1.��v=��t�{v��9��!��~���av���a�q �--�'��/���0�)�w
�kg�ꆯ<� ~
.�����Е*��B�Œ�~`@7�r ��ҩ��f�{	�ר�:�qcUvGPol�4��~����؜�@�9.������䚒q���|菗�� й�\t�R�f�bHz~ ���7�+�}O�����I� Qi�riޣ��
�&^��C�ҩ�{�}��q�쎳t�i�/�ʃ�Inl'	���v���r�8��k��J���`�=���/���w@�wt�J3r��I�PS��z�R{���(���-�X�:��O���4��x9��:�ҩ���<z��8r�{�m��=��t��dz �����68�K�qvN����@��[3��枥K��g��΍�=�-��zB�ԁ��+VЕ�@�Y:.�踏�:�Z�q>�(�Xa@7�r�t���;�G�ew�>:��#�\�ewM�����q�����p~)�
��"0	�8;���e\wn�08A�#�_[�dm�/zh�f�p~��f�@xjr*�g���5V�4�+��}w���t�uE6Fž �8�{@~�րn�cƌQ
�ew�Z�}�,r��*U��Po<�������:(�z% /{	������s��.� /t��g�K�����g�.��{t�>x{����z�
�JA��&��D����T����k
�&^;��ns���t�����:���*��,A}�����/�`�`�p� �g�l��:5E:ӡ����hi��s���+h���̸@
��W���'�mG�>
����<����M�vT*{$��,���`�0����t�������
|>{>�����?�g�m�v�v(n�Y��y;�WY����9w�����c���@�}�/N�e��ۀ��.�] 	��-�k�(బ���}��n
��� ��������g�p/������S�j����s9�3����sXj���Y���R�mP�ggA���ϔ�<S��]�R�U�qG�X�ƀ�Ԕ:���ss��7��d=:s���e�ݣ�J/\�B��`�j@w�]��7_���yF����1�}s����۩�8��r�	s�ݞ�/Yr_Y�YtXn�?X�<�q(t�N�����]���Q�@��߾��3��m͢�Aft�F;*�ˏ0P��|�f�O���k�t\�/DcݺR�޼�6.�6�ͻ�>g�R���ڽ�n���O��ӿr/���g�����J���ޗ�gp)�0[�`�p� �0�������?��܅�FVf���,<�av~��K:Wj嶌���*���ڵt��:�W�*#��m�Z�)�G*��y�?R��j0�n_�xJ��e_��I��_bli��ٟ/_�g��ٟ=���#��d�>g�sx���:��9� ��9,���9�^��!�'/��R�>�L�'q�=�/(���W�"��Z��n�])�Q2�}'$Ɂ�m�E���Ma=Z�|����K�q�.k�=��_�P�n0	�|b2S۱�wS@�z�g�Y��>��+{��߱���m��9�`Ne�l�����������K�~�L�@�`����9��/��8x獝כ;
�ja��$'#O#?�F�&z���f@7i�Ȍ��E�t�����K!���h��`�c�SSΊ���5P�`��|�m�9Un�z�k�.o��L΀.e���s��.wM�5t��[v�2���t�8��ƸT@Ov�V8��2,k�z�I��ʙ�P���4ǩ�c�c4��KxH��D�\z��@��� K����s�%r��. �`ޖ�s���=���������S=z�!z���6l0�+������P2B��5�j�.�|bqg@7��H��?3�=��kn`�V�M\���@����I�|"���݉,=uv�<�/
��9,�k��#�
��yHP��?_][���e�/��@?�������5�8�� >1 ɀ�T�]z�{)?pf@7��]�ԥ�{�,]}%�.�+����Ɉ�p��[��1@GY���]B��f���s-�5Y:�y�j.Z4�l�}*:��u|t
��Wt�F�ؚ�;J	��i��1�0I
t�ݤ��}}�9���:��6K�&Dž���wsP��K�HwNc��]���yfً����#��tu
씽)�f�l��:����.��_7�7�!���߸��9�G.�g(�C�{�!��܀���N%й��������dʀn*$�^F��e=m��CPW��&��#J)�c�S�y��Mq�~�ݙ,�C���%{��9���r{
�c����Y}Ѣ���@�������5
�p�B��p��t�
�zut��mT�O�J�ݔZ��u���+�w:�ҩ�ti��E	�9�r0u���ʦJ��av���K��,��z�!��d��Ϩ:u�&���f���n�nt�����p(RpJ�ft15X6�Г���~z��t)	Qm�Vj`ɝ��M�?
�89���2�t.P�_HP��"C
\L���g��}ɝz$�9��`�f�x��Y��VC��@�%K��-��@�`������p�f�c�S�䍍
�J�' \�F�z+5�Ž�G�=���TD�Μ�1�"Y:uiUƢ^���Q��i�lR�QB�@a��a�=�1�/��,�s@Nj���
���3�Fsɒ{�巇ПD���"@O�e@/E�ۆ�0@�j�%j�^��Tj覢���0ԵY:w�*�x?����Q��H �2s\n�@�0���:rsU��:\(qewuh��/�Z7�6:��c���2�O
����ѥy�����R��E,��Bz�R��N�tjz�Tz���۠��<�q�����<pq�"0�ٹt��SPٕYBv��"I� Z�pu7}��
��HA��C�e��1�q�}t�^��tA���j�P…��TH.K�&��d�[�Y0K�:�UP��`��;w����� �`�#��e�@���5"��/Y�W���$��)�㱟\C�Z����YS�^�(�.5���� i@7����h�N��ʂ����P��+v
��1�B����50Ot*;������Duc�9~�d�B�c�+�.-8q'[n��ы�1�G��Kg�q��\�i.��ew���_�ck���ҟ�:��]謧f��E��B��Hg�aƉ���78�x(+�`�ΧЩ}ti��u��˽����O�P���ѵ�r�����1�܀����3-��Ž�Od�7�Z*�S���
��zt���|D��s
r��.N
�H�+	T8sǠ�����ga��@�|J��np�ԡMlU\n.ZT텯B�?A��Sj]}l���hu
ti�7�Pٝ�~	��5��:�#��M��)�s����s�<��NA�Dzp�!�5��TY���9*���y4���T�NA����E[{��1@?@��vK�=�����qD0����*tm¡��]��,]��L^�k@7u��ʊ�Y:Uz皐8��=+\�'���3R2o�1�9�KW�<��ڦ5���p�k�ŋoȀ�`���:��N޺VFv&e��
�z�v[P}̖[�IYz�:U�ݔB�_�nb��t���5�q/,u�<vdf�(@s��<	�%��P�����:a�,��^�(�>�B@��
�+�@��`��X�΀�T'@�m�-������	3��:��}}�y�R9��/6��R�/u���ȯ�9��g�=ؼQ`���
�k@�
���$+�SY:�����k̀��
�rk�)��^:��
�z�]�hP�*K'v�,]��@��[g@7���w�5���#�q�Εީ=+�٪�DgP�����%%7�!߉�����'ť��%�/X�����w�I��k)���1��΢�t�@���+��9�7֮5�+%�~��Sہ1�BY:U����-�֮5���iG��;�SY:u�!��:��a�N��^J����E,�,w�g��[�|�f��/3A��%��tmcWvW�Ɣ\���f�]�]�;����_,�4ȵ��)��Yc@7�����i��o:�^"
�'�K����a��]1J��!�Cv���>w�1w�K7��F�rYz�͛��}s��Tv��tMc��X%l�d�9.��9	�y@7���Ev�,�*�s[0�tSj��;x?��7��@��cL�����}�ŀǐ���c�*��vإע����0�ϝ�+��E(��S0���G?1о��q�K�8�Po�^m@W*�.s�`�:�5�p�wPĔ�%�O�ݔ^���B@�J�E���uX��/l��p��!�e�Z���Ӏ]*����f��s�^� ��е@ǁ�[qv��%ע��n@�+
�t�;��.-쨽t�Z#m�pP�0������0�)���;�e
���`�N����%�c�C�k�����L�sDA=����?n��}����4@��Inb��ρO^�J�T�]����o@W*�C;*KWWk�-�8��M�ig�r���Щ�;l��P�/��c��&��Z��觊Qp�6��s����z�w�4%wt�w\vv��C�.J�����+WЕ�]�ڞ��
�
R=��;�O���e�+W�M�j׌��_{����
K�/D�g�,��!�a�|�Lw���=��D=<Eo�k�~�7���8E����i�tXrm+��Q��b�])
�;:���_Q՚�һ�WZܭXa@7��]��"�74@���܋�,,����1�_�NB���}*�
�"ԣ��V�?�|�{��k?���\0�>�QRw�AGu̩#L�}��3�O�R�w3�y[�{;<#_(�v�3�����gtSw��R����"�.e�!�� �K�8[�A�d��9�s����N��{P��{�:�����t�:��=m�M1��c��?Җ���
�J�q@ߓ�.;מx�v҈�!?�Y:�$�-�&���n�v�����j���R��]1��ٺ����!�%�KF-�EA��)�S{�P����^��V]��b��慃���ؘ]��9�=�qv��71�h�ˤp�]�����}9�����U
�\�=�3��!�����<z�E�-�s`�^�{�y�14���~#|9wl�:ջ�5d�`0�u�m��1P�G�&̀�T���1@�.�j
ނ�4���M���3f,s`?:�r��v!À�e�������)�C�S����C�{�A}����JeF��'V��ָ��/���`��}�{��##t��缍��v�*5�,����[�ө&9	�Y�>2b@7�N{g��ǫ���Y�^�n@��:��i��^y-�C�^;u�(���i��]SFׁ�@{'��8;�	�xU�1��^6�+�>�m��B[|��N�D��Wb��w��tSﵯZ]�@�O�"�P/v
�1����>��%�k�����7CCۚ�gWz�'�(z�+��-0WT��&Lij��/�su��9�/Yb@W�}�ۨ[���t�=;�Ž�|�3<��6K�wK��MSG���p��t�$�9���<�|Q�S�ׂ=u�(����>X���/R����W ��,��O#t�O,��t*��%s
� K�/^l@W*:^�i�4T��td����-��&9꓋;�ij�;��A��vW��Rj,Թl����9���fo��;�����W��~읾�iY^�t8z���!�;�P#xz��G
s���#m9��Еڟ]Z�)b
�%ҩ)Km��͒��n�B�ij�ə3��V���R�Uu�E�.e�����C`�&�Q����<zyp�g��{����t����:5��+�Q0����t�8���YZ�I~��[�qY:Uz'�*�P_���n����2����uv"t��J�KH��c����)����I�:�(�}pp� ���D9V�C�/ ر��dH���,��G�9<Җ�yt�:���Z�������&H��N����n�<�izh_߻��V�ǁ�1s�'���:��{�pW��ԙ,���?�00��ןm7��a���h������Kq��5�+u����1��p@�m�,=�p��Y���ܹt��Jg_q`�I�8K�3u)[�{���@�*��e郃�/�,������s�{�`���F��;1AegTɕ+���B�Y}��R���‹��hN�c�@��q���>g��4������9���y]z,�����	�@�����18��n1�C=��?��&Us4C��y�,���=�]@��w�]�#9бQ�A����j�l�R�n��w��t��H���?��eg'C%�TPOQ��@��So������
������.��M��M&��dR�;�}�R���/��Kg'%��z�u	�d�>0�^��Z�g������;{��M&��d*]�~۷�t�ٿs�GG�����z�����O8�?����+�������i2�L&Ӕ���j�Je���O���г��/����?q������A�����+�g��j'��jG��v���'j��:��ڋ��Ϲ~���擵ڒW�c�]�b2�L&Ӵ��;��̙�N̜9�|�������Zgc�*�y�f�rv�
k1�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L&��d2�L��Q�>����;FIEND�B`�assets/images/bcloud.svg000064400000014776151526424660011336 0ustar00<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->

<svg
   width="173.08162mm"
   height="117.32727mm"
   viewBox="0 0 173.08162 117.32726"
   version="1.1"
   id="svg5"
   sodipodi:docname="backuply-logo.svg"
   inkscape:version="1.1.2 (b8e25be833, 2022-02-05)"
   inkscape:export-filename="E:\Assets\backuply-media-assets\Backuply-logo.png"
   inkscape:export-xdpi="72.248894"
   inkscape:export-ydpi="72.248894"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:dc="http://purl.org/dc/elements/1.1/">
  <title
     id="title920">Backuply Logo</title>
  <sodipodi:namedview
     id="namedview7"
     pagecolor="#ffffff"
     bordercolor="#666666"
     borderopacity="1.0"
     inkscape:pageshadow="2"
     inkscape:pageopacity="0.0"
     inkscape:pagecheckerboard="0"
     inkscape:document-units="mm"
     showgrid="false"
     showguides="true"
     inkscape:guide-bbox="true"
     inkscape:zoom="0.44976872"
     inkscape:cx="645.88751"
     inkscape:cy="314.60614"
     inkscape:window-width="1920"
     inkscape:window-height="991"
     inkscape:window-x="-9"
     inkscape:window-y="-9"
     inkscape:window-maximized="1"
     inkscape:current-layer="layer1"
     fit-margin-top="0"
     fit-margin-left="0"
     fit-margin-right="0"
     fit-margin-bottom="0" />
  <defs
     id="defs2">
    <clipPath
       clipPathUnits="userSpaceOnUse"
       id="clipPath14029">
      <path
         id="path14031"
         style="fill:#ff0000;fill-opacity:0.408624;stroke-width:0.0274513"
         d="m 107.06661,46.920269 a 51.767348,51.767348 0 0 0 -49.532377,36.750212 38.788869,38.788869 0 0 0 -38.277767,38.769729 38.788869,38.788869 0 0 0 38.788844,38.78885 38.788869,38.788869 0 0 0 0.01138,0 c 0.0432,0.0573 0.108919,0.0966 0.186553,0.0966 H 163.43681 c 0.076,0 0.14064,-0.0377 0.18397,-0.093 A 33.494353,33.494353 0 0 0 194.8721,127.8223 33.494353,33.494353 0 0 0 161.37751,94.327702 33.494353,33.494353 0 0 0 158.65726,94.445524 51.767348,51.767348 0 0 0 107.06661,46.920261 Z m -0.85628,32.844507 h 5.3e-4 c 0.0587,-7.94e-4 0.1176,0.01958 0.1633,0.06305 h 10e-4 l 35.75951,33.890964 c 0.0914,0.0867 0.0944,0.22914 0.005,0.31884 l -22.01726,0.21291 v 26.68053 c 0,0.14494 -0.11222,0.26148 -0.25167,0.26148 H 94.257082 c -0.139443,0 -0.251666,-0.11653 -0.251666,-0.26148 V 114.5022 l -22.011058,0.2129 c -0.0915,-0.0867 -0.09423,-0.22862 -0.0057,-0.31833 L 106.0491,79.833507 c 0.0442,-0.04487 0.10253,-0.06794 0.16123,-0.06873 z" />
    </clipPath>
    <filter
       inkscape:collect="always"
       style="color-interpolation-filters:sRGB"
       id="filter14033"
       x="-0.029592279"
       y="-0.027113319"
       width="1.0591846"
       height="1.0542266">
      <feGaussianBlur
         inkscape:collect="always"
         stdDeviation="2.5386828"
         id="feGaussianBlur14035" />
    </filter>
  </defs>
  <g
     inkscape:label="Layer 1"
     inkscape:groupmode="layer"
     id="layer1"
     transform="translate(-23.567997,-24.796238)">
    <path
       id="rect7891"
       style="fill:#4581ff;stroke-width:0.0275983"
       d="m 110.1111,24.796247 a 51.020378,53.089456 0 0 0 -48.81766,37.68879 38.22917,39.779514 0 0 0 -37.725443,39.759873 38.22917,39.779514 0 0 0 38.229146,39.7795 38.22917,39.779514 0 0 0 0.01122,0 c 0.04258,0.0587 0.107347,0.0991 0.183861,0.0991 H 165.66792 c 0.075,0 0.13861,-0.0387 0.18131,-0.0954 a 33.01105,34.349779 0 0 0 30.80039,-34.26364 33.01105,34.349779 0 0 0 -33.01129,-34.350022 33.01105,34.349779 0 0 0 -2.681,0.12083 51.020378,53.089456 0 0 0 -50.84623,-48.739031 z m -0.84393,33.683336 h 5.3e-4 c 0.0579,-8.14e-4 0.1159,0.02008 0.16094,0.06466 h 9.9e-4 l 35.24358,34.75652 c 0.09,0.08891 0.0931,0.234992 0.005,0.326983 l -21.69956,0.218347 v 27.361927 c 0,0.14864 -0.11061,0.26816 -0.24804,0.26816 H 97.486404 c -0.137428,0 -0.248029,-0.11951 -0.248029,-0.26816 V 94.10418 l -21.69346,0.218338 c -0.09018,-0.08891 -0.09287,-0.234459 -0.0057,-0.32646 L 109.10827,58.550069 c 0.0436,-0.04601 0.10105,-0.06967 0.1589,-0.07048 z"
       inkscape:export-filename="E:\Assets\backuply-media-assets\Backuply-logo.png"
       inkscape:export-xdpi="93.125099"
       inkscape:export-ydpi="93.125099" />
    <path
       id="rect13846"
       style="opacity:0.740402;fill:#000000;fill-opacity:0.513347;stroke:none;stroke-width:1.56264;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter14033)"
       d="m 3.3783664,-8.2355464 c -0.1769057,0 -0.3188436,0.1424543 -0.3188436,0.3193603 V 216.16264 c 0,0.17691 0.1419379,0.31936 0.3188436,0.31936 H 208.63301 c 0.17691,0 0.31936,-0.14245 0.31936,-0.31936 V -7.9161861 c 0,-0.176906 -0.14245,-0.3193603 -0.31936,-0.3193603 z M 106.00827,46.92026 a 51.767348,51.767348 0 0 1 51.59065,47.525262 33.494353,33.494353 0 0 1 2.72025,-0.117822 33.494353,33.494353 0 0 1 33.49459,33.4946 33.494353,33.494353 0 0 1 -31.25132,33.41036 c -0.0433,0.0553 -0.10797,0.093 -0.18397,0.093 H 57.184899 c -0.07763,0 -0.143351,-0.0393 -0.186552,-0.0966 a 38.788869,38.788869 0 0 1 -0.01138,0 A 38.788869,38.788869 0 0 1 18.198133,122.4402 38.788869,38.788869 0 0 1 56.475898,83.670472 51.767348,51.767348 0 0 1 106.00827,46.92026 Z m -0.85628,32.844507 c -0.0587,7.94e-4 -0.11703,0.02387 -0.16123,0.06873 L 70.930313,114.39676 c -0.08853,0.0897 -0.08581,0.23163 0.0057,0.31833 l 22.011061,-0.21291 v 26.42888 c 0,0.14495 0.11222,0.26148 0.251663,0.26148 h 25.613413 c 0.13945,0 0.25167,-0.11654 0.25167,-0.26148 v -26.68054 l 22.01726,-0.21291 c 0.0894,-0.0897 0.0862,-0.23214 -0.005,-0.31885 L 105.31632,79.827812 h -5.3e-4 c -0.0457,-0.04347 -0.10459,-0.06384 -0.16329,-0.06304 z"
       clip-path="url(#clipPath14029)"
       transform="matrix(0.98557063,0,0,1.0255395,4.5893916,-23.322343)"
       inkscape:export-filename="E:\Assets\backuply-media-assets\Backuply-logo.png"
       inkscape:export-xdpi="93.125099"
       inkscape:export-ydpi="93.125099" />
  </g>
  <metadata
     id="metadata918">
    <rdf:RDF>
      <cc:Work
         rdf:about="">
        <dc:title>Backuply Logo</dc:title>
        <dc:creator>
          <cc:Agent>
            <dc:title>Vardana</dc:title>
          </cc:Agent>
        </dc:creator>
        <dc:rights>
          <cc:Agent>
            <dc:title>Softaculous</dc:title>
          </cc:Agent>
        </dc:rights>
      </cc:Work>
    </rdf:RDF>
  </metadata>
</svg>
assets/images/targz.png000064400000003564151526424660011173 0ustar00�PNG


IHDRddp�TsRGB��,	pHYs��IDATx��ylUǹ�"�&*  �h�
� ��$hb�TD�$j��Q�/�-�P�P9ڂ�-g��`A���������{o��;�.ҝ7��o�
�ٙ��}?��l�W�D"�H$�D"�H$�DJR��t�������am�Ϋ΅
�>��� �K]��v��άN�
�s=�h]2�B �>n�Vg†�w=�؀ZAwu;�:�G��Po�x��g�����@��B?�����%tO���.J �H��v��[	����${�<�v�׬b�)�<�'(f���ƬbC��9�S@J�
Ğ�z��s����yc�|������0oP��<j��o:���Ϲ�w��ۻ�,(O5c�r��U�rm^�v޵��H&"��d" ���H&"�bbm��9J�@N��b����z�X�ׁ��
��T���R ���46�&7���Hf"�	�d& ���Hf"���e8h�ZHc=�Kr��z��H�X��Α`��f��$�m�L@$3��D2�L@$�<@��|+���m�dh	�%I2�,RX��,X&q���}]��\�э%�1$�������,N�i/M�����f5���h]��n�Q�xI���^qJ<��K�P�8���e"���/
��/j���T�s���`��5hK�:��.xۧ�����u^'��~TA)Sۀ^�
�\0~]��9�;��墨gr�K3�۰ch���ĺ�D#���#�u��YPg=�l�@�s���e._����n���\��������b�i�܆Ck��.x�e/��ӟ���|`ל�kڲ~�LkS���`�,U~���'��Z+�ڗ	������n����E���:�M/�?' �D�Z�+�ev�u
�����:�kڒ�Uuڟ��a�׾#?��m��'�Z���=����BV���8}�����2�f�ύ<MM��T���7�Q�=���ȱ=8�����s��c
��<Xgxhl�a�؟?$& ���"��#~��[bf�r���X�P����0O�����~ ��Ś�ֲ���0O�G	�>�3����s
�F�{����ﳞnۡ�ǰ���i9�{�2����P����<�=F��T����JpQ��<�
˼9b=����3C��V�P�'��sҽ`]<�7��wcU��_=����\_3X��#��� �<��O�b�o�ߘ���-5/��~]/����<��w�y?�ؿ�jWU��e ʸ[*w`�w����HP�<R���&|��t�.|ұ|w\C"��Liŷ�!@��WN�֥Sײ�x���E�R.��{i��s�D��P�5{p`o�i8e�#Ճ��s�^�֙�"a?K���w�����5�6��nx�����&��a�t�*���Z��
���v`���8�
���i���+_�sHв_�k��LhΟ砏o�{��W�vշ
��G�>�ͪif��l������5~X"�!^O�᭺ۦ�2�_p�O��#������4�t<��=�����"?�f�ё�<�5�m�=����}��U=zbs�Y��k|V�ю?�.�R9��:�c��ʸ���OϸSS��뭓Aߐ6=���aYY`\�}6��q�|����c��p��[j In"�	�d���4�+�4@z�
	+�YFu���ď�%h��f���r�Г}�Wz����V0�M������%�=���}0�q�A"�H$�D"�H$�D"���n�/A�ӢIEND�B`�assets/images/aws.svg000064400000006622151526424660010647 0ustar00<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
	 viewBox="0 0 304 182" style="enable-background:new 0 0 304 182;" xml:space="preserve">
<style type="text/css">
	.st0{fill:#252F3E;}
	.st1{fill-rule:evenodd;clip-rule:evenodd;fill:#FF9900;}
</style>
<g>
	<path class="st0" d="M86.4,66.4c0,3.7,0.4,6.7,1.1,8.9c0.8,2.2,1.8,4.6,3.2,7.2c0.5,0.8,0.7,1.6,0.7,2.3c0,1-0.6,2-1.9,3l-6.3,4.2
		c-0.9,0.6-1.8,0.9-2.6,0.9c-1,0-2-0.5-3-1.4C76.2,90,75,88.4,74,86.8c-1-1.7-2-3.6-3.1-5.9c-7.8,9.2-17.6,13.8-29.4,13.8
		c-8.4,0-15.1-2.4-20-7.2c-4.9-4.8-7.4-11.2-7.4-19.2c0-8.5,3-15.4,9.1-20.6c6.1-5.2,14.2-7.8,24.5-7.8c3.4,0,6.9,0.3,10.6,0.8
		c3.7,0.5,7.5,1.3,11.5,2.2v-7.3c0-7.6-1.6-12.9-4.7-16c-3.2-3.1-8.6-4.6-16.3-4.6c-3.5,0-7.1,0.4-10.8,1.3c-3.7,0.9-7.3,2-10.8,3.4
		c-1.6,0.7-2.8,1.1-3.5,1.3c-0.7,0.2-1.2,0.3-1.6,0.3c-1.4,0-2.1-1-2.1-3.1v-4.9c0-1.6,0.2-2.8,0.7-3.5c0.5-0.7,1.4-1.4,2.8-2.1
		c3.5-1.8,7.7-3.3,12.6-4.5c4.9-1.3,10.1-1.9,15.6-1.9c11.9,0,20.6,2.7,26.2,8.1c5.5,5.4,8.3,13.6,8.3,24.6V66.4z M45.8,81.6
		c3.3,0,6.7-0.6,10.3-1.8c3.6-1.2,6.8-3.4,9.5-6.4c1.6-1.9,2.8-4,3.4-6.4c0.6-2.4,1-5.3,1-8.7v-4.2c-2.9-0.7-6-1.3-9.2-1.7
		c-3.2-0.4-6.3-0.6-9.4-0.6c-6.7,0-11.6,1.3-14.9,4c-3.3,2.7-4.9,6.5-4.9,11.5c0,4.7,1.2,8.2,3.7,10.6
		C37.7,80.4,41.2,81.6,45.8,81.6z M126.1,92.4c-1.8,0-3-0.3-3.8-1c-0.8-0.6-1.5-2-2.1-3.9L96.7,10.2c-0.6-2-0.9-3.3-0.9-4
		c0-1.6,0.8-2.5,2.4-2.5h9.8c1.9,0,3.2,0.3,3.9,1c0.8,0.6,1.4,2,2,3.9l16.8,66.2l15.6-66.2c0.5-2,1.1-3.3,1.9-3.9c0.8-0.6,2.2-1,4-1
		h8c1.9,0,3.2,0.3,4,1c0.8,0.6,1.5,2,1.9,3.9l15.8,67l17.3-67c0.6-2,1.3-3.3,2-3.9c0.8-0.6,2.1-1,3.9-1h9.3c1.6,0,2.5,0.8,2.5,2.5
		c0,0.5-0.1,1-0.2,1.6c-0.1,0.6-0.3,1.4-0.7,2.5l-24.1,77.3c-0.6,2-1.3,3.3-2.1,3.9c-0.8,0.6-2.1,1-3.8,1h-8.6c-1.9,0-3.2-0.3-4-1
		c-0.8-0.7-1.5-2-1.9-4L156,23l-15.4,64.4c-0.5,2-1.1,3.3-1.9,4c-0.8,0.7-2.2,1-4,1H126.1z M254.6,95.1c-5.2,0-10.4-0.6-15.4-1.8
		c-5-1.2-8.9-2.5-11.5-4c-1.6-0.9-2.7-1.9-3.1-2.8c-0.4-0.9-0.6-1.9-0.6-2.8v-5.1c0-2.1,0.8-3.1,2.3-3.1c0.6,0,1.2,0.1,1.8,0.3
		c0.6,0.2,1.5,0.6,2.5,1c3.4,1.5,7.1,2.7,11,3.5c4,0.8,7.9,1.2,11.9,1.2c6.3,0,11.2-1.1,14.6-3.3c3.4-2.2,5.2-5.4,5.2-9.5
		c0-2.8-0.9-5.1-2.7-7c-1.8-1.9-5.2-3.6-10.1-5.2L246,52c-7.3-2.3-12.7-5.7-16-10.2c-3.3-4.4-5-9.3-5-14.5c0-4.2,0.9-7.9,2.7-11.1
		c1.8-3.2,4.2-6,7.2-8.2c3-2.3,6.4-4,10.4-5.2c4-1.2,8.2-1.7,12.6-1.7c2.2,0,4.5,0.1,6.7,0.4c2.3,0.3,4.4,0.7,6.5,1.1
		c2,0.5,3.9,1,5.7,1.6c1.8,0.6,3.2,1.2,4.2,1.8c1.4,0.8,2.4,1.6,3,2.5c0.6,0.8,0.9,1.9,0.9,3.3v4.7c0,2.1-0.8,3.2-2.3,3.2
		c-0.8,0-2.1-0.4-3.8-1.2c-5.7-2.6-12.1-3.9-19.2-3.9c-5.7,0-10.2,0.9-13.3,2.8c-3.1,1.9-4.7,4.8-4.7,8.9c0,2.8,1,5.2,3,7.1
		c2,1.9,5.7,3.8,11,5.5l14.2,4.5c7.2,2.3,12.4,5.5,15.5,9.6c3.1,4.1,4.6,8.8,4.6,14c0,4.3-0.9,8.2-2.6,11.6
		c-1.8,3.4-4.2,6.4-7.3,8.8c-3.1,2.5-6.8,4.3-11.1,5.6C264.4,94.4,259.7,95.1,254.6,95.1z"/>
	<g>
		<path class="st1" d="M273.5,143.7c-32.9,24.3-80.7,37.2-121.8,37.2c-57.6,0-109.5-21.3-148.7-56.7c-3.1-2.8-0.3-6.6,3.4-4.4
			c42.4,24.6,94.7,39.5,148.8,39.5c36.5,0,76.6-7.6,113.5-23.2C274.2,133.6,278.9,139.7,273.5,143.7z"/>
		<path class="st1" d="M287.2,128.1c-4.2-5.4-27.8-2.6-38.5-1.3c-3.2,0.4-3.7-2.4-0.8-4.5c18.8-13.2,49.7-9.4,53.3-5
			c3.6,4.5-1,35.4-18.6,50.2c-2.7,2.3-5.3,1.1-4.1-1.9C282.5,155.7,291.4,133.4,287.2,128.1z"/>
	</g>
</g>
</svg>
assets/images/softsftp.svg000064400000004226151526424660011723 0ustar00<svg version="1.2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 178 179" width="178" height="179"><style></style><path fill-rule="evenodd" d="m66.5 4.1c22-0.1 23.2 0 27 2.2 2.6 1.5 4.9 3.9 6.5 7l2.5 4.7h20.8c17.9 0 21.1 0.2 23.4 1.7 3.3 2.2 5.3 7 5.3 12.6 0 4 0.2 4.4 3.5 5.6 6.6 2.3 6.8 3.8 5.6 34-1.9 46.5-1.9 46.1-5.3 49.3l-3 2.8h-58.8v14.5c0 8.2 0.4 14.5 0.9 14.5 1.7 0 7.2 5.3 8.2 7.7 0.8 2.3 1 2.3 17.4 2.3 16.2 0 16.6 0 17.4-2.3 2.7-7 12.6-9.9 19.1-5.5 2.4 1.6 3.8 3.7 4.8 6.9 1.4 4.3 1.3 5-0.4 8.5-2.5 5-6.3 7.7-11.1 7.7-5.3 0-9.5-2.4-11.8-6.7l-2-3.6h-32.1l-1.7 3.5c-4.4 9.1-18.3 9-22.7-0.3l-1.5-3.2h-33l-1.5 3.2c-6.1 12.9-25.6 6.9-23.7-7.2 0.4-2.9 1.5-5.3 3.5-7.3 6-6 17.7-4 20.5 3.3l1.1 3h33.1l1.6-3.3c0.8-1.7 3.2-4.1 5.2-5.2l3.7-2v-28.5h-58.8l-3.1-2.6c-1.8-1.5-3.2-3.8-3.5-5.7-0.5-3-2.4-49.6-2.8-65-0.1-7.9 1.8-11.6 7-13.2l3.2-0.9v-9.7c0-13.2 2.2-18.3 9.5-21.5 2.2-1 9-1.3 26-1.3zm0 4.9c-24.2 0.1-26.2 0.5-29 6-1 2-1.5 5.9-1.5 12.5v9.5h111.2l-0.4-5.5c-0.3-3.1-1-6.1-1.7-6.8-0.8-0.8-8.1-1.3-24.3-1.7l-23.1-0.5-1.4-4.8c-1-3.5-2.2-5.3-4.6-6.7-2.9-1.8-5.1-2-25.2-2zm24.6 33c-55.7 0-63 0.2-64.1 1.6-1.9 2.2 0.5 69.8 2.6 73.1l1.4 2.3h60c53.1 0 60-0.2 61.4-1.6 0.9-0.8 1.6-1.8 1.6-2.2 0-0.4 0.7-15.1 1.5-32.7 1.8-39.4 1.8-37-0.1-38.9-1.4-1.4-8.6-1.6-64.3-1.6zm-63.6 129c4.4 4.2 11.5 2.2 12.9-3.6 0.7-2.8-1.6-7.9-3.9-8.8-8.2-3.1-15.2 6.5-9 12.4zm57-2c1.8 3.5 2.7 4.1 6.5 4.2 6.9 0.2 10.4-7.9 5.5-12.7-6.2-6.3-16 0.7-12 8.5zm59.8 1.8c4.3 4.1 11 2.5 13-3 0.9-2.4-1.1-7.6-3.3-8.8-7.8-4.2-16 5.9-9.7 11.8z"/><path  d="m58.3 65v4.9q-2.9-1.3-5.4-2-2.6-0.7-4.9-0.7-4.1 0-6.4 1.6-2.2 1.6-2.2 4.6 0 2.4 1.5 3.7 1.5 1.2 5.6 2l3.1 0.6q5.6 1.1 8.2 3.8 2.7 2.7 2.7 7.2 0 5.4-3.6 8.2-3.6 2.8-10.6 2.8-2.6 0-5.6-0.6-3-0.6-6.2-1.7v-5.2q3.1 1.7 6 2.6 3 0.8 5.8 0.8 4.3 0 6.6-1.7 2.4-1.6 2.4-4.8 0-2.7-1.7-4.3-1.7-1.5-5.5-2.3l-3.1-0.6q-5.6-1.1-8.1-3.5-2.5-2.4-2.5-6.6 0-5 3.4-7.8 3.5-2.9 9.6-2.9 2.6 0 5.3 0.5 2.8 0.5 5.6 1.4zm10.1 36v-37.2h21.3v4.3h-16.3v10.9h14.8v4.2h-14.8v17.8zm23.3-32.9v-4.3h31.4v4.3h-13.2v32.9h-5v-32.9zm47.7-0.1h-6.4v13.9h6.4q3.5 0 5.4-1.8 1.9-1.8 1.9-5.2 0-3.3-1.9-5.1-1.9-1.8-5.4-1.8zm-11.4 33v-37.2h11.4q6.2 0 9.4 2.9 3.2 2.8 3.2 8.2 0 5.5-3.2 8.3-3.2 2.9-9.4 2.9h-6.4v14.9z"/></svg>assets/images/backuply-white.png000064400000004321151526424660012764 0ustar00�PNG


IHDR��/v�sRGB��,	pHYs��vIDATx��[�TE�W��
P���X@)
*v�A��	�`DĒ�~;�h�-�VP!"`4(���TE�(*2��9ϝ?���ߕOpor�yw�޹o�)w�:u�R����,E�1�0x8���	b�]1�Y۱�D���v,�.�F���ʈڎ'&��C�xum����j;�T�,5�)���k�l��W��(�t�S�!:3�?���^1핉U:�i�%R
֤��f�2�AM�,�t�3��C��J�U�6}b]���w�w����R��������`10T����f��G�~<Txu��R�w]�o������T��]+�&�V=�
<
�������U!�v���="14�W�3b}Uc��+�T	6��s�G�g��&,w�m3u���w@�@�G"6ہ�^����lz2���i�m��?S�JGw�3�0F���.�K$!�~�����b�t��SA24.^~M!�Z`�AJ�5��T%e��3@[�H`�Ee�<�J�9�CeG�p��E�{v݁��t�pg;{���*���*�"��K�ߍ�h�Q,��+������ǀm"�@�_bI7_�'"1\��w���"��
��c6"��ʦ;�:e�
N�i��G�_��i��M��+R&E|�P�'��x$ѓ��Mc�
��ԓ�_b���E*�-@s�O�Ģ�3^N
�-�]�)gI�k�tk�n�_ׅb,H@������<H����vO���@�|c�u�	�W9g���qo3��/�]�E�[��VJI��c���`8���8�؏�r�0����%RsV���C�:�)�x��6���*H0��� �ի6�"Wl�O�~�O,��G��wrt��w���=�&�F|���<]B�לX8c4��(��(�{_��َ>D,n��H����
�y0�6�$���A�n9��V������G��)��Q�{==�����ҿ5ٍ�+.�z;��ytYb�a�/eH�~���>��G�:��+}5bI��3g�6�����}܄|�!*�c��)��+c��V�}+�`�،�e�|�
�h��%�"ՙ���VK�N[|	�3�9=@�~��o�9��A�Z�U=s��
�/�X�@b�����c������ҝ���f���L�	�Ǡ"�9�H��#V�HL�R�����d�����L����d����|���(cgʁ����2����%ĺO�\n��#��w��^	���?��W)Ģ4��q�^�:�}�X*������=?h".Hv0������5>R���)�_q�Α
7�GF�t�ZGG�~`Į���Y�(�屌M<&1�|�Rن��]���]��w�ul$>�E�}��>�X=UF�3��O	�Q�d�)o�$ְX,za�X�G�����o)�h���l�U&��:O�,�OS��S�q&�L�B�X�t�[CG�Iz�mz�8�!B��w�5�x�,��ʹ�wˢ�R�G�_.�$}�P݂]?c��#��Z�:F/�����Lt676���&
�Ǯ��&'�42���دs��f�7�������f�:��f�	ʑ�M�X�;cQ�'%|/=���{��U�k�~�(\z+���ƥ���/�\���d+0%�,�J�^4��a%x���L��\��N��#�be�2�	�5q�x�^";��W�)�lѿR��2�0�إ�X��{�ňE=!؉N�D�
�0����4٬x�c�k�b���I2�pKP�t,�\���W��:���X2�^���US\�+�����NJh$&���4�%��07kX���f֙V�&w�|��lI�A��""�7c/���o��H~�
��xR��M6���lcS!E�o��`��:ٌp|��bdDB�Ǐ�y4θ�q,�����=7���H0譁iZ�JM(��EMr�a쉏`F���l�����H>G��i���4`�߻�w��&�s��,{n�[��3v���XB���0ξMmp	�e��HeIl͜�.�:�:8�ES$�ET�	p�̓��cuJ"��������Z$~f}�Ӡwa�Ub�m5��� �s���Rjbi��0��"��si�@YvA��u�f�$gƛ���q˲�f^VqoU����zi�)E��,�o1���Q����KH��km=�
��IEND�B`�assets/images/caws.svg000064400000013244151526424660011010 0ustar00<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->

<svg
   width="153.03752mm"
   height="140.86316mm"
   viewBox="0 0 153.03752 140.86316"
   version="1.1"
   id="svg41165"
   sodipodi:docname="caws.svg"
   inkscape:version="1.1.2 (b8e25be833, 2022-02-05)"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:xlink="http://www.w3.org/1999/xlink"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:svg="http://www.w3.org/2000/svg">
  <sodipodi:namedview
     id="namedview41167"
     pagecolor="#ffffff"
     bordercolor="#666666"
     borderopacity="1.0"
     inkscape:pageshadow="2"
     inkscape:pageopacity="0.0"
     inkscape:pagecheckerboard="0"
     inkscape:document-units="mm"
     showgrid="false"
     inkscape:zoom="0.63606902"
     inkscape:cx="373.38715"
     inkscape:cy="442.56203"
     inkscape:window-width="1920"
     inkscape:window-height="991"
     inkscape:window-x="-9"
     inkscape:window-y="-9"
     inkscape:window-maximized="1"
     inkscape:current-layer="g44110"
     fit-margin-top="0"
     fit-margin-left="0"
     fit-margin-right="0"
     fit-margin-bottom="0" />
  <defs
     id="defs41162">
    <linearGradient
       inkscape:collect="always"
       id="linearGradient50773">
      <stop
         style="stop-color:#f7f5f5;stop-opacity:1;"
         offset="0"
         id="stop50769" />
      <stop
         style="stop-color:#f7f5f5;stop-opacity:0;"
         offset="1"
         id="stop50771" />
    </linearGradient>
    <inkscape:path-effect
       effect="fillet_chamfer"
       id="path-effect41609"
       is_visible="true"
       lpeversion="1"
       satellites_param="F,0,0,1,0,5.55625,0,1 @ F,0,0,1,0,5.55625,0,1 @ F,0,0,1,0,5.55625,0,1 @ F,0,0,1,0,5.55625,0,1 @ F,0,0,1,0,5.55625,0,1 @ F,0,0,1,0,5.55625,0,1 @ F,0,0,1,0,5.55625,0,1 @ F,0,0,1,0,5.55625,0,1"
       unit="px"
       method="auto"
       mode="F"
       radius="26"
       chamfer_steps="1"
       flexible="false"
       use_knot_distance="true"
       apply_no_radius="true"
       apply_with_radius="true"
       only_selected="true"
       hide_knots="false" />
    <inkscape:path-effect
       effect="fillet_chamfer"
       id="path-effect41508"
       is_visible="true"
       lpeversion="1"
       satellites_param="F,0,0,1,0,22.489583,0,1 @ F,0,0,1,0,10.912457,0,1 @ F,0,0,1,0,22.489583,0,1 @ F,0,0,1,0,22.489583,0,1 @ F,0,0,1,0,22.489583,0,1 @ F,0,0,1,0,22.489583,0,1 @ F,0,0,1,0,22.489583,0,1 @ F,0,0,1,0,22.489583,0,1"
       unit="px"
       method="auto"
       mode="F"
       radius="108"
       chamfer_steps="1"
       flexible="false"
       use_knot_distance="true"
       apply_no_radius="true"
       apply_with_radius="true"
       only_selected="true"
       hide_knots="false" />
    <linearGradient
       inkscape:collect="always"
       xlink:href="#linearGradient50773"
       id="linearGradient50775"
       x1="6.8009958"
       y1="125.3955"
       x2="114.49817"
       y2="125.3955"
       gradientUnits="userSpaceOnUse" />
  </defs>
  <g
     inkscape:label="Layer 1"
     inkscape:groupmode="layer"
     id="layer1"
     transform="translate(-31.758979,-43.732821)">
    <g
       id="g44110"
       style="stroke:none;stroke-opacity:1">
      <g
         inkscape:label="Layer 1"
         id="layer1-5"
         transform="matrix(1.1161624,0,0,0.90165507,28.403651,175.2338)"
         style="stroke:none;stroke-width:0.999495;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">
        <g
           id="g44246"
           style="stroke:none;stroke-opacity:1">
          <g
             id="g44132"
             style="stroke:none;stroke-opacity:1">
            <g
               id="g44341"
               transform="translate(-32.833421,-202.81676)"
               style="stroke:none;stroke-opacity:1">
              <path
                 id="rect39728"
                 style="fill:#252f3e;stroke:none;stroke-width:0.999495;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
                 d="M 42.056613,60.601342 H 167.27976 c 0.14394,0 0.27161,0.110638 0.25981,0.247072 L 154.3849,212.95302 c -0.0118,0.13643 -0.11587,0.24727 -0.25981,0.24707 l -99.007868,-0.13733 c -0.143936,-2e-4 -0.248086,-0.11063 -0.259812,-0.24707 L 41.796801,60.848414 c -0.01173,-0.136441 0.115876,-0.247072 0.259812,-0.247072 z"
                 sodipodi:nodetypes="sssssssss" />
              <path
                 id="rect41074"
                 style="fill:#252f3e;stroke:none;stroke-opacity:1"
                 d="M 36.090233,56.972763 H 172.69931 c 0.13888,0 0.25068,0.111805 0.25068,0.250683 v 7.823319 c 0,0.138879 -0.1118,0.250683 -0.25068,0.250683 H 36.090233 c -0.138878,0 -0.250683,-0.111804 -0.250683,-0.250683 v -7.823319 c 0,-0.138878 0.111805,-0.250683 0.250683,-0.250683 z" />
            </g>
            <text
               xml:space="preserve"
               style="font-style:normal;font-weight:normal;font-size:53.4842px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.371231;stroke-opacity:1"
               x="20.225378"
               y="-41.995708"
               id="text45107"
               transform="scale(0.90691291,1.1026417)"><tspan
                 sodipodi:role="line"
                 id="tspan45105"
                 style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:53.4842px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold Italic';fill:#f9f9f9;stroke:none;stroke-width:0.371231;stroke-opacity:1"
                 x="20.225378"
                 y="-41.995708">S3C</tspan></text>
          </g>
        </g>
      </g>
    </g>
  </g>
</svg>
assets/images/webdav.svg000064400000004262151526424660011323 0ustar00<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
 "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
 width="110.000000pt" height="83.000000pt" viewBox="0 0 110.000000 83.000000"
 preserveAspectRatio="xMidYMid meet">

<g transform="translate(0.000000,83.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M573 810 c-42 -10 -112 -52 -143 -86 -18 -19 -10 -16 26 13 94 73
189 80 250 19 39 -39 54 -91 52 -171 -2 -59 -2 -59 -5 -10 -6 87 -8 92 -48 90
-19 -1 -38 -4 -41 -8 -4 -4 15 -80 41 -169 27 -90 58 -199 70 -243 l22 -80 71
-3 72 -3 -6 28 c-5 24 80 320 125 436 17 45 14 58 -11 49 -13 -5 -35 -8 -51
-7 -24 1 -29 -4 -38 -40 -32 -124 -72 -261 -79 -268 -4 -4 -21 50 -39 120 -18
70 -36 137 -41 148 -5 11 -17 43 -26 70 -32 99 -102 139 -201 115z m214 -297
c-3 -10 -5 -4 -5 12 0 17 2 24 5 18 2 -7 2 -21 0 -30z m-27 -43 c5 0 11 6 13
13 3 7 6 5 6 -5 1 -11 -6 -18 -17 -18 -26 0 -30 7 -23 38 l6 27 3 -27 c2 -16
7 -28 12 -28z"/>
<path d="M145 677 c-2 -6 -13 -59 -24 -118 -22 -110 -82 -351 -96 -382 -7 -17
0 -18 100 -16 l108 2 19 -37 c20 -40 49 -62 99 -76 76 -22 213 54 292 160 32
42 41 49 53 39 8 -6 12 -14 9 -18 -3 -3 -10 1 -14 8 -7 10 -15 4 -34 -24 -15
-21 -24 -42 -21 -47 3 -4 38 -8 78 -8 l74 0 -25 67 c-25 68 -103 324 -123 401
l-11 43 -69 -3 c-67 -2 -69 -3 -64 -25 4 -13 3 -31 -1 -40 -5 -15 -9 -12 -22
14 -28 58 -53 67 -196 70 -95 2 -129 0 -132 -10z m190 -92 c30 -29 33 -78 9
-174 -21 -85 -50 -142 -76 -149 -17 -4 -19 -11 -14 -40 3 -19 9 -39 14 -44 4
-4 30 3 56 16 32 16 46 19 42 10 -3 -8 -9 -21 -12 -29 -5 -12 4 -15 48 -15
l54 0 13 51 13 51 72 -2 c90 -3 91 -3 77 14 -9 11 -4 18 24 35 41 24 45 25 45
11 0 -6 -3 -9 -7 -8 -14 4 -54 -23 -48 -32 7 -11 -41 -84 -76 -117 -36 -33
-137 -83 -168 -83 -15 0 -47 10 -71 23 -65 32 -94 94 -92 190 2 40 9 97 17
127 8 30 12 56 10 58 -8 8 -36 -108 -44 -184 -5 -44 -9 -71 -10 -62 0 9 -7 18
-14 20 -10 2 -5 39 23 163 20 88 39 168 43 178 9 24 44 21 72 -8z m255 -232
c0 -15 -66 -18 -74 -4 -5 8 19 105 32 126 6 9 42 -96 42 -122z m-363 -165 c-3
-8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z"/>
<path d="M290 539 c-7 -11 -10 -23 -7 -25 2 -2 9 7 15 21 14 30 7 33 -8 4z"/>
</g>
</svg>
assets/images/vultr.svg000064400000002211151526424660011217 0ustar00<svg viewBox="0 0 41.539 36" xmlns="http://www.w3.org/2000/svg">
  <path class="svg-logo__shape-1" d="M 14.473,0.97 C 14.105,0.387 13.455,0 12.715,0 H 2.077 C 0.929,0 0,0.93 0,2.077 0,2.484 0.117,2.864 0.32,3.185 L 5.557,11.493 19.71,9.278 Z" fill="#c9f4ff" data-logo-dark-blue=""/>
  <path class="svg-logo__shape-2" d="m16.655 4.431c-0.368-0.583-1.019-0.97-1.758-0.97h-10.638c-1.147 0-2.077 0.93-2.077 2.077 0 0.408 0.117 0.787 0.32 1.108l3.055 4.846 14.152-2.215z" fill="#51b9ff" data-logo-light-blue=""/>
  <path class="svg-logo__shape-3" d="m5.557 11.493c-0.203-0.321-0.32-0.7-0.32-1.108 0-1.147 0.93-2.077 2.077-2.077h10.639c0.74 0 1.389 0.387 1.756 0.97l9.521 15.101c0.203 0.32 0.319 0.7 0.319 1.107 0 0.408-0.116 0.787-0.319 1.107l-5.32 8.438c-0.367 0.582-1.017 0.969-1.756 0.969-0.741 0-1.39-0.387-1.758-0.969z" fill="#007bfc"/>
  <path class="svg-logo__shape-3" d="m32.385 16.015c0.367 0.582 1.018 0.969 1.758 0.969s1.39-0.387 1.756-0.969l5.32-8.438c0.203-0.321 0.32-0.701 0.32-1.108s-0.117-0.787-0.32-1.107l-2.77-4.392c-0.367-0.583-1.017-0.97-1.758-0.97h-10.636c-1.147 0-2.078 0.93-2.078 2.077 0 0.407 0.117 0.787 0.32 1.108z" fill="#007bfc"/>
</svg>
assets/images/gdrive.svg000064400000001363151526424660011332 0ustar00<svg viewBox="0 0 87.3 78" xmlns="http://www.w3.org/2000/svg">
	<path d="m6.6 66.85 3.85 6.65c.8 1.4 1.95 2.5 3.3 3.3l13.75-23.8h-27.5c0 1.55.4 3.1 1.2 4.5z" fill="#0066da"/>
	<path d="m43.65 25-13.75-23.8c-1.35.8-2.5 1.9-3.3 3.3l-25.4 44a9.06 9.06 0 0 0 -1.2 4.5h27.5z" fill="#00ac47"/>
	<path d="m73.55 76.8c1.35-.8 2.5-1.9 3.3-3.3l1.6-2.75 7.65-13.25c.8-1.4 1.2-2.95 1.2-4.5h-27.502l5.852 11.5z" fill="#ea4335"/>
	<path d="m43.65 25 13.75-23.8c-1.35-.8-2.9-1.2-4.5-1.2h-18.5c-1.6 0-3.15.45-4.5 1.2z" fill="#00832d"/>
	<path d="m59.8 53h-32.3l-13.75 23.8c1.35.8 2.9 1.2 4.5 1.2h50.8c1.6 0 3.15-.45 4.5-1.2z" fill="#2684fc"/>
	<path d="m73.4 26.5-12.7-22c-.8-1.4-1.95-2.5-3.3-3.3l-13.75 23.8 16.15 28h27.45c0-1.55-.4-3.1-1.2-4.5z" fill="#ffba00"/>
</svg>assets/images/25off.png000064400000234134151526424660010764 0ustar00�PNG


IHDR����ߊsRGB��,	pHYstt�fx8IDATx��}	xUE�5�o�~ݯ��~=�	I�0$�$�@�Df	�ʌ��vP���U�EP�  �-(���
4�������k�[��]u���$7�{}_}	a��NU�Z{�Q��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0��`0F�Q4��_��{6,ѻYɈ>��#����T2���1����������`0�U��A���vN�������{o�q�pxϢ���#z
G�	��(�)F�@����Y��qb�4 8�
M(�0転�C>-�8dWѤ��M��x�c���������2�q��BV��k׿ ��;(�9P0�K�`ȵ����
�uBB��3�"�QB�-	}�E�E�&
ch@�y�x���7���Ӈ]4}���#�N޹t���{^�������?��ӦM^ߴ[�3�������@Av�@���������л
B��L���UTz�X$uB��%�O,	]�)�4B(�!�̑��Y�a��x����s��-�3.��9c0�� �gR��^�O�N-���&�߷m@z@��@~V{3����G�Jϔ*=�{�t��g�1gl�x�@ɼ�%�o:&Ɗ���=�~��vM�?j�$�XF���:��~ѱY�ם����"7ﺤ��ɹ�}���o�[��1�`���^�#���^���{���+ޕ���}����Q4�jY�1FvnѸ�E7
��7W��ܢ�Cr�&
�-�rC�X��b����[<stn�챹b͊1��nj�{�0�+�ݚ�O�u�3�'���:��+9��;%`&�B���NT:�:����ԁ�Q��n�(���,�(Y8Q�I{KL���G~���{��	�k8ҾI@�z೎�/:5���<�wm�@^�V⽦Z��z����E����w���y�*����@p��5���Z�c��j�S\�bϻ�v������QЩe��׶x&�k�@^�Dq�'�z�C�'%�4A��	R�/�ev�}��{��M>u�ᨙާ'�>�9(��)�/�$��@���'KO�^�`��=�U��)1	ﶍ���8� �������{���U\Ь�VqS.a^�NG5 Y��=+Ě%��*�S�x*�s�\��Q�`:����v��x�s���"p���%RO
�8 �^)A5J�SӻF��S���ߵ@9ۧNU�p��nR�6�O	��ij���i��:=0iҿ�=�U�7�%��xG��!A�m�i$u�5���;�H�:���F�د��Ȩ*=�!tX���R�̑��u)G��L��|8�9�×��}�u����*�'	�evWUz٤�լ֍��+
>ۨ������zδ@i��@�_�,�q���*��UtžԘ�mbo��j�.�}.q��,I�C�����5
J�cL1 B�K'�MX���H�ɛ�z��4g,�r���춿.Щs��c�z[Vp}�go�[0��a�־��5�c�J
�
8]8~�b��)�8�)q�R<e���)7�/�9�3\W'N�D��d������W�Ё�A�Y<��nv7�tjz�I��'�ۊ�L՞I�ȁIպb�Aꋤ��$�@�-�%����-3��~7�ī�Q	;�^O�	����P�H��S?)H޽u��|��f�Kx&R�/_����A/34���5s��&�8E]���K�E�ۤ�k�(�����י�!�^��=�m�ԑ���f�8Y<c���f\�5*��ge0��e4�t"#��wlf�S���L!t��ݤ�5R����#���݋�Mʝ��Ďfx��C�:��CTz�0f�_��Y���WD���	
����*H���F�\�ց��~�}��'�Zk޽$��SH���~��)�_���*
�z�C<�.mBC]^.�Zd��W��+���'
gNj���[g��!���,Brn������#��ؼ�y7=T��~ρ����%.�9纴�9]B��r����L�������)'ȵ9b����#�`x����}r
Fe�u�S8�N�,1�s
o�S8~���c��‰bL"���^r�����7ǴՁ?�?7qH?������?=���!8�?�o�\?�R_J�^��ݥ�5R��B��=�w/U�rk7 I�p��/�-�1�l��~g�ņ�
6&E6��
lĎ��w u�~?ށD�c�F�#���t�$5
ݚDץu�$M$t��:��T�b	֢%3.{B/�h�KqI���-�K;֕宓V=��a -�8**�����eɠ��C���1�Ə�bcfB�T��+O��ȡ���p��9s�Bb�gR��`e�.��W-|7������=?�N�o����7=�qFS��
��	1@��"fwx�g��a؄N��R��H]#v��)��H^��'�o.u�I욙�[��H]���a���ln�t�����]�~w�����'<��0�/R�;���o�8� uXJ�\���"��kz'W���nE�k�V����r&B�נ�]΄~�s���:���:7�h�!��Z����v���T��6i$u��_�M�]q�M�R\�o��}EX��'��9���;�Ɓ5����N�K��p��d�(�~�8�A*��҉��uB�ᐺP�/�=?���ޤŇ횜5�:U�f�{����D�8r�o����U%oP�⽪���xI��Ted�$��M���a*:��yb��²yC�~�����%<ӲAไ�$��"H}� u���6.y�v�\g$���(�W���v�\M��ي��:��A��K/B+�-3/KB?�1~��N����-}ݤ �s�ol�{R��[}�1���	�eN���L��]
���q8�OHk��z܌K���B�́�Ƃ_$�k����?[2uX���s��v�Y��}AP�3�H�"����rSRR����urWH>�!{F�7���y���!��O��L>̅ğNU�C���.�����wY<_7���OR_'H�:��_I��J�	���nz����s%H.1��QQ�7�Ԛr�
=s�^2�CU:ƍЂ�B?���D����,��
;�V7��^���T5*����^��[f�-]0�~�aU�vqM�ڮ����ic�tR��:G�ù�_�B�qU��e�]�^4��������&��̪����VUz9	]�t��mb��NG�F��"`2��xҸ�ɏ�E�&�|�hv'��r!|]�;-/�6����y���S-�[J}CR�˭�ۓ�x�ӿ�"u�����~~%
S��жHG�����ikZP���~����A�p���:��Z��co�{��ZŎ�>�ZC�x�����-�3��˪�����X��cy�c ��ǽT:Yˊ�M
K��	�h���s��0�?-n*T�%$ux�"t]��Sb/ǀ���Ϙ��+�N�!o�v	�����t�zP)i*]�E�+��ݖ5���fu�HR��|B�����Viz�KL��7x4���J�h���/"#��}�|hР�l�U:\*'���y��2i+�˃п�����oA����<9��9K�۱8�쮨t���i]%��i�'�"2��h�D!���m���/,�3��y�$���f@V�Y-�pyU�"�4�H�}�J�Au��\x�M�x�C̩!�s40NW�R'��I�?o�]9�����#�G�x$����$�Dݟi0ڦ�9A�N�ªE����;4���@|�%u� M�ζۘ�����d0����!���*.�aJ��/�p
��T:���N��`��e@�M���~��O���D's�+�=�\F:��ZJ�H��K�m��n
F��|��f#q3��>�?����H`Oj̑}��p�2�8IW�}�vf��_��ɕe��
'�����3���C��eP��-Y��ݶ$t�p]�@ب�a��|��{������i���i��}�ꤎ]�ީJ�~a�b�n~��pp_��	�5�@RT�����=������wX`>=%U���I]�H� <G[���5Ҫ��1 �ň�A�����%�H��я.I�:���ZB��s�C�s,C5�	�޿)�:2�ڔ1�z���gI��P�eD�޽,r�뫁���\W;�]q2��
��_r��e��vj�g��S�`�H]F�M��E��Ԙq��OV�~@��M�VP�N�:��?'����9�����z�!^�<�ov�,%v�dn�.�P3������F��)���Z����͏��{��#I��f��ݤ�6�j6�sNc�C�I��0�W���i��bC�ԁ`亳U��\t�;���ik�6����Ğ|GZ��KwΕ�R$�&�$��E�w/�o�Xj��{^�w�uD�wj�#�� ����(�'����_�Km7)��*}�L���Džkvw���g���/��R�C��6{Rc��/ndoK�;�t�}L��<tOB7���
�I��}�4|)��/�8�
��i`��
s��)%����p{���jun�s4�.�jA����݇��q��jR'`��A�o$�tLc{�lx�[=k
n���� �[��Ω&��Vh��b�Q�J��������^	=�M���5�W<[H�q�=\9�\�.׎;S�Yλ�V���9�'��@�8���10��:��i�w{�߶�f��"��*jV�ܕ��rc�I�Z�&MT����tWz���*(3�)$#~�d�}���j�ܤ�Z�R�M������C���뤡R\؄^��҆s�7���L��ƉΟ��Z����M�$��bP�:%u�I�橎��2���:H��[�~��pg\��;����+U:�ҟ�il[�C�wZA��?��l<�C�c�U��яa"��_8�@���h*��j���L�v��'���R�Kϖ��Ւ`X{m�Z���j��A-wΚl��*�:���Be"u��k*����t�{�˃��u~!.�Po2YಾG�����ݍ����*�(�h�[����R��.]4����j�)�?-���;�M,BW#R�=��J�;=�DCW�ȁ��ā��K�|��=�Q��?{\^B>���T��N���z�j���2�n�J�p��.ܶ0��u�;ck%�Y��R��/��f��I��z���x0�a�˧�J7�7e.(�M����>��C��<2Z�(��L��_�C��]ת���e$4��MΗw�	��k&w��T	]U�rm�y=k8CN�s/�h�SR�0�Mǰ�a��GR*��s��w�>� �E�߭��k��A�؜u\ҷ��
�Xc�i�P��xM�H�7��a����E���{~�5���~p�|i��r�mL't�B��2�{�N�i]#���+~D������3�������?�ʡo���u�}c7�.Sh��V���Own�J��f �O�^^�� �5�Ё�t4�C^:���m�5�c4�I�K�C�M���È�'����f)�I�r h̖��l�W��$���VB�uø�}�
���m�&�ϵ������\'�,9'�=�Қ���(����~�}��M�@L���<�3 �[{]^��B��s=ff�N��C8ؚX�\С��Ҡ����R�n�j�{p޾��W�ٽ���Z�8�����4�E��ZZc����`V�!M+�4B?@��kq:�	G�f4���W��Q�a~$��>�!�+Xl���|�t5��T ��NIK��BI��T'I݊B�D!��]7��T:���~���7�X#U:5�?)T�:�G�5��UW�/<��tF�|’C�2v|����,��8��v(�E܀J��6��ԵV�>�\������owr@��ai�����ܠ�ϡ*�j<H�=�����s/�x%
�7l�0(N '�����7���}n�ƭ\T�K@��3:�7(�N���UW}�w}wY��X9��M�rL������{~�-ުQ��[[E�&_�v� ����\&s{�|�u�ܬ��7�cD��D����8 ��d�ݛd���Y0
��闔�5s_���<`SR��3��`�O���1$M�$@����o.��tn�+	�~!�{�?!��P9n��ۇ�!-#�]*���K/f��gQ�I�9iP�b!BR���5��Z3eYR/^4�Z�8c��ڠ-xw����OU�[FU�g�2G2{�8�p��O��z@���#��߷.�����DV9�������箘���%S���w�ͭ6k�Ke)t��h�	�]�v7�w�*]�FDŽ���=?�[ZEMǍ��4��.&�VM-�&*�˚g��aMjT��|R*s��D.I|��̇�G�������,�c���Zw���N4l?�hX�����n��z�*�ׅ���׶	��00�����5�Td���W��0]2z|H'q��Z]�t'���B�9�pDR�ci�;
Ȕ�^�`��R�z�)"�eA[�9c��orp�:b�jw�\4�Y&� ����Z�'�2���J8�ޕ�\��ȕ��<��)}�z���&u�8-b�K�P��?�2��}n�ƭZ����MI
w�N}�f�{Sۢ�z�ˢ��U54ɡ�NF�A�\��+������u��RR�7��h�%tSЊ^�!d�v���V�̓�Uu4�#��'oذ�ȑ��	>\x;���?��Ὑ�<#^Z0F�*���Xᐵ�Sc$���n
���7���{}P�߮���бj�N�40��M�e�d܁��G��4��������қ�ˤJ�A���O���M��^<�&�	}CR�E��@��5�<c��]�@�iS��(~m�tI�hn�B��c�܀��]y^��g�<'�3����88`�9��.����w���������s\13������ѱ1�~7|W�	/���3�g|g&B���\��$�+}��?p���S�!nbk���714��YFZ	
��4�*e^
�NZ �C�AՂ���2߯oN1v��	��\�[���^'��Gպc*6G!�wˤd��h1
�O��w=@n�)@�Z�tJ�&����У�����N��ބ�Uh�(t$t�A+�W��a�`��ɠ�������$�I[Ar�H*�V��j�9�WB��ob]�f�<k�y=EU{x�s���4��a1�
�*���a]�����.�i !8/`m�އ��m �픮#,g��MX{���o *��CL����n]�e���J_��Zu^�]�Ə6$6<�I#�W��N[#Zk�+�U�@�C
���I��.F��{���9��x)�~�
�Q��ܜ�<�[��ˣ�v�:7wV3�����y�FB��vT燤��9�i�
�&#\�t��=�b}�X$0H����Ȳ�J$�G�j���ՋK�������Z�'���&tw����t���e�AG�tL�h�� ����<�|�3�VMQ�4H�:Ժ�9�WB.���ź��1���h�Nc-��^bH@*�Ҿ��^��D�XO:�@�I���s�g |��g���JR��e~��/� ��?���G/��GcfVY�'��W�Z��@>(�N����0�ij�i t�9r�I'*�&����q٣���j��
.`������fSt�ģD-��?�EB�ԉJ?KLf�k���T�p;�
�o�mo�D��ڠQ���r���__����s��>tR�����3�E@d$�l��� ���G��N�"t�C7���V��Q�c��9���;P���c�o��I����3��pLS��ԃ�!�JEI
pL��WB�e��!I��ߐбH�\��s�Ҍ�q�������]��;p�:�%��}��.ϊM������_/�FX��YA4��GR�K�u��X�M��[Q� '��K�c/��#�|?��-��Ӎ�Qg���;����~Ճ]�͐꫘�M�NUzp�{~�5^L�W{}B��
f2���Zu����H�罒ݤNRNNBG���K~��a�m��EI޸I�l`<-����y�>d���K�u�J�Q
PxV��E@B�t�f_���k��~!�<�UOBw.Dgtu�]��R��@��Ä̑�1h�Mi��I��{`��W���NQR�AH}�N�1��7B_ע^��-�|A�5.B'~�O;�*����p�k��3��S�kF�����]����ƾ�Fj�=�'�,����	�z���j)@��5Z�%����*���\xS���}���5g���`σ�
eY*���_�B��<U�G��j)��,z��mU��$�ikƠ�>*��fw1����Tk<���XȨXM�NK�$>e=�+d�e�qB��P���(U�a)��Nt�[҃��^��\�q�&�M	�Ҫ'�	�i�%�1����k,cڵe�|a;���+C���
Q�\���(�ПA躟͕5Ѝ�C]nr�e�Ȑ�h��\��[�]>ФYX�]���"u�\���9��p�@�]��]�>�U/<�r�LVY��~�:e�=��9 v������\:ٱ銣�
�>�k)�?�k���G�\�"Ikŀ���s�Y�*�$>�n��	���mz�w�l���n�č$��V-��|/:������I
/�G�����.�9���ow����C'���>.{��sS�1���l�����(��^�k����m��d7: m
i�B�E�7!u�¨���T[hnGu��c=!sؐ�ɍ��6p�>�B���||z��'�_�ez�G�k*�UM*]�,���M*L�Z��S���b=zYo΢D2'���!��YiN�$͂"ٙ�d=�A#�/Š�7�]�*�z
��uHR�����F�$�`��b��T1�4c�ޡ�\xI�Ĩ����eg�:�Y�vmq�lF|Ly>� �y����!�{���p�앟�$���g�_+@�,��]��{~|U��p�!1��pչ;Ή�Q�B[d상��!m�E�������T{<۲��g43%t�N�]u�K�%�h�У��`��u������B�
;�E�%�����%��m��F��ϛ#8G|�?���s-lx�E�]� ��6%n�������H�-�����b�f~G?���T�:�2
���J��Z���C�z��)zY��G[��-T�h���I�C�	]�s%��9T�eF�����xU~���^��H�q
s��N�]��޾����>*	/��ٵ
$��`�ò|�mn��lVub��&[k���3$u8Wz�����?+�_g0ą���_�z��-�� |n�wT鐛n�ҳ�{]\ޭt�En���\|}5��.6$�o�]d�y�۲�.��l�$�Y���O�hp�i�G^/�(��
>���M��T2G"og�V�煣��eR'�'�J��U�7=���Y����*ʿ���~�H�z��Y�M�
���Cߴ�����F�\1'���2A�R���Ӷ�b\\��fU���PYB?�"����l�\�h�FmK�@lk��(�璴��R"�Jm�kl�)BH�zN��.R�g�h�NR(����?Ҭ�,4_?.U�:��w��0;ϻs�/����
c��`?�?�=f=ovƗ{��T�qFL���{d����Fiz�wr@�t8�j�ҁ��sB��Aj^:����K�mAi�潼ؐ���!}�u�d����yW�i�� �g)�~q\��~��e����ŀ}���
A�-�B���r�X�� X��[��lb��4'���tA��ԴCe���&�~/6�Z !h��㞦NMrP�kIS4�o#�L��Fm��#|�JĻ,ө祛Lr�-��5PQD�Ѝn
�,׋+�	/r� �SK�t%B#t�̑H1���Q����iJ�a�n�/����������nVw�#�����#����grPJ�b���]T�+�%�k��,R�i@$>��M�|���\��9����Ip9�� �K��ۊxOf�@!tA�g(*e�ݱz^�R�p��r�"���
[V�:�
���j���c����q���n5��=Um���'ˡ�\QL/2��,�b速e�CI]\,zז��ߏ(��ٸv�5�k��&#z;P$�'[��
�y�����6P��ɡ�D�g:��e���-�I��B�%t���z~1�bg͗�^�l���4% u-�T��:$�az�n��s!sJ��+0*�w��C�������u�	�T��B`������t�Џ�=��F���3�[�{�1��a�9>W4т����k����ߌ�g��q���٠vD����{�w�o]D � Tpܟ��T:�s�����.6$E�5�sSq��S�u�u�ѽ/�6����O�O�)yc�@�r�A]/���g2�f���Y�&��]�?������g���Z]SU�p{�Z�9�L�-A�#�vh�L]�X�eH�y�R�8��+�qz�w�$�EU�E���c-wς!�&�u��`^+��Q͙$J�=��z���[|�eD�%������+K�጗BJ�:���wN2�-!��̶���nV�6�SyT�|���;2 �8W,�_w�#=ȭl�L5W��_[?��wD;��i\�=�o\�q�û�-??Džev�w���σ����/�z �c�.�
�S�t�չ1��N�𝇫���)������$ad��R���ST�;�Ϙ��$tڅ�y=��Ȁ��r\�
?Cb��u^��/
�&����cU\�{�������_�*�uM��ۮ��-I
��
��B3�Nln��w��MU�I(D��OvT�+:JR�bփ���2X�jN]�ףu��r�Z�j!G����s��#�n�P9Ba�䶉��A�9H)�g�X�V@��bln#�/���sD�1��0�����3�g�����E�m��l��9,�U��1�9_vn�s�KkN`n�z�^{��ʃ��tDW����C{e�ڇ2@����֫��l��v}�@�ج��E�,��q�fawAp��'�����	��1�j��[ɬ,����%�/��J$?(����Q�o�=
l�B2����:0��x-k�՛�(	R��Ns�+J�AS� 9��-�Z���HU�s:����7i����}� u �۵�8���6u�?��8�ٽ�cv��8��}��K���y�/ռ�	B�\v�r��W7�)�I
���J �_�6~�	Ì��댤A�4�����u��S�uoY#�O0�}�?�>�N�@��"�w�֩K-x�J��c����I ;X�N���'��")�\�m�>���3xacR�Q�ԹR������V���Q�w�l�E�Su>&��TǬ�x�Y�m��kL%�	��/ӔK�&t�B�>�b�(Щ󥜓�b�X{yl��n��~G�O�>�y��LRm��q*�yv�����ĆM[Lfw'8��t�Դl����!����׭�^�4�	n���.�l���L����n�Ll��������R��…���p~���=��!�.�d¬�.\�7�Ux����OBd�{Y~t����>��szq�}.�z��9�V�3�؝\�'B����p�Z������X�U��n�;�dtu^86�H >�G�b.k��Z�_jV�u�DBw«ڗ�jW�N5���"�nk����15����X)��k4�X2�����[¼t=8�4]��O�v��]3��=}l�1?���!9G�����vS�O���iTf�@���C�2�WC�ݴ�ӘAr?�K�-H�oH2�H�����p�d'9�k!�9���DY2��U���_��N��঄��,X>���d)X��aM[�.#���h����K��48��e���9(6�V�J��N���TsQ1j�U��tu�w�w���u���"�h|�8x&Q���_HtG������k&��
�2��὾�8��17wը�e�5�V�*��}6!���h�qhv7�X�&e�Z���.l!z��JGR_6w��$�+��6H��`�ú��z5�]M꼂i�z����?��+��Ef��`�W�XJ�T�F�㛙ë$_��Ƶ�X�A�/����z`\OY���(Z5n�ZL
�9(uA��U�s �A��Ć������g���Z�tun[fí
g��U��WjVg>-g�(�iђ��<t�i
6��G�#]�Bw�\��i'}��9?Kck�^.U:ȡ��Q�����o��]/23*T�����3s�9G�%�=��[®AN]Y����̦�`�;{���L���B��+��y�BB?dz0��r��!���Y�k���}��_ ��^�5�9��Y�$t��.�~�t`�����.6���T'/�Vp�� ��ș�Qρؔ��ފ�x5�sOˬW�2�yɸ�&U��W1��5���)��d�a��]L�Y���AT��y��p|sc7_#���^��*]7�?%"�ACk���~Ҵ���1���~t,2���[�J��9��{V5C�l,b�x�c	�b�0���qYL��n\{��@�L�}e"�S2eͺ1�^��2+͓�@2R��"G`����縫I�w�(wz1qzZ0R�i��E��u	.$z��s9�E>�*��5!��8���R�"2D��Ed�z������q��T�s_��^�	�Y�б�r�3��\/Xo#*I̺��!�6��#~�`Yl�C����~rќtۏ����4V�Ku��]U����+��Y��6'paɬF~�Oe����{Jw��P�9l���MAPS�at3z5ĚƵ�at��$�	��^"ik	�c+R���0�)�4k�s�R�U�w7�=��n�5�SB�;czzp]�H���}j���~�*����M�45Z⵼Ed�����WG5���c��!F�����`�:?�9�hv75$�����8|��h���&-J���!Ivқُ�"��#��������+~t'}m���2Ɲ�
�+�Y��Oq6���ԗ�L�k~"A�J53Z��8����3}ÑؙЫ!�:yK��k�Q֑�����j[�U/�@��*�x��o��9�*��^R��3$(n���e	XL]+/%4.�υJ��n�?M�^��r��ɛ4S�I��~)��:��[7��5�����`�F�rqb���$0��`�"���9c�<f�G=�
�e�=?��15G�Pr�ՃH��%��a{50λ�1-c*)k�us	��p�̞~�O�	��$t�!��:�F4[�P���?+�>�	��ڹ�r�7�ҩ@�CGB��0V�>��;LU�H�7O��CU=��uzݯ�y�<�+2������E�V��x�eѺ�O�gf�,�2�*�C��[H�45�:WڣV��kvi�
�~Q�|��un����v��2��Axs�I����A	�t��n�^|IU3ae�5���p~Q�O�n�t�ۃ:��Z��^�]���k4hH}ɬ���,*O�zk����@�%8�́ą�����u�̑L����~E������MR���eJ_qI�S4�31W���U���Fc���X_����}FS��[g���ZƋ��2X�踸p�H?��V�}��0-+��L�%^����QG:���@8!�fG�y�x_�E�z����[�F�������g/������Pf�i��ZTB���]�h54cŸ��F�8���
�f�_��^r�Lߺ�E��STB�/90'vT�h;��D�̄^
!�Ћx1�~�!�k�!���л��N+*R���-�V%��k�՛g%�2����8'iP����;<�:\P�(]0)��7k���IQ�M=.]�Ws�������^i#��c��ѱ�����J��&�����-�:%���=?�:�ZBwi���F.'��J�vU�Y��Bک��)j,������*!tjpC`�1Bi��0�τ^
�2��+
�(�H����t�������Z�H�J��^�Kj���x�Ǜ�[k�_`�&t��ٸOI����=Z�S� ��:���]���D��om5�+��ok�<d�W�z#^�<D�Z�ج�#��W
���i׵�J߬�e(�ہr$x��^�殖F#���:r�֐���ˣ�=sѕԵ��Ї;�q�Y�&�����*#t�Z�}F�c�)���Q<<z5� �
�:<��M�����&I�u��|�9�$��’Y=��9�j�����v�/��U��A���w�\zLQŋ�iMϿ�C�>��䨟���7�5pt�"2�:���t*��L�J���s^ux�Y�B/�;m҂fw�}҂��'�N�riD$Y�0��`7�8���`Z�v^+���ˠ������5+`f��Fr�-�kn.-�u��!��GM�‰L����՜�H�`��Z��H��d.:�# 
 ��+��inn�jb$�:Kn�]%��g[68��:ۊ���`?wl�z�Z�K?X+����Y��N�N�FEE��N��5p�mj׋Ȕ��k����(�:&+#R�y�\ �� tX�psF���:,����B���ѧ���䰈�z`��s�C�k�b`d���kX
]'t%} I]��E�.H�$g���J	ݎ�淪ĥ��yǖ�18�NbB���>�j�]��h`�t?$�iCs�&�n���h��Z����� q/H2�,S{��2v���ou[���+�ɥU�N�		t��H|�=��~��U�7pVᠦvfo�	��+��I��*T�5���g�j
I�T������*}������oZ�s�9���鬕?�ڿ�=7:�4����$w[?�6�^��#B�z����"sUo��[kA_	�7�ADŋ�Ы#V��LY[3�~�lz�k�G7�a�xx�M�ȴ�)J�%��OG���j�	D�F9���Vm���e�nq��{��9Y��i�DֵT�=��H}vqN?�U��xv����KZ�թ��x�$��(͇Is��!}�T����qa�NH��<b7���e���2;.�{nt�z�NCS�'[�����s� t�/z(B�	��,��t ��S��57���'{�$&��+��� t�ɐ��aO�����,����F���v���d��%�[E��9��V�d���]R���<zkm�9g�� �_%�۵H���r��7�[\6�_I��	}+1�K��("s��"2�U�㲟��3^Հ�QI�k52B�=�:�tJ� �~��#%)�����{~�v����̏bC	��3�r�-T�R�?�r�"t�H��X��e�t1.,��ɯ��^&w&�ꎥ15ϣJ_�����ۥS���b����[g���g�k��?{-9�"�c BG�%Rq���>-�3ۿRBW�7H�$3����.>�Wt2o��K�[��\D���|a�x��d֎�3^�xR�\��	M���U�ޝ����p>$���ğ���U;B��I����rO_"���$��!�Õ���ըn��$y��n��گ��Е�]��WwB߸U���=Ł,��q�F�,�{��_�f�~N�5�ՠTS�	5�^z˔?F��k�h)�_8���g��w[i���D�a@\�����)g<ELR���t?X�Ͻ�UT�u	����/�u^��V�ZEK�f��f��Ļ���)�z��)I�̟�Aq/h
	}H
�'�Az]څL��7��^)Վ��$�u������ٕ�t[��Y���ep�$��Z�U�P�z���~��%'t�b1���/C,��9�֘���D�S�;�!���nA��P�3���~��c�����p����$^���t(���%p�P�?SU�2�ZJ�{�B������UT�J|s���
2ֵh��6�g�{Ϸl��^�f�(�96%F��%16��[��3���M�W[Eg�h�(c���c2���f���q�M\�mgNo�q�]ӌ�2�3Nwh�q�S��-2�&f�L�V�שy�����w�rA�U��-f�՜��~uյ�"tLi�&I���#�V�KN�<t�aƅ�7�V�3
�[4�Bi�-����z<P0����{o.�g�P#;��Rᘬg�n�^+>�=������C�K'iZ���:cyl��@�0P������F-hv���1�Zk���hw�$l��78�1&�8������6�)�3X�@x�~ߔ�U{�`����V�Pj�"b�m��:�
&����/'N��S����S��`��]d^�"2�%^C�	Q�U|���3�'�oZ�?�9�m~B���K�9�є5��~�JM{��,-,�I裴JRQ��Z��J	=d�8-g��0w\����������8�?�~�YQ9����E8��sCj�0l���Nj�
�,�gY��]�WI���[bjP�nǁ�]��hws]���F-v���-%c+L�������d4��eP��na�gr����U����D��X�1Ig�Q�x`��n�z���k��!Tv�w�4�l;���-�e�x���*Q�p\v�/+F�!��Ϧ~�뤹��?Mv��C7�+w�nR��٥_uB���z�S$���9?��w����T���O,��X����mKy�a>����}`B���1Ίl��xΘE�y��A��BT�mR��M����\�A	�/��X9ݺJ��1~��@��N�נ,��OJg��\�g,�P�\�f���J�zD�:| >X��IE�`0�̕���SB�]�K�^
'�R�y�{"�%t���8�Q�h\�A�y6�Bx�Y�C{���H���?G+�s�P%=	��V��ȢD����[�8�%�g�$u�h�R0�S���"H��u�*���ЇB���_hG�R�&B�f3�Y���_o�v���T���Ȼ/d���*�Ϧ�8M����݁P0�},itB-8�6��"8�b����𷢉C�,7`R���~��Z0��Hq��9�O����@�����}$��$�%���#�̍���=�\c3�1�:�q�������~!DF%tJ���ʞ�"2�(�:�H�%#l<��?y�y�0��ЭKp�۩��M-��ᮤ{�;�бA
lOB�R��so�-pI��`��	$X/��tZ�y*��u�hе}�ܿa�_p؊
L�8��E�H�25ǥ��6�R��Iu�T�`R�g(������N�ߒE����pb��x�U�;k��%�j~�DS�w��8P���T�ԗnW��
�ȼn��.I��������{b_Y���%L�C뽊wm��q�z�u	����}T;�cR��^wE���J\Ӿ����`��J��Imt+��wHǁ�v��V�"2\�q9�:���\iX#S� �^7�$Ø�I}P����^��U���9G�7�7
�]i)F?t1G�Ӈ�4W�ç�8��[�.��"qqH��k�����U��՗$uK��P��d4@�{�׶��V�:�oI�kH�XhR���T:�T�y��^�b-�n`� �[�T���k��_���މ��֞����b¿^�t���O��K(�[ >�
j�K����,��^7_���}�Utn������)��{�@�z5OZ�뒔x��J$��6k^�^�ϧ�j^$�p�N��:�f+;���ɭ[;���ҌH��s�]�{�*��C�ݰF������F�������#�
���>�ſ��5�p eKUA>t(���#@�XP��tWJ�]�k�O�r1g�e-/Ty=A�?��B�?'�`�񃲤��c<�)آgE��q�G�	�?�%΂w�C���=�R��o������NA���$v'	��f=���P���"���ב}Vfn���<"���5S��Ts.�ʸb��v���i�4�o$�|')��enwd0lr�W�&tb�
*�M~�S$�)L��VQC��N� U�vU��+�r�K���
��:�,2� UyzP��%~m�zz٤4�SRW���n&�1�Z�7G)����[�U�T�p!�y��M��H��2@��%���^�M^��i9�z�4kg��A�[�� A�޽E譬=}F��a?��Ď�B�g��E��hp�9���ث�n����ѻR����w��s�+�,�:6+��r�� H|$-����9ý�����vϛn�!�F�J�r*H�:϶��&�穼
}7!��:��_��l�#�\��V���T����B/ѯ���C�܂
��H�"��~�Į����ݥ��� �@9�|G��N�T�c�_��e��RA�~����ؚ�-B�T:F�?H��7�^�~�Nsj���VMsG�k�SAsv��;���]�,kM_B�b���r�}��/�8-�ְ��i����`فqc�c���=�����|�F���L�%^����k���k"�v�r���=C�M�[Z;�|)&C��ms�4'+�h����3�yً��q��5�����':�˖���k��h���̋^Y+H��IC-B/��Uޥ�
>R ]�7��%���.Z�H
$v[��heD�����#)m�	�<��������b�	�,��Ti���{M���1�t�K�
�������M����O"�~��
�7te��`:�DaM�2�/y�5�|����?CH�KI��=������L	�J��P�;H�d]]NJ����T�_X�v!�:'�%^�)]�g/��a0�ƺ�
#��#�o7�^��d��]$��+�S��t�U���$c t�qC�g|��y��䎄~�:\|�"0?YXU�:w��-���,��0k�J�
H-;������M�Y��� �n�!��V�D�#����C��]�<�ZG<^�$���NU:!���sa��p�܈v�J����o��\s��t��'���d�%��ԏeheV�>	���=b����
"��^-u�,C�-�C�	�+m���5�ۄ��a����L�C��T���=�Α�Mm�Q���2��A}\�q�c]��u�7����eCl<��Pa	MW���eP|j$�u4�E�����=~�@y��:v�è`S����Pg)Z9�ٷZ��p���N4��m�yr�����Ӌ��\���U�+g=S�C� .�*���$Wh��<ߖ.����.�2�HU:�:��wg-SEuR?��e&���;"��h���zI�kHY��8س���B�Z#s$t�ܮz/�v2�잡�a��A��+ԩ~E�poJ̀]��a�n�Ed"[�ur$��6^hY�俪-c�]����,����t���!o�z���/Uz��=��+@EM��(�3:^+đ��k�J��Y��$��"s��fUjj�LW���W���|���z��=��;�U;!v�?q�z�s������Q�#���/Ƃ�+]1/��.����f��~�嚺WF�?F"mi�;2�cҪ�雐�(e����	��[�<2�	��brO���,��i�ugZ���P�x�#�j���W�P�#�SS�W�pK��օ
�x
����H�#lBok�9��SB�?V��s��A��.-4���O�+Ln[-6I$ݥ�he�Azޮ��]�#+H����nn���R���<��VF�C�=�^'y�i^Wez;V
���Z�+�٤�(��2��J_F��0�)��=p2���w��%�s���`z�5��$uN�"��(��,��.�f�O|�p��A.r���I�8%r���k�ݲ�i*I]q�@�d����]nj�T]�#��@8ZD&��m�V硋���a0ʅ��!���&v���=�v[†�Nt���HQ��
��@Gʠ)K�BW���L~��s����M����L��eۚ�M%%�f99FI2��v�gP�iU���]Xʜ�8�@�C%yJ�.%��|_=�������~+� 50���%�^�3]�:Q�+�Y�~a�Bk��/���F53�Nl2@�����'��ޤ�
SG��jX_�t�})���8���I�l�#���6�tORw\6y�駋����s�f�:��;�Q��!Թ��VV�H�x��n$��Q.lHl���o"d~�W�&٭����3���Y��/���s�Iِ�,��K�]��\!*��ߔ����&�f�	`��e*Ɓ90�&sR@&��s�RT�5�O}{�C!�$UZ&����슪�;>U�� �`��cz���tI��ra_��J8D>;��J�;D��?���_�k˫b#^�?����BS�_iꛒ�)W�y���)J�^�.��� F^����RTf���6Za2��@8S�ڥ(�Z2���`�Qͱ9�ASP�C�9�L7GHu�f���&�e 
�nG�˖�~�Ee	�(1�څ,��5�41��b�̕t��:w�J�4���Ǡ���DOͼ�@ϔ�L�؇.x4���(�� 94�S��jQ�t����rA���²����Q�M�fRǾ
�H_�����]�?�A��vR���DuпC��,�n�����P�-*3O{Sc�����LEd�,�J3q*Z�ul�ˑZF��)��~$�̈́���~sS�a-�S�lu��x��|T�?���P-7���\QD�п���/�Ufҫ G0�X!sijw�s4�)�Y��J�Kɑ�H��ꦃ��j��4��N;�"[ֲJH]�	�t6 u�ۦ����ª�@�E�g
�^3�`El͕�d�tP�hz��2�IRLד�\c��1^�?�{����X��8!w$vZ1����|����hU�֨��)1��f�Z�"2*�ZV���}�1���!�f�f�ȃ�%s�V��銪s'G��\�v�?�;/)-7�:*}�O�G�狢<�����id�}��
l4�S���a�
���/�R�2�45[�'�ȼ,�����`3l�fJ�2�x%
����M�ZX�ٻH}
��q�tI���g���un��5dyl�]�t0��Ar����2S�e���ҽ��]��ߓ�Iۡ��6��!w��)�����~�k��]Wvnr�4j"���=���[D��%^�e?���`�/���A6^���|!s���~(�)Q�_����tr��o��o��Ж
&&��|�����Ъa,�A�~�y6�1��$��	�S"���Oj��O;`��x�����Sb����m�I־���/}��I��Q��S��~3�/��ґ�W�/~��u.V��LYW��*�K�uv�\g��FI�-lJr�R���fh x�T��$H${��k��i�}��Ut�K���N���ļ�M�f�k7����$Mml��E#��!��`���_GU�M��vh��|�>9�#iu�*����-�&X8ej�6�„�6X�	=�Z0��1�s�D?�-Q�"��uW�9����C�H�hr���C�K�}L̴�]*N��s�˟�����ez�*]��7��M�5�j�R��@���~��|����8v��H��r%���R��K%O�	����Q��Kˉu��3��O�G�?��|�J���"s�:���aner�_�pl�-�xF��x%�a筒ȷ�<s�S�5�;�p�/���L'�^�'eG��s�T酓���|�.�o���K�5)�7��hA$�+yݔܑ�Q���1MM�a�1%sl�y���QI�G�rx��sx�@Uw����Ѣ�z ��"u(ebi���O�L�T��^\$~�{��Oy�&�v�;�z����v��CRLku���v$�ݩN4����G�N��G2��X�C�vD}�}�3G4nᵔ��>�ԹW�ʕxՋ��g�u~Y�`\!x�Y�_lk��6I�`b߮�9�=�E��ᔪp�:7�zM>)J�TB��Q-UE	��F�;w�(��r���,�-Q���SU�hj�r��9X@m�*��F�@��~@*9} ꎚoq� ��~���.b@�p�¥�+���,���t4��9 uG�o�{��kc~�SA���l\��.��a�= ��Z$ub���Je�f#��}gr���T���(���Nu��x����Cu2��u^�%^
ij��'D�y�� 6�H䯒M��9�A}�ej/S�����H�A�^8a�G~ϗ*K�G��Nu=Z>S+�AJ�*~f�7NJpnun�ڥ��8��E�5%q��pH����}����}���<]G�s3�vR��r���('�٬ �IN~����n���D��PEp�Z�d�J���JX����-|�q��bo�2[�� �w�̤n�[�7��XF�*��'>��Y_�ä�i���x
YD��iU=3����A7�~åd����?$�0��i���:7Dj��L2̈́.Tz����3/x:��~Z�m��?���'�j��)�Ss����
lXqKk���FwO���/x'�2��=J����!�+|X/p��s)#խ��$�pH��D��0�Xߞ�:�]��3v�;��k�w�J_�x��k�2x�e����6�:��I0�?���R%��D��d�j�V:��#��m�{�&�}�ޤ��"�'7aG��pf��ԅ�I��*"��x�]��v��wޯ������VQ
�&��W0	%sG�溩�]/ڤΩ�ݻ���Ny�h��P������X��
Y�ë����-XfU��ej�B���|ʼnl?gT�n2E
���IഘULx���IV�-?ԍ�W2U�(�]�`�L"Ar�?}�SpL����_U���_��k.��G��}]������{FS�Hꛒ4Ro���D�{Z\�X�J��~Jt�Gu�h^�bM�Zdn�,��y�J�V���M��U��3.�۩ƿ�H�~�`��3��i�s�M��WS�v��^�3d=�J/�)�ZtU�B��'DX��4s*
�x��(�%UQ�Sr��<��q�ο��s��?"fv��!��!9�$oI@�"QdD����ڡ��$u���c��:��IӻUpF�sT�'~�������z�E���J����y�e���-�C+ub~?%��u�nW��3��K^4����+_�x���J�x�� ��9%�����S.�|0z+%r�W�̩Yn�����D�
M��&~)�?7:�0��^�{��B8���$t@�)[^�z�j�@3;c@!u�ږ�V���I�Js;��R� }��2G2�u��96��&Y28���ሲ}���<����r�_�$���eԻUp�䦻T���}�^K���~�/&ԋېؠㆤY���ڜ�pƖVQ��&EO��*z� ɾ�[G���*��ߟ�#�A�m2B_�5��KY�u\�eXɸ��uTgA&?�D�E�*dn�����7WL�ll��E���4؄��^l�j_�S't�⅄�N0s�m%��is���ܬ[?<K���n�4��\������Qs;|�<hj�������6�ȁ���A���:9��&^��ċ��Bu�%���@Q������>k��~s��`���ڗ~%ck����I�������Ec�����U��)Q���4��+`�,2w��M�v��b.�����"t������ye����7JB��w(����NKh*�S��fZSJ��	���pH��?�D:��-߹�d�'}�pDed��7�4�5�7�g�.1O��	ʢ)TX��9'��Qa�~�F&w�zƋ�"��mӻ��&K��r�ilb\\����뉡���&�̩�չ���%*���ø��f�z�ޕ��]�*��A�H2T9Rs�w]�4�M&�s��n"t�hх�����}�$����A�vI^oE�G{� �N[S�$������WN������w�G���s��Ae�d�D�	X����H�Ge^�q�>�]w|W�����1O_I7Žt�OG�;–�=�*Fd��1@.<�����P��u�n��%��uu~�J�ZQ��}€�=?���Sb"��I��-%d��i:��~s�����h�i��=ݺ	I�`d��~�[��"tH!�]�:�Н򯯧�!�`���=%�E޽�е�2���D�hn�C�Q�A�:B�K�g��)ȇ~H��e*�^��9Rw|�F�4ƀV�����w���	_Hy�re�t�q���/,�Ǖ��	�~��-�h�v�:��q�K���΋�e���a\eؓ��EJ�T���'��%sѮ��ͦv�:�������y�
F�9��k�n����{V[��z��4s�^&U�dUf��n*��
��}�iq�o����Fj�2�����:z��ܙ[[Gux)1*cCBÌ�-�y�e�eO��������;</���r���`�x�>�u��H-�d�Qҕ�nz�t;�]�anzX*]���E�^S�5ިQ�G����xeK��y�"2/��n�*����A?�{�Wy/�%$n*帿2׃�B��
�\7�[m?5B�Tz�
�/�>�k�j�2_�����3-%����4d��c��]�\fT�ݼ	�kR��G�7�X��>hUѹx�Y�dA�w�_���h�>�LT��҂���F��^��R"�R\h>�K$�V�\7'7�V�#B�t��W.����6'5�a�����u^��a5`�
���0�"�m�h
�8%rZ�Q/ʼnݓ�j~\wV7���m��\i��:���J�{��sW^���]&�c��FIX�2P�+}��劖��j|A�KhRw��GE��H���~�_w7��sW���ll$r���7Y+���M�zg:'��C��/��*}Q���w$�Q>�M���ο��N��vj{�,u^��^�	}l��@|����#�U�}m
29����m�"si�y��]�P�w.���(��@t�e�Q��؛�&�ܟ�~t�:�����x5�������B'*�L��_wl6�*��ޘ�F��CwH�����}��k�%隠9�hzG�e�D�;ilԗn�x7�SR�xۂaU9/����9�6ko��*J�u�z񘬫�^�����b���@䶿�2�T���ʤM���N'0E���`@��_0�Ws��"�S:���1um���ZH�{۔���_���ϻ�8X�1�חj�V�պV�"���2��E��jzW��i*��:*ݎxǼ�!Z^:���t1JW.|�R�
C���{��!����%^�'��F����<H�c��eg����b:��\1��U�hP~:��1ETSS����pI����=�]q����H�2%􇈟�Y���AVM�$�ݦTBC�C��}�[�D��'�����~��iu�5�o��y|e\�� w���`V���������K�۾�2�.���n��
�X���)����UR_p�R�#�MI
�l��h7�P��4`�,"�]D�K�Ss�T���{~W�n��/-��o��DN{�`2�K掩ݠΕ`��ބ��@��U֡��q�P�wJu����П0�i�LH��0���xӻ���.�X$���ul�[Z��ƿ����Wh�~���
"4����t;��`-bIX�z�l�2y�;��O��T�H�+p�K��[F�{�����&uV�pK����en��~��*�[m㚋C��-��%	x�nM>Y���������x�uN����U��Ǚ����9��m\;T&��]M�hn$�$0n)���Ҽ�Q+���+�)
s�J?��)�ʻb��1�[[���+%��e�H
��x���R�A��W48���g
�#�f\�`��T����ϑ̗�}?����C�	��T��c��XC�X#�6�sn.dv�U��-�g�,�����{�,�Aq	yN|�W��h\�E�<\8~���	��M2�d����N�;??;#L�d�D�|��/7EN�V��4��W+����C�M���vٛ��kR�%���r`�U���ϒNWN�+w�P�6�'��������I�&FaYl��b��Q��I*�=FT:��-ͬ`��u|4C+	���i�`�fw�*�!u��_Blj� ۹�R�z�J�x�2��#��μ�R�EI��_f��S��~iAv�m��:�)A�g���X��V)+ .�So,.�>bg�̑��g��v�H&��i�Iba��ⶉ��r4���6T�����<%.I��M�Ԩ:�"t{A��:��9�hZ�%�}��~I�z�����F%�֕�֐�R�I]�ֆ�	Z�?�=O:n��y�"ui~��»�J'Mmh����q�B3!��VN�nv�$��7�n�*����st5acbԞ�V��"2^�\/?-	}t�oF��Ң�S�,���f�g�/-̅�ةK��CfDŽ�V�"�:�B��o�me|���_�玻�d�U�|�؟�(靴؋�"�}嚉�F�W�̩��ejwԹ��n$t�҇v�bZ>ܤN����,��,wJK�RBQ�tz��_%j��:���6���r�w���vͫ�[��F״\*}91�C,\����ge���ԦL�;�IWZ�f��5�;���J#�zW�d��ƗPu�� ^
X0.����nnw�I��̅U�܁��+�4,�{냊P*�8�ѲB�[�) u��Z�>*H���dY���O��tᄱ��GU=/����I���uyE���7�dNM��M�v���?�뇁�ԟ�=��£M�&`�S�v9U�ϴt���B�M�&RW�z���ׁף|�4�k[��{��pkL�M�J��t�a/��$8���D����6����D��"34���vp�T�b\\>7��9� ��G��r�xErՀEW��Ge�
j_%�׵��^Ϻ\�4.I/�����K�M�T����Э��I��E�ĞXX0��9��-��4M��7H�
�\/H��y�g'/O2�5�u�en�Q���_[P�ݥ���I<_/A�.�D��N�D�o d����	]j�
*]�L��)B�y]�&�=G^Xڨf�K��t,4��a.@����X����"3z����hvWT����esG�=GW:��,�:�X�W/u��>�"���:7���h
��;+C�1c��'JM�G"U�e��} 	.�P��$gڗb�����@��x7�q{���Չ\W�"�MeC+L�:���!=p�W8�S���i<ݢ~K��ws���T�H�&_:%�74B�6����l�f_�=?eaiL���*��u��,F������=�I_�����`N:�t �es��{~�d�n]�'����Ӏ%��Fu�"t�>��E��ε���u��{�r��!u�����4����`�Ȅ��R�H]W铬@Qk?��J쉒%3��o�H�C�`������D���_N#ٝ��y��on�ڥ:w��
�NH=`�~~�cU`}b�?
��yV�%4�y.�a�z1��R�W�8�r��ln��r��D��U��s���(Gj9��s���3%&gWjL� �A�9o���B�k G\�r�;�9֡iΉ��9��B�9�)����S���|T�m$��^���~t��v����U�ڹ��i~t���bvG�>�r��*ĆĨ��/�;tu��Q�a�x�߾�h5�O�H=穎�7��ѳS�g�ʶ�t�
;5�{����'[q%V#��=Qrˬo/�2{Z +��ze!Ȼ��iq�x����u�;-M-S>2'�v��q�鄮����=���e15G ����f�~tL_۞�4l9H��Y���: A���ѱ��я�ؤ�T:���9�=?W*����P��Pu�ն�y�K��q������ůF��H���u~�yǦ[>'i��u>��i�#��ȝ�u�LX���-�0��m�;��B���ҹ�J�ξ�U&�J���E�x��u2��Bdn2����LB�i���Ȩ�X}M��uB�X`�R�䣻����n��Y���Jņ��wչ,�\�,�%^�45�:�����ث�1N�kZ��M?:!�tQ��t��=Y>�D�<w�g���N\�|c��:�էR�.��o�fw%��Ǿ�u^�H���
���C�{$q$r]��b14��RdN���Ԯ��P�n�N{��/~�%���5~�<����qk��;v`�=��ņyȞf��3v`��#}!=�P�X�~�ϕ�
	�@\��:/�ī]o!T��2��H2WF��u�}�O;4��3����t��X��ZBf�9�/�t�����
>?�q��j+(�H}��ҕ�K�(��b^�H���B��E7���]
~kJn���~�a�9
������B���t8�7 ��3�2�"��^���$t�t�U�Hwkmb;U��;�?�cv'���i��˽Ұ!1j��Σ��<�%^M�\!��(֫R��X��?~ܾ���8���9b߅s��@dtw�s)C���6tF#��@I�0�&v�V�'dJ��'\����p۬?FjM\�8Զ�C��)�{��i�������B��:/��%�ge/���~�%��ؚ[W�f-�xT��S��j��CF�gyD�O�ơ]���͒�~�ϕ���
[n,�:���2���U����қ���?�Ô6l�\0z�vk~&~�7�9K���M[$��dG/:]�=1ʉ-qR:I�����!tٕ�o�/�sބS)5��`z��:��R��G���&sr+t��]�v��uBwH���m������|d��Q�ZBC+[f�58�Hw=0��щJ/�eV���J†���L�<�%^��K���&���U����5j����Px��GI%�Q5�knO9T�6�-��s�9�w�3-N�;��+�N|�B����J�AB���С�N�~R�_e��D�&U�_nW��2�r�2w���&t$u�����r�"�\XWs)����_1(.\B��E���"tL]�%`'j��xp����U������R�1�A�PEdh�P%^�v��2J�z��>���cne��P۸�inRZ�:���(ky&�\�8���A�})�|}Јz�‱v���ŗpo�Y ��jQ�t���#�F.{J������A���/w�r-�̵ 8�F	��&�����=����מm��ea�{I��S�=lB�s��5켆��Ҽ�������̸"�'��
���3���?�����3�=���	�H’@HBؔ����슸.��(�.ݠ���(���".�,"EDH�n�3��ש[��Su������@������=�:{F|I$�y�Z��o���}����U��黹)���;�p����w�Xs�5�ZZ�k�"�?{\���`���	F���>Q�i~I=���/��L(���^�p6��8�g�Nʾ���=y�_y�<��]M~;�s�$8��]g��Ρ���(7)�4R7eQr�q�D��n2F����,w��tl.��E�=ݕ�5/�(��
�����?�?g��o?.��ZW;���U�^{:���}�ra�c�w�:�tւ\�N�sj��-,r8��w��H$��{d��k�.�"�N �u.�uxG��J���k+��pVY���w�Lݒ��I�{󒿣1?�\�b?TM��]�����ߜ��,�4RweQJ�K��n�WL�{HL�{Jԡ�5%)�r@�oݝ4���ZW�z���5�D�S#�5mZ�����)��&~|�!����.&8�R�j�9�Yn��.�'���Gx	��XǏ͘�E����B$��c���jѯ���_ﶕ΀~�z��\#�7/e$SF�ԁ\g��x����i򛷛=C��{��}��y�F�*KR�["��e$�z�?F:Ł��:tZ�vP�l��Z�r����Z#�ޟ�.�3�f�k�i���&2��p���zT�{��>1�]B�	�}�����@=���?Go���i���:���sا=�p��/;IJ/�}.���up�3�oA������+5�wa�Kn����yf��V՞���*�uV��������\9<U��v:z��s����0�O��u�Y����H/w��6�Nq
пt�\�
�1�Yܵ�V��ӊ�ޟ�,5��ej#zo��wc
>;\2�s�5G��H�N�HI}=3ݞҾ�`x	�qs�����������g�×�z�v\�����}K��?��y�7]����J?�p�c�:;�Z����?�䧼�*�%�E�b�R_���+c�[0?1�ӑ�A��F�Yڲ�sa����֊ik8�{�c�W�X�hw���-��\f�����~�>A�O]��G����j��1MMc����]�ng��'4x5;�Ǘ8_P�ew{81@���/a��k�J�-=�3��f����7�߆�������6��"|6�h��.H|�w���]�R6fĭ��X������y�j����޼�:�\W�V���*Y粛��SE9���H�dYj�"�:Gw;��1�ǧn'�Y�����":-]���J�W�4�K�SW�6�M�Y��j��k$Md�u���ޏV绱�>.$����xA�<:�SrG����s��LGs���q��w��
����2�.J��py�=_'�E�c�H.�~�;�]�H2�9<�����9��ne���3T�d_nJ����ǽ����=��bs�><ٯ�i�i$�roZ��9�w�S$�e��.\����U�U:y����S��ޟ�*�2�j��l��kQ��ta�������n��'�� .'��w�����i��vqC]�Û�6Թ�ξ7�x�`�!���w��]5��TP=��?��gŸ^�w���w��7�~g�6�,A>���;óޯcצ{Y�g�6Zg�V�޼�����*�r�{�p
�b�5̋:�(�����'柃e0_I�s��n��iB�2iIӗ�����C�;���nC}j����.ʆ��Y�L��:������׬s9����|7�B�F�0c��yx
�/&��sh�U$J�A���;�q��A�Þ�'}�='q��~�N�� �1�G��?�_��a,�:\>���}�(PE0�q�����JP_0��h��Z!�pN�y4\�.����^5��֮����_�?A祝�O��W�rp�̡T
�á�Aw;��u��C�@����c�8�E��>نz�
��GuQ�eƿi���sl"�k�k"��s.F���һZ�lc��' `C;'/`#�<�y�������yJeqg�uH�c��7�������k��lF�oֶi��G�4{�#����A�n=,]����
�X��*\��g(e�
���V�&��P_0seu���ȗVO�%�"�yU�ص�oR�@/�<�e����^�l��A𣏕�Sl�$k%Q8���y�υ�}�&!��m[r��;R�c�8�t������EY�W�&2r�٣ūZ���9��O�����n;ۜ�����^Ħ����~�I�	�$�f.x>�\Lp���J�\��t���[��U��H?�V�z�w�\��"�
ri^#���h��.�#0 ��Y.b��l�f��=�+BÆ��:{�|ٹ����Q�����J5���\9���U^�a�h���C��|����ج-E��j�a�,
](����xCx�� �V�X�_�t.cdj��]a�Ek���Dv��VM�+b��;FX�E6�kJ�˚�k��&̀t1ڎ�[P/�5��.����~Md*����=Z�����b�����n�d6/����p_��D���8�D���H8�[��!��x؀/�o�nu��O��z�*�wUz���Ok��`�
V��9	�l���>3xH�2�X�K� �]S��Lb�	?��n��:��A|�����ص� ���r:/�Z�(�Ρ�������.�:&��M���W�=b~�$�/�FN"0�r�Sv�@�V�DXu�kS*/����	ˎ*I�ݮZs�k���*��ְ���bt���8��gMz5�k¬�˽��T�ū=)̧ū/�����;,
�o	O6�)M������L�۹��mue�G�b2�X��������g�?�a�e���-#�����S��|�׉��?3��sy�!�x}�]��t�cV:B��xKu�;��11�ʯ(ȫ/�y�5XEjJ�-�4��HzsƟv����Η��uAvvH�DM�m%���-�Y��D?�|��H���%uO� �	'O�l����4��c�km�;
��"y
@[X�^i�T��4��,�	Ї�@��q�B4	֪���.�֜�_�-^1.\��J5��wHW��a>V,�9{�N��w �qmF��u��J)���q,��t/�}5
������Ԑ����N��4�Q4oZ���O��U�����e����
�2�;[��ץ���<9n��.{���-|ͻ~K4��Fe~�`?�W���vJ�n^��J�ܧ�[9&d\��tƊP�rڡ*'Zs��2��%�����3�M6��(ړ�Ng�gO�՝��h�l,��Pk]�4���w�ܳ�8�\��XX���7L��F@�`~K$Md*��Um"#�x�%������WP��%�޿=ަ�?�
��cJx�})�۫��U���������<����ui�yQx4\��l�Cm��R4p��QL3��3|v�f3`��DJ�+���Il�x�3�n8��s��^����KY��xyd���CUH�7Ϲ����N��Zw@���wNz_�ln��:�y�u��3[#��-����n�4E!��`R؜��U�kaJd���@��d9���K���y���a=���l�����A�Q]������.�J�k�Z�-^E[T�:���&�Q(�p��p����h�4@!��$D�8����A�۹����L6�3	V/^�a�/��>{�%����$�aW�tN5�t���b�
��20N����r��n��F��`��
�tp�C���k���c&�3�~�//��ʸ��e�#̥x�j��Q@��B��q�S���n�U-05�����Db��'���R��6��Xv���@L��e�����
�
��!�кlh�u˫�Im�6��	���D���#��5;����3׏7#�#�u�qx5������}�X�?�ݯ�-^�<ں٨�E'M��:t�������h�n��|���	�8
���~��7(**w�4�fq�3��� �����mn�EKX����r��&������~۵�ׅ*n��_��CTeǔv?���=��œX�6�����
�)�)��L��tO�~g����EY��|�Z��])YA��u��%))auP%/�m��w�U��Y�ٺvb�����⟃}Å�9��)j���\EGj�$��µ�C�6�yc�c�;��������Ȇ�fI�I	W��>��J�xu��:�r����\ժ�-��n��:o��t��L����ɧ�8I�cX�.^�'
��7����KFE볣,Jix���J_J&�۝��AR�h4��v�l�wi���nwL��V�����N��w������s_~˿E�b��r���0V9f�+�e���&�pQ&Q:��Р��.�m�f<)��j�7��I�1u�Uut�+]m[��ًu�5�͹�a�{Ees��<7��|���Ė�j�oZ�D-:m'1��8D�*yҔ��-�jR�g�jM�:�d]F���n�q��>�rU�b??5z�e�ԏ�dbκ&H��A���nҒ&���If=������C��^���b�b�v��8�6<!������A]�B>#d��xv��N��kC�o�fq��CT佼���S~���]�d�nÓ@0f���.3#�l��&�[@��ۮqu��������WS�K���G�4��hxK��|�%�Pwe�Ӓ6���B�U<�d��ji��M���z�n��֔_��O��KY	����.{�c��8�Ɇ�I��c�[З7�J5�6��x�*'�Ρn�Z�P[dC�f9�X�Uj��/fya��8U!6����͏�w]���uڠ��Ɉ_=�EB� MZ����<o�>Ӽ\�F�_('�'�� w�4H��άt�����-_��������r��U�dFd�+���3�G�;TK��o{��d��W���`.e�ÁvY�yNy� �X��V��F�s�׾q���GI�K}]ok����R�q��3:q�s�i��Y�<�^�v��?!��/�)s+��P�m��z�@��$=��̐�EgI#�њ�'��ТC��<w`
:z<l�%�C���3��WuA�u�N�[�:Md"m�*�n��9���S��]��h~�қ|v�h�B�>&j�U���4N0 �XR����AX�Ǽ��N�����]01����8�k�P9��`%�3��v��G�ev���nR�_}��_�i�*e��&c�(̩U� �.�2��Av"�:�}�M�7��(�_қ���:��[�fY-����0�^�?��Pya<��އ���!�@�̭�N
r����n��;��.>�~,9���CW;Zt�:?�ˈV�p9@/t�q2ޯ5W��*���j�ʽ,����8�9��x�e��E��ޗ�����Dbm΂0,#I9�A�û
�>?|F�3�/�ь�U��ܕ��%"��\\N�L��ȥ���941��1���=��^}(VߣR�NNB�;y)��K�ɓ����^��#
�i�����G���ɚ�#Y�C�� ���M
���~�[:���A���(��6�����d��呟�nE&����$9�z׍��׮�o�vvc�iл�����d6Xl����9��;
�? ��C^�9Ζ��ȥ�]��Mz�"P�>�� ��.��z�~�.3�p�[���xZ�n���H�Y��3�f�^��m�I
�q�	�l���4\̱ta�$��._�Ϗ�`�kIK��̽�k;H�����K��Z�8:���^�����M�g��J�K�V��~'wW�x���Z�I�b	�^�_����6�==[����c龄�v�������B��L�*V�:&�@����I�^�֚3}YM�OIDŽ�f��S�AɁ�{�K��-����ht�#̱E�aRr��@_���)Y�:�ҭ5�����ʺ̸ɱk��:'�v�Eb���08ߙ����#:�-V�J�.Bm����'z+����U[�K����wY���ť��zX��)��%@�/%�4�'1��41�Μ�?��z.@��FN�$����K���Z�������\J�C��n���8-������f�#rW�Foc]�r���o����^�~PW��t=�)����`ֺ媽��4�q,���.i>�z�'�3ux���K�nx�9z�0�y���ng���*t��q�!�`ͯ�a�#�=d����#�R�|��3��~�.#���G�s���<��T�ū�D�Z�Ed
���}wj��>u)���m�0Ɵ%w5�n�y��8?n�9�Ε�@l-��`z��e�RB�\Ψ�]�E���;@��Q$�>ٱ�A���j~��ێ��՘�Pߥ��(��ii^�o:�{Z��ݎ�sj�{�
��V������xy
ȝ)
o�S�U�q41u��A�4�3LjX�����I;X\p�f����7Ny����Zs�k�����.i���ޑ���q"�Wn�掫0�й�I���(�iM?X�eW�:ͽ8����h�x�l"�����:/
�S����.�_��]�^�����e��0�%.���"V��������8y
�z�^z)qY�E��@/%Jb.��Կ�5�f��z��ۚ��e��H�y�Xﻬs�s����\;=��n�uʙ�:�in����Va�n�9.w&��\��0t�����z��+
�B꓇����o�X�Ұ~�Ä���]~y�՗�Te�
�}�wf��>ޭ��=�;����H�h��
�4d�e�]�	��uγ��fe�t.�*С���vg�l�E�|�M��}��e���}#m�/_�L7�X~��)�J�S�;��H��1�Zw��?DŽVa݊����*>w���n�c�
��=��{�����wq�K���_�n��ˤ��Z:�q=
tT:^}�`��kn�۳�np��t�L�=��vŽb�,x��C�u�U�^��5(�*"/d��ٰ"d"S���K$��
�U6}L�;<D�'7�`>�:��N�Zq�u�~�J�<�.ժc+�"�V3�uGp���ҳ~n���P,��e�G�`ǓnהO6�l��L��A/ߍ���}Rʆt�vrp��3�a�����>YV舝k8��B@����%��
����N$���+֝��ƧV:[S/M
��Y��2�<&-^=��B��X6��E,�;����k��Z�*�$wu���$��Һ���^��X������Z�բ���B���=|b����׏��.y�}�B����Kv6zK��)�i�����\7EMn$��ϵ
G��\/���>@�ؑ�[�uA�~v>���B�����H�m\e3��yI
&ߖ� 4/�ah�:��?f�����gH���N}ue��iiJ���ʨ�`�
��&�X�3���=�YG1ڱ�uɄy�е�cvv��
��[�ӹ2���4Q���=�F
K�0�w;�sBBT4�]� y-o�9܂��KMv��lh�R;Z�j��ˊV��ߑ��
x�1���L,�;��$z��g�A���c��r��K�񙓤���9�߈�`?��t�0���\�B�K���G�l��G�>�
0 ��Y��=�<V�C����Ϧ}���^�֓�[��bE��k�^0��5����`�:���a$��X���|}���j�)2��y������o��.wcz�n>c)�m��\��I������9x;xC���e�)����q��}�:�(OF����0?��l�g�w�	x?kZ⸼�0I�U���n�(u�GT�a7���u�8�'
�٩+¬󍵢�+�jl�+�y߀;�nq��0��� ��;:������	���h
б�K����;�4�ac�y����Z;��*:	؇�_���n�����Z:�P�=�H,��Kء,��͚,Mlr�ew�Β�y��.����2ĵ��*�J�w�N���v���TcøfM�_?!dnb�s�n�A�����ϴ���_�fC�z@�L�I_j��M,ޙj��{`�#�م�[���'8+c�@��­c8������g���ԏt�`���t	��r��ـ�+�$�}QG��Ўu�J'
�[hT�Z9��6�W�����U�}Pf�Y��n��=`0_�����"a��E�8xߪ�}��;��f�1���O��yL�~]��sY��.��2,�;�3��Y�݌nw;�7�h�<�6�g1�rũY�>�łT��������}k�=cJ�C��&��p:;���;�mK@��Qr�<0�D���zR�V�0��a��P��R��^$:C�t�A]7��>4�K�(Gʳ�j�h{��~O�9���|f~�(�A�"г�9F+]��N����]�"�����ףU${��,�8�/A��� LG�--^)�K/+*
M���5��]�5��Ϙ+�X��G�4f�,��e��^l,v
��g�NϏ�w`�q$肋�I��g�8-�C1�_H��Nq8\F:�XI���7Lx$��A+��i^�7:1k#q!��7Ҟ�؆R��5"�{��1��3��߁��v��%�ۀ
hFGk��X���Mo�ZR�:��6�$/;�©��lJ�y��Ɂ���[�s����/�=$�e"p��@}��ruA]B��\� OiS��t�����A��7%0/v�sx��`��3T��%�n�J�A�+v�H�	-��o���ɻBg����9}��*e���>���[���2\�jl<炤�!G�N�o��w�h���u��}�S�n�e�W̽��h�
��3\G�-8�����p�H���=-.�
�	CH�ڱ��P/���9�Zy�u��GD���e���o�ԅ��P�p�����j�G�݈�k�U�Wu�#�)|I��]j3�
�}����)��PR>{J�@�ۢ~��	��P�'�~�ȌU����$��V��R���]�Y�F����<q�SE�j��`'D0[h=+���ӊq&.wtG�nw�J?!�q�n ؽ��_�b�{�;�,uTԶu��b�PUWek�z?�]-^�u^|8���Ӛڋ�I
r�k����%_�R2S\N����u*\,�^���5�mꌃ��owh�Ϸ��.cω�34`_�8��.x����ӭRJX����t�ʪV�J Iiuk�\��%˺��Մ���Lf;~�Mt�r����5�`�G�No��^�3�9����z���mw����$��V�>IۑV�����|�z�γߕ�������}���t\n�pݵT��UGws����D~(�1���:�3��й�]��)���
[ީ�V�S
���p��߾��tS�m�պ��u>��&�bA�
��m䒎�7pb������=�#Tab\��8:��jf�\�1�[��C8.b/O��;�-��ų���.����;��ZU�i��i;�2�i�J2Ӗf�����^v��Rn��.w��B��J��A��B}���g�Z�g�46Xt�j��wm�Zw|s��Y�ګ|���)���>'�~���B}��:���n����w:���D�+���.[�t�TH!���s�0,�����ek��r��γ��+P�w��]]��N]GE%�T�ڈ�#DU:~��A���*��kf\i�-^�u���2�=A�ɭ�
 ����}��q�1NA�
G��rO���/r������9�7D�s�������,��a��n�o�ѫ����P��C��R�ƍ�!ԥK��q �I	T��L�ZO����$��r�r��4�.)�p#T���@��sӇ�uQ��u�^�m��}��~�.ww���t��C�$I�&�`���R9���A��K�'��1IRϫk<�xt�}��C0�H-s��m��[�M�o��9�uuER
�~?����d�<�Sc
O��t6���.#n��u�E�Q���s]�:�N�Wa��;0f-^���~���V���1j=���N,��
f�:��J���7O�vr�;�få�51�x[��D
��t�0�?7�-�����j�J�b5�z9{�ܗڤDTc�()z��Z��$i��GR�
vߘ:*-�R���V\��Ay!�qF�n�����Y�k`
�.�qG�����P�5�C?��rG��4�V}q�z?e0�wq��*\�{�NS+�nM��Nu����tЩcj�?ώ�5Q�6V���s^@�
˜�ܶ��")\�>@G���n�]x���^���dBPH������Vy&#����U��G�:�B����1�N�/�+.��u[�u����x��\�X�Fۧ�~��>�~o��mŬ��U��:%��O�'_,F�TZ��2C�/����9x�݂�
�:�"U4d����ͽ�v�*Q�?Lܟ�����CKG:z���pk���|Gk�{�w�@���-�jz�φpW��cI�r���"h{A�W��2'�d�U]��5��p@�ZтQ�:֩���\i
�m���4��xw��.���7���v�x3n�+0��sC�Ы����JP?5�o͔��QY��кhf�G�:/=(�Ä*#�Ꟈ@DŽ�;Ļ|/i��d��V�ݡA;����RsѢ{l̜t���	�+�y��y<Hr���m1���
.|vG���i���Y7Ї��s��rf�ȬX<��Ӳq�211Gȭ"m�F��K�8zW}ٍߢ�����rD��e2�Rf\�	����"y��kP
-���%�f$K��Ŗ���o�7I��-.w�[�_�@W]�D<�5r�m�7�s���cE�fE|h��.��-r
r��9�\��ct/�^Zl+]�����n�
�l�VY׶Y:-k
Ww.�]�;�(v�g����Il���J��80!|�$v�˶���|*5�ɳ��<�>Ȫ�V;�a'Ll�-���𙩣���'{��u��`l�w�D@'��b:�=+Ґ(�(�;ɋ�@O��˖���i�uM<[�"-��̵E+]u}b�5�8��U?25\y�
}�U�?�p�͆�D�|k��:�x�ϦxԒ^�2@v����nwo�m@a0���zW��8��!�T�ӊ�����qD;�LS���!<r�.{�{�gl��:g�����5��&~���k�z|/����V�3����K{t	�L�fa��E
���l��+\�y�⿗�p~�skb���@�V��E��=N��"ㅶQ��2lѬ�Z�r3r.}�|���lF���S�z<uq�I�������;.�..#�#���]�!<7�
�_�^��@����rgO�.��F
����\��$��p��c�]�G�]��3H�����Pl6��"�\�<V_�ʊ�)G��D'da��H&%Z�؍h�<��סׂ�5U�$�/��S+�6O_��i:�W-��#nv��K
v�e���K�f��!gHX�9�xXoU���>9&�'�^dƣ����`�ȍG��;���]�I���[����[4l�1}�19n��&��!��c�άS6���.�̞�`
N�
� $	�p	�|�������\h�R�gqH@GӅc�i���U�0�ɏC�ؑr�ܸ��a5{i�+�Q�11gQ��vW~`�=���u�N]C��--�V$ݲ�y):�r�p@ϕv%V�Z��%D�@G�����:xЩ�.�곺��X�K�'�?��kz�����R����R��}V�tl�r�;��촤Ҷڥˡ�b�Gs!�_���N�s=@�x�a�JY���
�����6��F$uQ�Έ;�@�Z�Wg��m�Z	w;���5��5a��5�KRuV���1��8֥C���l�9����ؚ�&1��=�ɫ�"�=e��;8���A1��c{�a��.)��*��
�1^��ef�L��btP�K��~/q��u�qt�q�eQ�;���^�pWy�zZ�\�~S�\�kj�R��]���Ibxp�	�;�i��}���A�~��[[�Od@?C�o�U�R�D9��<IJ�N�$z�T�ӗ��R��	L邨Y����U��2������hb��B��K�嚸���ψn�<������9UM?��u���}ܠ+��*s�U=n.+���a�^Wf��268�p���߁�����2�80	.@�2�+Q؞r���
B`b@�x(��N;���v���آ��F�.��_^������Dib�j�|͝��ZE���Lgu,d$�tpO�r����dmZj(���]7x)^3@�J����ng�N	�ϜTk� �vNB���}a��!S�輁�������pD�E��:x��2��SD�_�&�I�e�um���j�z?[����ݮ�������&�E�H���>	���:��-��?g�cwؿ�b��=���
�c[U:����2_��s#w��;�{Zn�c�=D�;�ɘb��ZbH��Ӑ��Z���W\r"4dȿ�à@�;��Mf��dz�%���]�`�@���HV�k$���@���¯��^DPi�pW[B�P�a��x<�X?��Aa|�
�M[�TnK� ������i���L�=q�m5�"��|����t�8>��N��.ѓB�5��+��sA�^�֥+P/��9�g^ۅ�|��b�]j&��4��Ƥj��9�<�u3��s�0��	����ԥ�q{i��s�Y��Y�}��09��R'��d�!X�R����C�c����1�0�wP��jH��}�@�Ku�.+�.�����i�ĸg2��Z�#U�ā>�ɱ��*���c9q�2�^�.�a�e�f�ٰux������aN�&�T�믨�@��ܠ)SGn%��q���'$U`�n�V��傧�:MV�gT-O����O�)�+��7�����I�(�vjg He��K��Y�vY���W�g(��9M�S����iR��}�[)�t|�Aܒ�`��q֥c���2,o�Kb�8\�P��>�A��WӄA�h��!֐$�n/��8@��X�E[1�\ɳ��I�'}��V҅_����y ����V�j=�F����T��O(��4@]��> K�4�]�.A���e����+Bb7b6��%�e�^V'�� ^���{oV:�e�Jr6���d!o&IK��9��4��(-Y����G::�z���9�t�P�%��|Y: ;)�g\���Χ�i
t�;�k��#&	Ӿ���~�����>v`����OnM��^�ұ{�Jw\�V�;pd'��A�f�'&�)���6}�",��	�<[G��_L=axa��)�μz�F@�R/3`@`B�З�.,!)�X9Ш,컅�ܛ_��O��v�o�e"��]6jjQ/u�����Άzw�
eէV�nM�)�1�����9��c�J�x:����6�t�/�5�D��-�k�/���E��0�(�1w(�2�#���i�`W�*�g�;P?�7kE�6�����жIc�S@��X��5%��֜����T����d����t��0�?�5.yq���^TN�>"��3�a
�H�ڰ�=�FO�
�3�8xW�uw���|���O�
I3��Ԩ~5׷]'^@�$I�(;:�����ʂn�k�r��Mܲ[����u~��I?
�Ť�����Q�'67�X�6�[���V��u�MJ��q��Vb�C��z���K.����������!�r���5�«��ޙ��u�5�M�]عy�)��j�r�Y�|":Z�U�N���41Y9��ϊQ��D"���
���_R+�Nb[NB�kE)�:���p��K
y�vif���6w�%[�s�u�Z�˝����ʚ�Ob&D���=��CXB��0�.	I��PG%��(JX_��X��ڿh�`���b���E�V�P�uQ�Y:mD�:Ȃ��~�V:��	��M�~?9����6�v�o�XW/{�[<�����Q=N��H�����w8F�;Z�)Q����1E6"�gX�dC���s/��:
�V:-��v�V:�n.�U�>`y�S���?�DW�dE�
��ꯉ��{��O���CPzFpK�6u"3t WTi���>���U��i�@�žA�?���X?.��������@�er��b��Y;͒���£�v�4wT�z��V{X(i+�4��dAr��b�`)[�����ԗ�Ӹ�j["C�����Nᾕ�]
x��Uȫ"]x�+<��νO��f㫵�B	��M��:�܃vF^��۝Z�o��x��k[����:+}d�﾿�?�?�����g������Gԟ'�p�Ӥ���Y����bHJ��.iU�R�J�}Br�����fH��A�;����+U���5��\�4Y�ý��9(H�Vy�䵝\|�o�p�z��@�n���;C�J�|V(��ɍ:2e���J_�@�+��̂�xL;�D�S\�wt˿�<#/���
�u�W-�}�K_��.�B�*������ꢬkӼ��S�YQ���gϋk��O���N^q��`y8Sو>��ޟ�ʭ�
�D�߮4��x:�:&]��e���!�%�޴��+U��K�tJB�TC��wy6�?�lG8/�ik�
�-�5�L:���J��J��z�,i��
�o�8�G�z�u�"��Xtj|�Yt��+CD��1���b���]�;��6i�ֻ��i�b�Ka%��^�§�z/��r�#]�v}�--5��S��z�~���8O�%[���T����=y�V��-EE׸S���64���GU��m����v9j�2YQ;.Yn`�㺽����~K-e�y*j8Ku�z�7�N�;Եk�7�����#I8�M�
��I�;�,�E/?����9K������JB�F8�����0�/eP��Z�8��>rvW��9�6^`׻U�.��%L���,�pּ
w�R:�V�)�2��gP
���Ua�\�8etj����	�:����ҝd/�hF�B6�Ǹ����r{R��bk���y1�<Q��b�5�vV�5���%�k<Z��'c"���r�@��+�.�7!�w|�t���	z�%aJ��!.���@_K�t�E��<9�f������@��zGyT-�����'ˁ���v����}�ei����@��\F�W�N��G<��u��ஆ���˙�J�󂺭�
R��K�ң�L9Z5dk�������'���k���B]�|W�R��{�I����'�
j]�ת�2f��Kj�Z��C����L�$`����bO	��]�Q/�^y*~�*4����;���6��L�?y��2Ē��	��xX7pП%��n��R/>���r��R�D>�P������i=9��(�$�?�)�Y�B�l9���s� 9�h�?���\����������ܑp�;�-v]M<Ɍ��)���uk���l�u��<M��'�U��z��!G�r6:'�3�뽝�z���ҋ��?іI
'-��-��l���[*]��V�4��&�}�3��SV�7-��`$qH�Îpwo�~�ݍ_�:��KT�@��mbO\��:��iM:0����&�tL�[I��Z�*؟��'Ei�K�ܷ���%�=WnʄJ�[�-7}�߲w�{6�ƴ�e�Ld@��9�o�<蠮z�>�S>�u��~�0�V�x��,Jj��0����z��DM�^�$bӄDZY�V�P/�.���S'3~I2뿹���vKKz}eU�f%
������tv
vu=k�k��}�Q1`����u�uwbP�s
�T��ޤ�iM1��_}��Z�kD�����7�	v�ŮB-a��ٝ�����rZ�w�{y6�̸Š�(����:PWǫ�]�Vui��ޟX˝)
�,V�E钱iHLƶ�䴗C^�)o��1	�jc�OHL�n�ݭ�mA�[D�6mSn�n�,��G�z�u��L�m���l1e��I��a��6x�:�ⷯg�m�vm0�w=��s�ڵؾ������;��7�O�rV�mى�_�I�F����tL޾7/e�����?)H�y���_um����葱�d��'�u�~jP�A��� �n�����=��tS��eUg���X��x)t�����8}�Ξ�wL�l��1i���I]�ޯ�]6�mф=�� �.W�գS�{A���_̒���x:��c���%u���|2�)YڲA#f�?��e�-%�����Ǥ.��u��~e�*���Bݎ�wN���.ik�uOo�~1bD#Ϥ���Gқ�<ܪ�$􇘕���j���u�:���`Jfێ��%��$+;9%�8ׄ]��<#��Pǁ,겞�7н,uj=���$�]�ҿ�����Ӳqk���-?����.AQmE�}�E���W�VzA��:��z�1Ry"�y��[7�]Ӻ��5m�_��M�ek��=�d��;�j�|/S�1%rx]F�7L����(�̿g����۵8�B���_l���A��-Y-ֽ��p;�F����a[릿
�;���|f|���d��Zﱞ�z8+��w�E��t�JO_�)�[6j~_j��Kk\���z7��s������Z�M�h��R*�\�inZ��oĈ#F��ZY���_�5�q���j�xEz�u���P���s���o�&}�nn�y�~���A#F�1b䬔���~U��1���h�fO����m�}ɫjO����_�N�nkv��vvH��Y����.��gĈ#F��Ӳ�]��n׎����C��h~�u�70�Ox�]����'�z)+>cG���	�#F�1bĈ#F�1bĈ#F�1bĈ#F�1bĈ#F�1bĈ#F�1bĈ#F�1bĈ#F�1bĈ#F�1bĈ#F�1bĈ#F�1bĈ#F�1bĈ#F�1bĈ#F�1bĈ#F�1bĈ#F�1bĈ#F�1bĈ#F�1bĈ#F�1bĈ#F�1bĈ#F��Pq��ݯe��e���.�֘�ec�UTP6���||qA�e��~������1bĈ�sNʇuktrh����z-���u������Ͻ�?5���#�����*ݟ���1��ұ��J�
��/
�]�8Tv�š�+.akp�t��M�1[[�&]Q>i����G�O^P:iX󠿳#F�1Rg%ԫ����K��w����n����SC/�vQ���l�1��̭5�O�tdߐ�
�i�^6���CBe���5,T6��)�C�S.
�O�����8��β+G�qzڨ���&�=2bĈ#Fj�����N�N
*��dQ�[�.��뒮�S���N
���>��N��P#[��h����	C��'���=T~�H�F�ʯbk�hX{˧�]R6}��'��m�{x�ȁ��-%�����B�wI}խU�x�V�=چN��
���!tr`�u>w�g�>���>{�Rw..��rο���x�R��?���3/��cC�3ƅʯ�,���<��q~r�G��95�Y���]�C_�3�텭C'zf�N�eg`@��ɢN��t?�<�s���_㩤zu �>�y��Þ�X���Uq���h�#uP�g���;�Da��'�N�d���lu��>X�C�Gx+�Vꕄ����
9Wt��{����̸�]�{[�eOn��[�>�J݁���s����p�B�A�(u}�	���B��������.���
k���_3.�@?����~������ف�	8�2C'�e�N�NXg���R��s��C�Z��e�>�*�o�~��ɾm�O�͞Ϭ�O�����-:����.R�Ρ�]c�G�J��u��
u�JǛ+Z/p�5;�w}w�����ɮ�I[v祄T��VU��a:>{�R?W�K��g�Z�Ý��-3sP�7L��̉ւ�_yԁ��cb<�}�)!{	��Q��\�&t�w;�ɳt\�#��9x�>��o�,����$�&�*����\�Pa�/O�j7�d�v�s�/S�r�\g�B�A������Z���z$1u�~�B�r�;V�pAI�����_?��3W��U�Ϣ.�Μ�-ovL����˔:Xj��T��jg��H:}��b?W���]��:���:'����dM��u���!!�\�ӋB��_z��0�b�=��/�N/th��wu<�ٓ���A�
��)��Uڷ=���,�3\��G�t+��Z�~�u�~�����~�X������^��gfOj���jv–�9��7:&��&P?H:��[�wI�=�%ϙU���R��ΨuΕ�����Z�+�IQ���-�vtH
�Ξ�[�b���:X�S���;���:�Cݜ�"ϟ��B�u��9<���b?��5��l��Z�:qQ����A��D�LnQq7z��2eL���Jw��%�{�`��?�>��
v�Z��:���MJѲpJ�̚2.�gUes�[^�NmcP���:�_�J;Bz�B�π���g.�΢
^�z�P�
Щ��s[�O��y���gO�:зeŧ����ʞ?�.vu���wK9����9v�����z��HϿP~���t@��б���+���W̞l�~��?:5���链���-
@�P��qOt��tnw5��P�Yꑀ��p�Y�qF�Z�.x�
��:ݹ�~yz��I��"�gX[�v�[6�oڒ���:@ܯ���:;kr��:w��ЇaT��+K�'([i\��s�@�sl��Q�O�0Ge~��)Q�K���^d�~3[�0�����_$�}�΀;��@]�ؙ3�<�稗Fr���>�[��;��8��l����M9�-�[��@��B��^��.�ݩ��q�KPW����Z�^�L$`�ֺ�HJ(HP�7M����&�,k��ˈ��Lf|�y����~}'/ٶ�\
]��0�>�#s.-���
�bG���a�YP�u�o�l��\������"��:���T}N�:��bw���c?�B�/Iq^@�d�?{:[�g�|�%��W][��b��н��h�����)�#|e\��#�e��nJ��.x9KT�ҧ�Vϙ[����i]�~�A�m�oy*#.D��-"�.�4�Ա�MU���B����V:Q��r����b�
m���c���s��C/����w������Tp�¡�'_�l�9|t�
u�K�t��L��~�4�,G��Lb��%HN�':X��@׹��@���._5�{�����᪔2D�9�uj��:^�+]��ιjc�M��ɶ���n����CO���^���Y�jL$�e�V�uQ-_��M�>�Z�~
�f��t�fiO����]f\�Y���w��
W��a�[y8���Wϰ���=���^��t�Ҁ�Ҹ�%��e�^G�HA��|�9���]���:,
t�8��v��:�
w����^}���&���^����NcS�E9=g��V̙��|�U��IYժ��m��(�7	��I��e=�V��~��G���pkHw�nu�K��!'r��+Z�Z�>I�����D�i��iΟ?���-��!H��9J��
�:�π�;k����&?r���vG���zݕC]�|�%�^h�a���ŋ�v��5qt�JwA]v�eȻ`�@_~|�&6��t��mb���J����$X۫B��,W��̝�X����~Ez�-�jZ�ڂ:��J�D�WE<����ǝ��Ϝ��EL}`�S1�^䪺��k�2��qBn��V���K
�����VM�f�.u���XP�
�X=
����[��N׬�\z���������K�]� �Rv��mx��!9ժտ�9u)��5t�����X�n���p�K}$Kwй��%��b�H�r���Y��J�հCuir��u�X?V�:cv���'A��X�iM��`@�PgJ}�P�E�;���ˮwI��P��C�RHU�y*ar�+rz����!�5r��\��J���,p�:w�;V:�W�v�%g��ҵ�}uz�4x�1���O�K�z~ѹ�����Q���M�tg�l���(ر�/u��KZ�^4@�#�Y�Ԧ��	H%�[7�j�B�.�]�|uW?�E!�d<��^��>&��շT�\��#���]:}�5��p���l�R�Mm��&�B��B�;�R_ɖK�>
����	��kJ"=� /%-Ά�g���cU.��ZJ7F;������i��l+]�]��i7�
�Jo��/uk<5[I)���t;�†z��������U.������@.u�΢V��\f��ȋ:�d��)�o9���eN=�Z��G�C�
����KY�=��ᑠW��J<ΎK)qI
vm��H�^�:��m+�u�����������^��-��B:Cv��)�0�]�̆
�'`f��g��eSFaSE�/���ؗGq��hV%�w���|��M��>\J���4K�e;;���i������GO��z���N��z��t^�@�����ϩ{�_���7�㥎'��tR�.t�z-��	�c/�s�Ƃ�#���G��:��wߥ�?=qe8��H���hB��sa�f&��KC��\JG&5��B�~;���ǥ����,m�h�z�>���[
��Щ��j�����B����42��cxYX.��(h��sͥV�P���.��ꅖw�Zi3��&��:���(
��}�R��]�k�m�c������Tp���.�3�Z�u��+}@��m���{jĥt
��-`�+fO1@���^nb���Z; F~��!5)ΣlM��#Z>/�ݸĿ�m%��9�u�So�ԅ�44qe������k���$���JG���_��b���>;є%�KЗ���w��1���%;V���~�*�����nQx{)pP�x6ճ�q���^�p�88ȁ:?���Zi��ɻF���_З��~/�:��1��U���N'�ٮw�5�/�΀��������ϟz�@�qoMg�ꥎ&H��:��nZ��>y/7���S��t���&�U	�.�g��͆�6����>���,��i�����$����)�:��=�~�u���a�>3�3-�+�і%-��a@�WX�KGm��B+QfgW���ȕW��6���8���g=W��
`�M?I���	gܰ3kC��^5�w:J5����g^;^�V��&Hb�e7��SO�~�P�w7���W�Nm}���>�<u��]�26K?��,�L��%�	7\p]�z_��Ϗy�Pt��s��[}y�3�E�/�9��Y���/���ԛ�ۍ��x$��]��C���bP�ۮw�7�U1��aA��h�b�F!���B�n����8�K�1�h��N\���,�}A.��q��s'��d���� �����e�Q�#�E<U�z�1��~�Fip��G@�>�R������AgT�t;AW����@�@���Pg�m��<XvC�<+�8��r��ĝ�N<5f|j-��������5p���PW���t���'н�����u��(R��>�!�>��x��}��W�ꉐ2��8�.�D��M:��>٫K�ҤB}���uy�窺�8�ᖻ�JG��Bԥ��%F�;�о���*�^���Cj�%��z(r
q����<��|"��ZֿwP���پ���K��S�C�����g�B����Q�}�Kԗ�;��m�:�v? zR�t~�Q�m5�9��?���M���z0p���c��_��/ubFE�u��-�e���nw%�7���sj�Sw{X�{-ŕ�q�x�S��A��c����J�l7&B�vc�<y`6u�R����s6u)߆�,ut����`&�85��UYĀ���W��{�\����m�Z�B�48�)r
s�̏�����*��}$��<���x�jj�[B.�.#؏Q��B�)�QW��0clL�0�[�]h.^�Ԛ�4n��]5V���g���w��Q��ǝk���y[wu���-���S�Ir�?�p�å����A�[��/��\Utt�c�D��W��1��X�%��8�A�=�*=����J��(� [��WZ���Z�I;5MT�oҸ�:�|�Fr�Эuì��XU�=��RG���ω8:��\��~�X!~
]_�([�.en��:�o™ó�g
.��'�`����������Av�'{��
uL����v��QQ��-��a-M��4jr$6�KV<T�R�Pw�j�����
�=�sP�^�O�M����W�?�u�2�}WO�_V�n
<cl���1�A����I�Fn*(�yW���N���p.��蕱�] wC\�S`��(V�b���%8@@��+�n,�j�����#:8D���:u���:̀��g^�y��ܙ�p�"�0�.\�jb܋ʼt��ó�t���/+��h�;�a�(r�8��=���Xp��+��V��~�/��w�S]�Ծ�"�yl�{*��Kc�%-+]�Q[�F|����x�Ε���P��G����� �?=����9�r�G�1�$��̕#
Ѓ��;$=���^��Ca�s���t�,u�
rǕ��8��Uk�Ky��aO����t$RR��wj��^g��-�%��F$��x��1K}p�g��B�
��PiR֑�$�a�7�i�*tt��Q�B�9U�����O�}�llx��X����^98�v;���s��R����3ك����K|��xi�cb��)����R��H�#�::�)��}J<3x�C}�L��g�>o�翋<��B�(�C��S��.���3S.5@BvvH��}�p�Z4~��;.�u��20'Ii^1�ͭXg�#Ye_,�G�EP^/��/7ر8G�kܛ���갌H��p[�Cg̼0�WA�/F��Lw�e��.
���P=�ݩRG�.�*Z��e�0�3��8gp�6�!ykG@�m��#��Y�=�T���A}��(銋k�~a��t/�W8L.c�
iK9ԝKZ�tj��g/sp&Q����p=����ߧ�7G�A}4�&�.ug&5@�i��!i}�*�z�	h*;��:s�*GkHr
q��w��X!�[^/�;�w/C�v��.��P7��<�
�킷�p^�u�~�g�$��%��Y8���L
�F*�Du���%�������)�Q����@G��V����$g,I�ϫ��kh�w9�x��%ΰ�w��P�w�N�9��:З�@o��C
�հ�t��^�ϟ6�!P'V:��)�?P.t���sP�l���My�x��+�5���
��z�cx����פ��I�#'�_;t@����:�e�GsM����sj��k�Z����D�S���*;�P��p�$��+���B�~)<.F�ӥx�Ŷ�!��m8io��"YNu;�}��:f�k�􅳿�X0�~�g1���Z��t�̳��ڎa�R���(�C��@W��N����Y{�,H��g�q��bSXk���P�T�~��S���@ׅ]T��M�<�Ʃ�_�����:^ꨗ�}��!̷�������Y��ۣi�$C])i��c�הl�J�Uo��]���4L��Z瑸�#�h�Y�3��9���*�%N!��Lp�7�J�=�ړ%~�E�gQ1H�j^�]�jG��W�2��.�0z�V�M���n�}'Irn�������L�?��=�i�Z�~X�����-$�8س�����0U�
�:�C
s�ܽ��;��Ek��aq~_S���n�r���,�g�]M����l��g����Pw<5��q�#�A�J:�{6����P�p���A]\�N��k�^��]R�Ws�T�.b(ow���.'y�MU�J�m��Z�X
��1N��M5V�/�V͋�/4�x^,(�k�k��g6�?�I�(�r�"ྜྷ(G��½u2J5�Fj�I�0S� ��>�i{�T'��O���c6��9�sN�t�8A/O�2'��p\&��(�.,5u����
��n��	��3��=�5�6	%�"Q�(J]�:|��Ԓ��<R��=F@oU�����3��#U� �
������Kzi�K�s�j_�g��Nw�@.����1u;��/}���Q>��z����M~�JV�A/K�&E`��Ě�ֹ.���qE�S�\m��R�̅U�&qo�"�Q��B�-�4�X�W���__/��z<����ୗ���<9����n�n��G���d9ԅ�K���[���u�鶕~�
��A�O?�6�%�Vp�5����?����:�:��Q���m�B�@��ɍd9��,z!�3��p��{�U�:#\@�6l>c��:G��Rbt{�j�3���F��O����u���O|.u�-
�k�x=��Y�����@]�SA;�]�5T>��z�奬�{��tY���`Aov5~~���:?H�Ah���{=�y�6{��x�i��O�j�Y�����g�x�dY�.^�v�3w��u�[܂�Խ����v���J����wg���zI4�.�[�12P����9����B�[J=�?��q�z�
}���������ȩW��.�ۄB]=��]��R�:�	哺rk-бi�QWx+�=w�-=���`���3@r*��$�����m�5u��?Z�\�$OM_�RW^��=��R���dy'A�)��j��u�p�ij�@���tt���s�{����*=�e�?%������R�q� ��Q͂_�?����nxy(��b��Ƚ"$��]ݺ�	�P��ԡ	R滈���w�3w����m�gU'U���e��ʼ���"f���Z�sX�{���P�$)a�Q�����B^Q�t7�pɊ���]zQq��Y��$I��MBK7;&@�w��8��_F�<xr���s��;u��Å�H���t�v������z��Rz/uo
]���R�P�*+�3@��ln��۷�^��H��� ҮQj�:����9��HTtu���n���uֹW&�^y�a�����m��~X�Uʂ_�߇���5����D\Z��N]�jFg
R��������D��OW\��7>�y�	��hݕ|�!
ͨ[^]�>b��_���J� tb@�����Ѯ�d��Ǻ�*8�9���Ni%���s[��R��Cr�Μ���ى�f%��>�`s���ڵ(ؔ٢�y�6��\f��2��l��st�g���a�g����l����}�ײ�
�d�������kY�q�ԂCi_��y�}_��'/�((��2��Y�F��:6J�;�Ѫ�؈͝�8�u.��;/�Pر��Y|N����K���lo�}�����;��>�d�	�
g��@��"[[���}���>����a�}�}>b�3�����f����e�Z�:�g����^U�^0aKW{���V[�j'��`��4ɢ`WfGt�ݎݗh�/뜺�����*�S@�����RY���?�Z(��߫�}3�sH<���7ԉ����X�.MB��w�$'��u�m�m��u��o�s���Xt���b�V\Q��A���,�T�B�����gԫ@;5��I�$Dx�4g��]\�B���O��'#g�lj�b�_��n���uCG�0�@��ci��j���z�'��!q���_�N���ݻo�n��v͓_h�pSf�o`�Im�u�n�<��q�hӬ+�G[7�ɀ|���M7�j��8��
!��$(�
]�k�{+ğE�t�`�����K"VE�Z��b��]��I�8�xK)INO�V��7���m��M��sHͿ:�jk!OF����z�T��P���)�iȅ���fNv�ex���?��5�=q�]p������̸�Ϸ��AWR����=ʩ�ֹ��fbQe�JcR�j��	qt����ܤ�����IH��^>��8}ez�k�w�%��?&0��>��%
�BX��Dž+��Zo���Q`��J-Ա����)�r6�xzq�G�R�TWA`+seF�؁V��xk��a��b����=����=�=�g+-��;��(�?�$�����	�u8#쬄76@7y�^��ll��.I�r�QQw��u�ej��n�<ܴ*�'�kЁ{�0M���#��-�'��c����w�&������i�ߛ����Mʗ�q����L�l���,w��"Ǝ�F��0�я^�E�����H�rsP2�$9��c�/�;zŝ71��ث&��O�
t�����?�����{����*��� ��A���k�C�*Хy�픒;ҕ�3������3���~�c�P\����ȳ�ZL�2W)Љ��Ἲ��IaR�c�IU���9�t�����/�Q���K:�u
z�0x�Yڲ�>��L�H,�_.�C��b_ݚZ��Ϟ�շ��~P����A���ʘ�.�� �>��ӡ>]��ܮ��;n:��_�� ��?Ew+��ڍ��s�K���0Q~���w�虵n�C�6ЏK@ϑ'*���`�<�d����1�(JJ2@7}y>#�7�fƗK�N<ji2�:���g���`l�h8P�x̘vF��>뜺󓂴�AﭟܝҨ��F��
�~�+���up��3ø��0Pw\�&aeЁd^1��C'9�O�t���k��A�+HL�Nݭ�:��Y��$�?�_�߻�b�
zJ��W
j�-Ð��30̺�1����
ЍD_6d�߻��1�77٩)�r�s�L
Ꭺqsu�
�y�6��h&��]��ٿ��]�k��7a�ygr��;�µ�VF�iV~�H�(A
��8כ@]���zZ	NR9�.�N���.e����;����$�=�Х=S�x�!:��.D��{���7W����Pbt�CQ[+�y	v�	�=��|(#��Ht��vq-�)��$~�=���d�b���|aN'I�
��rM-��U�tVz�������$�OX���!�B�(�q�}B)q<���~�N]���4IN��k]ﮬw�ጚ Ǭ�A�gu��!����V]K]�̦��~�/\�`��a?�^j�C�;�AL���A���c�os���?��z(+��Hte]f�Ӻ��t���e�c����ng�+0�M(�Y8����Ɍ����mAzb�{
Y�X�����g@_ �~�;UL'�EL}�(i{�4�9H:5�Ir4��c-P��C\Hֻ�pF� wc�7��������Ѥ�N�Ce{�%~�X~!�~ɆW�4@�������*���K*��?�E���Q����~-��k�n$z��u�ħE9�z�M�&&tޱ�u�r���47�s�	E8��H7�(ߙXEFQ��{f,�l��2�rg��0/��v�B����}�PN�5Pǘ�����5�~�}�xz��w��Ns�;M���#An��@�0�@�����t݃K(pv��_�����P�
�D !Rxh�~�B�g׌q�P�N�F�'Of�=��d��nW����sw�p�kgG��&�)Ub���P�^�c(m�gU0
zc%K���mI
nf����I��~�PR*�V���:QҶ�(��@�q�cֻ�E�6�	rh��9��?V�q}|P�;�cBTg���j�3Ҟb���R�
�9S��1�%���N�@�^�5..s�����v5@7Y��,�N����w���ܘ'��3ŨI�2�7�[�{v�p�w(;ѿC����&�}حI
B����u�9��Z��&�ԸM���0���#ʱ\Y�T�ጚ ��A�������F��k�3qQ�c�
U��}����=�B�~W4������q��xh���=b�.���Ht�)��q�'��a�\��#O�
c�cܼ��;�GN�ѓ��I�'敖vH
z�jRnMh0tnb����!�E���զ�r<]�O,M���X�
g0AnI��)c�s�o��g����=�u��4*s9$�9�=�����D�^���E����
��a�n���DF�ֶi���t@�
٭9H�ο��p.W��"ev4�
Ʊ��࿕y�'�Jˋ��)���P��(C-u�>���*�|����\��4AήM/v��H�t��K�Q�K��ar�\p��E�:��S�5k�z%�@��B4�Tm�D��u �K�X�^�ЍT_ִm����F�6�w�	�t���:ᰣun'�I��p0'糃{�EgI����WZ�)3�R�$ԟ>��u��~��S��rkH<]u���]�I���-�Z��o���cvi��j<i1P��ʜ[���	����1�����"~.��R����H�dSz��=֦�i��H�y�OJ�<�s�՞c�B�f/&���"��=fH�aϑ.�}X�{W䖄�koQ�~�PZ�h�nrZ�zK\�h�	Zv��ū��Ej�S�/���ާ�ta��o�f����P:C<Ɖ���[��}
ЍTOm������&ĩ�v�=wJ��s�:GW;��s�0G�|x��R��>�EA�[m�;��ߜP�m
����m	����i�z��.[EkX(?�զ�����tM,}�~ۙ��_��}

�t�
��ۧX �}������P�
t�g�\�H��P���F�'��n��cm�@��^'��d8Qw.Y��n���8	��"��ⴐX�.�^��g�Mn����R/C�C�;&�-��w�����z	�t� ���j6�K���Jg��5��=
�Iu��o�9�9���W��P�z)��������<���խ��Z�8g{C�9�:w��:Ǭv8�7ǘ����aA�LX�O���C�Ȟ��޷�(7'\0�A=1u�~�:ut�/��X'A��J����2�պt�{���fϬ��]@�VP�sk��Pj��@?�u��`�n�겺u�kW���'�(�gEBܖ,'~�VG��u�I[�Jֹ�j�l|��S�#�9�XcaN4_����B�{V�妄���U�;f�c�$?bm���J�X:��wƻ�.=��q�g��&��V��=�R��>��	����j�t���0�@_C�����2��$���4�m��8�v;n��:�*��c�B�kLᶠ���˭q��z��z_L�tV�_ƻg]��{�4^��x�B&�]+���o��~���p�Aw;}�t�J�:������Nm��V)@�.Yka��i]ok�ퟋ	TX�fw���s�jǸ9���`��q �/Y�Ϥ�guAnN�?]�~V:��7y'Kyv���}˱��
��V��=��j���~�]S�b�~nK�����F�&�nr�C��2П���i�\�չ��d8�lW�s����8q(�.B��ˊ�	z�����_0+���J�X:�xW����qG�#�(PyU����3g�}��@��=�b�n����e�t;!.G�҅��?�u���v�:'�v��.`@@��"�D+�����PkJЧ�b��@l���
���{$%l��`5�q���B���ohP{b�~n����VmY���U��Vf���F��N����~�\���g���yOgx��)��L­=�&y*��rsB��(�0e
@�-a�{�T–+'�y���C[p��:Z��3��.��+�b�
�kb?jE�z`R[��
ЍD]V�7�t��C�?�$Ľ����d5t��CX03�%뼇c�C&;(=	�Cx�4@�Y��ޯ�(�J���vO����O�@�$ǵ�����2��w��Tw;D�]�K�#V��3k$��(��t��%K4��=�S���<;ōu�"0@7R]Y��d
}�tH����K�0~�W��c3��ݩ;wY�P�qsH�/`�X�����T��O�ޫ�*��̿t%lR��(�ݽ;Ǎs�w'�qb}:4�,�@W'��DA�֯�5.5t״5M�W��B�F�$������1�V�;v��Q������v��.��)�9q��Î�9�@�&(}֔K��WuY�7��f����a�vwդ��¦����5�"9NX鰾�w]V���F�>X3�΍�z�[�_Mc������gpy�����:t#U���6n���v��.J�6�	q���C�\��n���yV�W�u.\�`�Q��⃃k�|?m��ޯ�,sZ��?'��t��%��Y�G�Z����yr�ү�뽈��Y����3���:�?�d����?������Y�F@h6e��pAY��P*�ʢ��(�-�'�d\pQ\�h$�Hp_pcʦYf���u�s��=���}�~��|�'���[�Su�T���x��$���,a�U����莜�.D:::�=R)NT%�ں�Y`�n��vemI��F�U���p{w��13۩w>9����a�Ch
µ3�{,�gu�kE�z��y�_c�}9��~����2dF)XG[Uk��K�aw�/��ğ�a�~��?���XA����5�JaA-oiΒ�R:=v�
.���5@�H-wQ�Zۺ�M���t��N�"���9�z���I�J��s흟���3�73���������<�.l�"33�;5d�|����k��<�Q[����"3vW^:@}��~��	t��`>>]W�ͷ5爴ϔ��I+)��Ѫn�ޅy,J�7u���:Ȝz�]��<��:���;��N�P�F��b2�p��;�C�
���V�3�5H�Y�y@?��J����b��s��F�{5�ذ����K���:*��@�.	���ƙ��B��CSP�>o�=A%t<~�7豋�	���M9G7�^��$@�5����?���<AJ�b�8�9?�b2�ݎ�vL�?,�Z��P;z�`�`��s��i?���%��W4o�Tb���>�>zp�����۳V�s]_��vWEft��to,���ĕ�t]߾��T�Akȕxh�K���U�@�'F�h��/�rJ��n_S�u�0@�.�]̛B��^��I<5��nK������v�����ÎՀ��`��Ӭ���~VuI�����>�=1��a�w�Ҭ�v�n��F���K��N��^u��л�Y�4�
ъ�d��sTàC�������H{�F�<cS7�\jdN9E�.�]7�l81B�б�^Y�%_��	qz��d"���\��5�'��������<}-:O��=@��-1�~=�st��f��ԯ��&�gP]@��z��I'���{hz�3�N�:xNޟ��lp�k!���8'���'~�3�,jxְq��64��ߵ��w��yZ�&���𝅘𝅥9���Mr���z��bx�b�ҐM]����$k�W�`�q�O�3<�j
x����y�τy�9�q
��O{h��۴>�4r<�~�g�t �� ���7���NQ�c��wHC���s��ka�068o�4I�Y�%y0�ȁn+0��S|b�����#}h�#�y�N��H�	t�2ֽ��i8���R�"Y�!��9�c�N�N�9�RJn
"�!�tR��6���4��9��*o�)�x�H�����:�����`����׀e�����񡽎ο�g�kB�[�s�u�������S��;�敵0�]/�A�g��k=��x�Z��9����s�k�`~"}�#����Nՙ��}t��F��3���Q�� )�G"S�DP��@�8�玌7���\`Ό6�#���Q��z��
1�:���cJ�z�A.��:3��Cz
���?�l3�a~fsȳ����on茟W9`,9j�3/�$@�	�ت�8;��L�~'�#��;�wз�0K�~B� �T���
=V��#��͙�L�ϩ������o�7�<���q��s	7�+;2ژ��G�st���P�r�_�|U:��#ɠ�;¯j�ʈ��tɰ�c�|�ӐG����a�Шs�ۼsr��\eh�1�� �n�8���K��d�uݱѹW���m�9�F.�5��N�N�*=j�Y��M
�3�N�ׄ�o��8�?H�N���;�E��1<G�%�#��gE�=�@.��*��TuU�&�ͫk��:����L�;#�c
�o���vWP�ơE�$�J5��nwd�����d��Ò�n�kCN
�2��j��ѰO�tt�E��aa5�M+,��(M̦�_ٍ/w�����l�r]�����θGOk)��ÑڼJzM�3d��|�Z�X\&��z)��#z(*�]���8���K�LO�9�E-))z�s��X����떤03ӽ�]���$���AS
}}��_-��sR��gȫ軭��Ag�� 6$rvT�F�{�hę�>��!1C}
5��O���۩wN��Q���u��c�؆T�,�OcIg��:M�_m�Gn@<�50��v
��H$�ݹ�S���88�=i�i��h��1C��mm�Fǂv��#F�n��FK �8/�Q�0�/�:<�gU��g�-@�9��GI�@�յH�5[��8R%��#���>Ѓq�YC����躠�ѐ�tx�e��	��IHh�-��ڈ�G�
�WUxj���B�΁�+�Ѿ�0�(��{X�MD�h�m������{#�!Π}��?�@}$�"X�N7tf?�`-,�H���n(-jF�~�J�C���"ЍL_^\�$�Y+f��
qLU�/S:���ꢖ�(���}5k�wo8�@�-��3ݧ8��9�%!ԯ����~�-�4D]{hܠ��-�:<4��E�0'��ĕ��8��u��hؕQ�^�n�t�[��A[4�`�nDiئN_�[H���!�pg��'5�z��7u��9O����K @OZ�Zw��e`�oP��k���o�#�6(�������9
ݐ�Zxя�~VuQ�J�Ω
�c�ӫk�,�t��xb�ݽqh�ʼn�˭N�=|�+

���5�4꧄F
*����)���6	l�������,u�W:�jt��c��:��Br0Fj4��ϝ�d����ǭ����ԑ�|L���]߲�Е
�`���謞��:e��
�~NuU�[�Z�"����@���輸��.z�~��L���!���c�%W%��'t�i��*�̨{޺6�6���i��_��8%�����gv�>~��ze��4�MFj(�qcG�N�=q��a̿^�sp-��8�nKdf��8�50C����+m8
�*u��F][Zg1�q!�ȵ
Z-�V�m$m���Lɋ���ꪖ7/j�jβ2��jqP�?+�-�#ã���yNJq������_�X���:���5`��3T�� ��`e�)ԩQ��a7+�h��`��>|n�C_��s�稡~Z�c��bЍ3�B�mS�������p���րm�q
��5З���#���jiFi�=�Ϳ�f����Y�>2г�!e:�gMkیBx�e_�ϩ�����c�}e�	�X��G��>��n�W����b&��=x��O�V��&@G

:��|�S���N���C����
s��2��4�9�kV��B$�F
:���(����B}����Q�;�@
��!؍N��=.u��C���V�,�B{gAs��ɂ�7����T��XDx�c�����S]�7�?�Z�\Ϳ-BÁ��������k4ӝ�����g��������A�:z�Ԩ������ĸFFh��k���m���>k�1�|�����MO���,î��
������:�-;|��6HW�G�n2�����a��t����'���Ń�+�3/�S/-f���gi?������}�����@oj���=[?hޤ�f���7oX4sGR�R@�t�ҸQ�`熕
n��{�����\��y�.������Q���=��#�i!���5'�٦.�z'��<�5���5P�����"H��s5�r��J:���ʒ�>Ԡ���F
��>�4�8��6�sc@vw�ܕ�s�˺����4BC�\�k�M#Iqfȝ�W��}�yu
��ہ�3��T'бu���+��=è�Sנ��o���,�(x>�7�Q�e��HC�$��f�S����fu���te]�:��Ֆ�/�Ͽ�(k(D��7u���p��zM�[�]��!WbԪ
�hQ�5�%UD�4����y�倕�\�ֲ���'DƝ��@R�{�]t�Q�p7F��.>6
��0�߳��۹�Z~L���wK4�cW�͸�R0@�Gi:D�_�ݶ��5P�����,�o\�s��Κ5U�T�Jq5��%
;�3T�强
Ww���b�n�9˒ů�̔��E+��&���9}S,��dz7�g��>
�F�I�wO�ܠ��zD�qG�g���χ����#����r�{vӟ]mD��(����]����?�-�����G�?]U������I}i	��?Rc��P��Z�5!�mM�aW0�cO�M"-4_bF�z=�O�W����J�:���?����nk��o��B��I�Tڜ�K������ű��g���:��/�4�߿Ɓ΍:���Pn1����?z?����}�9p�
��q���ϴXP\M��HTa�u[x�n���6���8���5�z�4�v�qWQ��(�=5s��)�E�xy;G�M�����q�^�3_�OeW����i?���խ�`	��L�'�V��_1�csZ)��}L�ّ9{�AR���uq�1#N�7m������=6���u���}D�D��/P���e���߶�F�B�6���;��Wp|��|�Pˍ1l�HR0jl�i��C�]WZt,�Z��
���ؼ���ĨE�>Ȓ�6><C�ϫ���d.��;i?���J����?V	���f����$�_
��
�4��O����7/�]R��g���Ԑ#�шS�ó�	�4���N5~���I��������"��ԇE�2!�g_P0@�'�U
��
���~���5P���5��v���CT��{ͺgξ@���V���w�&��W��K��|g�hOl�B��q�yǕ���(�i=h�q`��?N�Y�E�XzL�����K"ОU�-|���N{�Gv�]�y�/$��'qm͙g3�+�9xd��*�&1��3��@�$��~�4������0�x-��ؒ�t����>Y���Ȇn��9n�(��&�j����:�;Ի�VO��9"�~�d��f},���������?yq���Q��6�ȫ����7m�q�O3���c�ϩ.�V�oT�9��i�\Ø�h�ֹ��҂�cn�#I��5sݒ97�k����#G��P�A�B����U2~���ρσ�E�[0�W}�]Pו��B�cA=rݖɝPk�x��3�9��!�����6��3����]����<���ׄ���]n����f���{=o}m-�n���W���rֈ��S]ԍ-���s�ߡr'0���֘'�ֹ�N{���`̭\���h�8�&w��Y��wh���;_������6e����
DP�XƋj����5��x��|�o�qG���񞃧�:����.�n�g��f�⥫5�@�:�9��!������UX[�:B�����>�E��H,@�Fa5�I5����kB�Z����B�WK=oZ�s��A��?��~h��i?��(o��ܤ�s��!�	q42��X�\��{�����I���tz~��)(�)r�\C]t�
t��d0U�8m���x6���I����ޭ�{PPu�g��:^O�y�:���ڜE�p�d
tp=��qCk�5��{Y���r��^P�Im�^%;Zw$��jrpS9Z�^ZZR�4�}�����(.�5��X\��H򌣞�wQyhq@_2�ʴ�S]�g����Q���9�˕5��P��n̓'����`�l�%I��>�K�t[���\�<R��3��}OMA
:"z蝿FaN@F��i5`��-����}���oU�kb���7���C�ӹ����:/��R�up�Y;8K��*��>��V��{�րk�_R��*o��Mi��C��t��&��E���`����5���
�ԌP�zgV-��XX��� �~pɜ��sJ�9�Eyۊ0�����0Ý_Y�U�h��G��u�/p3�!�P���I���
tk�-[��Hi��k���K���C�Ό9����hÜ=�DZ\���Ie�&���3��MO�A=h�Yg�ΣT�=�����.��Nk���6vu���Pm���ڡ"4�Ȇ`�9��O��������$!�w�B�wࠗ�pzMhi��+</=�^�
�G3��յ���詙�ʣ��x��K�=tЗ̑z�լ{����]K��֩p�/�9&�aA!~e
�ZB���%#1b�̹�yF1�)�8x���z+K��x~��K���6�@��/�;�ϒt��� @I�9���p���j@t-�x\}��N!�Ѱ?G�:/*B�̄zX&�`�����
���na�X'�M��=
7uA��?:l��
��<׀u�;�`�h
��ۡ�-R&v�C�5�e͋'З�st0n�L�������ah�#�[Te����C�4��K�Y�%�ҦQK
�;Tv���9���%�����rYX*�,@����?{bbW�葻�X��0�a3����S�]yj>�-�zh�*��w��~F4�ڀ{?;�〯ؐ��y��'�Q�P�3�0����;��}�]'�g��i3���l
Uk��z�����0�K
�Ϩ��m
<������ۨ�w�5�/t
7��wgn��:����s�� @�	-kޠ�zIv�s��yf�ӫk��2#Y�H��h���>�}��e�e�Z6�W�Ϫ.��֍��P;����

�?�6pt��9jĐ
�����N{�K�~�N�c�Ϡ��nxgX�t�
{M�~��lT�k߰�Q'P��;��C{Yy�6��!#�(��~
w;7�u
58z���J[`��T�T��0g��q�����1��F�c��v̦n���lB����p�?n�"P�Zn����g��}��&�����U%E�%$쾒T��]�Ž�����̀��:n�!�7-L�#@���Ē�
Q���`N�s�:\�&*�$AbA�Ș5�Ä8���A�vh��W<O�W�4�Uq8zA�_:��$�Au��Ҧ&ʘ�P��KÀc(��ʰF��B}��x��5�a�í�̐F�x<������i�������9�g��:
�Hb(Fhh�2�/��h���5׀�5>�a��!�BEj0A�M�Ka��Q��\��:�:�Լ����޳_��S�^S����r�~X�q;��7^\f�A�	�E����-�|}�ϩ.�6�^�]���;��v��{�%�Є8j��;���>�ـ���ts.�-�gPU�����7�s0����	D���
��:l�p����]̠oS�q�\Q}3�h�rӰ�F=5~�������"���t��]ʺ��G}����5��7v����h(<o���kS��p�?B�n����N���uDwzMɃ�s�/w����J��%�}N�SO5�S̻�g��誸�ڳ�_g�>��~VuAw�+��m�a~�2^���2`4���۲�#�x����EUI�
t�Ͼpz��aEi�����u��$0�
y� ��5����̞��k�ԥbo��{�����wۊ]=�T�ۣu���*^/oY�j�Ҋ�'��x�KI�3��W<թy���Ul�ج�?;6�x��i�o<�GʎF�p<��3��G���ρ�{��'��o<׹��E��|��[^Z�F��o�hU�~E늏��q�����{B���.�y���+-nU]@GGF7��m�Q�9@	�d��5pJ�5�z�7ú��b`����t��㭁O{����{��x�z���_�+][�s�7'07���s
d��ǽ��LX[[���[k���MX{ۼ5��Y����{����
kv�)e��5�ÿ�=��������~
��N��ػJ���:��q�Lw����W���{衇�9��򊴟U]�m�sJa��9&Á��v܉�s�Ox�y0�����e�j����88{b�y+��C�zg���=��px����:xq#+f'����C7
��f7=��Vo����a��6v��7qbD����+�%��4��n;GwU���t�]��[�-]��М�/,���s�I�Y��k�As<;����i�n���f�Ì��j̃�&��<���g���I>�����A�Z�1�a�67�<��@��ڨ��͐=AU�?�G��<����g
������e������UM4��yQ��H؝�����+�EK���3ݡ�;���/+�gUtg��_C^�{U�}=9;\����pb��s�rve
��
r'ԕ��!�]A���I?�
UL�p�_)��a����gb0�!r�v0�g��'�d���C�/���o���X��F���9��(y@?x�%�:r�<G1�st[Mwl�I���~�@�����~VG��9��`��3��
�ü>L��T63M|��vZLe���pdxe�(*3Q�N@d"5�Dž@�-I?��z$ܪ�}B�\=��႑��<�_�Z�a�>v�=AU+�#e�;�����Mx`�q
��օ���6v�&M�uE������;o�b�����L���~bܥ�������Ց,�#������j
�[�j�sC�ZXX��	t�Ϛ86�gQ�@�Tʋ֡�P	̡�?@�����x��{?�	�����/�c������)d�����+���(y@�@G�c�=r}�9�]��#lfN̸��11.�י��s���H�}m5��
��3s���j>������X2�n����8���+!�(�11�3�%�<��m��9vC>u���T����?����tz�J�;f��im���^���`��=Ӧ�]���l^�l1:
�G��{}���ѱb�q�>/s�y���Dy��r�z�|nT��n�<���q�$�Y
ٙA�
t�W�����mGL��{������
���}�>e�=A%t�:�w$Ȃj�1k��|�C��jZܬh?M��ް�a\_3��>��ʌ����ב��Z{�7o�+�c�a��Ch����슄���H�;^Y�0���|��x�ښx&�tZT$�3�z�e���Q
���.\t�=A%�H�Lޜh�cS�k����?�t�$@UM��^�2[���j���нMj;G�5�n�u?���H�;	�{@��v޸��ב����z�8�kNaU�\e�;��p���Fe4��P'�c�rc�A}���F��3�.������V����;�یN�
��c�	�����n������ias"
�ο�g��r��j�@>v����K��8{�{v����aw{��6r�lwR5��v���̲K���3;���
�0R�7���O�P;�wνs��,68,sI�j��th��}���1�F:�%t<?�����+{��=�sz��n����G.aa%��
]x�C%�N�dz�����%��?
�N��VX�̬�Rd��}m0��/ܵ:��O7���5�K?x����̎=\v�/i�f]�[���熍����z�*.�&��?w\�
����8�R�K�1vCM=��ޅ���ϼ3f̱ӜY���=A%t�m��B�;o�VIT���L��tQյ�y����k��"3p�	��ތ�q����Y&�Ef��"3q�Z��t�W��W��%�
}$��M��։���9j�{�6�<�7�^W���9޻������ؚz65tz~��"x�4#��yx̹P���:�#HR$����\��a�A���{����W�.��<����Y��"���8Gm���UN��^�ܨ�n��_3oc�Ϭ�������ǰck��0�s�,�N3��;��p*�b����9�G�׵(���u��1��{�J����]��)c~�9�z�q�dz��q���6�CM0�D&�1%�9������@�O�˷�jN��R�/����B3����74��V��Ħ�W��alT^���`��j����޹�;7��]�H��8�1)HA}��s���S�@7­c�r��2�9@�[�z̝*@OP����0�Nr(p
�g �>jd����O����W+�G���:���{�����-!I}��
�X�	r������j�6wjR��D �^9�<<C��s<7��o��pN�\'�����<RMUF��wp���g��g�*й1���J��	z�c^�=A�
���ss
�u���t��iQ���x�w;1z�5
�ܧb���楳�t�'=������g�9G���ʎ��7��p�܀AB��y�m��|'	����E2ۣ�9�n�6��x#���r�>�U��z�92�;}�&�Sj@��]y��Ӄ1�"z�J�7@��v���4Hl���^�ox@�l!����h����]g��V��	rXlfk�2領�]��ޤ�{�s��`�������i�޹J�3�����W꒧�j�Y�tz~�ޙ�O��q��=Q�����C�F׀��eN=U�.:|y0_Ƚt~����r�nm��肋E���akU�z_z����/�0�g����Rrx�|P��մ��̜Üf��P�靳d�a��p��U�ߌ�7$��~p�Y�5��jЩ1W޹�i��tz�J���,@W�:��Z��y��4k�g��{�q]،{�D�p�9zWY�ԉ����Zv�负_��P��� ��r�͎g��xn��$��*�[��u5u~�[E2�c�)���SF�rS�v]�Z*���'����M��̐!tQ�������8/�����c��:2���U6������

�[�Kn��
��8���_V!v�1	�G�s�G��\]Y�=lz`�}�xf��s�3�	��>4�+#Q��ڴ�Y���,�g��{�/�{��q��f$AC�8����L��U�WK/=+�gX�M��[�9��٪�K�_! ߦ��մl0���m�9
���s�p�����M���WZϭ�}����U��СtQ����Ŏ�w~/��Z�F䆲�Tz�{�U���~_�`����CK��K�&��z��ϰl��s�a�F�9z�0;�0WIp����{sex�G����J�R/}��#�z~��:�.@O\��袄tEI�����$��U��֪��� �w�kR]�Cݿ҆���Kf?�Yz�?��,�So�TZ�F��7��H�󅱭�9��^S �^�N�����P;�z���n��vu~�
����ӷ��k5�!�$@OTtQAʃ��/��V��{	��w&�9C��,5�g����W`�]�Y��bVӴ�eu��-O�]E�/�YX�+��@��خ@nz��m4�?Q0��کw���Y��x~΁0����
�'�H��%@/l	�E�EM~��v���K/}-��F
���;�M7�޻ڛX���^��3H;���q	�����W�������L��@�P�F��x�r�>��w��4��P��;��>�9f�k���C/}d�ˉ#�J�y
�[����E�.JD�տ�&�a��k��Ɔ����л�����+��6�:��œ��8ұh�ۇN�3�G�n=��^m��3��B�͊춱�y��`N��#�pA��yWnW�����vWP?�������%@��--�����C�x��H�S�U!��i��=[�<O����m89Ա�4V�2�\���B�*qM���3K}3��k��+J�uw�6ڧ�ǐs�
�:�
��6�#G��y9|NN0�P{6�G� �ү*������lA�–]T�Zج�4z�	r��;�bװ�6���t|!��Z�$u��<�t-�}��%6:XpQt�
0���}���Y�|��i?c�ޓ;4�ۯ��{Nn{�	���ǽC���nO{t��B����"W�h�݄�
���yg�wnz���2��=6�g��袂ׂ�
vR/�J#A���K^Z���t{�f�3��:�e��E~^y�vݒp*�d��)+�?W���k�_:�	��?w��	�R���'��g�t����D/>�B=��]�}r��9�uF;���+��d8�z~N��Iq>Ї�P?ؒ�|�q��袂ׂ�?i�A�/<A�z��Â3[�D;�ٓ�:�C��!k�4cE9xI�[dzu
v�S�������?�5��}��v���q��j����q��Ÿ�gx�5{��o�;� �ɇ����x͟S��	<l
�4��h�C��+�{,�1���I�]���݀��73Ç�cu>�Ñ��%@��[�л�g:��o'g~���*r�+�a�m�cX𒀡���uL�C�Ϛ��
��A��|b�=����}޾�����l�?�웽
��/���{��QL:�d��ӊL�]x>�F�����R����%��<�˳���rL��=�ݶwT�_qz��g�>��!l0�{<����!䭼t�S��;�k�B���r</7��P;��F�s���sL��@�aw瞚z"���%@��4��[[���W�/��*rϐ$����u<S�+m�߶_Z�4՚S��F�}�
��;�9�9|?|a��ig] ����HC��{Y��/8+��ɇ� �e����fؔ �G�B�K���A0h/��O�
����9z�Yaνs�g9?7�N�/}߹�j�uAzaK�.)]ѼA�M�m�c�|9�y��f�$�Ѣ3N�㙺�(G��a�Q��5^y�x�N��g�3�sW��q
r��R]�F/'�{���C&��!!�=�����A����-P�`G����m0g����yn���@�^��|9s�q�H{�r	�[t��ȃ���y����lx�6p	��Hb�;�$�z���S��\�dݽ��������P<\s�p�`}^���� ��9z���Mܷ��s�y�E�����
��X��aw�K��t0�	�?cp�� �0�}�$Ԯp{6��!@�����,J{��$@/l	�E"&�FB��<۬�Œ��%��4��7���w�01�6��쓰]� \>�������>�0{̇��v
t��t�y
�����8�#�1�}7�kp�[aνsn��'z��x�_��X�k�%zaK�.1�h���x@��C�ؑ�:v�IrXt����;���W���3e�7�'~&i�ax�����(ݏ[C����\�<O�c��w�
��L��W����K�@�uw�g�5��ss��y6�W���{���*�'zaK�.Y��4�z���scپ�n����,W�>Q��{h���}o�v��g����z��+�j���&��A\�\%��`n$��!��r�t�3�#�]�';`���l@ǰ��S�e6���H�^���D-lZz��y:�OǗEW���:d��{��2��s��?��r��8�Q��,E��c'0��!�{��~��!�gN��)̭�v����t�[��m��n��<����>��/�T�O{Mf���%@�b�y����
�7��B������S��r;u��\]��H��:
�`gW�lU�TiR�֡�^C|hxǚx�a���8+>C�
�<��y�@����=��'���>�����^��H�^تy����,y0_�����~:&�KP��u�(���_Veb_W-@�:ܱ6�vcW�S;�5�)؍�f��Ph���Y8����#�)�1���Gan��uR\v�����n=C��Cwy�g�ۗg����U��V�@�w�
�tё�����o��wL��FO�|wA���=����߱����a޺>[�v�x��6�U7��/<-��m��!�a��s}vN���x�^�����]g��{�./�~z���^��*@�>4�c�
��@��z�P���	t,��@�"X萏S��j�E�ke����+�c���i�
��W�#��:9W��#���j�1
�S���N��Jg<��fkc�6c�����\���0���0O�C�vW^:��P�qe��._%��!�a=�>�� Ч
�k��+��7�!Z��tx��#]W5+�ޢ�
v���P_��Օ��K����E�s����$������ޟ�%��1���LX'{9G���
��sr�S�S�\���0{�g^������Y�z�~�5i���(_�?�)�3�H�&�z��=@�>�:T#��p�=Y�t��K�c:�S�'��@�(�t����j�<��G���>
�c��
�hH���zeL7�x<W�<\m��:�X�0<�nz�n��mI��χ��ICʖ��{j/<q?�����#���^y5�٫�9����5�ۃi���
�~-�j��J�?���!R��鰶��_�
�Ű���8��h�A_z��tX��\��b�(�F�G������ʒ�_ܬ�+,Ir�x�
���G���BAگ>���]`�3v
�H{PKh=Q
���A��=7›z�V�W/����t݀z��w�w+�?3���L{�UU��y�@�T>���b�p��T�)?4��!�rI�� yr�����QQ�_��y�c.@���6����%{��[�Q��ڪe%?��祿��w�o&/�]���=�d��S��ϰ��m�;	�u(�$���R�C�1r����l���y\�ݬ*�k8��Y磊PC�&��zK���p�
�p��+t�ya�(n�����r5�-�
�C��Y���_z��������M�G|S�lz������
�Z87uA.��3C��E�OKZ��W4o�<���FuI�{�x될��:���0<���v�`x�׮��ϯq
��
��LpSxG^5��S��V��Z�=g��&���gS�@����~u��L��!��*K�Z@���D�
�4��1�ɶ�Ӊq�M�P˦�[s.4�ѽ������
����EwP�/cP�/�m
�w�����a��I~��o�/{&�E�]ɜmE)�5�HxaMw�����e�.ktd{.P�3���;���i�������M$$g�:{����l?G����Ǽ���	�ݚɎ]��.O�i$e��UX6ug8�p
P��j�<�O��y�_0I�
ue\1Y���Z�l���m`��$��;��?�c��_�#��oWkԪ�*�S
3�?��_Y���Nu��5�7	K����0=4,tdM��yhr�I��S+xh�I*�1��4��ëk�=v�V�#awWr$��_�ɜz�]T����Aw�{1�A�zb`1Y�N���y�H�.;��Î��鵇p�����S��<�l��-pB�,���2���s��
��/���>m����n�kk���SG=��=�9�t��3�ð��C��=A��� Qۦ��{� ���b�y��E��{P�,@Zڼ�������@���DkX��a��g�Pa��6����z	��N��;x[�2�����
��+�ɿ����r�{��l�꧜pc������ZIB�]�CVIQ����g ֠S/�f���N�Q��	�}�G�~;���VϘK�H}ػM|ո��Ύ^���4H�.:�����z:��)��b��oro�������������Nx��C�GAoi.#�Z��������n�z߶�{�	c�^I*����zum�1K�B�S�)22���[�#��ܩ�u=:�Q��G
]��/��z� i�Ԩ���.��'Ѻ�|
L�d���<]]R�{YI�/'P_���r���x�L��ꊛ�*yv��kY��S�cX�C��w	��!���u�x�1�s�u��倷��B}w��[��:�Q�k"i�(��X�#꡽�Š��[�A�]a��;�˧���k-Q��9:����<�I��9}/�?���|
�.�¦2��<�L��tё�͊������yz�,���$����x�Y�[��N᎞�6x��w���>��M���n���k���Q�PC�m���O���Z�^A�JK�$b��_�\�h� 4���Yj��旃%�w����Q3�A�s�=A�PZ�z��/v��Mݣ���]ͪ�;��/�$��}�2'�\�Ң�����
�ҭ&!x�֡T�]��`�`�������k7�[ՙ;������qp8�m��x��>�uu���'�Z���פV��7z�xhq��ܡW�a�;
�ӳT4�z�}�=Ae:���N�*�%^�j/E�:��I��Ymr���@�wo�����:��-^��␾x4O�u�s����s>�I8~�zA)�1,^���	�)�_���žB�����d�6����{�y��>�z�=�i�[S�pMـ�
<�nS���K�S���|��䈗ftr�>S��//@OP7z@���u,z�&zS�G/���
���*�"z�B
�5�����ꎮoY�+J�o��7/��:	���n��V���x��7��<�b��{G�ou@~=�=����n|3���@=�B���m���g��^�Nf���<�_�"?�Qަx�R�h3�T��w<S�%�P/M]e�$HU�	�Sg�'@OP��W�<
t��C/��Ҟ:���#
u?�r*��Q������L�ntQ�Ӫ�E%�7�$/ ����[�0<��ߋ{{{��p<����:s�
8z�.�ËMAO�ϡO�Z�&�n8�9�w:��n�V��^�V+v�=�i�i���ѦU���[�3rܢ����C�4������(w���uS���0�0�������@/�ݹ6v��3FkL��G�3�ac��@�K������ΫJ>�/���[��^���0�;z�,�;��c^��<��=�
�q�簏;�7�^��O�T�Z�Ay��簶��Ę3�Nr���ڠ;nPhO�rO݀:�^1�}��SFyc�=A������A��ݬyB�5hl;'�Y%}���*&��d��袺��[5j뽈��h��\}�z1oUIs:����F�=L��1�7�oq�C�=��V�]��������v~��-���uouo��笶�Ɩ�l�����3tZ�0�*���u^�Ь&�:��
�r��~�����e��72������Z�-�Iv5�%r�
�5X"�sl�Pg]���
o
dڵ��
G?k��h�0_潐�f�:�:z������kw�C�Xx�x�|N�/wx���g�v�ף��=e
����Vyke�j�91���J{F�[���zeP�+m���g;Z�&n5��ـN7u�n�d��Ѫ�V�fP'k Ӳ�]T���e�~�a�^Lu�����8�`�������C�ӗ��]���m���Ի�<��{�U;{�h��\	Z��M7���s0"@o�AO�v��w�)�?��#zE���7�~���*@OP�z@_��?���<�&�ƎFk(�wE��|�5�i�T�.*ly/�nnu�%�K�:i
u��v���X�7��wvԷuk��uk1*��~��g�m�u��rD�	��X�f���TI=5�wl�W
�>�=������i�������#xtc�E�0Zá��ﺇ�`R�6v��{�]$B�mٰ�Z�ދ��-���V�PWax
�_8��+�B�N_j[X��:�)�0|ג?�R^���c�wl~T��H�mmm��k�m,���&��xj�$�N
��a�o��>�dz�Z��ָ���wC&n
��֠�Nۮ��j�~�`��`�2��t�Ȧ��sԭ�
��m����;�4�{.P����g;ǻ�NC�y�?{P���%�^�V����)�gY��m�Mw(��a���s��n�Թ�f��̠{P�著�S����iۨ5�7_�H��=4b����sA���K�[���'�� x�j
d�>Z�.�;���um���v�W�k�U�%�+��s���[�%�m�ux�9���ui��'5���I-z��x������$:~�M��n�G0��Eh���Ġ}�mݹ�B�Xz���]��0�wY���#Q:��0#u����SO�����QG	�E���VG����;���	w�;��{N8v��R/5}���]����S�����s�
Owi���.�Fy0o��s�D"����m�-^߮q�_�?n��1�'��pܥЯ�v�7�{�&w{P�?ʚ<�H��x���7t<�Fo,�>��NM'n����ﷹ�i�g;�ô'�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$�D"�H$���3�է]�DwIEND�B`�assets/images/loginizer_product.png000064400000015130151526424660013576 0ustar00�PNG


IHDR@L%nesRGB��,	pHYs.#.#x�?v�IDATx��]	xU�u�o�����QG�M@��Q�qA}��Dp�ƍE��&J����"C�	6	 dA ˝�wU��v��U]	���ם�]��]u�.���xy�߀��-�G�'���W��!����6��Ρ��M`gp�,+@f�
5���
�*��k���K��`op
x�B���4�
�
��D�� F1`'�+��%�3"���+��v�
u^�E0�c�3*�0�Y�r��B@@��@��{\�
W����g�l�e�x�@��e`}Y�
x	����{`A���1�QXҒ�n������n#������̌T��ݱ�%|5��ҷ+��Og�va��ak�BH�%��"�����������E�뛑��9~$���- ~��߯�8q,K�����M{����搕עH�);o�t	k:�G���l2�6l�B�6w_�Bx|����P{~�D"~��v�!�f���jŎ�n5�W���w�1���o�a+��D��XpU�h��³z{~`(�{�lvoRvk��!=��	o���}���X���C�4@��#X��Yl.�[�=�9���}b8,  `������E�����b�J�*�B�4<����[�X����k�j�K_��VCz�����I�ن�]L��{��SGc���n>*ﮡ��Hf#�,bӳsP�@�d�CvU�I$��r���GY��=��u���$I����Aqqq-���.`�-��^���{��\����9~E&�:�
�:= n�2|�"6 }>�1{:�הI�������"���^�>]�#��u߲�S��
O���Y�؃��`��wx��ެ�'I�)ٻsf�D�E����d/��k�,6%+�z���h�n��pc��1.u��)�Ao�ʟ�*߾�����u��Zn��.
 ��Y4|�2}�*^ʼ\%̈́Io�K=��Y+ّ��BW�΁���=�U쟟��-G�i�~F���O���'����&���^�[S�h����ڷ��vY6������~�%����k�	i����i�(��b	�WP�**�dOe����#lB�R�i�(v�~�Cd3����z��@!���񒎐|�]V������iH�m��}���[�ve��O?b�ϝƒ3�0yWn�G��&���=Ȝ�y,��+u{v�X�ס4�֟o�@�>����(�[�-[��9l�]V����e�����v	\�߂�+����G7/g-[�y[���mڛ��~f�KJة3gX�ˢg���;^R�Ӿ|���[�y#��]6�pA���Px6��^��@o_�9[#"�!.����
���$�f���*Y��wY��g(�����E�5C$�*+ѧ=iO!���CR�<�1����d�
���E����}��c$ҞfO�	
�F����0�hխ�hO!�����d�]�S��&��	<^C�(x��mZ��ƀ�σ�3���N����uP~[���Sݵ���o�S��111�͈4��͓��i�؄t�4y.5J5�?��7��:}���n$�s���z�	Ýs�u_ރkJ����	��
�-hQ��c������~����E}��{�=�9�K
�� �F�h��ӥ��<]fϟЁ��u��F�V���ۅ���$�4��^Ul��̳��.ɶ:�w>/��`n�a�g�<?"O���Շz�Ĺ�萮�u�+�x�/��Bw��[<�R[�f�V���ݏ��`�E��.H_�I{@�~�|;5�k����S���8|x<��?�-�ɫY��
\�uE^�B���@�W�z�J�;%�x|t����w�ú�a�~
���Z��B�mFi�9�EW�0]��)���ݠ���,M[�=��d!�h����<�׃en`ϴc���s��_�@r�qu���H�ܢ��(c<�hu\R�x�)�$���I��[auCk��g0�\�s�n �vf6:?-w�W�i�� ���A:�cs��v�CG��srk�w$���کK�+�Pj�]�E EY�_�$)t�@��I����7E#i!)�[i��
i�c�k���C\~^v��27G�W[
�-;�7���s�z9������2��9��
`3�M�O�j�����ECiX�V����Ip9W��i�=��t�o���]��w)�M%e^y��}��v�X�����^7ͷ�j������2M�*8��[�zt����B�.��5���q�+�'�*+�()�ѥ\}%e���T�E:��Y� .���VC��
����N�.
��׷J<����CRz}�r���ܪ~�.P櫪M���᳞V�$e�
��W��E�r�I����V?�:Hl,)�1L��������K�E^��C�u[=;���&�!��.
�d��Q-#��1X
/h�_7>�%�j���x��j�%����v?�SƗV��!�(�J)t�<
4])�w�ؖ���֜0��i�'���1�$��7�|�_	n�&�n�m4�v�z2�a�SW
��Cp�I��\O�7���։�i�����y����ሐ���k��^n��kTWM�ru䁒E>Z<���˴M-�X�+�2V��?X�ɞn�-���)b�k�ң,���z��.H�����[����;p�I����ʘj��MD�iv���J�{.V�^^��cxFS>��=j�O�RS���6�����(4�^Lp7�G:����K�H�'Y>@v-�S�h���3�')���\��M����}F����2�<.`X�����Ki��,���r����ܽ�d�Z�rv���%)�o���h��Hq-]���x���~X�������f��h[a�)��[mE����8�I��ĕ�ܤ�׹�߅Q'/�K��(��vW�u�j���c����?��ck׊��1;[�СFi
�"��6���6Y���N���=?��uN�)�J)�鯷DK%�`����4")�?��<i�j�������ԥ��!�6�%��N��l�[�;ni���6D��ri8���2��̾��#�.�M1Jk ��­��7������
 ��&���x��¶�:���F�)�@����i��@�ޭ
����մ�W�}�IR�a�>���Q��t�z
05���
<�e�] 5Li*����DQ����l���
>�-S�s�?�����!�`�mX6�%����i`��()sn|�˖Sv%��W�\��\aR��F�l��R�<�z,���]��E�w`Xm�I��R�!��$}�ڊ�ު�I.?ry
狸�n	�t;���"�P�<ڥ��IHC@[��CV�`����`�J�]'E��H@�&^�(���_Ke6�B���1IO���:�K�� ��M��)J
�.�����֞Z��y���P��{�+�|�iY�f:��*Ln����o��7��d�FQ�a�4e�;EP`+�I�5���*I���%<,�n�#nt�U�y�K�s���x_,D�z���D��
���ڲ�9 5TW���նQ��\�#-S
Td�����1�@���4�t���5Z�o)WNn��<��LǦ�)�)�@:s��_P෶�B�-Np�ڶ�h	 mT���H�Qf�L��h>I�����U���:�g�IJ���q}�6�X�S�"kˠ�6�^A
�����-���f��uF�~�g���fss��=t��V�/7�6�ؑ��&��N[�/�v�JJ�&��}���8%t	֟%e��.���HDڛ%e:A[�H�sD?�(c1W�Hʳ_���v3a蓖���rVH>[�̖
�8����xU���?L�s��z`J�J+t��E��|,���-ORV��Dv�����a�pm���(�qJ�>>|X�d;�f�J~���HP�2����V�aM�8+&�2��>Sj)@~��)-e���ͷ%����o2���%n�k�P�kWϜp��M�2WmK���")�U+��z+SM@���=��aM!�\Kk�RG���* 1�HVl��ԈI���خ�Ui�Wp�5���6���Vm�m&�	��GcFY���t����I����q���Ll��m�S��k��P���0�`�$��µ]���:��Mq&�P݀�H���l��9Ӄ��z�Nc���Q	/9�Z�:�:Ǭ8aZoyE�?f���gN5?:ĵ(0����0�wA�t�CzZ	��AY���bD��#AM@�D�ͼ�R./f����F��j������z#������w�
J�A=��C?�
Qѩrv��}�2w��?|����\��w6#;�L��\��D4P��)�.���7oȉj<T7�)�9=>>�� ���t:�I9��^�v���m����.����3AR�`�L�s-ve%Ԁ�+t��N���_	5�����mQ��H��a�H�!eLP��9SM��/$������$��׆Z ����:�B}ÈE�	_ō2�M�&)����G�y7:�^�3I��B�S0V[sZ5H��ғZ��)�;�CK�n�V�΢�������U����J�kK6��*	�u�YW(f�[���Uyg.����5�k�K7oZ�n�m��Z�L����D�5�H�x�Q�jO��ʛ�#
g�B꩑�K/ �qr�$̸��a=��uαš �������C;+�tb ?��E��٭~�z�Yym�F��D#�X����1���Ճ���_����f���~]�+S&��ܽF�Ga�z{1�%�!���h_.�ȇ7��ܴv:$E>ZE�����ᐎa4�g�!��ں^��#��:f�@��0�HW����5�O��md�w�|>�k�:t0`?�l���V�3?'�PS?	ȷQ.��SP�ǝ�AW}��q�0љ�4l��X�<�s��������
��z+��@�V���ʯ7��I�C���
�k�X�� +���L�\�H|��Y��_į��I����A�4����m&~��ozَ�i���.���ÎT��@R��h�KQ[������ٱ3-�\')��ko�
(��߶_%m�G�RhD�2�yHښ')�m;�$eFۦ��ձ!N�;�1�C?0|*�nZ���&���_@�R)��D�3$�Dž\��ٌG�.�<��h{��u@ꀙF��u:k��#�7g
;VTU�;t��'�Q�_7��U�����ˎ��4��
Gj����v�r�k7�\�N��(����W�9H��p?Պ�����^�q��i6���Y�^�.A�"��X�O?FE�h����A�G��=�lޏ�]v1�_Mn�{8��l7`�E��u��
8D��ɑ��y�؛_~�l=�/����Ȧ=����Bz~����������:�)�*[�/�(7��UZ�Z
�E-p�lrj\Ɩ$�ъ�����r�E�v��ٱ���xXP}����O�=f�G�Q�/[��8�r�٥r�s��I, �) W��D�����i!"�����o�6/x���
_����"~}�Rٷ��G�:����8�W�P�i��X�`��������3,ؐ�X����Ď)#Y����I��:MRvs��茥�����o2q� �s�7�Nv�LZ
���>TW��o&��v��n="!D�n�.K��feee�ďҏC/�9��e�uX����j��8[v1Խ�����kAywK���i��@؀�\β�E���v�$mI�\�}s����*1�;91��̗�ظal��-V�G�~�İ�H�y�|�Tr�~�m����x��
mP��^_���-�J�߁�b3�Y�5��L��'��s�s�,y��Kq���>~���XH��m��`���e[r�ďV{_V{�~7�y�ѓ�؃�nr���F0��0�
�^�T�'����+��H���U[�ߩ�k�Cb�==i\���BV
�:��`e���Ha!�pk9�gH�	�Xljc��h�&l.��{�a�h���vvx���N��D��
�u�i(J�Bݦ�$>02��K��5@������<Y�=�J�J���B��I�.S�(�EiK�b��G@�d�\�6�r�� 9Mϒ׳>Of����?�W�������Ke%��xx|Bll,�ӧú_����[t�������q�0���z�X��������G��p��c���?��~�)><v0��r����Ň��k/�y����K!p�8�4# P��
a3�#Y9iMW�Vc8������!!�&@�L��i���X�����P���:�KV
���SF�K���Q`r�nF�D@@@ *PLh_��C`/Yٓ��TWme���p���'� ++�6�})U�O�jW}TIEND�B`�assets/images/php-logo32.svg000064400000026475151526424660011757 0ustar00<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
   height="11.284406"
   id="svg3430"
   version="1.1"
   viewBox="0 0 22.724844 11.284406"
   width="22.724844"
   xml:space="preserve"
   sodipodi:docname="php-logo32.svg"
   inkscape:version="1.1.2 (b8e25be833, 2022-02-05)"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:dc="http://purl.org/dc/elements/1.1/"><sodipodi:namedview
   id="namedview41"
   pagecolor="#ffffff"
   bordercolor="#666666"
   borderopacity="1.0"
   inkscape:pageshadow="2"
   inkscape:pageopacity="0.0"
   inkscape:pagecheckerboard="0"
   showgrid="false"
   inkscape:zoom="14.890608"
   inkscape:cx="24.075579"
   inkscape:cy="16.889841"
   inkscape:window-width="1920"
   inkscape:window-height="991"
   inkscape:window-x="-9"
   inkscape:window-y="-9"
   inkscape:window-maximized="1"
   inkscape:current-layer="svg3430"
   fit-margin-top="0"
   fit-margin-left="0"
   fit-margin-right="0"
   fit-margin-bottom="0" />
  <title
   id="title3510">Official PHP Logo</title>
  <metadata
   id="metadata3436">
    <rdf:RDF>
      <cc:Work
   rdf:about="">
        <dc:format>image/svg+xml</dc:format>
        <dc:type
   rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
        <dc:title>Official PHP Logo</dc:title>
        <dc:creator>
          <cc:Agent>
            <dc:title>Colin Viebrock</dc:title>
          </cc:Agent>
        </dc:creator>
        <dc:description />
        <dc:contributor>
          <cc:Agent>
            <dc:title />
          </cc:Agent>
        </dc:contributor>
        <cc:license
   rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
        <dc:rights>
          <cc:Agent>
            <dc:title>Copyright Colin Viebrock 1997 - All rights reserved.</dc:title>
          </cc:Agent>
        </dc:rights>
        <dc:date>1997</dc:date>
      </cc:Work>
      <cc:License
   rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
        <cc:permits
   rdf:resource="http://creativecommons.org/ns#Reproduction" />
        <cc:permits
   rdf:resource="http://creativecommons.org/ns#Distribution" />
        <cc:requires
   rdf:resource="http://creativecommons.org/ns#Notice" />
        <cc:requires
   rdf:resource="http://creativecommons.org/ns#Attribution" />
        <cc:permits
   rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
        <cc:requires
   rdf:resource="http://creativecommons.org/ns#ShareAlike" />
      </cc:License>
    </rdf:RDF>
  </metadata>
  <defs
   id="defs3434">
    <clipPath
   clipPathUnits="userSpaceOnUse"
   id="clipPath3444">
      <path
   d="M 11.52,162 C 11.52,81.677 135.307,16.561 288,16.561 v 0 c 152.693,0 276.481,65.116 276.481,145.439 v 0 c 0,80.322 -123.788,145.439 -276.481,145.439 v 0 C 135.307,307.439 11.52,242.322 11.52,162"
   id="path3446" />
    </clipPath>
    <radialGradient
   cx="0"
   cy="0"
   fx="0"
   fy="0"
   gradientTransform="matrix(363.05789,0,0,-363.05789,177.52002,256.30713)"
   gradientUnits="userSpaceOnUse"
   id="radialGradient3452"
   r="1"
   spreadMethod="pad">
      <stop
   id="stop3454"
   offset="0"
   style="stop-opacity:1;stop-color:#aeb2d5" />
      <stop
   id="stop3456"
   offset="0.3"
   style="stop-opacity:1;stop-color:#aeb2d5" />
      <stop
   id="stop3458"
   offset="0.75"
   style="stop-opacity:1;stop-color:#484c89" />
      <stop
   id="stop3460"
   offset="1"
   style="stop-opacity:1;stop-color:#484c89" />
    </radialGradient>
    <clipPath
   clipPathUnits="userSpaceOnUse"
   id="clipPath3468">
      <path
   d="M 0,324 H 576 V 0 H 0 Z"
   id="path3470" />
    </clipPath>
    <clipPath
   clipPathUnits="userSpaceOnUse"
   id="clipPath3480">
      <path
   d="M 0,324 H 576 V 0 H 0 Z"
   id="path3482" />
    </clipPath>
  </defs>
  <g
   id="g3438"
   transform="matrix(0.04109665,0,0,-0.03879429,-0.47343341,11.926878)"
   inkscape:export-filename="E:\Program Files\EasyPHP 3.0\www\wp_dev\wp-content\plugins\backuply-pro\assets\images\php-logo32.png"
   inkscape:export-xdpi="191.47629"
   inkscape:export-ydpi="191.47629">
    <g
   id="g3440">
      <g
   clip-path="url(#clipPath3444)"
   id="g3442">
        <g
   id="g3448">
          <g
   id="g3450">
            <path
   d="M 11.52,162 C 11.52,81.677 135.307,16.561 288,16.561 v 0 c 152.693,0 276.481,65.116 276.481,145.439 v 0 c 0,80.322 -123.788,145.439 -276.481,145.439 v 0 C 135.307,307.439 11.52,242.322 11.52,162"
   id="path3462"
   style="fill:url(#radialGradient3452);stroke:none" />
          </g>
        </g>
      </g>
    </g>
    <g
   id="g3464">
      <g
   clip-path="url(#clipPath3468)"
   id="g3466">
        <g
   id="g3472"
   transform="translate(288,27.3594)">
          <path
   d="M 0,0 C 146.729,0 265.68,60.281 265.68,134.641 265.68,209 146.729,269.282 0,269.282 -146.729,269.282 -265.68,209 -265.68,134.641 -265.68,60.281 -146.729,0 0,0"
   id="path3474"
   style="fill:#777bb3;fill-opacity:1;fill-rule:nonzero;stroke:none" />
        </g>
      </g>
    </g>
    <g
   id="g3476">
      <g
   clip-path="url(#clipPath3480)"
   id="g3478">
        <g
   id="g3484"
   transform="translate(161.7344,145.3066)">
          <path
   d="m 0,0 c 12.065,0 21.072,2.225 26.771,6.611 5.638,4.341 9.532,11.862 11.573,22.353 1.903,9.806 1.178,16.653 -2.154,20.348 C 32.783,53.086 25.417,55 14.297,55 H -4.984 L -15.673,0 Z m -63.063,-67.75 c -0.895,0 -1.745,0.4 -2.314,1.092 -0.57,0.691 -0.801,1.601 -0.63,2.48 L -37.679,81.573 C -37.405,82.982 -36.17,84 -34.734,84 H 26.32 C 45.508,84 59.79,78.79 68.767,68.513 77.792,58.182 80.579,43.741 77.05,25.592 75.614,18.198 73.144,11.331 69.709,5.183 66.27,-0.972 61.725,-6.667 56.198,-11.747 49.582,-17.939 42.094,-22.429 33.962,-25.071 25.959,-27.678 15.681,-29 3.414,-29 h -24.722 l -7.06,-36.322 c -0.274,-1.41 -1.508,-2.428 -2.944,-2.428 z"
   id="path3486"
   style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
        </g>
        <g
   id="g3488"
   transform="translate(159.2236,197.3071)">
          <path
   d="m 0,0 h 16.808 c 13.421,0 18.083,-2.945 19.667,-4.7 2.628,-2.914 3.124,-9.058 1.435,-17.767 C 36.012,-32.217 32.494,-39.13 27.452,-43.012 22.29,-46.986 13.898,-49 2.511,-49 H -9.523 Z m 28.831,35 h -61.055 c -2.872,0 -5.341,-2.036 -5.889,-4.855 l -28.328,-145.751 c -0.342,-1.759 0.12,-3.578 1.259,-4.961 1.14,-1.383 2.838,-2.183 4.63,-2.183 h 31.75 c 2.873,0 5.342,2.036 5.89,4.855 L -16.324,-84 H 5.925 c 12.582,0 23.174,1.372 31.479,4.077 8.541,2.775 16.399,7.48 23.354,13.984 5.752,5.292 10.49,11.232 14.08,17.657 3.591,6.427 6.171,13.594 7.668,21.302 3.715,19.104 0.697,34.402 -8.969,45.466 C 63.965,29.444 48.923,35 28.831,35 M -16.802,-55 H 2.511 c 12.801,0 22.336,2.411 28.601,7.234 6.266,4.824 10.492,12.875 12.688,24.157 2.101,10.832 1.144,18.476 -2.871,22.929 C 36.909,3.773 28.87,6 16.808,6 H -4.946 L -16.802,-55 M 28.831,29 C 47.198,29 60.597,24.18 69.019,14.539 77.44,4.898 79.976,-8.559 76.616,-25.836 75.233,-32.953 72.894,-39.46 69.601,-45.355 66.304,-51.254 61.999,-56.648 56.679,-61.539 50.339,-67.472 43.296,-71.7 35.546,-74.218 27.796,-76.743 17.925,-78 5.925,-78 h -27.196 l -7.531,-38.75 h -31.75 L -32.224,29 h 61.055"
   id="path3490"
   style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
        </g>
        <g
   id="g3492"
   transform="translate(311.583,116.3066)">
          <path
   d="m 0,0 c -0.896,0 -1.745,0.4 -2.314,1.092 -0.571,0.691 -0.802,1.6 -0.631,2.48 L 9.586,68.061 C 10.778,74.194 10.484,78.596 8.759,80.456 7.703,81.593 4.531,83.5 -4.848,83.5 H -27.55 L -43.305,2.428 C -43.579,1.018 -44.814,0 -46.25,0 h -31.5 c -0.896,0 -1.745,0.4 -2.315,1.092 -0.57,0.691 -0.801,1.601 -0.63,2.48 l 28.328,145.751 c 0.274,1.409 1.509,2.427 2.945,2.427 h 31.5 c 0.896,0 1.745,-0.4 2.315,-1.091 0.57,-0.692 0.801,-1.601 0.63,-2.481 L -21.813,113 H 2.609 c 18.605,0 31.221,-3.28 38.569,-10.028 7.49,-6.884 9.827,-17.891 6.947,-32.719 L 34.945,2.428 C 34.671,1.018 33.437,0 32,0 Z"
   id="path3494"
   style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
        </g>
        <g
   id="g3496"
   transform="translate(293.6611,271.0571)">
          <path
   d="m 0,0 h -31.5 c -2.873,0 -5.342,-2.036 -5.89,-4.855 l -28.328,-145.751 c -0.342,-1.759 0.12,-3.578 1.26,-4.961 1.14,-1.383 2.838,-2.183 4.63,-2.183 h 31.5 c 2.872,0 5.342,2.036 5.89,4.855 l 15.283,78.645 h 20.229 c 9.363,0 11.328,-2 11.407,-2.086 0.568,-0.611 1.315,-3.441 0.082,-9.781 l -12.531,-64.489 c -0.342,-1.759 0.12,-3.578 1.26,-4.961 1.14,-1.383 2.838,-2.183 4.63,-2.183 h 32 c 2.872,0 5.342,2.036 5.89,4.855 l 13.179,67.825 c 3.093,15.921 0.447,27.864 -7.861,35.5 -7.928,7.281 -21.208,10.82 -40.599,10.82 H -0.253 L 5.89,-7.145 C 6.231,-5.386 5.77,-3.566 4.63,-2.184 3.49,-0.801 1.792,0 0,0 m 0,-6 -7.531,-38.75 h 28.062 c 17.657,0 29.836,-3.082 36.539,-9.238 6.703,-6.16 8.711,-16.141 6.032,-29.938 l -13.18,-67.824 h -32 l 12.531,64.488 c 1.426,7.336 0.902,12.34 -1.574,15.008 -2.477,2.668 -7.746,4.004 -15.805,4.004 h -25.176 l -16.226,-83.5 h -31.5 L -31.5,-6 H 0"
   id="path3498"
   style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
        </g>
        <g
   id="g3500"
   transform="translate(409.5498,145.3066)">
          <path
   d="m 0,0 c 12.065,0 21.072,2.225 26.771,6.611 5.638,4.34 9.532,11.861 11.574,22.353 1.903,9.806 1.178,16.653 -2.155,20.348 C 32.783,53.086 25.417,55 14.297,55 H -4.984 L -15.673,0 Z m -63.062,-67.75 c -0.895,0 -1.745,0.4 -2.314,1.092 -0.57,0.691 -0.802,1.601 -0.631,2.48 L -37.679,81.573 C -37.404,82.982 -36.17,84 -34.733,84 H 26.32 C 45.509,84 59.79,78.79 68.768,68.513 77.793,58.183 80.579,43.742 77.051,25.592 75.613,18.198 73.144,11.331 69.709,5.183 66.27,-0.972 61.725,-6.667 56.198,-11.747 49.582,-17.939 42.094,-22.429 33.962,-25.071 25.959,-27.678 15.681,-29 3.414,-29 h -24.723 l -7.057,-36.322 c -0.275,-1.41 -1.509,-2.428 -2.946,-2.428 z"
   id="path3502"
   style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
        </g>
        <g
   id="g3504"
   transform="translate(407.0391,197.3071)">
          <path
   d="M 0,0 H 16.808 C 30.229,0 34.891,-2.945 36.475,-4.7 39.104,-7.614 39.6,-13.758 37.91,-22.466 36.012,-32.217 32.493,-39.13 27.452,-43.012 22.29,-46.986 13.898,-49 2.511,-49 H -9.522 Z m 28.831,35 h -61.054 c -2.872,0 -5.341,-2.036 -5.889,-4.855 L -66.44,-115.606 c -0.342,-1.759 0.12,-3.578 1.259,-4.961 1.14,-1.383 2.838,-2.183 4.63,-2.183 h 31.75 c 2.872,0 5.342,2.036 5.89,4.855 L -16.324,-84 H 5.925 c 12.582,0 23.174,1.372 31.479,4.077 8.541,2.775 16.401,7.481 23.356,13.986 5.752,5.291 10.488,11.23 14.078,17.655 3.591,6.427 6.171,13.594 7.668,21.302 3.715,19.105 0.697,34.403 -8.969,45.467 C 63.965,29.444 48.924,35 28.831,35 M -16.801,-55 H 2.511 c 12.801,0 22.336,2.411 28.601,7.234 6.267,4.824 10.492,12.875 12.688,24.157 2.102,10.832 1.145,18.476 -2.871,22.929 C 36.909,3.773 28.87,6 16.808,6 H -4.946 L -16.801,-55 M 28.831,29 C 47.198,29 60.597,24.18 69.019,14.539 77.441,4.898 79.976,-8.559 76.616,-25.836 75.233,-32.953 72.894,-39.46 69.601,-45.355 66.304,-51.254 61.999,-56.648 56.679,-61.539 50.339,-67.472 43.296,-71.7 35.546,-74.218 27.796,-76.743 17.925,-78 5.925,-78 h -27.196 l -7.53,-38.75 h -31.75 L -32.223,29 h 61.054"
   id="path3506"
   style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
        </g>
      </g>
    </g>
  </g>
</svg>
functions.php000064400000143602151526424660007306 0ustar00<?php

/*
* BACKUPLY
* https://backuply.com
* (c) Backuply Team
*/

if(!defined('ABSPATH')) {
	die('HACKING ATTEMPT!');
}

function backuply_get_protocols(){
	
	$protocols['ftp'] = 'FTP';
	$protocols['gdrive'] = 'Google Drive';
	$protocols['bcloud'] = 'Backuply Cloud';
	
	if(defined('BACKUPLY_PRO')) {
		
		if(!function_exists('backuply_get_pro_backups') && defined('BACKUPLY_PRO_DIR')) {
			include_once(BACKUPLY_PRO_DIR . '/functions.php');
		}
		
		$protocols += backuply_get_pro_backups();
	}
	
	return $protocols;
	
}

function backuply_create_backup_folders(){
	
	// Creating Backuply Folder
	if(!file_exists(BACKUPLY_BACKUP_DIR)) {
		@mkdir(BACKUPLY_BACKUP_DIR, 0755, true);
	}
	
	$random_string = wp_generate_password(6, false);
	
	// Creating backups_info folder
	if(file_exists(BACKUPLY_BACKUP_DIR . 'backups_info')){
		@rename(BACKUPLY_BACKUP_DIR . 'backups_info', BACKUPLY_BACKUP_DIR . 'backups_info-'. $random_string);
	}
	
	// Creating backups folder
	if(file_exists(BACKUPLY_BACKUP_DIR . 'backups')){
		@rename(BACKUPLY_BACKUP_DIR . 'backups', BACKUPLY_BACKUP_DIR . 'backups-'. $random_string);
	}

	$backup_info = backuply_glob('backups_info');
	$backups = backuply_glob('backups');
	
	if(empty($backup_info)){
		@mkdir(BACKUPLY_BACKUP_DIR . 'backups_info-' . $random_string, 0755, true);
	}
	
	if(empty($backups)){
		@mkdir(BACKUPLY_BACKUP_DIR . 'backups-' . $random_string, 0755, true);
	}
}


// Add the htaccess file to protect us !
function backuply_add_htaccess(){
	
	if(!file_exists(BACKUPLY_BACKUP_DIR)) {
		@mkdir(BACKUPLY_BACKUP_DIR, 0755, true);
	}
	
	$htaccess = @fopen(BACKUPLY_BACKUP_DIR . '.htaccess', 'w');
	if(!$htaccess) {
		return false;
	}
	
	@fwrite($htaccess, 'deny from all');
	@fclose($htaccess);
	
	return true;
}

// Add the webconfig file to protect us !
function backuply_add_web_config(){
	
	if(file_exists(BACKUPLY_BACKUP_DIR . 'web.config')){
		return true;
	}
	
	$web_config = @fopen(BACKUPLY_BACKUP_DIR . 'web.config', 'w');
	if(!$web_config) {
		return false;
	}
	
	$web_conf = '<configuration>
<system.webServer>
<authorization>
<deny users="*" />
</authorization>
</system.webServer>
</configuration>';
	
	@fwrite($web_config, $web_conf);
	@fclose($web_config);
	
	return true;
}

// Add the htaccess folder to protect us !
function backuply_add_index_files(){
	
	if(!file_exists(BACKUPLY_BACKUP_DIR)) {
		@mkdir(BACKUPLY_BACKUP_DIR, 0755, true);
	}
	
	$php_protection = '<?php //Backuply';
	$html_protection = '<html><body><a href="https://backuply.com" target="_blank">WordPress backups by Backuply</a></body></html>';

	@file_put_contents(BACKUPLY_BACKUP_DIR . 'index.html', $html_protection);
	@file_put_contents(BACKUPLY_BACKUP_DIR . 'index.php', $php_protection);
	
	$backups = backuply_glob('backups');
	
	if(!empty($backups)){
		if(!file_exists($backups . '/index.html')){
			@file_put_contents($backups . '/index.html', $html_protection);
		}
		
		if(!file_exists($backups . '/index.php')){
			@file_put_contents($backups . '/index.php', $php_protection);
		}
		
		// Protecting backups-*/tmp folder
		if(!file_exists($backups . '/tmp/index.html')){
			@mkdir($backups . '/tmp');
			@file_put_contents($backups . '/tmp/index.html', $html_protection);
		}
		
		if(!file_exists($backups . '/tmp/index.php')){
			@file_put_contents($backups . '/tmp/index.php', $php_protection);
		}
	}

	// Protecting backups_info folder
	$backups_info = backuply_glob('backups_info');
	
	if(!empty($backups_info)){
		if(!file_exists($backups_info . '/index.html')){
			@file_put_contents($backups_info . '/index.html', $html_protection);
		}

		if(!file_exists($backups_info . '/index.php')){
			@file_put_contents($backups_info . '/index.php', $php_protection);
		}
	}
}

function backuply_glob($relative_path){
	$glob = glob(BACKUPLY_BACKUP_DIR . $relative_path . '-*', GLOB_ONLYDIR);
	
	if(!empty($glob[0])){
		return $glob[0];
	}

	return false;
}


function backuply_kill_process($is_restore = false) {
	delete_option('backuply_status');
	update_option('backuply_backup_stopped', true);
	
	if(!empty($is_restore)){
		backuply_clean_restoration_file();
	}

	die();
}

function backuply_clean_restoration_file(){

	// Restore is complete now we dont need this
	if(file_exists(BACKUPLY_BACKUP_DIR.'/restoration/restoration.php')) {
		@unlink(BACKUPLY_BACKUP_DIR.'/restoration/restoration.php');
	}
	
	if(is_dir(BACKUPLY_BACKUP_DIR.'/restoration')) {
		@rmdir(BACKUPLY_BACKUP_DIR.'/restoration');
	}
	
	// Deleting restore index file
	if(file_exists(ABSPATH . '/backuply-restore.php')){
		unlink(ABSPATH . '/backuply-restore.php');
	}
}

// If there is a restore or backup task running
function backuply_active(){
	global $backuply;
	
	$backuply['status'] = get_option('backuply_status');
	
	// Nothing there
	if(empty($backuply['status']['last_time'])){
		return false;
	}
	
	// No updates since 5 min
	if((time() - BACKUPLY_TIMEOUT_TIME) > $backuply['status']['last_time']){
		return false;
	}
	
	return true;
	
}

// Verifies the backuply key
function backuply_verify_self($key, $restore_key = false) {
	
	if(empty($key)) {
		return false;
	}
	
	$config = backuply_get_config();
	
	if(!empty($restore_key)){
		if(!empty($config['RESTORE_KEY']) && urldecode($key) == $config['RESTORE_KEY']) {
			return true;
		}
		
		return false;
	}

	if(urldecode($key) == $config['BACKUPLY_KEY']) {
		return true;
	}

	return false;
}

// Wp-Cron handle for timeout check i.e. clean dead processes
// Terminates process if no update for 30 min
function backuply_timeout_check($is_restore) {	
	
	global $backuply;
	
	// Is it a restore check ?
	if(!empty($is_restore)) {
		
		$file = BACKUPLY_BACKUP_DIR . '/restoration/restoration.php';
		
		if(!file_exists($file)) {
			die();
		}
		
		$fm_time = filemtime($file);
		
		if((time() - $fm_time) >= BACKUPLY_TIMEOUT_TIME) {
			backuply_kill_process(true);
		}
	
	// Its a backup process
	} else {
		
		if(empty($backuply['status']['last_update'])){
			backuply_kill_process();
		}
		
		if((time() - $backuply['status']['last_update']) >= BACKUPLY_TIMEOUT_TIME) {
			backuply_kill_process();
		}
		
	}
	
	// To check after 5 minutes again
	wp_schedule_single_event(time() + BACKUPLY_TIMEOUT_TIME, 'backuply_timeout_check', array('is_restore' => $is_restore));
	
}

// Create a config file and set it with a key
function backuply_set_config() {
	$cron = get_option('backuply_cron_settings', []);

	if(empty($cron) || empty($cron['backuply_cron_schedule']) || $cron['backuply_cron_schedule'] !== 'custom'){
		$write['BACKUPLY_KEY'] = backuply_csrf_get_token();
		// $write['RESTORE_KEY'] = backuply_csrf_get_token();

		update_option('backuply_config_keys', $write);
	}
}

function backuply_set_config_file(){

	$write = get_option('backuply_config_keys', []);

	if(empty($write)){
		return false;
	}

	$config_file = BACKUPLY_BACKUP_DIR . 'backuply_config.php';
	
	$fp = @fopen($config_file, 'w');
	
	if(!is_resource($fp)){
		return;
	}

	@fwrite($fp, "<?php exit();?>\n" . json_encode($write, JSON_PRETTY_PRINT));
	@fclose($fp);
	
	@chmod($config_file, 0600);

	return true;
}

function backuply_update_restore_key(){
	
	$config = get_option('backuply_config_keys');

	if(empty($config)) {
		backuply_set_config();
		return;
	}

	$restore_key = backuply_csrf_get_token();
	$config['RESTORE_KEY'] = $restore_key;
	
	update_option('backuply_config_keys', $config);
}

// Sets Backup Location details in Restoration File
function backuply_set_restoration_file($loc) {
	$write['protocol'] = $loc['protocol'];
	$write['name'] = $loc['name'];
	
	$restoration_file = BACKUPLY_BACKUP_DIR . 'restoration/restoration.php';
	
	$fp = @fopen($restoration_file, 'w');
	
	if(!is_resource($fp)){
		return;
	}

	if (0 == filesize($restoration_file)){
		// file is empty
		@fwrite($fp, "<?php exit();?>\n");
	}
	
	@fwrite($fp, json_encode($write, JSON_PRETTY_PRINT));
	@fclose($fp);
	
	@chmod($restoration_file, 0600);
}

// Sets Backup Location details in Restoration File
function backuply_get_restoration_data() {
	$restoration_file = BACKUPLY_BACKUP_DIR . 'restoration/restoration.php';
	
	$fp = @fopen($restoration_file, 'r');
	@fseek($fp, 16);
	
	if(filesize($restoration_file) == 0){
		return;
	}
	
	$content = @fread($fp, filesize($restoration_file));
	@fclose($fp);
	
	if(empty($content)) {
		return [];
	}
	
	$restro = json_decode($content, true);

	return $restro;
}

// Get Config Array
function backuply_get_config() {
	
	$config_file = BACKUPLY_BACKUP_DIR . 'backuply_config.php';
	
	// Fetch keys saved in DB
	if(!file_exists($config_file)){
		$db_keys = get_option('backuply_config_keys', []);

		if(empty($db_keys)){
			return [];
		}

		return $db_keys;
	}
	
	if(empty(filesize($config_file))) {
		return [];
		//backuply_get_config();
	}

	$fp = @fopen($config_file, 'r');
	
	if(!is_resource($fp)){
		return [];
	}
	
	@fseek($fp, 16);
	
	$file_size = filesize($config_file);
	if(empty($file_size)){
		return [];
	}
	
	$content = @fread($fp, $file_size);
	@fclose($fp);
	
	if(empty($content)) {
		return [];
	}
	
	$config = json_decode($content, true);

	return $config;
}

// Create or updates the log file
function backuply_status_log($log, $status = 'working', $percentage = 0){
	$log_file = BACKUPLY_BACKUP_DIR . 'backuply_log.php';
	
	if(!file_exists($log_file) || 0 == filesize($log_file)) {
		$log = "<?php exit();?>\n" . $log; //Prepend php exit
	}

	$this_log = $log . '|' . $status . '|' . $percentage . "\n";
	
	file_put_contents($log_file, $this_log, FILE_APPEND);
}

// Returns array of logs
function backuply_get_status($last_log = 0){
	$log_file = BACKUPLY_BACKUP_DIR. 'backuply_log.php';
	$logs = [];
	
	if(!file_exists($log_file)){
		$logs[] = 'Something went wrong!|error';
		delete_option('backuply_status');
		update_option('backuply_backup_stopped', 1, false);
		return $logs;
	}
	
	$fh = fopen($log_file, 'r');
	
	$seek_to = $last_log;
	@fseek($fh, $seek_to);
	
	$lines = fread($fh, fstat($fh)['size']);
	fclose($fh);
	$fh = null;
	return $lines;
}

// A compulsory POST which issues a error if the POST[$name] is not there
function backuply_POST($name, $e){

	global $error;

	//Check the POSTED NAME was posted
	if(!isset($_POST[$name]) || strlen(trim($_POST[$name])) < 1){
	
		$error[] = $e;
		
	}else{
		return backuply_inputsec(backuply_htmlizer(trim($_POST[$name])));
	}
}

// Used for the checkboxes which have the same names (i.e. name=SOMENAME[])
function backuply_POSTmulticheck($name, $value, $default = array()){
	
	if(isset($_POST[$name]) && is_array($_POST[$name])){
		if(in_array($value, $_POST[$name])){
			return 'checked="checked"';
		}
	}else{
		if(in_array($value, $default)){
			return 'checked="checked"';
		}
	}
	
	return true;
}

// A compulsory REQUEST which issues a error if the REQUEST[$name] is not there
function backuply_REQUEST($name, $e){

	global $error;

	//Check the POSTED NAME was posted
	if(!isset($_REQUEST[$name]) || strlen(trim($_REQUEST[$name])) < 1){
	
		$error[$name] = $e;
		
	}else{
		return backuply_inputsec(backuply_htmlizer(trim($_REQUEST[$name])));
	}
}

// Check if a field is posted via POST else return default value
function backuply_optpost($name, $default = ''){
	
	if(!empty($_POST[$name])){
		return backuply_inputsec(backuply_htmlizer(trim($_POST[$name])));
	}
	
	return $default;	
}

// Check if a field is posted via GET else return default value
function backuply_optget($name, $default = ''){
	
	if(!empty($_GET[$name])){
		return backuply_inputsec(backuply_htmlizer(trim($_GET[$name])));
	}
	
	return $default;	
}

// Check if a field is posted via GET or POST else return default value
function backuply_optreq($name, $default = ''){
	
	if(!empty($_REQUEST[$name])){
		return backuply_inputsec(backuply_htmlizer(trim($_REQUEST[$name])));
	}
	
	return $default;	
}

function backuply_POSTchecked($name, $default = false, $submit_name = ''){
	
	if(!empty($submit_name)){
		$post_to_check = isset($_POST[$submit_name]) ? backuply_optpost($submit_name) : '';
	}else{
		$post_to_check = $_POST;
	}
	
	return (!empty($post_to_check) ? (isset($_POST[$name]) ? 'checked="checked"' : '') : (!empty($default) ? 'checked="checked"' : ''));

}

function backuply_POSTselect($name, $value, $default = false){
	
	if(empty($_POST)){
		if(!empty($default)){
			return 'selected="selected"';
		}
	}else{
		if(isset($_POST[$name])){
			if(trim($_POST[$name]) == $value){
				return 'selected="selected"';
			}
		}
	}
}

///TODO:: Not being used
function backuply_POSTradio($name, $val, $default = null){
	
	return (!empty($_POST) ? (@$_POST[$name] == $val ? 'checked="checked"' : '') : (!is_null($default) && $default == $val ? 'checked="checked"' : ''));

}

function backuply_inputsec($string){

	$string = addslashes($string);
	
	// This is to replace ` which can cause the command to be executed in exec()
	$string = str_replace('`', '\`', $string);
	
	return $string;

}

function backuply_htmlizer($string){

	$string = htmlentities($string, ENT_QUOTES, 'UTF-8');
	
	preg_match_all('/(&amp;#(\d{1,7}|x[0-9a-fA-F]{1,6});)/', $string, $matches);//backuply_print($matches);
	
	foreach($matches[1] as $mk => $mv){		
		$tmp_m = backuply_entity_check($matches[2][$mk]);
		$string = str_replace($matches[1][$mk], $tmp_m, $string);
	}
	
	return $string;
	
}

function backuply_entity_check($string){
	
	//Convert Hexadecimal to Decimal
	$num = ((substr($string, 0, 1) === 'x') ? hexdec(substr($string, 1)) : (int) $string);
	
	//Squares and Spaces - return nothing 
	$string = (($num > 0x10FFFF || ($num >= 0xD800 && $num <= 0xDFFF) || $num < 0x20) ? '' : '&#'.$num.';');
	
	return $string;
}

// Check if a checkbox is selected
function backuply_is_checked($post){

	if(!empty($_POST[$post])){
		return true;
	}	
	return false;
}

// A Function that lists files and folders in a folder.
function backuply_sfilelist($startdir='./', $searchSubdirs=1, $directoriesonly=0, $maxlevel='all', $level=1){	
	return backuply_filelist_fn($startdir, $searchSubdirs, $directoriesonly, $maxlevel, $level);
}

// The below function will list all folders and files within a directory. It is a recursive function that uses a global array.
function backuply_filelist_fn($startdir='./', $searchSubdirs=1, $directoriesonly=0, $maxlevel='all', $level=1, $reset = 1){
	
   //list the directory/file names that you want to ignore
   $ignoredDirectory = array();
   $ignoredDirectory[] = '.';
   $ignoredDirectory[] = '..';
   $ignoredDirectory[] = '_vti_cnf';
   global $directorylist;	//initialize global array
   
	if(substr($startdir, -1) != '/'){
		$startdir = $startdir.'/';
	}
   
	if (is_dir($startdir)) {
		if ($dh = opendir($startdir)) {
			while (($file = readdir($dh)) !== false) {
				if (!(array_search($file,$ignoredDirectory) > -1)) {
					if (@filetype($startdir . $file) == 'dir') {

						//build your directory array however you choose;
						//add other file details that you want.

						$directorylist[$startdir . $file]['level'] = $level;
						$directorylist[$startdir . $file]['dir'] = 1;
						$directorylist[$startdir . $file]['name'] = $file;
						$directorylist[$startdir . $file]['path'] = $startdir;
						if ($searchSubdirs) {
							if ((($maxlevel) == 'all') or ($maxlevel > $level)) {
							   backuply_filelist_fn($startdir . $file . "/", $searchSubdirs, $directoriesonly, $maxlevel, ($level + 1), 0);
							}
						}
					} else {
						if (!$directoriesonly) {
							//if you want to include files; build your file array 
							//however you choose; add other file details that you want.
							$directorylist[$startdir . $file]['level'] = $level;
							$directorylist[$startdir . $file]['dir'] = 0;
							$directorylist[$startdir . $file]['name'] = $file;
							$directorylist[$startdir . $file]['path'] = $startdir;
						}
					}
				}
			}
			closedir($dh);
		}
	}

	if(!empty($reset)){
		$r = $directorylist;
		$directorylist = array();
		return($r);
	}
}

// Report an error
function backuply_report_error($error = array()){

	if(empty($error)){
		return true;
	}
	
	$error_string = '<b>Please fix the below error(s) :</b> <br />';

	foreach($error as $ek => $ev){
		$error_string .= '* '.$ev.'<br />';
	}
	
	echo '<div id="message" class="error"><p>'. wp_kses_post($error_string). '</p></div><br>';
	
}

// Report a success
function backuply_report_success($msg){

	if(empty($msg)){
		return true;
	}
	
	echo '<div id="message" class="notice updated is-dismissible"><p>'. wp_kses_post($msg) . '</p></div><br />';
}

// Generate a random string
function backuply_random_string($length = 10){
	$characters = '0123456789abcdefghijklmnopqrstuvwxyz';
	$charactersLength = strlen($characters);
	$randomString = '';
	for($i = 0; $i < $length; $i++){
		$randomString .= $characters[rand(0, $charactersLength - 1)];
	}
	return $randomString;
}

function backuply_print($array){

	echo '<pre>';
	print_r($array);
	echo '</pre>';

}

function backuply_cleanpath($path){
	$path = str_replace('\\\\', '/', $path);
	$path = str_replace('\\', '/', $path);
	$path = str_replace('//', '/', $path);
	return rtrim($path, '/');
}

//TODO:: Not being used
// Returns the Numeric Value of results Per Page
function backuply_get_page($get = 'page', $resperpage = 50){

	$resperpage = (!empty($_REQUEST['reslen']) && is_numeric($_REQUEST['reslen']) ? (int) backuply_optreq('reslen') : $resperpage);
	
	if(backuply_optget($get)){
		$pg = (int) backuply_optget($get);
		$pg = $pg - 1;		
		$page = ($pg * $resperpage);
		$page = ($page <= 0 ? 0 : $page);
	}else{	
		$page = 0;		
	}	
	return $page;
}

// This function just redirects to the Location specified and dies
function backuply_redirect($location, $header = true){
	//$prefix = (empty($raw) ? $globals['index'] : '');
	
	if($header){
	
		//Redirect
		header('Location: '.$location);
		
	}else{
		echo '<meta http-equiv="Refresh" content="0;url='.esc_url($location).'">';
	}
}

// Returns the CSRF Token, generates one if it does not exist
function backuply_csrf_get_token(){
	$csrf_token = bin2hex(openssl_random_pseudo_bytes(32));
	return $csrf_token;
}

// Update Backuply logs as per action
function backuply_log($data){
	global $backuply;
	
	if(empty($backuply['debug_mode'])){
		return;
	}

	$write = '';
	$write .= '['.date('Y-m-d H:i:s', time()).'] ';

	$write .= $data."\n\n";
	
	$backups_info = backuply_glob('backups_info');
	
	$log_file = $backups_info .'/debug.php';
	
	$fp = @fopen($log_file, 'ab');
	
	if (0 == @filesize($log_file)){
		// file is empty
		@fwrite($fp, "<?php exit();?>\n");
	}
	
	@fwrite($fp, $write);
	@fclose($fp);
	
	@chmod($log_file, 0600);
}

/**
 * This function will preg_match the pattern and return the respective values in $var
 * @package	  Backuply 
 * @param		 $pattern This should be the pattern to be matched
 * @param		 $file This should have the data to search from
 * @param		 $var This will be the variable which will have the preg matched data
 * @param		 $valuenum This should be the no of regular expression to be returned in $var
 * @param		 $stripslashes 0 or 1 depending upon whether the stripslashes function is to be applied (1) or not (0)
 * @return	   string Will pass value by reference in $var
 * @since	 	 4.5.4
 */
function backuply_preg_replace($pattern, $file, &$var, $valuenum, $stripslashes = ''){	
	preg_match($pattern, $file, $matches);

	if(!empty($matches) && !empty($matches[$valuenum])){
		if(empty($stripslashes)){
			$var = trim($matches[$valuenum]);
		}else{
			$var = stripslashes(trim($matches[$valuenum]));
		}
	}
}

//Function to return a file's size with their appropriate formats.
function backuply_format_size($size){
	$sizes = array(' Bytes', ' KB', ' MB', ' GB', ' TB', ' PB', ' EB', ' ZB', ' YB');
	if ($size == 0) { return('n/a'); } else {
	return (round($size/pow(1024, ($i = floor(log($size, 1024)))), 2) . $sizes[$i]); }
}

// Prevent pro activate text for installer
function backuply_install_plugin_complete_actions($install_actions, $api, $plugin_file){
	
	if($plugin_file == BACKUPLY_PRO_BASE){
		return array();
	}
	
	return $install_actions;
}

/**
 * Gets a list of backups along with their info data.
 *
 * @param int $offset Starting offset (must be >= 0).
 * @param int $limit  Maximum number of backups to return.
 *                    Use -1 for no limit (default).
 *
 * @return array List of backups with associated info data.
 */
function backuply_get_backups_info_data($offset = 0, $limit = -1){

	// Get all Backups Information from the "backups_info" folder.
	$all_backup_info_files = backuply_glob('backups_info');
	$backup_files_location = backuply_glob('backups');
	
	$backup_infos = [];

	if(empty($all_backup_info_files)){
		return $backup_infos;
	}

	// Not using glob becasue it is 10 times slower than scandir
	//$info_files = glob($all_backup_info_files .'/*[0-9].php');
	$info_files = @scandir($all_backup_info_files);

	if(empty($info_files)){
		return $backup_infos;
	}
	
	$info_files = array_diff($info_files, ['.', '..', 'index.php', 'index.html', 'debug.php']);

	// Sorting the files based on the time in the file name.
	rsort($info_files, SORT_STRING);

	foreach($info_files as $files){
		
		if($limit == 0){
			break;
		}
		
		if($offset > 0){
			$offset--;
			continue;
		}

		$check_for_file = basename($files, '.php');

		$file = file($all_backup_info_files.'/'.$files);
		unset($file[0]);
		$all_info = json_decode(implode('', $file));

		$backup_file_location = $backup_files_location.'/'.$check_for_file.'.tar.gz';
		if(file_exists($backup_file_location) || isset($all_info->backup_location)){

			//Store all the files information in an array
			$backup_infos[] = $all_info;
			
			if($limit > 0){
				$limit--;
			}
		}
	}

	// Count to calculate pages for pagination, and can be done here only.
	$backups_info = [
		'total_backups' => count($info_files),
		'backup_infos' => $backup_infos
	];

	return $backups_info;
}

// This is just a wrapper to backuply_get_backups_info_data
// So that we do not have to change the function call on other places
function backuply_get_backups_info(){
	$infos = backuply_get_backups_info_data();
	
	if(empty($infos) || empty($infos['backup_infos'])){
		return [];
	}
	
	return $infos['backup_infos'];
}

function backuply_get_backup_info($backup_name){
	$backup_info_dir = backuply_glob('backups_info');
	$backup_name_base = basename($backup_name, '.tar.gz');
	
	$file = file($backup_info_dir.'/'.$backup_name_base.'.php');
	unset($file[0]);
	$info = json_decode(implode('', $file), true);
	
	return $info;
}

// Deletes backups
function backuply_delete_backup($tar_file) {
	
	global $error;
	
	$_file = $tar_file;
	$bkey = basename(basename($_file, '.tar.gz'), '.tar');
	$backup_info_dir = backuply_glob('backups_info');
	$deleted = false;
	
	// Load Backuply's remote backup locations.
	$backuply_remote_backup_locs = get_option('backuply_remote_backup_locs');
	
	$files_exists = 0;
	$backup_infos = backuply_get_backups_info();
	$is_bcloud = false; // We are using this so we know we need to update the quota too.

	foreach($backup_infos as $backup_info){
		// Is the backup on a remote location ? 
		if(!empty($backup_info->backup_location) && $backup_info->name == $bkey && array_key_exists($backup_info->backup_location, $backuply_remote_backup_locs)){

			$backup_dir = $backuply_remote_backup_locs[$backup_info->backup_location]['full_backup_loc'];
			$remote_stream_wrappers = array('dropbox', 'gdrive', 'softftpes', 'softsftp', 'webdav', 'aws', 'caws', 'onedrive', 'bcloud');

			if(in_array($backuply_remote_backup_locs[$backup_info->backup_location]['protocol'], $remote_stream_wrappers)){

				if($backuply_remote_backup_locs[$backup_info->backup_location]['protocol'] === 'bcloud'){
					$is_bcloud = true;
				}
				
				if(!defined('BACKUPLY_PRO') && $backuply_remote_backup_locs[$backup_info->backup_location]['protocol'] !== 'gdrive' && $backuply_remote_backup_locs[$backup_info->backup_location]['protocol'] !== 'bcloud') {
					$error[] = esc_html__('You are trying to access a PRO feature through FREE version', 'backuply');
					return false;
				} else if(defined('BACKUPLY_PRO')){
					include_once BACKUPLY_PRO_DIR . '/functions.php';
				}

				backuply_stream_wrapper_register($backuply_remote_backup_locs[$backup_info->backup_location]['protocol'], $backuply_remote_backup_locs[$backup_info->backup_location]['protocol']);
			}
			
			//echo "<br> checked for file existance : ".$backup_dir.'/'.$_file;
			
			if(file_exists($backup_dir.'/'.$_file)){
				//echo "<br> checked for file existance : ".$backup_dir.'/'.$_file;
				$files_exists = 1;
				break;
			}
		}else{
			$backup_dir = backuply_glob('backups');
		
			if(file_exists($backup_dir.'/'.$_file)){
				//echo "local file : ".$backup_dir.'/'.$_file;
				$files_exists = 1;
				break;
			}
		}
	}

	if(!empty($files_exists)){
		// Delete the backup
		@unlink($backup_dir.'/'.$_file);

		// Delete the backup_info file
		@unlink($backup_info_dir.'/'.$bkey.'.php');
		
		// If the Location is remote
		if(strpos($backup_dir, '://') !== FALSE){
			@unlink($backup_dir.'/'.$bkey.'.info'); // Changed to info file since 1.0.2
			@unlink($backup_dir.'/'.$bkey.'.log');
		}

		// Deleting log files from local
		if(file_exists(BACKUPLY_BACKUP_DIR . $bkey.'_log.php')){
			@unlink(BACKUPLY_BACKUP_DIR . $bkey.'_log.php');
		}

		$deleted = true;
	}else{

		// Delete the backup_info file
		@unlink($backup_info_dir.'/'.$bkey.'.php');
		
		// If the Location is remote
		@unlink($backup_dir.'/'.$bkey.'.php');
		if(strpos($backup_dir, '://') !== FALSE){
			@unlink($backup_dir.'/'.$bkey.'.info'); // Changed to info file since 1.0.2
			@unlink($backup_dir.'/'.$bkey.'.log');
		}
		
		// Deleting log files from remote and local
		if(file_exists(BACKUPLY_BACKUP_DIR . $bkey.'_log.php')){
			@unlink(BACKUPLY_BACKUP_DIR . $bkey.'_log.php');
		}
		
		$deleted = true;
	}

	// Updating the storage usage of Backuply Cloud.
	if(!empty($deleted) && !empty($is_bcloud)){
		$args = ['bcloud'];
		$schedule_time = wp_next_scheduled('backuply_update_quota', $args);

		// We are scheduling this because it makes a remote call and can take time
		// So we are pushing it on another request so, deletion can happen smoothly.
		// We have added a delay of some time so that if there is consecutive deletion
		// then we only make a single quota updation request.
		if(empty($schedule_time)){
			wp_schedule_single_event(time() + 10, 'backuply_update_quota', $args);
		}
	}
	
	if(file_exists($backup_dir.'/'.$_file)) {
		$deleted = false;
		$error[] = __('Unable to delete ', 'backuply') . esc_html($_file);
	}

	return $deleted;
}

// Creates log file
function backuply_create_log_file() {
	@unlink(BACKUPLY_BACKUP_DIR.'backuply_log.php');
	@touch(BACKUPLY_BACKUP_DIR.'backuply_log.php');
}

/**
 * Connect to the ftp server
 *
 * @param	string $host The hostname of the ftp server
 * @param	string $username The username Login detail
 * @param	string $pass The Login password
 * @param	string $cd The path of the file or directory to be changed
 * @returns 	bool
 */
function backuply_sftp_connect($host, $username, $pass, $protocol = 'ftp', $port = 21, $cd = false, $pri = '', $passphrase = ''){
	
	$port = (int) $port; // Converting to INT as FTP class requires an integer

	backuply_include_lib($protocol);
	
	if($protocol == 'ftp'){
		$ftp = new ftp(FALSE, FALSE);
		
		if(!$ftp->SetServer($host, $port)) {
			$ftp->quit();
			return 0;
		}
		
		if (!$ftp->connect()) {
			return -1;
		}
		
		if (!$ftp->login($username, $pass)) {
			$ftp->quit();
			return -2;
		}
		
		if(!empty($cd)){
			if(!$ftp->chdir($cd)){
				if(!$ftp->chdir(trim($cd, '/'))){
					return -3;
				}
				//return -3;
			}
		}
		
		if(!$ftp->SetType(BACKUPLY_FTP_AUTOASCII)){
		}
		
		if(!$ftp->Passive(TRUE)){
		}
	}

	// Class other than FTP
	if(empty($ftp)){
	
		// Initialize a Class
		$ftp = new $protocol();
		
		// Return if Class not found
		if(!is_object($ftp)){
			return -1;
		}
		
		// For SFTP authentication with keys or password
		if($protocol == 'softftpes' && !empty($pri)){
			$ftp->auth_pass = 0;
		}else{
			$ftp->auth_pass = 1;
		}

		// Can connect ?
		$ret = $ftp->connect($host, $port, $username, $pass, $pri, $passphrase);
		
		if(!$ret){
			return -2;
		}
		
		// Is directory present
		if(!empty($cd)){
			if(!$ftp->is_dir($cd)){
				return -3;
			}
		}
	}

	return $ftp;
}

// Creates stream wrapper and includes the associated class
function backuply_stream_wrapper_register($protocol, $classname){
	
	$protocols = array('dropbox', 'aws', 'caws', 'gdrive', 'softftpes', 'softsftp', 'webdav', 'onedrive', 'bcloud');
	
	if(!in_array($protocol, $protocols)){
		return true;
	}

	backuply_include_lib($protocol);
	
	$existing = stream_get_wrappers();
	if(in_array($protocol, $existing)){
		return true;
	}

	if(!stream_wrapper_register($protocol, $classname)){
		return false;
	}

	return true;
}

// Includes Lib Files
function backuply_include_lib($protocol) {

	if(!class_exists($protocol)){
		if(file_exists(BACKUPLY_DIR.'/lib/'.$protocol.'.php')) {
			include_once(BACKUPLY_DIR.'/lib/'.$protocol.'.php');
			return true;
		}

		if(defined('BACKUPLY_PRO') && defined('BACKUPLY_PRO_DIR') && file_exists(BACKUPLY_PRO_DIR . '/lib/' .$protocol . '.php')) {
			include_once(BACKUPLY_PRO_DIR . '/lib/' .$protocol . '.php');
			return true;
		}

		return false;
	}

	return true;
}

// Load Remote Backup class and initialize the class object
function backuply_load_remote_backup($backup_proto){
	
	if(!array_key_exists($backup_proto, backuply_get_protocols())){
		return false;
	}

	backuply_include_lib($backup_proto);
	
	$init_obj = new $backup_proto([]);
	
	return $init_obj;
}

// Gets data and path of the backup location
function backuply_load_remote_backup_info($protocol) {
	$remote = get_option('backuply_remote_backup_locs');
	
	foreach($remote as $k => $r) {
		if($r['protocol'] == $protocol) {
			return $r;
		}
	}
}

// Returns Remote loc details by id
function backuply_get_loc_by_id($id, $filter = array()){
	$remote = get_option('backuply_remote_backup_locs');

	foreach($remote as $k => $r) {
		if($k == $id) {
			// Removes the indexes that matches the filter
			foreach($r as $i => $k){
				if(in_array($i, $filter)) {
					unset($r[$i]);
				}
			}

			return $r;
		}
	}
	
	return false;
}

// Syncs available backup infos on a remote backup location to your site
function backuply_sync_remote_backup_infos($location_id){
	
	if($location_id === 'loc'){
		$synced_local = backuply_sync_local_backups();
		return true;
	}
	
	$locs = get_option('backuply_remote_backup_locs');
	
	if(empty($locs[$location_id])){
		return false;
	}
	
	$loc = $locs[$location_id];
	//backuply_print($loc);
	
	backuply_stream_wrapper_register($loc['protocol'], $loc['protocol']);

	$list = @scandir($loc['full_backup_loc']);
	
	if(empty($list)){
		return false;
	}
	
	foreach($list as $k => $v){
		
		$ext = pathinfo($v, PATHINFO_EXTENSION);
		
		$allowed_ext = array('php', 'info');
		$fexists = $v;

		if(strpos($v, '.info') !== FALSE){
			$fexists = basename($v, '.info') . '.php';
		}
		
		if(!in_array($ext, $allowed_ext) || file_exists(backuply_glob('backups_info') . '/'. $fexists)){
			//echo 'Continuing : '.$v.'<br>';
			continue;
		}
		//echo $v.'<br>';
		
		// Get the contents
		$fh = fopen($loc['full_backup_loc']. '/' . trim($v, '/'), 'rb');
		
		if(empty($fh)){
			continue;
		}
		
		$file = fread($fh, 8192);
		@fclose($fh);
		//backuply_print($file);
		
		if(empty($file)){
			continue;
		}
		
		$lines = explode("\n", $file);
		unset($lines[0]);
		
		$info = json_decode(implode("\n", $lines), true);
		//backuply_print($info);
		
		if(empty($info)){
			continue;
		}
		
		// Set the backup location ID
		$info['backup_location'] = $location_id;
		//backuply_print($info);
		
		$v = str_replace('.info', '.php', $v);
		
		// Write the file
		file_put_contents(backuply_glob('backups_info') .'/'.$v, "<?php exit();?>\n".json_encode($info, JSON_PRETTY_PRINT));
		
	}
	
	return true;
	
}

function backuply_untar_archive($tarname, $untar_path, $file_list = array(), $handle_remote = false){
	global $globals, $can_write, $ftp;

	// Create directory if not there
	if(!is_dir($untar_path)){
		@mkdir($untar_path);
	}
	$tar_archive = new backuply_tar($tarname, '', $handle_remote);
	
	if(empty($file_list)){
		$res = $tar_archive->extractModify($untar_path, '');
	}else{
		$res = $tar_archive->extractList($file_list, $untar_path);
	}
	
	if(!$res){
		return false;	
	}
	
	return true;	
}

function backuply_sync_local_backups(){
	
	$backups_dir = backuply_glob('backups');
	$backups_info_dir = backuply_glob('backups_info');
	
	if(!file_exists($backups_dir) || !file_exists($backups_info_dir)){
		return false;
	}

	$backups = @scandir($backups_dir);

	$backup_info_name = '';
	$backup_file_name = '';

	foreach($backups as $backup){
		if(in_array($backup, ['.', '..', 'index.html', 'index.php', 'tmp'])){
			continue;
		}
		
		$info_file_name = str_replace('.tar.gz', '.php', $backup);
		
		if(!file_exists($backups_info_dir . '/' . $info_file_name)){
			backuply_create_info_file($info_file_name, $backup);
		}
	}

}

// Creates new info file, from the info file in that backup tar.gz
function backuply_create_info_file($backup_info_name, $backup_file_name){

	$backups_dir = backuply_glob('backups');
	$backups_info_dir = backuply_glob('backups_info');

	if(empty($backup_info_name) || empty($backup_file_name)){
		return true;
	}

	include_once BACKUPLY_DIR . '/backuplytar.php'; // Including the Backuply TAR class.

	$backup_path = $backups_dir . '/' .$backup_file_name;
	backuply_untar_archive($backup_path, $backups_dir .'/tmp/', array($backup_info_name));

	$archived_info = $backups_dir .'/tmp/' .$backup_info_name;
	
	if(!file_exists($archived_info)){
		return true;
	}
	
	$content = file_get_contents($archived_info);

	if(!preg_match('/{.*}/s', $content, $json_info) || empty($json_info[0])){
		return true;
	}

	$info_arr = json_decode($json_info[0], true);

	if(empty($info_arr['size'])){
		$info_arr['size'] = filesize($backup_path);
	}

	file_put_contents($backups_info_dir . '/'. $backup_info_name, "<?php exit();?>\n".json_encode($info_arr, JSON_PRETTY_PRINT));
	
	@unlink($archived_info);

	return true;
}

// Syncs available backup logs on a remote backup location to your site
function backuply_sync_remote_backup_logs($location_id, $fname){
	
	if(empty($location_id)){
		return false;
	}
	
	$locs = get_option('backuply_remote_backup_locs');
	
	if(empty($locs[$location_id])){
		return false;
	}
	
	$loc = $locs[$location_id];
	
	backuply_stream_wrapper_register($loc['protocol'], $loc['protocol']);

	$list = @scandir($loc['full_backup_loc']);
	
	if(empty($list)){
		return false;
	}
	
	foreach($list as $k => $v){
		
		// Changing log name to log file for remote loc
		$fname = str_replace('_log.php', '.log', $fname);
		$ext = pathinfo($v, PATHINFO_EXTENSION);

		if($ext != 'log' || $fname != trim($v, '/') || file_exists(BACKUPLY_BACKUP_DIR . $v)){
			continue;
		}
		
		// Get the contents
		$fh = fopen($loc['full_backup_loc'].'/'.trim($v, '/'), 'rb');
		
		if(empty($fh)){
			return false;
		}
		
		$file = '';

		while(!feof($fh)){
			$file .= fread($fh, 8192);
		}
		
		@fclose($fh);

		if(empty($file)){
			return false;
		}

		// Changing log to php file for local
		$v = str_replace('.log', '_log.php', $v);
		
		// Write the file
		file_put_contents(BACKUPLY_BACKUP_DIR . $v, $file);
	
	}
	
	return true;
	
}

//Fix the serialization in Cloned DB Tables
function backuply_wp_clone_sql($table, $field_prefix, $keepalive, $i = null){

	global $wpdb;

	if(empty($wpdb)){
		backuply_log('Fix Serialization failed: unable to connect to the database');
		return false;
	}
	
	if(empty($table) || empty($field_prefix)){
		return false;
	}
	
	$possible_tables = ['options', 'postmeta', 'commentmeta'];
	$possible_fields = ['option', 'meta'];

	// We make sure here that we do not process any unwanted data.
	if(!in_array($table, $possible_tables, true) || !in_array($field_prefix, $possible_fields, true)){
		return false;
	}

	if($wpdb->has_cap('identifier_placeholders')){
		$cnt_qry = $wpdb->prepare("SELECT count(%i) as %i FROM %i", [$field_prefix.'_id', 'count_'.$field_prefix, $wpdb->prefix.$table]);
	} else {
		$cnt_qry = $wpdb->prepare("SELECT count(%s) as %s FROM `".$wpdb->prefix.$table . "`", [$field_prefix.'_id', 'count_'.$field_prefix]);
	}
	$result = $wpdb->get_results($cnt_qry);
	$result = json_decode(json_encode($result[0]), true);
	$cnt_res = $result['count_'.$field_prefix];
	
	$count = 10000;
	$limit = 0;

	if(is_null($i)){
		$i = $cnt_res;
		backuply_status_log('Repairing '. $wpdb->prefix.$table, 'repairing', 80);
	}
	
	backuply_status_log($i . ' Rows left to repair in ' . $wpdb->prefix.$table, 'working', 89);
	
	while($i >= 0){
		
		if(time() > $keepalive){
			return (int) $i;
		}

		if($wpdb->has_cap('identifier_placeholders')){
			$query = $wpdb->prepare("SELECT %i, %i FROM %i ORDER BY %i LIMIT %d, %d", [$field_prefix.'_id', $field_prefix.'_value', $wpdb->prefix.$table, $field_prefix.'_id', $limit, $count]);
		} else {
			$query = $wpdb->prepare("SELECT `".$field_prefix."_id`, `".$field_prefix."_value` FROM `".$wpdb->prefix.$table."` ORDER BY %s LIMIT %d, %d", [$field_prefix.'_id', $limit, $count]);
		}

		$result = $wpdb->get_results($query);
		
		// If there are no more rows we need to break the loop
		if(empty($result[0])){
			break;
		}
		
		foreach($result as $rk => $rv){
			$rv = json_decode(json_encode($rv), true);
			
			$update_query = '';
			$sresult = '';
			// This data should be serialized
			if(preg_match('/^a:(.*?):{/is', $rv[$field_prefix.'_value']) || preg_match('/^O:(.*?):{/is', $rv[$field_prefix.'_value'])){
				
				if(preg_match('/^utf8(.*?)/is', $wpdb->charset) && empty($conn)){
					$encoding = mb_detect_encoding($rv[$field_prefix.'_value']);
					if(empty($encoding)){
						$encoding = 'ISO-8859-1';
					}

					$_unserialize = backuply_unserialize(mb_convert_encoding($rv[$field_prefix.'_value'], 'UTF-8', 'auto'));
					$updated_data = (!function_exists('get_magic_quotes_gpc') || !get_magic_quotes_gpc()) ? addslashes(mb_convert_encoding(serialize($_unserialize), $encoding, 'UTF-8')) : mb_convert_encoding(serialize($_unserialize), $encoding, 'UTF-8');
				}else{
					$_unserialize = backuply_unserialize($rv[$field_prefix.'_value']);
					$updated_data = (!function_exists('get_magic_quotes_gpc') || !get_magic_quotes_gpc()) ? addslashes(serialize($_unserialize)) : serialize($_unserialize);
				}
				
				$update_query = "UPDATE `".$wpdb->prefix.$table."` SET `".$field_prefix."_value` = '".$updated_data."' WHERE `".$field_prefix."_id` = '".$rv[$field_prefix.'_id']."';";
				
				$sresult = $wpdb->query($update_query);
			}

			$i--;
			$limit++;
		}
	}
	
	return true;
}

/**
 * Callback for fixing any broken serialized string
 *
 * @package      string 
 * @author       Brijesh Kothari
 * @param        array $matches
 * @return       string Returns the fixed serialize content
 * @since     	 5.3.1
 * NOTE : Any changes in this function will affect anywhere this function is used as a callback
 */
function backuply_fix_serialize_callback($matches){
	
	//r_print($matches);
	
	// We are not using soft_is_serialized_str() because that checks for ; or } at the end and our data can be a:2:{s:3:"three
	if(preg_match('/^a:(.*?):{/is', $matches[2]) || preg_match('/^O:(.*?):/is', $matches[2])){
		return $matches[0];
	}
	
	return 's:'.strlen($matches[2]).':"'.$matches[2].'";';
}

/**
 * Unserialize a string and also fixes any broken serialized string before unserializing
 *
 * @package      string 
 * @author       Pulkit Gupta
 * @param        string $str
 * @return       array Returns an array if successful otherwise false 
 * @since     	 1.0
 */
// Note : This will not work for a serialized string in an array key
function backuply_unserialize($str){

	$var = @unserialize($str);
	
	if(empty($var)){
		
		// NOTE : Any changes in this pattern will need to be handled in callback function as well
		$str = preg_replace_callback('/s:(\d+):"(.*?)";(?=([:]|(?<=;)\}(?!\.)|a:|s:|S:|b:|d:|i:|o:|O:|C:|r:|R:|N;))/s', 'backuply_fix_serialize_callback', $str);
		
		$var = @unserialize($str);
	
	}
	
	//If it is still empty false
	if($var === false){
	
		return false;
	
	}else{
	
		return $var;
	
	}

}

// Renames backuply_log file to show last logs.
function backuply_copy_log_file($is_restore = false, $file_name = ''){
	
	if(empty($file_name)){
		$file_name = 'backuply_backup';
	}
	
	$copy_to = empty($is_restore) ? $file_name . '_log.php' : 'backuply_restore_log.php';
	copy(BACKUPLY_BACKUP_DIR . 'backuply_log.php', BACKUPLY_BACKUP_DIR . $copy_to);

}

function backuply_pattern_type_text($type) {
		
	if(empty($type)){
		return esc_html__('No type found!', 'backuply');
	}
		
	$types = array(
		'extension' => esc_html__('With specific extension', 'backuply'),
		'beginning' => esc_html__('At beginning', 'backuply'),
		'end' => esc_html__('At end', 'backuply'),
		'anywhere' => esc_html__('Anywhere', 'backuply')
	);
		
	return $types[$type];
}

function backuply_init_restore($info){
	
	global $wpdb;
	
	$backuply_backup_dir = backuply_cleanpath(BACKUPLY_BACKUP_DIR);
	
	if(!is_dir($backuply_backup_dir.'/restoration')) {
		mkdir($backuply_backup_dir.'/restoration', 0755, true);
	}
	
	$myfile = fopen($backuply_backup_dir.'/restoration/restoration.php', 'w') or die('Unable to open restoaration.php file !');
	$txt = time();
	fwrite($myfile, $txt);
	fclose($myfile);

	$info['plugin_dir'] = backuply_cleanpath(BACKUPLY_DIR);
	$info['backuly_backup_dir'] = $backuply_backup_dir;
	$info['softdb'] = $wpdb->dbname;
	$info['softdbhost'] = $wpdb->dbhost;
	$info['softdbuser'] = $wpdb->dbuser;
	$info['softdbpass'] = $wpdb->dbpassword;
	$info['tbl_prefix'] = $wpdb->prefix;
	$info['backuply_version'] = BACKUPLY_VERSION;

	backuply_create_log_file(); // Create a log file.
	backuply_status_log('Starting Restoring your backup', 'info', 10);
	wp_schedule_single_event(time() + BACKUPLY_TIMEOUT_TIME, 'backuply_timeout_check', array('is_restore' => true));
	backuply_restore_curl($info);

}

function backuply_restore_curl($info = array()) {
	global $wpdb, $backuply;

	$info['site_url'] = site_url();
	$info['home_url'] = home_url();
	$info['to_email'] = get_option('backuply_notify_email_address');
	$info['admin_email'] = get_option('admin_email');
	$info['ajax_url'] = admin_url('admin-ajax.php');
	$info['debug_mode'] = $backuply['debug_mode'];
	$info['user_id'] = get_current_user_id();
	$info['exclude_db'] = !empty($backuply['excludes']['db']) ? $backuply['excludes']['db'] : array();

	$config = backuply_get_config();
	
	if(empty($config['RESTORE_KEY'])) {
		return;
	}
	
	$info['backup_dir'] = backuply_glob('backups');

	// Setting backup_dir if its remote location
	if(!empty($info['loc_id'])){
		$backuply_remote_backup_locs = get_option('backuply_remote_backup_locs');
		$loc_id = $info['loc_id'];
		$info['backup_dir'] = $backuply_remote_backup_locs[$loc_id]['full_backup_loc'];
		backuply_set_restoration_file($backuply_remote_backup_locs[$loc_id]);
	}

	$info['restore_key'] = urlencode($config['RESTORE_KEY']);
	$tmp_restore_file = ABSPATH . '/backuply-restore.php';
	$tmp_restore_include = "<?php\ndefine('BACKUPLY_DIR_FOR_RESTORE', '".BACKUPLY_DIR."');\ninclude_once '".BACKUPLY_DIR."/restore_ins.php';";

	if(file_put_contents($tmp_restore_file, $tmp_restore_include)){
		$restore_url = site_url() . '/backuply-restore.php';
	} else {
		$restore_url = BACKUPLY_URL . '/restore_ins.php';
	}

	$info['restore_curl_url'] = $restore_url;
	
	$args = array(
		'body' => $info,
		'timeout' => 0.01,
		'blocking' => false,
		'sslverify' => false,
		'headers' => [
			'Referer' => (!empty($_SERVER['REQUEST_SCHEME']) ? $_SERVER['REQUEST_SCHEME'] : 'http') .'://'. $_SERVER['SERVER_NAME'],
		],
		'user-agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36',
	);

	wp_remote_post($info['restore_curl_url'], $args);
}

// Shifts the Config keys from file to db for user below 1.2.0.
function backuply_keys_to_db(){
	$config = backuply_get_config();
	if(isset($config['RESTORE_KEY'])){
		unset($config['RESTORE_KEY']); // Restore Key gets generated every time a restore is created.
	}

	update_option('backuply_config_keys', $config);
	unlink(BACKUPLY_BACKUP_DIR . '/backuply_config.php');
}

// Create a status lock key
function backuply_set_status_key(){
	
	$key = wp_generate_password(32, false);

	file_put_contents(BACKUPLY_BACKUP_DIR . '/status_key.php', "<?php exit();?>\n". $key);
	
	@chmod(BACKUPLY_BACKUP_DIR . '/status_key.php', 0600);
}

function backuply_get_status_key(){

	$status_file = BACKUPLY_BACKUP_DIR . 'status_key.php';

	if(!file_exists($status_file)){
		return false;
	}

	$content = file_get_contents($status_file);
	$content = str_replace("<?php exit();?>\n", '', $content);
	
	return $content;
}

function backuply_get_quota($protocol){

	backuply_stream_wrapper_register($protocol, $protocol);
	
	if(class_exists($protocol) && method_exists($protocol, 'get_quota')){
		$class = new $protocol();
		
		$info = backuply_load_remote_backup_info($protocol);
		$quota = $class->get_quota($info['full_backup_loc']);

		if(empty($quota)){
			return false;
		}
		
		return $quota;
	}
	
	return false;
}

function backuply_schedule_quota_updation($location){

	$storage_loc = sanitize_text_field($location);
	
	if(empty($storage_loc)){
		backuply_log(__('No Storage location provided', 'backuply'));
		return;
	}

	$quota = backuply_get_quota($storage_loc);
	
	if(empty($quota)){
		backuply_log('Scheduled Quota Update: Nothing returned in quota fetch!');
		return;
	}
	
	$info = get_option('backuply_remote_backup_locs', []);
	
	if(!empty($info)){
		foreach($info as $key => $locs){
			if($locs['protocol'] === $storage_loc){
				$info[$key]['backup_quota'] = (int) $quota['used'];
				$info[$key]['allocated_storage'] = (int) $quota['total'];
			}
		}
		
		update_option('backuply_remote_backup_locs', $info, false);
	}

	backuply_log('Scheduled Quota Update: Fetched Quota updated successfully!');
}

// Checks every day if there is any file inside tmp or a backup with dot(.) at start
// and have not been updated since last 24 hours, then delete them.
// And also deletes any softperms, softsql residue left
function backuply_delete_tmp(){

	$backup_folder = backuply_glob('backups');

	// Deleting files with dot(.) at start
	$files = glob($backup_folder .'/.*.tar.gz');

	if(!empty($files)){
		foreach($files as $file){
			if(!file_exists($file) || is_dir($file)){
				continue;
			}

			if(filemtime($file) < (time() - 86400)){
				try{
					unlink($file);
					backuply_log('Deletion unsuccessful: '.$file);
				}catch(Exception $e){
					backuply_log('Deletion Error: ' . $e->getMessage());
				}
			}
		}
	}

	// Deleting folders in tmp
	$folders = glob($backup_folder .'/tmp/*/');

	if(!empty($folders)){
		foreach($folders as $folder){
			// We dont need to delete any file in this folder.
			if(!is_dir($folder)){
				continue;	
			}

			if(filemtime($folder) < (time() - 86400)){
				try{
					global $wp_filesystem;

					include_once ABSPATH . 'wp-admin/includes/file.php';
					WP_Filesystem();

					$wp_filesystem->rmdir($folder, true);
				} catch(Exception $e){
					backuply_log('Deletion Error: '. $e->getMessage());
				}
			}
		}
	}
	
	// Deletes any restore residue
	if(!file_exists(BACKUPLY_BACKUP_DIR .'/restoration/restoration.php')){
		if(file_exists(ABSPATH .'/softperms.txt')){
			unlink(ABSPATH .'/softperms.txt');
		}

		if(file_exists(ABSPATH .'/softsql.sql')){
			unlink(ABSPATH .'/softsql.sql');
		}

		if(file_exists(ABSPATH .'/softver.txt')){
			unlink(ABSPATH .'/softver.txt');
		}
	}
}

function backuply_add_mime_types($mimes) {

    if(!array_key_exists('tar', $mimes)){
        $mimes['tar'] =  'application/x-tar';
    }

    if(!array_key_exists('gz|gzip', $mimes) && !array_key_exists('gz', $mimes)){
        $mimes['gz|gzip'] = 'application/x-gzip';
    }

    return $mimes;
}

function backuply_sanitize_filename($filename){
	$filename = sanitize_file_name($filename);
	// We need to remove "_" as sanitize_file_name adds it if the file 
	// have more than 2 extensions, which in our case happens sometimes, if the 
	// URL of the website, has a sub domain or has TLD as .co.in or similar.
	$filename = str_replace('_.', '.', $filename);

	return $filename;
}

function backuply_direct_download_file(){
	check_admin_referer('backuply_download_security', 'security');

	if(!current_user_can('manage_options')){
		wp_die('You do not have required privilege to download the file');
	}
	
	@set_time_limit(0);

	$filename = backuply_optget('backup_name');
	$filename = backuply_sanitize_filename($filename);
	$backups_dir = backuply_glob('backups');
	
	$file_path = $backups_dir . '/'. $filename;

	if(!file_exists($file_path)){
		wp_die('File does not exists');
	}
	
	if(ob_get_level()){
		$ob_levels = min(5, (int) ob_get_level());
		for($i = 1; $i<= $ob_levels; $i++){
			@ob_end_clean();
		}
	}

	if(ob_get_level()){
		@ob_end_clean();
	}

	// Get the file size
	$file_size = filesize($file_path);

	// Handle range requests
	header('Content-Type: application/octet-stream');
	header('Content-Disposition: attachment; filename="' . basename($filename) . '"');
	header('Content-Transfer-Encoding: binary');
	header('Content-Length: ' . $file_size);
	header('Last-Modified: ' . gmdate('D, d M Y H:i:s T', filemtime($file_path)));
	header('Expires: 0');
	header('Cache-Control: public, must-revalidate, max-age=0');
	header('Pragma: no-cache');

	readfile($file_path);
	die();
}

// Returns the Security key
function backuply_status_config(){

	$config_file = BACKUPLY_BACKUP_DIR . '/status_key.php';
	
	if(!file_exists($config_file) || 0 == filesize($config_file)) {
		return false;
	}

	$fp = file($config_file);

	if(empty($fp[1])){
		return '';
	}

	$status_key = $fp[1];

	return $status_key;
}

// Verifies the backuply key
function backuply_verify_status_log(){
	
	if(empty($_REQUEST['status_key'])) {
		return false;
	}
	
	$status_lock = BACKUPLY_BACKUP_DIR. '/status.lock';
	
	if(!file_exists($status_lock) || (time() - filemtime($status_lock) > 1800)){
		return false;
	}

	$status_key = backuply_status_config();
	
	if(!$status_key) {
		return false;
	}
	
	$request_key = sanitize_text_field(wp_unslash($_REQUEST['status_key']));

	if(urldecode($request_key) == $status_key) {
		return true;
	}

	return false;
}

// LiteSpeed kills long running processes, and backups need to run long
// So we have to prevent the default behaviour of LiteSpeed by using noabort rule.
function backuply_add_litespeed_noabort(){

	if(!extension_loaded('litespeed')){
		return;
	}

	$htaccess_file = ABSPATH .'.htaccess';

	if(!file_exists($htaccess_file) || !is_writable($htaccess_file)){
		return;
	}

	$rules = file_get_contents($htaccess_file);

	if(!preg_match('/noabort/i', $rules)){
		$rules .= "\n". "\n";
		$rules .= '# BEGIN LiteSpeed'."\n";
		$rules .= '<IfModule Litespeed>'."\n";
		$rules .= 'SetEnv noabort 1'."\n";
		$rules .= '</IfModule>'."\n";
		$rules .= '# END LiteSpeed'."\n";

		file_put_contents($htaccess_file, $rules);
	}
	
}restore_ins.php000064400000307517151526424660007641 0ustar00<?php
/*
* BACKUPLY
* https://backuply.com
* (c) Backuply Team
*/

if(isset($_REQUEST['status_key']) && defined('BACKUPLY_DIR_FOR_RESTORE')){
	include_once BACKUPLY_DIR_FOR_RESTORE . '/status_logs.php';
	die();
}

if(empty($_SERVER['REQUEST_METHOD']) || $_SERVER['REQUEST_METHOD'] !== 'POST' || !backuply_verify_self()){
	die('HACKING ATTEMPT!');
}

if(!set_time_limit(300)){
	set_time_limit(60);
}

$keepalive = 25;
if(function_exists('ini_get')){
	$max_execution_time = (int) ini_get('max_execution_time');

	if(!empty($max_execution_time) && $max_execution_time > 180){
		$keepalive = 60;
	}
}

ignore_user_abort(true); // Dont abort if user aborts
//error_reporting(E_ALL);

//Constants
define('ARCHIVE_TAR_ATT_SEPARATOR', 90001);
define('ARCHIVE_TAR_END_BLOCK', pack('a512', ''));

include_once __DIR__ .'/lib/Curl/Curl.php';
use Curl\Curl;

function backuply_died() {
	$last_error = error_get_last();

	if(!$last_error){
		return false;
	}
	
	if(!empty($last_error['type']) && ($last_error['type'] === E_ERROR || $last_error['type'] === E_PARSE)){
		backuply_log($last_error['message'], true);
	}

	// To show the memory limit error.
	if(strpos($last_error['message'], 'Allowed memory size') !== FALSE){
		backuply_status_log($last_error['message'] . 'you can solve this issue by increasing PHP memory_limit', 'error');
	}

	if(strpos($last_error['message'], 'Maximum execution time') !== FALSE){
		//backuply_log('Didnt Come inside max execution');
		backuply_status_log('Your server reached PHP maximum execution time, to solve this issue you can increase PHP max_execution_time', 'error');
		backuply_kill_process();
	}
}
register_shutdown_function('backuply_died');

function backuply_glob($relative_path){
	global $data;

	$glob = glob(dirname(__FILE__, 3) .'/backuply/'. $relative_path .'-*', GLOB_ONLYDIR);

	if(!empty($glob[0])){
		return $glob[0];
	}
	
	return false;

}

// Update Backuply logs as per action
function backuply_log($info, $is_fatal = false){
	global $data;

	if(empty($data['debug_mode']) && empty($is_fatal)){
		return;
	}
	
	$write = '';
	$write .= '['.date('Y-m-d H:i:s', time()).'] ';
	
	$write .= $info."\n\n";
	
	$log_file = backuply_glob('backups_info') .'/debug.php';
	
	$fp = @fopen($log_file, 'ab');

	if (0 == filesize($log_file)){
		// file is empty
		@fwrite($fp, "<?php exit();?>\n");
	}
	
	@fwrite($fp, $write);
	@fclose($fp);
	
	@chmod($log_file, 0600);
}

// Returns the Security key
function backuply_get_config() {
	$config_file = dirname(__FILE__, 3) . '/backuply/backuply_config.php';
	
	if(!file_exists($config_file) || 0 == filesize($config_file)) {
		return false;
	}

	$fp = @fopen($config_file, 'r');
	@fseek($fp, 16);
	
	$content = @fread($fp, filesize($config_file));
	@fclose($fp);
	
	$config = json_decode($content, true);
	
	return $config;
}

function backuply_kill_process() {
	global $error, $data;
	
	if(file_exists(dirname(__FILE__, 3).'/backuply/restoration/restoration.php')) {
		@unlink(dirname(__FILE__, 3).'/backuply/restoration/restoration.php');
	}
	
	restore_clean();
	$error[] = 'The Restore has been killed Successfully';

	// Deleting restore index file
	if(!empty($data['softpath']) && file_exists($data['softpath'] . '/backuply-restore.php')){
		unlink($data['softpath'] . '/backuply-restore.php');
	}
	
	backuply_die('restore_killed');
}

function restore_got_killed() {
	if(!file_exists(dirname(__FILE__, 3).'/backuply/restoration/restoration.php')) {
		restore_clean();
		backuply_die('got_killed');
	}
}


function backuply_preg_replace($pattern, $file, &$var, $valuenum, $stripslashes = ''){	
	preg_match($pattern, $file, $matches);
	if(empty($stripslashes)){
		$var = trim($matches[$valuenum]);
	}else{
		$var = stripslashes(trim($matches[$valuenum]));
	}
}

// Verifies the backuply key
function backuply_verify_self() {
	//backuply_log($_REQUEST['restore_key']);
	if(empty($_REQUEST['restore_key'])) {
		return false;
	}

	$config = backuply_get_config();

	if(!$config) {
		return false;
	}

	if(urldecode($_REQUEST['restore_key']) == $config['RESTORE_KEY']) {
		return true;
	}
	
	return false;	
}

function backuply_inputsec($string){
	
	//get_magic_quotes_gpc is depricated in php 7.4
	if(version_compare(PHP_VERSION, '7.4', '<')){
		if(!get_magic_quotes_gpc()){
		
			$string = addslashes($string);
		
		}else{
		
			$string = stripslashes($string);
			$string = addslashes($string);
		
		}
	}else{
		$string = addslashes($string);
	}
	
	// This is to replace ` which can cause the command to be executed in exec()
	$string = str_replace('`', '\`', $string);
	
	return $string;
}

function backuply_htmlizer($string){

global $globals;

	$string = htmlentities($string, ENT_QUOTES, 'UTF-8');
	
	preg_match_all('/(&amp;#(\d{1,7}|x[0-9a-fA-F]{1,6});)/', $string, $matches);//backuply_print($matches);
	
	foreach($matches[1] as $mk => $mv){	 
		$tmp_m = backuply_entity_check($matches[2][$mk]);
		$string = str_replace($matches[1][$mk], $tmp_m, $string);
	}
	
	return $string;
	
}

class softtar{

	var $_tarname='';
	var $_compress=false;
	var $_compress_type='none';
	var $_separator=',';
	var $_file=0;
	var $_temp_tarname='';
	var $_ignore_regexp='';
	var $error_object=null;
	
	var $_local_tar=''; // The local file	
	var $_orig_tar=''; // The remote file
	var $remote_fp=''; // The remote file pointer	
	var $remote_fp_filter = NULL;
	var $remote_hctx = NULL;
	var $remote_content_size = 0;
	
	function __construct($p_tarname, $p_compress = null, $handle_remote = false){
		// $tmpdir is mainly used for REMOTE protocols so that we can write locally and append on the remote server
		if(preg_match('/\:\/\//', $p_tarname) && $handle_remote){
			$tmpdir = backuply_glob('backups') . '/tmp';
			$this->_orig_tar = $p_tarname;
			$p_tarname = $tmpdir.'/'.md5($p_tarname);
			
			$this->_local_tar = $p_tarname;
			$GLOBALS['local_tarname'] = $this->_local_tar;
			
		}
		
		$this->_compress = false;
		$this->_compress_type = 'none';
		if (($p_compress === null) || ($p_compress == '')) {
			if (@file_exists($p_tarname)) {
				if ($fp = @fopen($p_tarname, "rb")) {
					// look for gzip magic cookie
					$data = fread($fp, 2);
					fclose($fp);
					if ($data == "\37\213") {
						$this->_compress = true;
						$this->_compress_type = 'gz';
						// No sure it's enought for a magic code ....
					} elseif ($data == "BZ") {
						$this->_compress = true;
						$this->_compress_type = 'bz2';
					}
				}
			} else {
				// probably a remote file or some file accessible
				// through a stream interface
				if (substr($p_tarname, -2) == 'gz') {
					$this->_compress = true;
					$this->_compress_type = 'gz';
				} elseif ((substr($p_tarname, -3) == 'bz2') ||
						  (substr($p_tarname, -2) == 'bz')) {
					$this->_compress = true;
					$this->_compress_type = 'bz2';
				}
			}
		} else {
			if (($p_compress === true) || ($p_compress == 'gz')) {
				$this->_compress = true;
				$this->_compress_type = 'gz';
			} else if ($p_compress == 'bz2') {
				$this->_compress = true;
				$this->_compress_type = 'bz2';
			} else {
				$this->_error("Unsupported compression type '$p_compress'\n".
					"Supported types are 'gz' and 'bz2'.\n");
				return false;
			}
		}
		$this->_tarname = $p_tarname;
		if ($this->_compress) { // assert zlib or bz2 extension support
			if ($this->_compress_type == 'gz')
				$extname = 'zlib';
			else if ($this->_compress_type == 'bz2')
				$extname = 'bz2';

			if (!extension_loaded($extname)) {
				PEAR::loadExtension($extname);
			}
			if (!extension_loaded($extname)) {
				$this->_error("The extension '$extname' couldn't be found.\n".
					"Please make sure your version of PHP was built ".
					"with '$extname' support.\n");
				return false;
			}
		}
	}
	// }}}
	
	function __destruct(){
		$this->_softtar();
	}

	// {{{ destructor
	function _softtar(){
		$this->_close();
		// ----- Look for a local copy to delete
		if ($this->_temp_tarname != '')
			@unlink($this->_temp_tarname);
	}
	// }}}

	// {{{ create()
	function create($p_filelist){
		return $this->createModify($p_filelist, '', '');
	}
	// }}}

	// {{{ add()
	function add($p_filelist){
		return $this->addModify($p_filelist, '', '');
	}
	// }}}

	// {{{ extract()
	function extract($p_path='', $p_preserve=false){
		return $this->extractModify($p_path, '', $p_preserve);
	}
	// }}}

	// {{{ listContent()
	function listContent(){
		$v_list_detail = array();

		if ($this->_openRead()) {
			if (!$this->_extractList('', $v_list_detail, "list", '', '')) {
				unset($v_list_detail);
				$v_list_detail = 0;
			}
			$this->_close();
		}

		return $v_list_detail;
	}
	// }}}

	// {{{ createModify()
	function createModify($p_filelist, $p_add_dir, $p_remove_dir=''){
		$v_result = true;

		if (!$this->_openWrite())
			return false;

		if ($p_filelist != '') {
			if (is_array($p_filelist))
				$v_list = $p_filelist;
			elseif (is_string($p_filelist))
				$v_list = explode($this->_separator, $p_filelist);
			else {
				$this->_cleanFile();
				$this->_error('Invalid file list');
				return false;
			}

			$v_result = $this->_addList($v_list, $p_add_dir, $p_remove_dir);
		}

		if ($v_result) {
			$this->_writeFooter();
			$this->_close();
		} else
			$this->_cleanFile();

		return $v_result;
	}
	// }}}

	// {{{ addModify()
	function addModify($p_filelist, $p_add_dir, $p_remove_dir=''){
		$v_result = true;

		if (!$this->_isArchive())
			$v_result = $this->createModify($p_filelist, $p_add_dir,
											$p_remove_dir);
		else {
			if (is_array($p_filelist))
				$v_list = $p_filelist;
			elseif (is_string($p_filelist))
				$v_list = explode($this->_separator, $p_filelist);
			else {
				$this->_error('Invalid file list');
				return false;
			}

			$v_result = $this->_append($v_list, $p_add_dir, $p_remove_dir);
		}

		return $v_result;
	}
	// }}}

	// {{{ addString()
	function addString($p_filename, $p_string){
		$v_result = true;

		if (!$this->_isArchive()) {
			if (!$this->_openWrite()) {
				return false;
			}
			$this->_close();
		}

		if (!$this->_openAppend())
			return false;

		// Need to check the get back to the temporary file ? ....
		$v_result = $this->_addString($p_filename, $p_string);

		$this->_writeFooter();

		$this->_close();

		return $v_result;
	}
	// }}}

	// {{{ extractModify()
	function extractModify($p_path, $p_remove_path, $p_preserve=false){
		$v_result = true;
		$v_list_detail = array();
		
		// Download the archive if its remote
		// if(!empty($this->_orig_tar)){
			// $this->remote_archive_download_loop();
		// }

		if ($v_result = $this->_openRead()) {
			$v_result = $this->_extractList($p_path, $v_list_detail,
				'complete', 0, $p_remove_path, $p_preserve);
			$this->_close();
		}

		return $v_result;
	}
	// }}}

	// {{{ extractInString()
	function extractInString($p_filename){
		if ($this->_openRead()) {
			$v_result = $this->_extractInString($p_filename);
			$this->_close();
		} else {
			$v_result = null;
		}

		return $v_result;
	}
	// }}}

	// {{{ extractList()
	function extractList($p_filelist, $p_path='', $p_remove_path='', $p_preserve=false){
		$v_result = true;
		$v_list_detail = array();

		if (is_array($p_filelist))
			$v_list = $p_filelist;
		elseif (is_string($p_filelist))
			$v_list = explode($this->_separator, $p_filelist);
		else {
			$this->_error('Invalid string list');
			return false;
		}

		if ($v_result = $this->_openRead()) {
			$v_result = $this->_extractList($p_path, $v_list_detail, "partial",
				$v_list, $p_remove_path, $p_preserve);
			$this->_close();
		}

		return $v_result;
	}
	// }}}

	// {{{ setAttribute()
	function setAttribute(){
		$v_result = true;

		// ----- Get the number of variable list of arguments
		if (($v_size = func_num_args()) == 0) {
			return true;
		}

		// ----- Get the arguments
		$v_att_list = func_get_args();

		// ----- Read the attributes
		$i=0;
		while ($i<$v_size) {

			// ----- Look for next option
			switch ($v_att_list[$i]) {
				// ----- Look for options that request a string value
				case ARCHIVE_TAR_ATT_SEPARATOR :
					// ----- Check the number of parameters
					if (($i+1) >= $v_size) {
						$this->_error('Invalid number of parameters for '
									  .'attribute ARCHIVE_TAR_ATT_SEPARATOR');
						return false;
					}

					// ----- Get the value
					$this->_separator = $v_att_list[$i+1];
					$i++;
					break;

				default :
					$this->_error('Unknow attribute code '.$v_att_list[$i].'');
					return false;
			}

			// ----- Next attribute
			$i++;
		}

		return $v_result;
	}
	// }}}

	// {{{ setIgnoreRegexp()
	function setIgnoreRegexp($regexp){
		$this->_ignore_regexp = $regexp;
	}
	// }}}

	// {{{ setIgnoreList()
	function setIgnoreList($list){
		$regexp = str_replace(array('#', '.', '^', '$'), array('\#', '\.', '\^', '\$'), $list);
		$regexp = '#/'.join('$|/', $list).'#';
		$this->setIgnoreRegexp($regexp);
	}
	// }}}

	// {{{ _error()
	function _error($p_message){
		//we have changed this since PEAR is not used
		//$this->error_object = &$this->raiseError($p_message); 
		trigger_error($p_message, E_USER_WARNING);
	}
	// }}}

	// {{{ _warning()
	function _warning($p_message){
		//we have changed this since PEAR is not used
		//$this->error_object = &$this->raiseError($p_message); 
		trigger_error($p_message, E_USER_NOTICE);
	}
	// }}}

	// {{{ _isArchive()
	function _isArchive($p_filename=null){
		if ($p_filename == null) {
			$p_filename = $this->_tarname;
		}
		clearstatcache();
		return @is_file($p_filename) && !@is_link($p_filename);
	}
	// }}}

	// {{{ _openWrite()
	function _openWrite(){
		
		if ($this->_compress_type == 'gz' && function_exists('gzopen'))
			$this->_file = @gzopen($this->_tarname, "wb9");
		else if ($this->_compress_type == 'bz2' && function_exists('bzopen'))
			$this->_file = @bzopen($this->_tarname, "w");
		else if ($this->_compress_type == 'none')
			$this->_file = @fopen($this->_tarname, "wb");
		else
			$this->_error('Unknown or missing compression type ('
						  .$this->_compress_type.')');

		if ($this->_file == 0) {
			$this->_error('Unable to open in write mode \''
						  .$this->_tarname.'\'');
			return false;
		}

		return true;
	}
	// }}}

	// {{{ _openRead()
	function _openRead(){
		global $ftp, $can_write;
		
		if (strtolower(substr($this->_tarname, 0, 7)) == 'http://') {

		  // ----- Look if a local copy need to be done
		  if ($this->_temp_tarname == '') {
			  $this->_temp_tarname = uniqid('tar').'.tmp';
			  if (!$v_file_from = @fopen($this->_tarname, 'rb')) {
				$this->_error('Unable to open in read mode \''
							  .$this->_tarname.'\'');
				$this->_temp_tarname = '';
				return false;
			  }
			  if (!$v_file_to = @fopen($this->_temp_tarname, 'wb')) {
				$this->_error('Unable to open in write mode \''
							  .$this->_temp_tarname.'\'');
				$this->_temp_tarname = '';
				return false;
			  }
			  while ($v_data = @fread($v_file_from, 1024))
				  @fwrite($v_file_to, $v_data);
			  @fclose($v_file_from);
			  @fclose($v_file_to);
		  }

		  // ----- File to open if the local copy
		  $v_filename = $this->_temp_tarname;

		} else
		  // ----- File to open if the normal Tar file
		  $v_filename = $this->_tarname;


		if ($this->_compress_type == 'gz')
			$this->_file = @gzopen($v_filename, 'rb');
		else if ($this->_compress_type == 'bz2')
			$this->_file = @bzopen($v_filename, "r");
		else if ($this->_compress_type == 'none')
			$this->_file = @fopen($v_filename, "rb");
		else
			$this->_error('Unknown or missing compression type ('
						  .$this->_compress_type.')');

		if ($this->_file == 0) {
			$this->_error('Unable to open in read mode \''.$v_filename.'\'');
			return false;
		}

		return true;
	}
	// }}}

	// {{{ _openReadWrite()
	function _openReadWrite(){
		if ($this->_compress_type == 'gz')
			$this->_file = @gzopen($this->_tarname, "r+b");
		else if ($this->_compress_type == 'bz2') {
			$this->_error('Unable to open bz2 in read/write mode \''
						  .$this->_tarname.'\' (limitation of bz2 extension)');
			return false;
		} else if ($this->_compress_type == 'none')
			$this->_file = @fopen($this->_tarname, "r+b");
		else
			$this->_error('Unknown or missing compression type ('
						  .$this->_compress_type.')');

		if ($this->_file == 0) {
			$this->_error('Unable to open in read/write mode \''
						  .$this->_tarname.'\'');
			return false;
		}

		return true;
	}
	// }}}

	// {{{ _close()
	function _close(){
		//if (isset($this->_file)) {
		if (is_resource($this->_file)) {
			if ($this->_compress_type == 'gz')
				@gzclose($this->_file);
			else if ($this->_compress_type == 'bz2')
				@bzclose($this->_file);
			else if ($this->_compress_type == 'none')
				@fclose($this->_file);
			else
				$this->_error('Unknown or missing compression type (' . $this->_compress_type.')');

			$this->_file = 0;
		}

		// ----- Look if a local copy need to be erase
		// Note that it might be interesting to keep the url for a time : ToDo
		if ($this->_temp_tarname != '') {
			@unlink($this->_temp_tarname);
			$this->_temp_tarname = '';
		}

		return true;
	}
	// }}}

	// {{{ _cleanFile()
	function _cleanFile(){
		$this->_close();

		// ----- Look for a local copy
		if ($this->_temp_tarname != '') {
			// ----- Remove the local copy but not the remote tarname
			@unlink($this->_temp_tarname);
			$this->_temp_tarname = '';
		} else {
			// ----- Remove the local tarname file
			@unlink($this->_tarname);
		}
		$this->_tarname = '';

		return true;
	}
	// }}}

	// {{{ _writeBlock()
	function _writeBlock($p_binary_data, $p_len=null, $finished = false){
		if(is_resource($this->_file)){
			if($p_len === null){
				if ($this->_compress_type == 'gz')
					@gzputs($this->_file, $p_binary_data);
				else if ($this->_compress_type == 'bz2')
					@bzwrite($this->_file, $p_binary_data);
				else if ($this->_compress_type == 'none')
					@fputs($this->_file, $p_binary_data);
				else
					$this->_error('Unknown or missing compression type (' . $this->_compress_type.')');
			} else {
				if ($this->_compress_type == 'gz')
					@gzputs($this->_file, $p_binary_data, $p_len);
				else if ($this->_compress_type == 'bz2')
					@bzwrite($this->_file, $p_binary_data, $p_len);
				else if ($this->_compress_type == 'none')
					@fputs($this->_file, $p_binary_data, $p_len);
				else
					$this->_error('Unknown or missing compression type (' . $this->_compress_type.')');
			}
		}
		
		return true;
	}
	// }}}

	// {{{ _readBlock()
	function _readBlock(){
		$v_block = null;
		if(is_resource($this->_file)){
			if($this->_compress_type == 'gz'){
				$v_block = @gzread($this->_file, 512);
			}else if($this->_compress_type == 'bz2'){
				$v_block = @bzread($this->_file, 512);
			}else if ($this->_compress_type == 'none'){
				$cur = ftell($this->_file);
				$v_block = @fread($this->_file, 512);

				// We always need to read 512 blocks and in some cases we do not get complete 512 blocks due to network issues
				// This is a fix to retry if we did not get 512 blocks
				$retry = 0;
				$read = strlen($v_block); // How much did we read ? 
				while($read != 512 && !feof($this->_file)){
					if($retry >= 3){ // We can try max for 3 times
						break;
					}
					$toread = 512 - $read; // How many blocks did we miss ? 
					$tmp_block = @fread($this->_file, $toread); // Read the missing blocks
					$v_block .= $tmp_block; // Add it to the existing content
					$read = strlen($v_block); // Update the length of updated content
					$retry++;
				}
			}else{
				$this->_error('Unknown or missing compression type (' . $this->_compress_type.')');
			}
		}
		return $v_block;
	}
	// }}}

	// {{{ _jumpBlock()
	function _jumpBlock($p_len=null){
		if(is_resource($this->_file)){
			if ($p_len === null)
				$p_len = 1;

			if($this->_compress_type == 'gz'){
				@gzseek($this->_file, gztell($this->_file)+($p_len*512));
			}
			else if($this->_compress_type == 'bz2'){
				// ----- Replace missing bztell() and bzseek()
				for ($i=0; $i<$p_len; $i++)
					$this->_readBlock();
			} else if ($this->_compress_type == 'none')
				@fseek($this->_file, $p_len*512, SEEK_CUR);
			else
				$this->_error('Unknown or missing compression type (' . $this->_compress_type.')');
		}
		return true;
	}
	// }}}

	// {{{ _writeFooter()
	function _writeFooter(){
		if(is_resource($this->_file)){
			// ----- Write the last 0 filled block for end of archive
			$v_binary_data = pack('a1024', '');
			$this->_writeBlock($v_binary_data);
		}
		return true;
	}
	// }}}

	// {{{ _addList()
	function _addList($p_list, $p_add_dir, $p_remove_dir){
		$v_result=true;
		$v_header = array();

		// ----- Remove potential windows directory separator
		$p_add_dir = $this->_translateWinPath($p_add_dir);
		$p_remove_dir = $this->_translateWinPath($p_remove_dir, false);

		if(!$this->_file){
			$this->_error('Invalid file descriptor');
			return false;
		}

		if(sizeof($p_list) == 0)
			return true;

		foreach($p_list as $v_filename){
			if (!$v_result) {
				break;
			}

			// ----- Skip the current tar name
			if ($v_filename == $this->_tarname)
				continue;

			if ($v_filename == '')
				continue;

			// ----- ignore files and directories matching the ignore regular expression
			if($this->_ignore_regexp && preg_match($this->_ignore_regexp, '/'.$v_filename)){
				$this->_warning("File '$v_filename' ignored");
				continue;
			}

			if(!file_exists($v_filename) && !is_link($v_filename)){
				$this->_warning("File '$v_filename' does not exist");
				continue;
			}

			// ----- Add the file or directory header
			if (!$this->_addFile($v_filename, $v_header, $p_add_dir, $p_remove_dir))
				return false;

			if (@is_dir($v_filename) && !@is_link($v_filename)) {
				if(!($p_hdir = opendir($v_filename))){
					$this->_warning("Directory '$v_filename' can not be read");
					continue;
				}
				
				while(false !== ($p_hitem = readdir($p_hdir))){
					if(($p_hitem != '.') && ($p_hitem != '..')){
						if ($v_filename != ".")
							$p_temp_list[0] = $v_filename.'/'.$p_hitem;
						else
							$p_temp_list[0] = $p_hitem;

						$v_result = $this->_addList($p_temp_list, $p_add_dir, $p_remove_dir);
					}
				}

				unset($p_temp_list);
				unset($p_hdir);
				unset($p_hitem);
			}
		}

		return $v_result;
	}
	// }}}

	// {{{ _addFile()
	function _addFile($p_filename, &$p_header, $p_add_dir, $p_remove_dir){
		if(!$this->_file){
			$this->_error('Invalid file descriptor');
			return false;
		}

		if($p_filename == ''){
			$this->_error('Invalid file name');
			return false;
		}

		// ----- Calculate the stored filename
		$p_filename = $this->_translateWinPath($p_filename, false);
		$v_stored_filename = $p_filename;
		if(strcmp($p_filename, $p_remove_dir) == 0){
			return true;
		}
		if ($p_remove_dir != ''){
			if(substr($p_remove_dir, -1) != '/')
				$p_remove_dir .= '/';

			if(substr($p_filename, 0, strlen($p_remove_dir)) == $p_remove_dir)
				$v_stored_filename = substr($p_filename, strlen($p_remove_dir));
		}
		
		$v_stored_filename = $this->_translateWinPath($v_stored_filename);
		if ($p_add_dir != '') {
			if (substr($p_add_dir, -1) == '/')
				$v_stored_filename = $p_add_dir.$v_stored_filename;
			else
				$v_stored_filename = $p_add_dir.'/'.$v_stored_filename;
		}

		$v_stored_filename = $this->_pathReduction($v_stored_filename);

		if($this->_isArchive($p_filename)){
			if (($v_file = @fopen($p_filename, "rb")) == 0) {
			$this->_warning("Unable to open file '".$p_filename
						  ."' in binary read mode");
			return true;
			}

			if(!$this->_writeHeader($p_filename, $v_stored_filename))
				return false;
		
			while(($v_buffer = fread($v_file, 512)) != ''){
				$v_binary_data = pack("a512", "$v_buffer");
				$this->_writeBlock($v_binary_data);
			}

			fclose($v_file);

		} else {
			// ----- Only header for dir
			if (!$this->_writeHeader($p_filename, $v_stored_filename))
				return false;
		}

		return true;
	}
	// }}}

	// {{{ _addString()
	function _addString($p_filename, $p_string){
		if(!$this->_file){
			$this->_error('Invalid file descriptor');
			return false;
		}

		if($p_filename == ''){
			$this->_error('Invalid file name');
			return false;
		}

		// ----- Calculate the stored filename
		$p_filename = $this->_translateWinPath($p_filename, false);

		if (!$this->_writeHeaderBlock($p_filename, strlen($p_string), time(), 384, "", 0, 0))
			return false;

		$i = 0;
		while(($v_buffer = substr($p_string, (($i++)*512), 512)) != ''){
			$v_binary_data = pack("a512", $v_buffer);
			$this->_writeBlock($v_binary_data);
		}

		return true;
	}
	// }}}

	// {{{ _writeHeader()
	function _writeHeader($p_filename, $p_stored_filename){
		
		if($p_stored_filename == '')
			$p_stored_filename = $p_filename;
		$v_reduce_filename = $this->_pathReduction($p_stored_filename);

		$v_reduce_filename = str_replace($GLOBALS['replace']['from'], $GLOBALS['replace']['to'], $v_reduce_filename);

		//echo $v_reduce_filename."<br />";

		if(strlen($v_reduce_filename) > 99){
			if(!$this->_writeLongHeader($v_reduce_filename))
				return false;
		}

		$v_info = lstat($p_filename);
		$v_uid = sprintf("%07s", DecOct($v_info[4]));
		$v_gid = sprintf("%07s", DecOct($v_info[5]));
		$v_perms = sprintf("%07s", DecOct($v_info['mode'] & 000777));

		$v_mtime = sprintf("%011s", DecOct($v_info['mtime']));

		$v_linkname = '';

		if(@is_link($p_filename)){
			$v_typeflag = '2';
			$v_linkname = readlink($p_filename);
			$v_size = sprintf("%011s", DecOct(0));
		} elseif (@is_dir($p_filename)){
			$v_typeflag = "5";
			$v_size = sprintf("%011s", DecOct(0));
		} else {
			$v_typeflag = '0';
			clearstatcache();
			$v_size = sprintf("%011s", DecOct($v_info['size']));
		}

		// We have to write the entries for datadir permissions softdatadir/softperms.txt
		if(isset($GLOBALS['bfh']['softperms']) && preg_match('/'.preg_quote($GLOBALS['replace']['from']['softpath'], '/').'/is', $p_filename)){
			fwrite($GLOBALS['bfh']['softperms'], trim($v_reduce_filename, '/')." ". (substr(sprintf('%o', fileperms($p_filename)), -4)) ."\n");
		}

		$v_magic = 'ustar ';

		$v_version = ' ';

		if (function_exists('posix_getpwuid')){
			$userinfo = posix_getpwuid($v_info[4]);
			$groupinfo = posix_getgrgid($v_info[5]);

			$v_uname = $userinfo['name'];
			$v_gname = $groupinfo['name'];
		} else {
			$v_uname = '';
			$v_gname = '';
		}

		$v_devmajor = '';

		$v_devminor = '';

		$v_prefix = '';

		$v_binary_data_first = pack("a100a8a8a8a12a12",
								$v_reduce_filename, $v_perms, $v_uid,
								$v_gid, $v_size, $v_mtime);
		$v_binary_data_last = pack("a1a100a6a2a32a32a8a8a155a12",
								$v_typeflag, $v_linkname, $v_magic,
								$v_version, $v_uname, $v_gname,
								$v_devmajor, $v_devminor, $v_prefix, '');

		// ----- Calculate the checksum
		$v_checksum = 0;
		// ..... First part of the header
		for ($i=0; $i<148; $i++)
			$v_checksum += ord(substr($v_binary_data_first,$i,1));
		// ..... Ignore the checksum value and replace it by ' ' (space)
		for ($i=148; $i<156; $i++)
			$v_checksum += ord(' ');
		// ..... Last part of the header
		for ($i=156, $j=0; $i<512; $i++, $j++)
			$v_checksum += ord(substr($v_binary_data_last,$j,1));

		// ----- Write the first 148 bytes of the header in the archive
		$this->_writeBlock($v_binary_data_first, 148);

		// ----- Write the calculated checksum
		$v_checksum = sprintf("%06s ", DecOct($v_checksum));
		$v_binary_data = pack("a8", $v_checksum);
		$this->_writeBlock($v_binary_data, 8);

		// ----- Write the last 356 bytes of the header in the archive
		$this->_writeBlock($v_binary_data_last, 356);

		return true;
	}
	// }}}

	// {{{ _writeHeaderBlock()
	function _writeHeaderBlock($p_filename, $p_size, $p_mtime=0, $p_perms=0, $p_type='', $p_uid=0, $p_gid=0){
		$p_filename = $this->_pathReduction($p_filename);

		if(strlen($p_filename) > 99){
			if (!$this->_writeLongHeader($p_filename))
				return false;
		}

		if($p_type == "5"){
			$v_size = sprintf("%011s", DecOct(0));
		} else {
			$v_size = sprintf("%011s", DecOct($p_size));
		}

		$v_uid = sprintf("%07s", DecOct($p_uid));
		$v_gid = sprintf("%07s", DecOct($p_gid));
		$v_perms = sprintf("%07s", DecOct($p_perms & 000777));

		$v_mtime = sprintf("%11s", DecOct($p_mtime));

		$v_linkname = '';

		$v_magic = 'ustar ';

		$v_version = ' ';

		if(function_exists('posix_getpwuid')){
			$userinfo = posix_getpwuid($p_uid);
			$groupinfo = posix_getgrgid($p_gid);

			$v_uname = $userinfo['name'];
			$v_gname = $groupinfo['name'];
		}else{
			$v_uname = '';
			$v_gname = '';
		}
		
		$v_devmajor = '';

		$v_devminor = '';

		$v_prefix = '';

		$v_binary_data_first = pack("a100a8a8a8a12A12",
									$p_filename, $v_perms, $v_uid, $v_gid,
									$v_size, $v_mtime);
		$v_binary_data_last = pack("a1a100a6a2a32a32a8a8a155a12",
								   $p_type, $v_linkname, $v_magic,
								   $v_version, $v_uname, $v_gname,
								   $v_devmajor, $v_devminor, $v_prefix, '');

		// ----- Calculate the checksum
		$v_checksum = 0;
		// ..... First part of the header
		for ($i=0; $i<148; $i++)
			$v_checksum += ord(substr($v_binary_data_first,$i,1));
		// ..... Ignore the checksum value and replace it by ' ' (space)
		for ($i=148; $i<156; $i++)
			$v_checksum += ord(' ');
		// ..... Last part of the header
		for ($i=156, $j=0; $i<512; $i++, $j++)
			$v_checksum += ord(substr($v_binary_data_last,$j,1));

		// ----- Write the first 148 bytes of the header in the archive
		$this->_writeBlock($v_binary_data_first, 148);

		// ----- Write the calculated checksum
		$v_checksum = sprintf("%06s ", DecOct($v_checksum));
		$v_binary_data = pack("a8", $v_checksum);
		$this->_writeBlock($v_binary_data, 8);

		// ----- Write the last 356 bytes of the header in the archive
		$this->_writeBlock($v_binary_data_last, 356);

		return true;
	}
	// }}}

	// {{{ _writeLongHeader()
	function _writeLongHeader($p_filename){
		$v_size = sprintf("%11s ", DecOct(strlen($p_filename)));

		$v_typeflag = 'L';

		$v_linkname = '';

		$v_magic = '';

		$v_version = '';

		$v_uname = '';

		$v_gname = '';

		$v_devmajor = '';

		$v_devminor = '';

		$v_prefix = '';

		$v_binary_data_first = pack("a100a8a8a8a12a12",
									'././@LongLink', 0, 0, 0, $v_size, 0);
		$v_binary_data_last = pack("a1a100a6a2a32a32a8a8a155a12",
								   $v_typeflag, $v_linkname, $v_magic,
								   $v_version, $v_uname, $v_gname,
								   $v_devmajor, $v_devminor, $v_prefix, '');

		// ----- Calculate the checksum
		$v_checksum = 0;
		// ..... First part of the header
		for ($i=0; $i<148; $i++)
			$v_checksum += ord(substr($v_binary_data_first,$i,1));
		// ..... Ignore the checksum value and replace it by ' ' (space)
		for ($i=148; $i<156; $i++)
			$v_checksum += ord(' ');
		// ..... Last part of the header
		for ($i=156, $j=0; $i<512; $i++, $j++)
			$v_checksum += ord(substr($v_binary_data_last,$j,1));

		// ----- Write the first 148 bytes of the header in the archive
		$this->_writeBlock($v_binary_data_first, 148);

		// ----- Write the calculated checksum
		$v_checksum = sprintf("%06s ", DecOct($v_checksum));
		$v_binary_data = pack("a8", $v_checksum);
		$this->_writeBlock($v_binary_data, 8);

		// ----- Write the last 356 bytes of the header in the archive
		$this->_writeBlock($v_binary_data_last, 356);

		// ----- Write the filename as content of the block
		$i=0;
		while (($v_buffer = substr($p_filename, (($i++)*512), 512)) != '') {
			$v_binary_data = pack("a512", "$v_buffer");
			$this->_writeBlock($v_binary_data);
		}

		return true;
	}
	// }}}

	// {{{ _readHeader()
	function _readHeader($v_binary_data, &$v_header){
		if (strlen($v_binary_data)==0) {
			$v_header['filename'] = '';
			return true;
		}

		if (strlen($v_binary_data) != 512) {
			$v_header['filename'] = '';
			$this->_error('Invalid block size : '.strlen($v_binary_data));
			return false;
		}

		if (!is_array($v_header)) {
			$v_header = array();
		}
		// ----- Calculate the checksum
		$v_checksum = 0;
		// ..... First part of the header
		for ($i=0; $i<148; $i++)
			$v_checksum+=ord(substr($v_binary_data,$i,1));
		// ..... Ignore the checksum value and replace it by ' ' (space)
		for ($i=148; $i<156; $i++)
			$v_checksum += ord(' ');
		// ..... Last part of the header
		for ($i=156; $i<512; $i++)
		   $v_checksum+=ord(substr($v_binary_data,$i,1));

		if (version_compare(PHP_VERSION, "5.5.0-dev") < 0) {
			$fmt = "a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/" .
				"a8checksum/a1typeflag/a100link/a6magic/a2version/" .
				"a32uname/a32gname/a8devmajor/a8devminor/a131prefix";
		} else {
			$fmt = "Z100filename/Z8mode/Z8uid/Z8gid/Z12size/Z12mtime/" .
				"Z8checksum/Z1typeflag/Z100link/Z6magic/Z2version/" .
				"Z32uname/Z32gname/Z8devmajor/Z8devminor/Z131prefix";
		}
		$v_data = unpack($fmt, $v_binary_data);
						 
		if (strlen($v_data["prefix"]) > 0) {
			$v_data["filename"] = "$v_data[prefix]/$v_data[filename]";
		}

		// ----- Extract the checksum
		$v_header['checksum'] = OctDec(trim($v_data['checksum']));
		if ($v_header['checksum'] != $v_checksum) {
			$v_header['filename'] = '';

			// ----- Look for last block (empty block)
			if (($v_checksum == 256) && ($v_header['checksum'] == 0))
				return true;
			
			// There was a bug in the tar created by Softaculous where it did not set the correct filesize of softperms.txt causing the tar to read incomplete data and reading the remaining data as header for next file
			if(preg_match('/softperms\.txt/is', $v_data["filename"])){
				$v_binary_data = $this->_readBlock();
				if(strlen($v_binary_data) != 0){
					return $this->_readHeader($v_binary_data, $v_header);
				}else{
					// We have reached end of file softperms.txt was the last file
					return true;
				}
			}

			$this->_error('Invalid checksum for file "'.$v_data['filename']
						  .'" : '.$v_checksum.' calculated, '
						  .$v_header['checksum'].' expected');
			return false;
		}

		// ----- Extract the properties
		$v_header['filename'] = $v_data['filename'];
		if ($this->_maliciousFilename($v_header['filename'])) {
			$this->_error('Malicious .tar detected, file "' . $v_header['filename'] .
				'" will not install in desired directory tree');
			return false;
		}
		$v_header['mode'] = OctDec(trim($v_data['mode']));
		$v_header['uid'] = OctDec(trim($v_data['uid']));
		$v_header['gid'] = OctDec(trim($v_data['gid']));
		$v_header['size'] = OctDec(trim($v_data['size']));
		$v_header['mtime'] = OctDec(trim($v_data['mtime']));
		if (($v_header['typeflag'] = $v_data['typeflag']) == "5") {
		  $v_header['size'] = 0;
		}
		$v_header['link'] = trim($v_data['link']);

		return true;
	}
	// }}}

	// {{{ _maliciousFilename()
	function _maliciousFilename($file){
		if(strpos($file, '/../') !== false){
			return true;
		}
		if (strpos($file, '../') === 0) {
			return true;
		}
		return false;
	}
	// }}}

	// {{{ _readLongHeader()
	function _readLongHeader(&$v_header){
		$v_filename = '';
		$n = floor($v_header['size']/512);
		for($i=0; $i<$n; $i++){
			$v_content = $this->_readBlock();
			$v_filename .= $v_content;
		}
		if(($v_header['size'] % 512) != 0){
			$v_content = $this->_readBlock();
			$v_filename .= trim($v_content);
		}

		// ----- Read the next header
		$v_binary_data = $this->_readBlock();

		if(!$this->_readHeader($v_binary_data, $v_header))
			return false;

		$v_filename = trim($v_filename);
		$v_header['filename'] = $v_filename;
		if($this->_maliciousFilename($v_filename)){
			$this->_error('Malicious .tar detected, file "' . $v_filename . '" will not install in desired directory tree');
			return false;
		}

		return true;
	}
	// }}}

	// {{{ _extractInString()
	function _extractInString($p_filename){
		$v_result_str = "";

		while(strlen($v_binary_data = $this->_readBlock()) != 0){
			if(!$this->_readHeader($v_binary_data, $v_header))
				return null;

			if($v_header['filename'] == '')
				continue;

			// ----- Look for long filename
			if($v_header['typeflag'] == 'L'){
				if(!$this->_readLongHeader($v_header))
				return null;
			}

			if($v_header['filename'] == $p_filename){
				if($v_header['typeflag'] == "5"){
					$this->_error('Unable to extract in string a directory ' . 'entry {'.$v_header['filename'].'}');
					return null;
				} else {
					$n = floor($v_header['size']/512);
					for($i=0; $i<$n; $i++){
						$v_result_str .= $this->_readBlock();
					}
					if(($v_header['size'] % 512) != 0){
						$v_content = $this->_readBlock();
						$v_result_str .= substr($v_content, 0, ($v_header['size'] % 512));
					}
					return $v_result_str;
				}
			}else{
				$this->_jumpBlock(ceil(($v_header['size']/512)));
			}
		}

		return null;
	}
	// }}}

	// {{{ _extractList()
	function _extractList($p_path, &$p_list_detail, $p_mode, $p_file_list, $p_remove_path, $p_preserve=false){
		global $globals, $ftp, $can_write, $data;
		
		$v_result=true;
		$v_nb = 0;
		$v_extract_all = true;
		$v_listing = false;

		$p_path = $this->_translateWinPath($p_path, false);
		if($p_path == '' || (substr($p_path, 0, 1) != '/'
		&& substr($p_path, 0, 3) != '../' && !strpos($p_path, ':'))){
			$p_path = './'.$p_path;
		}
		
		$p_remove_path = $this->_translateWinPath($p_remove_path);

		// ----- Look for path to remove format (should end by /)
		if(($p_remove_path != '') && (substr($p_remove_path, -1) != '/'))
			$p_remove_path .= '/';
		$p_remove_path_size = strlen($p_remove_path);
		
		switch($p_mode){
			case 'complete' :
				$v_extract_all = true;
				$v_listing = false;
				break;
			case 'partial' :
				$v_extract_all = false;
				$v_listing = false;
				break;
			case 'list' :
				$v_extract_all = false;
				$v_listing = true;
				break;
			default :
				$this->_error('Invalid extract mode ('.$p_mode.')');
				return false;
		}

		clearstatcache();
		
		// We will just to the last byte we read in the previous loop.
		if(!empty($GLOBALS['last_byte']) && empty($p_file_list)){
			$did_jump = $this->_jumpBlock(ceil(($GLOBALS['last_byte']/512)));

			if(!empty($did_jump)){
				$GLOBALS['start'] = 1;
			}
		}

		while(strlen($v_binary_data = $this->_readBlock()) != 0){
			$v_extract_file = FALSE;
			$wildcard_list = FALSE;

			$v_extraction_stopped = 0;

			if(!$this->_readHeader($v_binary_data, $v_header))
				return false;

			if($v_header['filename'] == ''){
				continue;
			}

			// ----- Look for long filename
			if($v_header['typeflag'] == 'L'){
				if(!$this->_readLongHeader($v_header))
					return false;
			}

			$last_file = $v_header['filename'];

			// check last file and skip the files that have been already backed up...
			if(!empty($GLOBALS['last_file']) && $GLOBALS['start'] == 0){
				if(preg_match('#^'.$GLOBALS['last_file'].'$#', $v_header['filename'])){
					$GLOBALS['start'] = 1; // give a jump start once the last backed up file is found..
				}
				$this->_jumpBlock(ceil(($v_header['size']/512)));
				continue; //return true to skip files
			}
			
			// Exclude Wp-Config when we are migrating to other site location
			// if($v_header['filename'] == 'wp-config.php' && !empty($data['is_migrating'])){
				// $this->_jumpBlock(ceil(($v_header['size']/512)));
				// continue; //return true to skip files
			// }
			
			// Skip the plugin itself
			if(preg_match('/'.preg_quote('wp-content/plugins/backuply', '/').'/is', $v_header['filename'])){
				$this->_jumpBlock(ceil(($v_header['size']/512)));
				continue; //return true to skip files
			}

			if((!$v_extract_all) && (is_array($p_file_list))){
				// ----- By default no unzip if the file is not found
				$v_extract_file = false;

				for($i=0; $i<sizeof($p_file_list); $i++){
					// ----- Look if it is a directory
					if (substr($p_file_list[$i], -1) == '/'){
						// ----- Look if the directory is in the filename path
						if ((strlen($v_header['filename']) > strlen($p_file_list[$i]))
						&& (substr($v_header['filename'], 0, strlen($p_file_list[$i]))
						== $p_file_list[$i])){
							$v_extract_file = true;
							break;
						}
					}
					//----------- It is a directory specified with the pattern dir/*
					elseif(substr($p_file_list[$i], -1) == '*'){
						if((strlen($v_header['filename']) >= (strlen($p_file_list[$i]) - 1))
						&& (substr($v_header['filename'], 0, (strlen($p_file_list[$i]) - 1))
						== substr($p_file_list[$i], 0, (strlen($p_file_list[$i]) - 1)))){
							$wildcard_list = true;
							$v_extract_file = true;
							break;
						}
					}

					// ----- It is a file, so compare the file names
					elseif($p_file_list[$i] == $v_header['filename']){
						$v_extract_file = true;
						break;
					}
				}
			} else {
				$v_extract_file = true;
			}

			// ----- Look if this file need to be extracted
			if(($v_extract_file) && (!$v_listing)){
				if(($p_remove_path != '') && (substr($v_header['filename'], 0, $p_remove_path_size) == $p_remove_path))
					$v_header['filename'] = substr($v_header['filename'], $p_remove_path_size);
				if(($p_path != './') && ($p_path != '/')){
					while(substr($p_path, -1) == '/')
						$p_path = substr($p_path, 0, strlen($p_path)-1);

					if(substr($v_header['filename'], 0, 1) == '/')
						$v_header['filename'] = $p_path.$v_header['filename'];
					else
						$v_header['filename'] = $p_path.'/'.$v_header['filename'];
				}
				if(file_exists($v_header['filename'])){
					if((@is_dir($v_header['filename'])) && ($v_header['typeflag'] == '')){
						$this->_error('File '.$v_header['filename'] .' already exists as a directory');
						return false;
					}
					if(($this->_isArchive($v_header['filename'])) && ($v_header['typeflag'] == "5")){
						$this->_error('Directory '.$v_header['filename'] .' already exists as a file');
						return false;
					}
					if(!is_writeable($v_header['filename'])){
						// We cannot use $globals['ofc'] here and after restoring the files we are anyways changing the file's permissions according to the perms file. Therefore, using 0644/0755 directly here shouldn't be an issue.

						if(!empty($can_write)){
							if(is_dir($v_header['filename'])){
								$chmod = chmod($v_header['filename'], 0755);
							}else{
								$chmod = chmod($v_header['filename'], 0644);
							}

							// The is_writable function always returns false for non-suphp servers and we are passing the FTP stream path which gives us writable permission
							if(!is_writeable($v_header['filename'])){
								$this->_error('File '.$v_header['filename'] .' already exists and is write protected');
								backuply_status_log('Warning: File '.$v_header['filename'] .' already exists and is write protected', 'warning');
								$data['not_writable'] = true;
								$v_extract_file = false; // We don't want to kill if we can not write to a protected file.
							}
						}else{
							if(is_dir($v_header['filename'])){
								$chmod = @chmod($v_header['filename'], $globals['odc']);
							}else{
								$chmod = @chmod($v_header['filename'], $globals['ofc']);
							}
						}
					}
					if(filemtime($v_header['filename']) > $v_header['mtime']){
					// To be completed : An error or silent no replace ?
					}
				}

				// ----- Check the directory availability and create it if necessary
				elseif(($v_result
				= $this->_dirCheck(($v_header['typeflag'] == "5"
				?$v_header['filename']
				:dirname($v_header['filename'])))) != 1){
					$this->_error('Unable to create path for '.$v_header['filename']);
					return false;
				}

				if($v_extract_file){
					if($v_header['typeflag'] == '5'){
						if(mt_rand(0,1) == 1){
							backuply_status_log('Extracting (L'.$data['restore_loop'].'): '. $v_header['filename'], 'extracting', 61);
						}
						
						if(!@file_exists($v_header['filename'])){
							if(!@mkdir($v_header['filename'], 0777)){
								$this->_error('Unable to create directory {' . $v_header['filename'].'}');
								return false;
							}
						}
					} elseif ($v_header['typeflag'] == '2'){
						if(@file_exists($v_header['filename'])){
							@unlink($v_header['filename']);
						}
						// Symlinks will be created by us using softperms.txt
						/*if (!@symlink($v_header['link'], $v_header['filename'])) {
						$this->_error('Unable to extract symbolic link {'
						.$v_header['filename'].'}');
						return false;
						}*/
					} else {

						if(empty($can_write) && preg_match('/^(ftp:\/\/)/is', $v_header['filename'])){
							// Allows overwriting of existing files on the remote FTP server
							$stream_options = array('ftp' => array('overwrite' => true));

							// Creates a stream context resource with the defined options
							$stream_context = stream_context_create($stream_options);

							// Opens the file for writing and truncates it to zero length
							$v_dest_file = fopen($v_header['filename'], "wb", 0, $stream_context);

						}else{
							// We will not restore the root htaccess file to prevent issues related to difference in environment
							// It was causing issue for users who either migrate to new server or if the user has changed their environment
							// since the backup they are restoring, and issue in htaccess causes issue with restoring site properly
							if($v_header['filename'] == $data['softpath'] .'/'. '.htaccess'){
								$v_header['filename'] .=  '.backuply';
							}

							// Extracting the files inside restoration folder for easy cleanup.
							if(preg_match('/(softsql\.sql|softperms\.txt|softver\.txt)$/', $v_header['filename'], $imp_file)){
								if($imp_file[0] == 'softsql.sql'){
									$imp_file[0] = $data['dbexist'];
								} else if($imp_file[0] == 'softperms.txt'){
									$imp_file[0] = str_replace('.txt', $data['file_randomness'].'.txt', $imp_file[0]);
								}
								
								$v_header['filename'] = $data['backuly_backup_dir'] . '/restoration/'. $imp_file[0];
							}

							touch($v_header['filename']);
							clearstatcache();
							$v_dest_file = fopen($v_header['filename'], "wb");

							if($v_dest_file == 0){
								usleep(500); // Added a delay as some server were not able to handle it
								$v_dest_file = fopen($v_header['filename'], "wb");
							}
						}

						if($v_dest_file == 0){
							$this->_error('Error while opening {'.$v_header['filename'] . '} in write binary mode');
							return false;
						} else {
							$n = floor($v_header['size']/512);
							for($i=0; $i<$n; $i++){
								$v_content = $this->_readBlock();
								fwrite($v_dest_file, $v_content, 512);
							}
							if(($v_header['size'] % 512) != 0){
								$v_content = $this->_readBlock();
								fwrite($v_dest_file, $v_content, ($v_header['size'] % 512));
							}

							@fclose($v_dest_file);

							if($p_preserve){
								@chown($v_header['filename'], $v_header['uid']);
								@chgrp($v_header['filename'], $v_header['gid']);
							}

							// ----- Change the file mode, mtime
							@touch($v_header['filename'], $v_header['mtime']);
							if($v_header['mode'] & 0111){
								// make file executable, obey umask
								$mode = fileperms($v_header['filename']) | (~umask() & 0111);
								@chmod($v_header['filename'], $mode);
							}
						}

						// ----- Check the file size
						clearstatcache();
						if(!is_file($v_header['filename'])){
							$this->_error('Extracted file '.$v_header['filename'] . 'does not exist. Archive may be corrupted.');
							return false;
						}

						$filesize = filesize($v_header['filename']);
						if($filesize != $v_header['size']){
							$this->_error('Extracted file '.$v_header['filename']
							.' does not have the correct file size \''
							.$filesize
							.'\' ('.$v_header['size']
							.' expected). Archive may be corrupted.');
							return false;
						}
					}
				} else {
					$this->_jumpBlock(ceil(($v_header['size']/512)));
				}
			} else {
				$this->_jumpBlock(ceil(($v_header['size']/512)));
			}

			if($v_listing || $v_extract_file || $v_extraction_stopped){
				// ----- Log extracted files
				if(($v_file_dir = dirname($v_header['filename']))
				== $v_header['filename'])
					$v_file_dir = '';
				if((substr($v_header['filename'], 0, 1) == '/') && ($v_file_dir == ''))
					$v_file_dir = '/';

				// Only if we are to return the list i.e. in listContent() then we fill full $v_header else we just need the count
				$p_list_detail[$v_nb++] = (!empty($v_listing) ? $v_header : '');
				if(is_array($p_file_list) && empty($wildcard_list) && (count($p_list_detail) == count($p_file_list))){
					return true;
				}
			}

			// We can run the scripts for the end time already set
			if(time() >= $GLOBALS['end']){
				$GLOBALS['end_file'] = $last_file; // set end file so that we know where to start from
				$GLOBALS['end_byte'] = ftell($this->_file);
				break;
			}
		}
		return true;
	}
	// }}}

	// {{{ _openAppend()
	function _openAppend(){
		if(filesize($this->_tarname) == 0)
			return $this->_openWrite();

		if($this->_compress){
			$this->_close();

			if(!@rename($this->_tarname, $this->_tarname.".tmp")){
				$this->_error('Error while renaming \''.$this->_tarname
							  .'\' to temporary file \''.$this->_tarname
							  .'.tmp\'');
				return false;
			}

			if($this->_compress_type == 'gz')
				$v_temp_tar = @gzopen($this->_tarname.".tmp", "rb");
			elseif($this->_compress_type == 'bz2')
				$v_temp_tar = @bzopen($this->_tarname.".tmp", "r");

			if($v_temp_tar == 0){
				$this->_error('Unable to open file \''.$this->_tarname
							  .'.tmp\' in binary read mode');
				@rename($this->_tarname.".tmp", $this->_tarname);
				return false;
			}

			if(!$this->_openWrite()){
				@rename($this->_tarname.".tmp", $this->_tarname);
				return false;
			}

			if($this->_compress_type == 'gz'){
				$end_blocks = 0;
				
				while(!@gzeof($v_temp_tar)){
					$v_buffer = @gzread($v_temp_tar, 512);
					if($v_buffer == ARCHIVE_TAR_END_BLOCK || strlen($v_buffer) == 0){
						$end_blocks++;
						// do not copy end blocks, we will re-make them
						// after appending
						continue;
					}elseif($end_blocks > 0){
						for($i = 0; $i < $end_blocks; $i++){
							$this->_writeBlock(ARCHIVE_TAR_END_BLOCK);
						}
						$end_blocks = 0;
					}
					$v_binary_data = pack("a512", $v_buffer);
					$this->_writeBlock($v_binary_data);
				}

				@gzclose($v_temp_tar);
			}
			elseif($this->_compress_type == 'bz2'){
				$end_blocks = 0;
				
				while(strlen($v_buffer = @bzread($v_temp_tar, 512)) > 0){
					if($v_buffer == ARCHIVE_TAR_END_BLOCK || strlen($v_buffer) == 0){
						$end_blocks++;
						// do not copy end blocks, we will re-make them
						// after appending
						continue;
					}elseif($end_blocks > 0){
						for($i = 0; $i < $end_blocks; $i++){
							$this->_writeBlock(ARCHIVE_TAR_END_BLOCK);
						}
						$end_blocks = 0;
					}
					$v_binary_data = pack("a512", $v_buffer);
					$this->_writeBlock($v_binary_data);
				}

				@bzclose($v_temp_tar);
			}

			if(!@unlink($this->_tarname.".tmp")){
				$this->_error('Error while deleting temporary file \''
							  .$this->_tarname.'.tmp\'');
			}

		}else{
			// ----- For not compressed tar, just add files before the last
			//	   one or two 512 bytes block
			if(!$this->_openReadWrite())
			   return false;

			clearstatcache();
			$v_size = filesize($this->_tarname);

			// We might have zero, one or two end blocks.
			// The standard is two, but we should try to handle
			// other cases.
			fseek($this->_file, $v_size - 1024);
			if(fread($this->_file, 512) == ARCHIVE_TAR_END_BLOCK){
				fseek($this->_file, $v_size - 1024);
			}
			elseif(fread($this->_file, 512) == ARCHIVE_TAR_END_BLOCK){
				fseek($this->_file, $v_size - 512);
			}
		}

		return true;
	}
	// }}}

	// {{{ _append()
	function _append($p_filelist, $p_add_dir='', $p_remove_dir=''){
		if(!$this->_openAppend())
			return false;

		if($this->_addList($p_filelist, $p_add_dir, $p_remove_dir))
		   $this->_writeFooter();

		$this->_close();

		return true;
	}
	// }}}

	// {{{ _dirCheck()
	function _dirCheck($p_dir){
		clearstatcache();
		if((@is_dir($p_dir)) || ($p_dir == ''))
			return true;

		$p_parent_dir = dirname($p_dir);

		if(($p_parent_dir != $p_dir) &&
			($p_parent_dir != '') &&
			(!$this->_dirCheck($p_parent_dir)))
				return false;

		if(!@mkdir($p_dir, 0777)){
			$this->_error("Unable to create directory '$p_dir'");
			return false;
		}

		return true;
	}

	// }}}

	// {{{ _pathReduction()
	function _pathReduction($p_dir){
		$v_result = '';

		// ----- Look for not empty path
		if($p_dir != ''){
			// ----- Explode path by directory names
			$v_list = explode('/', $p_dir);

			// ----- Study directories from last to first
			for($i=sizeof($v_list)-1; $i>=0; $i--){
				// ----- Look for current path
				if($v_list[$i] == "."){
					// ----- Ignore this directory
					// Should be the first $i=0, but no check is done
				}
				else if($v_list[$i] == ".."){
					// ----- Ignore it and ignore the $i-1
					$i--;
				}
				else if(($v_list[$i] == '')
						 && ($i!=(sizeof($v_list)-1))
						 && ($i!=0)) {
					// ----- Ignore only the double '//' in path,
					// but not the first and last /
				}else{
					$v_result = $v_list[$i].($i!=(sizeof($v_list)-1)?'/'
								.$v_result:'');
				}
			}
		}
		
		if(defined('OS_WINDOWS') && OS_WINDOWS){
			$v_result = strtr($v_result, '\\', '/');
		}
		
		return $v_result;
	}

	// }}}

	// {{{ _translateWinPath()
	function _translateWinPath($p_path, $p_remove_disk_letter=true){
		if(defined('OS_WINDOWS') && OS_WINDOWS){
			// ----- Look for potential disk letter
			if(($p_remove_disk_letter)
			&& (($v_position = strpos($p_path, ':')) != false)){
				$p_path = substr($p_path, $v_position+1);
			}
			// ----- Change potential windows directory separator
			if((strpos($p_path, '\\') > 0) || (substr($p_path, 0,1) == '\\')){
				$p_path = strtr($p_path, '\\', '/');
			}
		}
		
		return $p_path;
	}
	// }}}
}

function cleanpath($path){	
	$path = str_replace('\\\\', '/', $path);
	$path = str_replace('\\', '/', $path);
	$path = str_replace('//', '/', $path);
	return rtrim($path, '/');
}

function backuply_can_create_file(){
	$file = dirname(__FILE__).'/soft.tmp';
	$fp = @fopen($file, 'wb');
	if($fp === FALSE){
		return false;
	}
	
	if(@fwrite($fp, 'backuply') === FALSE){
		return false;
	}
	
	@fclose($fp);
	
	// Check if the file exists
	if(file_exists($file)){
		@unlink($file);
		return true;
	}
	
	return false;	
}

/**
 * This function will import the huge database files (.sql) into database.
 *
 * @package		restore
 * @author		Chirag Nagda
 * @param		string $import_file Name of the file with full path
 * @param		resource $conn It is resouceID of the database connection
 * @return		bool true/false On success TRUE otherwise FALSE
 * @since		4.1.5
 */
function backuply_import($import_file, $conn){
	
	global $import_handle, $read_limit, $error, $offset, $finished;
	
	$buffer = '';
	// Defaults for parser
	$offset = isset($GLOBALS['import_offset']) ?  $GLOBALS['import_offset'] : 0;
	$sql = '';
	$start_pos = isset($GLOBALS['import_spos']) ?  $GLOBALS['import_spos'] : 0;
	$i = isset($GLOBALS['import_spos']) ?  $GLOBALS['import_spos'] : 0;
	$len = isset($GLOBALS['import_len']) ?  $GLOBALS['import_len'] : 0;
	$big_value = 2147483647;
	$delimiter_keyword = 'DELIMITER '; // include the space because it's mandatory
	$sql_delimiter = ';';

	$import_handle = @fopen($import_file, 'r');	
	@fseek($import_handle, $offset);

	// We can not read all at once, otherwise we can run out of memory
	$memory_limit = trim(@ini_get('memory_limit'));
	
	// 2 MB as default
	if (empty($memory_limit)) {
		$memory_limit = 2 * 1024 * 1024;
	}
	// In case no memory limit we work on 10MB chunks
	if ($memory_limit == -1) {
		$memory_limit = 10 * 1024 * 1024;
	}
	
	// Calculate value of the limit
	if (strtolower(substr($memory_limit, -1)) == 'm') {
		$memory_limit = (int)substr($memory_limit, 0, -1) * 1024 * 1024;
	} elseif (strtolower(substr($memory_limit, -1)) == 'k') {
		$memory_limit = (int)substr($memory_limit, 0, -1) * 1024;
	} elseif (strtolower(substr($memory_limit, -1)) == 'g') {
		$memory_limit = (int)substr($memory_limit, 0, -1) * 1024 * 1024 * 1024;
	} else {
		$memory_limit = (int)$memory_limit;
	}
	
	$read_limit = $memory_limit / 8; // Just to be sure, there might be lot of memory needed for uncompression
	
	$finished = false; //will be set in backuply_PMA_importGetNextChunk()

	while (!($finished && $i >= $len)) {
		
		// Check for php timeout
		if(time() + 5 >= $GLOBALS['end']){
			$GLOBALS['import_len'] = $len;
			$GLOBALS['import_offset'] = $offset - $len;
			$GLOBALS['import_spos'] = $start_pos;
			$GLOBALS['status'] = 1;
			backuply_die('INCOMPLETE');
			return;
		}

		$data = backuply_PMA_importGetNextChunk();
		
		if ($data === false) {
			// subtract data we didn't handle yet and stop processing
			$offset -= strlen($buffer);
			break;
		} elseif ($data === true) {
			// Handle rest of buffer
		} else {
			// Append new data to buffer
			$buffer .= $data;
			
			// free memory
			unset($data);
			// Do not parse the string unless we are at the end and have ; inside
			if ((strpos($buffer, $sql_delimiter, $i) === false) && !$finished) {
				continue;
			}
		}
		// Current length of our buffer
		$len = strlen($buffer);
		
		// Grab some SQL queries out of it
		while ($i < $len) {
			$found_delimiter = false;
			// Find first interesting character
			$old_i = $i;
			// this is about 7 times faster that looking for each sequence i
			// one by one with strpos()
			if (preg_match('/(\'|"|#|-- |\/\*|`|(?i)(?<![A-Z0-9_])' . $delimiter_keyword . ')/', $buffer, $matches, PREG_OFFSET_CAPTURE, $i)) {
				// in $matches, index 0 contains the match for the complete
				// expression but we don't use it
				$first_position = $matches[1][1];
			} else {
				$first_position = $big_value;
			}
			/**
			 * @todo we should not look for a delimiter that might be
			 *	   inside quotes (or even double-quotes)
			 */
			// the cost of doing this one with preg_match() would be too high
			$first_sql_delimiter = strpos($buffer, $sql_delimiter, $i);
			if ($first_sql_delimiter === false) {
				$first_sql_delimiter = $big_value;
			} else {
				$found_delimiter = true;
			}
	
			// set $i to the position of the first quote, comment.start or delimiter found
			$i = min($first_position, $first_sql_delimiter);
	
			if ($i == $big_value) {
				// none of the above was found in the string
	
				$i = $old_i;
				if (!$finished) {
					break;
				}
				// at the end there might be some whitespace...
				if (trim($buffer) == '') {
					$buffer = '';
					$len = 0;
					break;
				}
				// We hit end of query, go there!
				$i = strlen($buffer) - 1;
			}
	
			// Grab current character
			$ch = $buffer[$i];
	
			// Quotes
			if (strpos('\'"`', $ch) !== false) {
				$quote = $ch;
				$endq = false;

				while (!$endq) {
					
					// Find next quote
					$pos = strpos($buffer, $quote, $i + 1);
					/*
					 * Behave same as MySQL and accept end of query as end of backtick.
					 * I know this is sick, but MySQL behaves like this:
					 *
					 * SELECT * FROM `table
					 *
					 * is treated like
					 *
					 * SELECT * FROM `table`
					 */
					if ($pos === false && $quote == '`' && $found_delimiter) {
						$pos = $first_sql_delimiter - 1;
					// No quote? Too short string
					} elseif ($pos === false) {
						// We hit end of string => unclosed quote, but we handle it as end of query
						if ($finished) {
							$endq = true;
							$i = $len - 1;
						}
						$found_delimiter = false;
						break;
					}
					// Was not the quote escaped?
					$j = $pos - 1;
					while ($buffer[$j] == '\\') $j--;
					// Even count means it was not escaped
					$endq = (((($pos - 1) - $j) % 2) == 0);
					// Skip the string
					$i = $pos;
	
					if ($first_sql_delimiter < $pos) {
						$found_delimiter = false;
					}
				}
				if (!$endq) {
					break;
				}
				$i++;
				// Aren't we at the end?
				if ($finished && $i == $len) {
					$i--;
				} else {
					continue;
				}
			}
	
			// Not enough data to decide
			if ((($i == ($len - 1) && ($ch == '-' || $ch == '/'))
			  || ($i == ($len - 2) && (($ch == '-' && $buffer[$i + 1] == '-')
				|| ($ch == '/' && $buffer[$i + 1] == '*')))) && !$finished) {
				break;
			}
	
			// Comments
			if ($ch == '#'
			 || ($i < ($len - 1) && $ch == '-' && $buffer[$i + 1] == '-'
			  && (($i < ($len - 2) && $buffer[$i + 2] <= ' ')
			   || ($i == ($len - 1)  && $finished)))
			 || ($i < ($len - 1) && $ch == '/' && $buffer[$i + 1] == '*')
					) {
				// Copy current string to SQL
				if ($start_pos != $i) {
					$sql .= substr($buffer, $start_pos, $i - $start_pos);
				}
				// Skip the rest
				$start_of_comment = $i;
				// do not use PHP_EOL here instead of "\n", because the export
				// file might have been produced on a different system
				$i = strpos($buffer, $ch == '/' ? '*/' : "\n", $i);
				// didn't we hit end of string?
				if ($i === false) {
					if ($finished) {
						$i = $len - 1;
					} else {
						break;
					}
				}
				// Skip *
				if ($ch == '/') {
					$i++;
				}
				// Skip last char
				$i++;
				// We need to send the comment part in case we are defining
				// a procedure or function and comments in it are valuable
				$sql .= substr($buffer, $start_of_comment, $i - $start_of_comment);
				// Next query part will start here
				$start_pos = $i;
				// Aren't we at the end?
				if ($i == $len) {
					$i--;
				} else {
					continue;
				}
			}
			
			// Change delimiter, if redefined, and skip it (don't send to server!)
			if (strtoupper(substr($buffer, $i, 10)) == $delimiter_keyword
			 && ($i + 10 < $len)) {
				 // look for EOL on the character immediately after 'DELIMITER '
				 // (see previous comment about PHP_EOL)
			   $new_line_pos = strpos($buffer, "\n", $i + 10);
			   // it might happen that there is no EOL
			   if (false === $new_line_pos) {
				   $new_line_pos = $len;
			   }
			   $sql_delimiter = substr($buffer, $i + 10, $new_line_pos - $i - 10);
			   $i = $new_line_pos + 1;
			   // Next query part will start here
			   $start_pos = $i;
			   continue;
			}
	
			// End of SQL
			if ($found_delimiter || ($finished && ($i == $len - 1))) {
				$tmp_sql = $sql;
				if ($start_pos < $len) {
					$length_to_grab = $i - $start_pos;
	
					if (! $found_delimiter) {
						$length_to_grab++;
					}
					$tmp_sql .= substr($buffer, $start_pos, $length_to_grab);
					unset($length_to_grab);
				}
				// Do not try to execute empty SQL
				if (! preg_match('/^([\s]*;)*$/', trim($tmp_sql))) {
					
					$sql = update_urls_in_db($tmp_sql);

					if(strpos($sql, 'SET CHARACTER_SET_CLIENT') === FALSE && strpos($sql, 'SET COLLATION_CONNECTION') === FALSE){
						$res = backuply_mysql_query($sql, $conn);
						
						// Find Prefix in create tables
						if(preg_match('/CREATE\s+TABLE\s+[.]*[`]*(.*)options[`]*\s*\(/is', $sql, $prefix)){
							if(!empty($prefix[1])){
								$wp_old_prefix = $prefix[1];
							}
						}
						
						// If backuply_version found, then execute
						if(!empty($wp_old_prefix) && preg_match('/backuply_version/is', $sql)){
							$bacuply_version_query = "UPDATE ".$wp_old_prefix."options SET `option_value`='".$GLOBALS['backuply_version']."' WHERE `option_name`='backuply_version';";
							backuply_mysql_query($bacuply_version_query, $conn);

							//backuply_log($bacuply_version_query);
						}
					}

					if(!$res && backuply_mysql_error($conn)){
						//$error[] = backuply_mysql_error($conn);
						backuply_status_log('<strong style="color:orange;">Warning:</strong> ' . backuply_mysql_error($conn), 'warning');
						//return false;
					}
					//PMA_importRunQuery($sql, substr($buffer, 0, $i + strlen($sql_delimiter)));
					$buffer = substr($buffer, $i + strlen($sql_delimiter));
					// Reset parser:
					$len = strlen($buffer);
					$sql = '';
					$i = 0;
					$start_pos = 0;
					// Any chance we will get a complete query?
					//if ((strpos($buffer, ';') === false) && !$finished) {
					if ((strpos($buffer, $sql_delimiter) === false) && !$finished) {
						break;
					}
				} else {
					$i++;
					$start_pos = $i;
				}
			}
		} // End of parser loop
	} // End of import loop
	return true;
} // End of backuply_import


/**
 * Returns next part of imported file/buffer
 *
 * @param int  $size  size of buffer to read (this is maximal size function will return)
 * @return string part of file/buffer
 * @access public
 */
function backuply_PMA_importGetNextChunk($size = 32768)
{
	global $compression, $import_handle, $charset_conversion, $charset_of_file,$read_multiply, $read_limit, $offset, $finished;
		
	$read_multiply = 1;
	
	// Add some progression while reading large amount of data
	if ($read_multiply <= 8) {
		$size *= $read_multiply;
	} else {
		$size *= 8;
	}

	$read_multiply++;

	// We can not read too much
	if ($size > $read_limit) {
		$size = $read_limit;
	}

	if ($finished) {
		return true;
	}

  	$result = fread($import_handle, $size);
	$finished = feof($import_handle);
	$offset += $size;

	/**
	 * Skip possible byte order marks (I do not think we need more
	 * charsets, but feel free to add more, you can use wikipedia for
	 * reference: <http://en.wikipedia.org/wiki/Byte_Order_Mark>)
	 *
	 * @todo BOM could be used for charset autodetection
	 */
	if ($offset == $size) {
		// UTF-8
		if (strncmp($result, "\xEF\xBB\xBF", 3) == 0) {
			$result = substr($result, 3);
		// UTF-16 BE, LE
		} elseif (strncmp($result, "\xFE\xFF", 2) == 0 || strncmp($result, "\xFF\xFE", 2) == 0) {
			$result = substr($result, 2);
		}
	}
	
	return $result;
}

function untar_archive($tarname, $untar_path, $file_list = array(), $handle_remote = false){
	global $globals, $can_write, $ftp;
	
	// Create directory if not there
	if(!is_dir($untar_path)){
		@mkdir($untar_path);
	}
	$tar_archive = new softtar($tarname, '', $handle_remote);
	
	if(empty($file_list)){
		$res = $tar_archive->extractModify($untar_path, '');
	}else{
		$res = $tar_archive->extractList($file_list, $untar_path);
	}
	
	if(!$res){
		return false;	
	}
	
	return true;	
}

function backuply_optPOST($name, $default = ''){

global $error;

	//Check the GETED NAME was GETed
	if(isset($_POST[$name])){
	
		return $_POST[$name];
		
	}else{
		
		return $default;

	}
}

function backuply_entity_check($string){
	
	//Convert Hexadecimal to Decimal
	$num = ((substr($string, 0, 1) === 'x') ? hexdec(substr($string, 1)) : (int) $string);
	
	//Squares and Spaces - return nothing 
	$string = (($num > 0x10FFFF || ($num >= 0xD800 && $num <= 0xDFFF) || $num < 0x20) ? '' : '&#'.$num.';');
	
	return $string;
}

function backuply_rmdir_recursive_fn($path){
	
	$path = (substr($path, -1) == '/' || substr($path, -1) == '\\' ? $path : $path.'/');
	
	backuply_resetfilelist();
	
	$files = backuply_filelist_fn($path, 1, 0, 'all');
	$files = (!is_array($files) ? array() : $files);
	
	//First delete the files only
	foreach($files as $k => $v){
		@chmod($k, 0777);
		if(file_exists($k) && is_file($k) && @filetype($k) == "file"){
			@unlink($k);
		}
	}
	
	@clearstatcache();
	
	$folders = backuply_filelist_fn($path, 1, 1, 'all');
	$folders = (!is_array($folders) ? array() : $folders);
	@krsort($folders);

	//Now Delete the FOLDERS
	foreach($folders as $k => $v){
		@chmod($k, 0777);
		if(is_dir($k)){
			@rmdir($k);
		}
	}
	
	@rmdir($path);
	
	@clearstatcache();
}

function backuply_filelist_fn($startdir="./", $searchSubdirs=1, $directoriesonly=0, $maxlevel="all", $level=1, $reset = 1) {
   //list the directory/file names that you want to ignore
   $ignoredDirectory[] = ".";
   $ignoredDirectory[] = "..";
   $ignoredDirectory[] = "_vti_cnf";
   global $directorylist;	//initialize global array
   
   if(substr($startdir, -1) != '/'){
		$startdir = $startdir.'/';
	}
   
   if (is_dir($startdir)) {
	   if ($dh = opendir($startdir)) {
		   while (($file = readdir($dh)) !== false) {
			   if (!(array_search($file,$ignoredDirectory) > -1)) {
				 if (@filetype($startdir . $file) == "dir") {
					 
					   //build your directory array however you choose;
					   //add other file details that you want.
					   
					   $directorylist[$startdir . $file]['level'] = $level;
					   $directorylist[$startdir . $file]['dir'] = 1;
					   $directorylist[$startdir . $file]['name'] = $file;
					   $directorylist[$startdir . $file]['path'] = $startdir;
					   if ($searchSubdirs) {
						   if ((($maxlevel) == "all") or ($maxlevel > $level)) {
							   backuply_filelist_fn($startdir . $file . "/", $searchSubdirs, $directoriesonly, $maxlevel, ($level + 1), 0);
						   }
					   }
					  
					   
				   } else {
					   if (!$directoriesonly) {
						 
					  //  echo substr(strrchr($file, "."), 1);
						   //if you want to include files; build your file array 
						   //however you choose; add other file details that you want.
						 $directorylist[$startdir . $file]['level'] = $level;
						 $directorylist[$startdir . $file]['dir'] = 0;
						 $directorylist[$startdir . $file]['name'] = $file;
						 $directorylist[$startdir . $file]['path'] = $startdir;
						  
					 
	 }}}}
		   closedir($dh);
	}}

	if(!empty($reset)){
		$r = $directorylist;
		$directorylist = array();
		return($r);
	}
}


function backuply_resetfilelist(){
global $directorylist;
	$directorylist = array();
}

function backuply_die($txt, $l_file = '', $backuly_backup_dir = ''){
	
	global $data, $can_write;
	
	$array = array();
	$array['result'] = $txt;
	$array['data'] = $GLOBALS['data'];
	
	$globals = ['l_readbytes', 'import_i', 'import_len', 'import_offset', 'status', 'current_status', 'import_spos', 'part_no', 'backuply_version', 'remote_data', 'file_randomness'];
	
	// Updating data with $GLOBALS
	foreach($globals as $global){
		if(!empty($GLOBALS[$global])){
			$data[$global] = $GLOBALS[$global];
		}
	}
	
	// Add last backed up file to the array if the process is still INCOMPLETE
	if(!empty($l_file)){
		$array['l_file'] = $l_file;
	}
	
	// Send the current status of the operation performed according to which the next operation will be performed.
	if(!empty($GLOBALS['current_status'])){
		$array['current_status'] = $GLOBALS['current_status'];
	}
	
	// Was there an error ?
	if(!empty($GLOBALS['error'])){
		$array['local_tarname'] = $data['local_tar'];
		$array['restore_error'] = $GLOBALS['error'];
		//backuply_log(' restore error : '. var_export($array['restore_error'], 1));
		
		restore_clean(1);
		restore_curl($array);
		die();
	}
	
	if($txt == 'DONE'){
		$array = array();
		$array['status'] = 0;
		$array['backuly_backup_dir'] = $backuly_backup_dir;
		$array['softpath'] = $data['softpath'];
		$array['fname'] = $data['fname'];
		$array['dbexist'] = $data['dbexist'];
		$array['is_migrating'] = $data['is_migrating'];
		$array['not_writable'] = isset($data['not_writable']) ? $data['not_writable'] : false;
		$array['file_randomness'] = $data['file_randomness'];
		$data = $array;

		restore_clean(1);
		restore_curl($data);
		die();
	}
	
	// In case the restore is incomplete we call clean without force so it will delete files that are not required anymore
	//restore_clean();
	
	restore_curl($data);
}

// Copy from source to destination
function backuply_copydir_fn($source, $destination){
	
	$source = (substr($source, -1) == '/' || substr($source, -1) == '\\' ? $source : $source.'/');
	$destination = (substr($destination, -1) == '/' || substr($destination, -1) == '\\' ? $destination : $destination.'/');
	$source_ = substr($source, 0, -1);
	$destination_ = substr($destination, 0, -1);
	
	if(!is_dir($destination)){
		mkdir($destination);
	}
	
	backuply_resetfilelist();	
	$files = backuply_filelist_fn($source, 1, 1, 'all');
	$files = (!is_array($files) ? array() : $files);
	
	// Make the folders
	foreach($files as $k => $v){
		mkdir(str_replace($source_, $destination_, $k), $globals['dirchmod'], 1);
		@chmod(str_replace($source_, $destination_, $k), fileperms($k));
	}
	
	@clearstatcache();	
	backuply_resetfilelist();
	
	$files = backuply_filelist_fn($source, 1, 0, 'all');
	$files = (!is_array($files) ? array() : $files);
	
	// Copy the files
	foreach($files as $k => $v){
		if(file_exists($k) && is_file($k) && @filetype($k) == "file"){
 			if(!empty($GLOBALS['last_file']) && $GLOBALS['start'] == 0){
				if(preg_match('#^'.$GLOBALS['last_file'].'$#', $k)){
					$GLOBALS['start'] = 1; // give a jump start once the last backed up file is found..
				}
				
				continue; //return true to skip files	
			}  
			
			copy($k, str_replace($source_, $destination_, $k));
			@chmod(str_replace($source_, $destination_, $k), fileperms($k));
			
			// We can run the scripts for the end time already set
			if(time() >= $GLOBALS['end']){ 
				$GLOBALS['end_file'] = $last_file; // set end file so that we know where to start from
				break;
			}  
		}
	}
	
	@clearstatcache();	
	backuply_resetfilelist();
	
	return true;
}

function backuply_mysql_connect($host, $user, $pass, $newlink = false){
	
	if(extension_loaded('mysqli')){
		//echo 'mysqli';
		// To handle connection if user passes a custom port along with the host as localhost:6446
		$exh = explode(':', $host);
		if(!empty($exh[1])){
			$sock = null;
			$port = $exh[1];
			
			// To handle connection if user passes a socket like localhost:usr/mysql/mysql.sock
			if(!is_numeric($exh[1])){
				$sock = $exh[1];
				$port = null;
			}

			$sconn = @mysqli_connect($exh[0], $user, $pass, '', $port, $sock);
		}else{
			$sconn = @mysqli_connect($host, $user, $pass);
		}
	}else{
		//echo 'mysql';
		$sconn = @mysql_connect($host, $user, $pass, $newlink);
	}
	
	return $sconn;
}

function backuply_mysql_select_db($db, $conn){
	
	if(extension_loaded('mysqli')){
		$return = @mysqli_select_db($conn, $db);
	}else{
		$return = @mysql_select_db($db, $conn);
	}
	
	return $return;
}

/**
  * This function is taken from WordPress https://developer.wordpress.org/reference/classes/wpdb/set_sql_mode/
  * It sets the SQL mode because there could be some incompatible modes set so that can break database restore.
*/
function backuply_set_sql_mode($modes, $conn){
	if(empty($modes)){
		if(extension_loaded('mysqli')){
			$res = mysqli_query($conn, 'SELECT @@SESSION.sql_mode');
		} else {
			$res = mysql_query('SELECT @@SESSION.sql_mode', $conn);
		}

		if(empty($res)){
			backuply_log('Query to get SQL Mode returned empty');
			return;
		}

		if(extension_loaded('mysqli')){
			$modes_array = mysqli_fetch_array($res);
			if (empty($modes_array[0])){
				return;
			}
			$modes_str = $modes_array[0];
		} else {
			$modes_str = mysql_result($res, 0);
		}

		if(empty($modes_str)){
			return;
		}

		$modes = explode(',', $modes_str);
	}

	$modes = array_change_key_case($modes, CASE_UPPER);

	$incompatible_modes = array(
		'NO_ZERO_DATE',
		'ONLY_FULL_GROUP_BY',
		'STRICT_TRANS_TABLES',
		'STRICT_ALL_TABLES',
		'TRADITIONAL',
		'ANSI',
	);

	foreach($modes as $i => $mode){
		if(in_array($mode, $incompatible_modes, true)){
			unset($modes[$i]);
		}
	}

	$modes_str = implode(',', $modes);

	if(extension_loaded('mysqli')){
		mysqli_query($conn, "SET SESSION sql_mode='$modes_str'");
	} else {
		mysql_query("SET SESSION sql_mode='$modes_str'", $conn);
	}
}

function backuply_mysql_query($query, $conn){
	
	$return = '';
	
	if(extension_loaded('mysqli')){
		try{
			$return = @mysqli_query($conn, $query);
		}catch(mysqli_sql_exception $e){
			//
		}
	}else{
		$return = @mysql_query($query, $conn);
	}
	
	return $return;
}

function backuply_mysql_error($conn){
	
	if(extension_loaded('mysqli')){
		$return = @mysqli_error($conn);
		
		// In mysqli if connection  is not made then we will get connection error using the following function.
		if(empty($conn)){
			$return = @mysqli_connect_error();
		}
		
	}else{
		$return = @mysql_error($conn);
	}
	
	return $return;
}

function backuply_mysql_num_rows($result){
	
	if(extension_loaded('mysqli')){
		$return = @mysqli_num_rows($result);
	}else{
		$return = @mysql_num_rows($result);
	}
	
	return $return;
}

function backuply_mysql_fetch_array($result){
	
	if(extension_loaded('mysqli')){
		$return = @mysqli_fetch_array($result);
	}else{
		$return = @mysql_fetch_array($result);
	}
	
	return $return;
}

function backuply_stream_wrapper_register($protocol, $classname){
	
	$protocols = array('dropbox', 'aws', 'caws', 'bcloud', 'gdrive', 'softftpes', 'softsftp', 'ftp', 'webdav', 'onedrive');
	
	if(!in_array($protocol, $protocols)){
		return false;
	}

	backuply_include_lib($protocol);

	if(!stream_wrapper_register($protocol, $classname)){
		return false;
	}
	
	return true;
}

function backuply_include_lib($protocol) {
	if(!class_exists($protocol)){
		if(file_exists(__DIR__ .'/lib/'.$protocol.'.php')) {
			include_once(__DIR__ .'/lib/'.$protocol.'.php');
			return;
		}
		
		if(file_exists(dirname(dirname(__FILE__)) . '/backuply-pro/lib/' .$protocol . '.php')) {
			include_once(dirname(dirname(__FILE__)) . '/backuply-pro/lib/' .$protocol . '.php');
			return;
		}
		
		return false;
	}
	
	return true;
}

function soft_preg_replace($pattern, $file, &$var, $valuenum, $stripslashes = ''){	
	preg_match($pattern, $file, $matches);
	if(empty($stripslashes)){
		$var = @trim($matches[$valuenum]);
	}else{
		$var = @stripslashes(trim($matches[$valuenum]));
	}
}

function backuply_print($array){

	echo '<pre>';
	print_r($array);
	echo '</pre>';

}

// Create or updates the log file
function backuply_status_log($log, $status = 'working', $percentage = 0 ){
	$log_file = dirname(__FILE__, 3).'/backuply/backuply_log.php';
		
	if(!file_exists($log_file) || 0 == filesize($log_file)) {
		$log = "<?php exit();?>\n" . $log; //Prepend php exit
	}

	$this_log = $log . '|' . $status . '|' . $percentage . "\n";
	
	file_put_contents($log_file, $this_log, FILE_APPEND);
}

function restore_clean($force = 0){
	global $data;
	
	//Delete the temporarily downloaded archive if some error occur in the restore
	if($GLOBALS['current_status'] >= 4 || !empty($force)){
		@unlink($data['local_tar']);
	}

	// Delete these always, we will unzip these files everytime
	$soft_perms = $data['backuly_backup_dir'].'/restoration/softperms'.$data['file_randomness'].'.txt';
	if(file_exists($soft_perms)){
		unlink($soft_perms);
	}

	@unlink($data['backuly_backup_dir'].'/restoration/softver.txt');

	$info_file = str_replace('.tar.gz', '.php', $data['fname']);
	
	// To delete the info file which gets extracted too.
	if(file_exists($data['softpath'] .'/'. $info_file)){
		@unlink($data['softpath'] .'/'. $info_file);
	}
	
	//Delete the softsql.sql file
	if((file_exists($data['backuly_backup_dir'].'/restoration/'.$data['dbexist']) && $GLOBALS['current_status'] >= 2) || !empty($force)){
		
		if(file_exists($data['backuly_backup_dir'].'/restoration/'.$data['dbexist']) && !is_dir($data['backuly_backup_dir'].'/restoration/'.$data['dbexist'])){
			@unlink($data['backuly_backup_dir'].'/restoration/'.$data['dbexist']);
		}

		// TODO:: We might not need this, as this is deleting the .tar.gz file which we dont have at the root of the installation.
		if(file_exists($data['softpath'].'/'.$data['fname']) && !is_dir($data['softpath'].'/'.$data['fname'])){
			@unlink($data['softpath'].'/'.$data['fname']);
		}
	}
}

function handle_restore_status($output) {
	
	if(!empty($output['restore_error'])){
		// Send restore failure mail
		$error = $output['restore_error'];

		$error_string = '<b>Below are the error(s) :</b> <br />';

		foreach($error as $ek => $ev){
			$error_string .= '* '.$ev.'<br />';
		}
		
		backuply_status_log($error_string, 'info');
		backuply_status_log('Restore of your WordPress installation failed.', 'error', 100);
		restore_clean(1);
		final_restore_response($output, $error_string);
		
		return false;
	}
	
	if($output['status'] == 0) {
		backuply_log('Restore complete called !');
		final_restore_response($output, '');
	}
}

function final_restore_response($output, $error_str = '') {
	global $data;
	
	$config = backuply_get_config();
	$url = $output['ajax_url'];

	if(empty($config['RESTORE_KEY'])) {
		backuply_status_log('Unable to find security key', 'error');
		backuply_kill_process();
		return;
	}

	$url .= '?action=backuply_restore_response&security='. $config['RESTORE_KEY'].'&user_id='.$output['user_id']. '&sess_key='.$output['sess_key'];
	if(!empty($output['restore_db'])){
		$url .= '&restore_db=true';
	}
	
	if(!empty($output['is_migrating'])){
		$url .= '&is_migrating=true';
	}
	
	if(!empty($output['not_writable'])){
		$url .= '&not_writable=true';
	}

	if(!empty($error_str)) {
		$url .= '&error=1&error_string=' . urlencode($error_str);
	}
	
	$curl = new Curl();

	$curl->setConnectTimeout(5);
	$curl->setTimeout(5);
	$curl->setOpt(CURLOPT_SSL_VERIFYPEER, FALSE);
	$curl->setOpt(CURLOPT_SSL_VERIFYHOST, FALSE);
	$curl->setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36');
	$curl->get($url);

	die();
}

// CURL call to call self to prevent timeout
function restore_curl($data) {
	$config = backuply_get_config();

	if(empty($config['RESTORE_KEY'])) {
		backuply_kill_process();
		return;
	}
	
	$data['restore_key'] = urlencode($config['RESTORE_KEY']);
	$data['site_url'] = backuply_optPOST('site_url');
	$data['home_url'] = backuply_optPOST('home_url');
	$data['backup_site_url'] = backuply_optPOST('backup_site_url');
	$data['backup_site_path'] = backuply_optPOST('backup_site_path');
	$data['ajax_url'] = backuply_optPOST('ajax_url');
	$data['backuly_backup_dir'] = backuply_optPOST('backuly_backup_dir');
	$data['restore_db'] = backuply_optPOST('restore_db');
	$data['debug_mode'] = backuply_optPOST('debug_mode');
	$data['sess_key'] = backuply_optPOST('sess_key');
	$data['user_id'] = backuply_optPOST('user_id');
	$data['exclude_db'] = backuply_optPOST('exclude_db');
	
	handle_restore_status($data);
	
	$curl = new Curl();

	$curl->setConnectTimeout(5);
	$curl->setTimeout(5);
	$curl->setOpt(CURLOPT_SSL_VERIFYPEER, FALSE);
	$curl->setOpt(CURLOPT_SSL_VERIFYHOST, FALSE);
	$curl->setReferer((!empty($_SERVER['REQUEST_SCHEME']) ? $_SERVER['REQUEST_SCHEME'] : 'http') .'://'. $_SERVER['SERVER_NAME']);
	$curl->setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36');
	
	$curl->post(backuply_optPOST('restore_curl_url'), $data);
	
	die();
}

// Download the remote archive
function remote_archive_download_loop(){
	global $data, $error;

	// Do we have a remote file ?
	if(empty($data['remote_tar'])){
		return false;
	}
	
	clearstatcache();
	restore_got_killed(); //stops process if restore gets killed

	// For untar and backward compatibiility of .tar files
	// if(substr($this->_orig_tar, -2) == 'gz'){
		// $this->_compress = true;
		// $this->_compress_type = 'gz';
	// }
	
	$url = parse_url($data['remote_tar']);

	if(!class_exists($url['scheme'])){

		$did_register = backuply_stream_wrapper_register($url['scheme'], $url['scheme']);

		if(empty($did_register)){
			backuply_include_lib($url['scheme']);
		}
	}

	//Create tmp directory if not present.
	$localdir = pathinfo($data['local_tar'], PATHINFO_DIRNAME);
	if(!is_dir($localdir)){
		//create recursively
		@mkdir($localdir, 0755, 1);
	}

	// Lets ensure file data is proper
	if($data['restore_loop'] == 1){
		// $data['size'] = filesize($data['remote_tar']);
		// backuply_log('Size : ' . $data['size']);
		@unlink($data['local_tar']);
		$data['l_readbytes'] = 0;
	}

	if(empty($data['l_readbytes']) && $data['restore_loop'] == 1) {
		backuply_status_log('Downloading the backup(' . $data['fname'] . ') from remote location.', 'info', 13);
	}
	
	if(method_exists($url['scheme'], 'download_file_loop')){

		$obj = new $url['scheme'];

		//Delete the local file if the process is starting afresh and the file already exists
		if(file_exists($data['local_tar']) && empty($data['l_readbytes'])){
			@unlink($data['local_tar']);
		}

		//backuply_log('invoked download function, org_tar : '.$this->_orig_tar.' , local : '.$this->_local_tar);
		$obj->download_file_loop($data['remote_tar'], $data['local_tar'], $data['l_readbytes']);

		if(!empty($error)){
			backuply_die('download_error');
		}
	}else{

		// Open the file pointer if not opened
		$remote_fp = @fopen($data['remote_tar'], 'rb');
		$fp = @fopen($data['local_tar'], 'ab');
		$GLOBALS['l_readbytes'] = $data['l_readbytes'];
		
		//backuply_log($data['remote_tar']);
		
		if(empty($remote_fp)){
			$error[] = 'Unable to open remote file for reading';
			backuply_log('Unable to open remote file for reading');
			backuply_die('download_error');
		}
		
		$meta = stream_get_meta_data($remote_fp);
		$chunk = 1048576;
		
		// Seek to the location
		if(!fseek($remote_fp, $GLOBALS['l_readbytes'])){
			$error[] = 'Unable to seek file pointer';
			backuply_die('download_error');
		}
		
		while($GLOBALS['l_readbytes'] < $data['size']){
			restore_got_killed();
			
			if(time() + 5 >= $GLOBALS['end']){
				$GLOBALS['l_readbytes'] = filesize($data['local_tar']);
				break;
			}
			
			if(($data['size'] - $GLOBALS['l_readbytes']) < $chunk){
				$chunk = (int) $data['size'] - $GLOBALS['l_readbytes'];
				backuply_log('Last Chunk '. $chunk);
			}

			// Read a block
			$block = fread($remote_fp, $chunk);

			$GLOBALS['l_readbytes'] += strlen($block);
			
			backuply_log('Downloaded (L'.$data['restore_loop'].') : '.$GLOBALS['l_readbytes'].' / '.$data['size']);	
			
			// Write the block to the local file
			fwrite($fp, $block);
		
			$percentage = (filesize($data['local_tar']) / $data['size']) * 100;

			backuply_status_log('<div class="backuply-upload-progress"><span class="backuply-upload-progress-bar" style="width:'.round($percentage).'%;"></span><span class="backuply-upload-size">'.round($percentage).'%</span></div>', 'downloading', 22);
			
		}
		
		// Close
		@fclose($remote_fp);
		@fclose($fp);
	}
	
	backuply_log('File Size ---->' . $data['size']);
	
	if($GLOBALS['l_readbytes'] <= $data['size']){
		$data['status'] = 1;
		backuply_die('INCOMPLETE');
		die();
	} else {
		backuply_status_log('TAR has been successfully downloaded, now we will untar the file', 'info', 20);
	}
}

// Updates current time
function update_active_time($bak_dir) {
	
	$ret = touch($bak_dir . '/restoration/restoration.php');
	@touch($bak_dir . '/status.lock');

	if($ret === FALSE) {
		$error[] = 'Unable to create a restore session';
		backuply_die('restoreerror');
	}
}

// Updates Site Config file if its migration
function updating_config_file(){
	
	global $data;
	
	if(!file_exists($data['softpath'] . '/wp-config.php')){
		backuply_log('Updating Wp-Config File: Unable to find wp-config.php');
		return false;
	}
	
	// wp-config.php is required to be writable, especially in case of migration
	// so that the database values could be updated to the new one.
	if(!is_writable($data['softpath'] . '/wp-config.php')){
		$old_permission = fileperms($data['softpath'] . '/wp-config.php');
		chmod($data['softpath'] . '/wp-config.php', 0644);
	}
	
	if(!is_writable($data['softpath'] . '/wp-config.php')){
		backuply_log('Updating Wp-Config File: wp-config.php is not writable!');
		return false;
	}

	$config_cont = file_get_contents($data['softpath'] . '/wp-config.php');
	
	$replace_list = [
		'DB_NAME' => $data['softdb'],
		'DB_USER' => $data['softdbuser'],
		'DB_PASSWORD' => $data['softdbpass'],
		'DB_HOST' => $data['softdbhost'],
		'WP_HOME' => $data['home_url'],
		'WP_SITEURL' => $data['site_url']
	];
	
	$matches = [];
	
	foreach($replace_list as $con => $val){
		preg_match_all('/\ndefine\((\s*?)("|\')'.preg_quote($con).'("|\')(\s*?),(\s*?)("|\')(.*?)("|\')(\s*?)\);/is', $config_cont, $match);
		
		if($match[7] !== $replace_list[$con]){
			$replacement = str_replace($match[7], $val, $match[0]);

			$config_cont = str_replace($match[0], $replacement, $config_cont);
		}
		
	}

	file_put_contents($data['softpath'] . '/wp-config.php', $config_cont);
	
	// Restoring the older permission of the wp-config.php file.
	if(isset($old_permission) && is_numeric($old_permission)){
		chmod($data['softpath'] . '/wp-config.php', $old_permission);
	}
	
	return true;
}

function update_urls_in_db($sql){
	global $data;
	
	// We dont need to change the url if it's just a restore
	if(empty($data['is_migrating'])){
		return $sql;
	}
	
	// What is the data to be replaced ?		
	$replace_data[$data['backup_site_path']] = $data['softpath'];

	// Removing protocols
	if(preg_match('/^http:\/\/www\./is', $data['backup_site_url'])){
		$source_url =  preg_replace('/^http:\/\/www\./is', '', $data['backup_site_url']);
	}elseif(preg_match('/^http:\/\//is', $data['backup_site_url'])){
		$source_url =  preg_replace('/^http:\/\//is', '', $data['backup_site_url']);
	}elseif(preg_match('/^https:\/\/www\./is', $data['backup_site_url'])){
		$source_url =  preg_replace('/^https:\/\/www\./is', '', $data['backup_site_url']);
	}elseif(preg_match('/^https:\/\//is', $data['backup_site_url'])){
		$source_url =  preg_replace('/^https:\/\//is', '', $data['backup_site_url']);
	}
	
	$replace_data['https?:\/\/[www.]?'. preg_quote($source_url, '/')] = $data['site_url'];
	
	if(!preg_match('/' . 'https?:\/\/[www.]?'.preg_quote($source_url, '\/?$/'). '/is', $data['backup_site_url'])){
		$replace_data[$data['backup_site_url']] = $data['site_url'];
	}

	//Replacing protocols
	if(preg_match('/^http:\/\/www\./is', $data['site_url'])){
		$dest_url =  preg_replace('/^http:\/\/www\./is', '', $data['site_url']);
	}elseif(preg_match('/^http:\/\//is', $data['site_url'])){
		$dest_url =  preg_replace('/^http:\/\//is', '', $data['site_url']);
	}elseif(preg_match('/^https:\/\/www\./is', $data['site_url'])){
		$dest_url =  preg_replace('/^https:\/\/www\./is', '', $data['site_url']);
	}elseif(preg_match('/^https:\/\//is', $data['site_url'])){
		$dest_url =  preg_replace('/^https:\/\//is', '', $data['site_url']);
	}
	
	$replace_data['//www.'.$source_url] = '//www.'.$dest_url;
	$replace_data['//'.$source_url] = '//'.$dest_url;
	
	//Replace encoded softurls
	$replace_data[rawurlencode('http://'.$source_url)] = rawurlencode($data['site_url']);
	$replace_data[rawurlencode('http://www.'.$source_url)] = rawurlencode($data['site_url']);
	$replace_data[rawurlencode('https://'.$source_url)] = rawurlencode($data['site_url']);
	$replace_data[rawurlencode('https://www.'.$source_url)] = rawurlencode($data['site_url']);
	
	//If enabled then it will replace all directory characters in database e.g if user has installation in subdir e. "/a" then the anchor and every word which has "a" will be replaced in database.
	//$replace_data[$data['relativeurl']] = $__settings['relativeurl'];

	// Just to be safe
	foreach($replace_data as $rk => $rv){
		if(empty($rk) || empty($rv)){
			unset($replace_data[$rk]);
		}

		if(strpos($rk, '//') === 0){
			$rk = '(?<!:)' . preg_quote($rk, '/');
		} elseif(strpos($rk, 'https?:\/\/[www.]?') !== 0){
			$rk = preg_quote($rk, '/');
		}

		$sql = preg_replace('/'.$rk.'/im', $rv, $sql);
	}
	
	return $sql;

}

#####################################################
# RESTORE LOGIC STARTS HERE !
#####################################################
	
global $globals, $error, $can_write, $ftp;

$data = array();
$data['restore_dir'] = backuply_optPOST('restore_dir');
$data['restore_db'] = backuply_optPOST('restore_db');
$data['backup_dir'] = backuply_optPOST('backup_dir');
$data['exclude_db'] = backuply_optPOST('exclude_db');
$data['fname'] = backuply_optPOST('fname');
$data['softpath'] = backuply_optPOST('softpath'); 
$data['softdbhost'] = backuply_optPOST('softdbhost');
$data['softdbuser'] = backuply_optPOST('softdbuser');
$data['softdbpass'] = backuply_optPOST('softdbpass');
$data['softdb'] = backuply_optPOST('softdb');
$data['dbexist'] = backuply_optPOST('dbexist');
$data['soft_version'] = backuply_optPOST('soft_version');
$data['plugin_dir'] = backuply_optPOST('plugin_dir');
$data['backuly_backup_dir'] = backuply_optPOST('backuly_backup_dir');
$data['l_readbytes'] = backuply_optPOST('l_readbytes');
$data['size'] = backuply_optPOST('size');
$data['restore_loop'] = (empty(backuply_optPOST('restore_loop'))) ? 1 : ( (int) backuply_optPOST('restore_loop') + 1);
$data['site_url'] = backuply_optPOST('site_url');
$data['home_url'] = backuply_optPOST('home_url');
$data['backup_site_url'] = backuply_optPOST('backup_site_url');
$data['backup_site_path'] = backuply_optPOST('backup_site_path');
$data['tbl_prefix'] = backuply_optPOST('tbl_prefix');
$data['db_prefix'] = backuply_optPOST('db_prefix');
$data['restore_curl_url'] = backuply_optPOST('restore_curl_url');
$data['ajax_url'] = backuply_optPOST('ajax_url');
$data['is_migrating'] = false;
$data['debug_mode'] = backuply_optPOST('debug_mode');
$data['sess_key'] = backuply_optPOST('sess_key');
$data['user_id'] = backuply_optPOST('user_id');
$data['part_no'] = backuply_optPOST('part_no');
$data['file_randomness'] = !empty(backuply_optPOST('file_randomness')) ? backuply_optPOST('file_randomness') : bin2hex(random_bytes(12)); // This is for restoring db and soft perms safely
$GLOBALS['backuply_version'] = backuply_optPOST('backuply_version');

// Adding randomness to sql file name.
if(!empty($data['dbexist']) && strpos($data['dbexist'], $data['file_randomness']) === FALSE){
	$data['dbexist'] = 'softsql'.$data['file_randomness'].'.sql';
}

// For DB restore loop
if(!empty($data['restore_db'])){
	$GLOBALS['import_i'] = !empty(backuply_optPOST('import_i')) ? backuply_optPOST('import_i') : 0;
	$GLOBALS['import_len'] = !empty(backuply_optPOST('import_len')) ? backuply_optPOST('import_len') : 0;
	$GLOBALS['import_offset'] = !empty(backuply_optPOST('import_offset')) ? backuply_optPOST('import_offset') : 0;
	$GLOBALS['import_spos'] = !empty(backuply_optPOST('import_spos')) ? backuply_optPOST('import_spos') : 0;
}

if(backuply_optPOST('remote_data')){
	$GLOBALS['remote_data'] = backuply_optPOST('remote_data');
}

if($data['site_url'] !== $data['backup_site_url']){
	$data['is_migrating'] = true;
}

// Check if we can write
$can_write = backuply_can_create_file();

update_active_time($data['backuly_backup_dir']);

if(empty($can_write)){
	$error[] = 'Cannot write a temporary file !';
	backuply_die('cannot_write');
}

// We need to stop execution in 25 secs.. We will be called again if the process is incomplete
// Set default value
$GLOBALS['end'] = (int) time() + $keepalive;

// Empty last file everytime as a precaution
$GLOBALS['last_file'] = '';
$GLOBALS['last_file'] = backuply_optPOST('last_file');
if(!empty($GLOBALS['last_file'])){			
	$GLOBALS['last_file'] = rawurldecode($GLOBALS['last_file']);
}

$GLOBALS['last_byte'] = 0;
$GLOBALS['last_byte'] = (int) backuply_optPOST('last_byte', 0);

$GLOBALS['current_status'] = 0;
$GLOBALS['current_status'] = (int) backuply_optPOST('current_status');
if(!empty($GLOBALS['current_status'])){			
	$GLOBALS['current_status'] = $GLOBALS['current_status'];
}

$local_file = backuply_glob('backups') .'/' . $data['fname'];

if(preg_match('/\:\/\//', $data['backup_dir'])){
	if(empty($data['l_readbytes'])) {
		$data['l_readbytes'] = 0;
	}

	//$data['is_remote'] = true;
	$data['local_tar'] = backuply_glob('backups') .'/'. $data['fname'];
	$data['remote_tar'] = $data['backup_dir'].'/'.$data['fname'];

	//Download the file if its on remote location
	if($data['size'] > $data['l_readbytes']) {
		remote_archive_download_loop();
	}

}

// Restore files
if(!empty($data['restore_dir']) && empty($GLOBALS['current_status'])){
	//backuply_log('restore files start');

	// Store the progress
	backuply_status_log('Restoring directories', 'working', 27);

	// Set default values
	$GLOBALS['start'] = 0;
	$GLOBALS['end_file'] = '';

	if(!untar_archive($local_file, $data['softpath'], array(), true)){
		$error[] = 'There was some error while unzipping the backup files';
		backuply_die('restoreerror');
	}

	// Is the backup process INCOMPLETE ?
	if(!empty($GLOBALS['end_file'])){
		$data['last_file'] = $GLOBALS['end_file'];
		$data['last_byte'] = $GLOBALS['end_byte'];
		$data['status'] = 1;
		backuply_status_log('Restoring: ' .$GLOBALS['end_file']);
		backuply_die('INCOMPLETE', $GLOBALS['end_file']);
		///echo serialize($data);
	}

	// See if a permission list is there ?
	$perms_file_name = 'softperms' . $data['file_randomness'] .'.txt';
	$perms = @file($data['backuly_backup_dir'].'/restoration/'.$perms_file_name);
	if(is_array($perms)){
		foreach($perms as $k => $v){
			$link = $target = $dest_file = '';
			$v = trim($v);
			$perm = substr($v, -4);
			
			// Do this only if the restore of files is already completed
			if(empty($GLOBALS['end_file'])){
				if(preg_match('/(.*?)linkto=(.*?)('.$perm.')/', $v, $out)){
					$link = trim($out[1]);
					$target = trim($out[2]);
					if (substr($link, 0, 1) == '/'){
						$link = $data['softpath'].$link;
					}else{
						$link = $data['softpath'].'/'.$link;
					}
					if(!empty($target)){				
						if(!@symlink($target, $link)){
							$error[] = 'Unable to extract symbolic link {' . $link . '}';
							backuply_die('restoresymlink');
						}
					}
				}
			}

			// We are not going to touch the permission of the install directory.
			if(trim(substr($v, 0, -5)) == '/'){
				continue;
			}

			if(is_numeric($perm)){
				
				if(empty($link)){
					$dest_file = $data['softpath'].'/'.substr($v, 0, -5);
				}else{
					$dest_file = $link;
				}
				@chmod($dest_file, octdec($perm));
			}
		}
	}
	
	$GLOBALS['current_status'] = 1;
	//backuply_log('restore files ends');
}


// Restore Database	
if(!empty($data['restore_db']) && $GLOBALS['current_status'] < 2){
	//backuply_log('restore db start');
	
	// Updating wp-config
	updating_config_file(); // Will need to update config on every restore because, we can't identify if a restore is migration or not unless there is a change in URL, and migration can happen even if there URL is same.
	
	// Store the progress
	backuply_status_log('Working on restoring Database', 'working', !empty($data['restore_dir']) ? 67 : 24);
	
	// --- Enabling maintenance mode ---
	$maintenance_string = '<?php $upgrading = ' . time() . '; ?>';
	file_put_contents(cleanpath($data['backup_site_path']) . '/.maintenance', $maintenance_string);  // We need to update everytime the script calls itself, becuase .maintenance gets deleted after 10 minutes of inactivity with the file.
	backuply_status_log('Maintainance mode enabled', 'info', !empty($data['restore_dir']) ? 68 : 25);

	$dbuser = $data['softdbuser'];
	$dbpass = $data['softdbpass'];

	// Does the USER exist ?
	$mysql = @backuply_mysql_connect($data['softdbhost'], $dbuser, $dbpass, true);
	
	// Try to select the DB if connection was successful
	if($mysql){
		$_mysql = @backuply_mysql_select_db($data['softdb'], $mysql);
	}
	
	// Untaring the backup file
	if(!file_exists($data['backuly_backup_dir'].'/restoration/'.$data['dbexist'])){
		backuply_status_log('Untaring the backup file', 'working', !empty($data['restore_dir']) ? 67 : 24);
		
		if(!untar_archive($local_file, $data['softpath'], array('softsql.sql', 'softver.txt'), true)){
			$error[] = 'There was some error while unzipping the backup files';
			//backuply_log('There was some error while unzipping the backup files');
			backuply_die('restoreerror');
		}
	}
	
	//$sql_data = implode('', file($data['softpath'].'/'.$data['dbexist']));
	
	//Make the Connection
	$__conn = @backuply_mysql_connect($data['softdbhost'], $dbuser, $dbpass, true);
	
	backuply_mysql_query('SET CHARACTER SET utf8mb4', $__conn);
	backuply_mysql_query('SET NAMES utf8mb4', $__conn);

	backuply_set_sql_mode(array(), $__conn);
	
	//CHECK Errors and SELECT DATABASE
	if(!empty($__conn)){
		backuply_status_log('Successfully connected to the database L('. $data['restore_loop'] .')', 'working', !empty($data['restore_dir']) ? 68 : 25);
		if(!(@backuply_mysql_select_db($data['softdb'], $__conn))){
			//$softpanel->deldb($dbuser, $dbpass);
			$error[] = 'Could not select the database to restore'.'
'.backuply_mysql_error($__conn);
			backuply_die('res_err_selectmy');
			//backuply_log('Could not select the database to restore');
		}
	}else{
		$error[] = 'Could not connect to the database'.'
'.backuply_mysql_error($__conn);
		backuply_die('err_myconn');
		//backuply_log('Could not connect to the database');
	}
		
	// We did not create the database ! So just backup the tables required for this database
	if(!empty($data['exclude_db'])){
		
		// Do we have to get the tables list from backup info ?
		$thisdb_tables = $data['exclude_db'];

		
		if(!is_array($data['exclude_db'])){
			$thisdb_tables = unserialize($data['exclude_db']);
		}
		
		
		// This is just to remove the ` since we are not getting it in $tables below
		foreach($thisdb_tables as $tk => $tv){
			$_thisdb_tables[trim($tk, '`')] = trim($tv, '`');
		}
	}
	
	if(empty($GLOBALS['import_len'])) {
		$res = backuply_mysql_query("SHOW TABLES", $__conn);
		
		for($i=0; $i < backuply_mysql_num_rows($res); $i++){
			$row = backuply_mysql_fetch_array($res);
			
			// We do not need to backup this table
			if(isset($_thisdb_tables) && is_array($_thisdb_tables) && in_array($row[0], $_thisdb_tables)){
				continue;
			}
			
			$tables[] = $row[0];
		}
		
		// Some tables cause problem
		$res = backuply_mysql_query("SET foreign_key_checks = 0", $__conn);
		
		$backup_version = 0;
		if(file_exists($data['softpath'].'/softver.txt')){
			$backup_version = file_get_contents($data['softpath'].'/softver.txt');
			$backup_version = trim($backup_version);
		}
		
		if(!empty($backup_version) && version_compare($backup_version, '1.1.7', '<=')){
			foreach($tables as $k => $v){
				backuply_status_log('Dropping old table : '.$v, 'writing');
				$res = backuply_mysql_query("DROP TABLE `$v`", $__conn);
			}
		}
		
		//Softaculous Function to import Data
		backuply_status_log('Starting to import database', 'working', !empty($data['restore_dir']) ? 69 : 26);
	}
	
	backuply_import($data['backuly_backup_dir'].'/restoration/'.$data['dbexist'], $__conn);
	
	//backuply_log('restore db complete');
	if(!empty($error)){
		return false;
	}
	
	backuply_status_log('Import has been completed', 'working', !empty($data['restore_dir']) ? 70 : 28);
	
	// --- Disabling Maintenance mode ---
	if(file_exists($data['backup_site_path'] . '/.maintenance')){
		unlink($data['backup_site_path'] . '/.maintenance');
		backuply_status_log('Maintainance mode disabled', 'info', !empty($data['restore_dir']) ? 72 : 29);
	}

	@unlink($data['backuly_backup_dir'].'/restoration/'.$data['dbexist']);
	if(file_exists($data['softpath'].'/'.$data['fname'])){
		@unlink($data['softpath'].'/'.$data['fname']);
	}
	
	$GLOBALS['current_status'] = 2;	
}

$GLOBALS['current_status'] = 5;

// The process is complete. Send a NULL Value
backuply_die('DONE','',$data['backuly_backup_dir']);
status_logs.php000064400000003401151526424670007636 0ustar00<?php

/*
* BACKUPLY
* https://backuply.com
* (c) Backuply Team
*/


header('Content-Type: application/json; charset=utf-8');

if(!_verify_self()){
	echo json_encode(array('success' => false, 'progress_log' => 'Security Check Failed!|error'));
	die();
}

_get_status($_REQUEST['last_status']);

// Returns the Security key
function _get_config(){

	$config_file = dirname(__FILE__, 3) . '/backuply/status_key.php';
	
	if(!file_exists($config_file) || 0 == filesize($config_file)) {
		return false;
	}

	$fp = @fopen($config_file, 'r');
	@fseek($fp, 16);

	$content = @fread($fp, filesize($config_file));
	@fclose($fp);

	$status_key = $content;

	return $status_key;
}

// Verifies the backuply key
function _verify_self(){
	
	if(empty($_REQUEST['status_key'])) {
		return false;
	}
	
	$status_lock = dirname(__FILE__, 3). '/backuply/status.lock';
	
	if(!file_exists($status_lock) || (time() - filemtime($status_lock) > 1800)){
		return false;
	}

	$status_key = _get_config();
	
	if(!$status_key) {
		return false;
	}

	if(urldecode($_REQUEST['status_key']) == $status_key) {
		return true;
	}

	return false;
}

// Returns array of logs
function _get_status($last_log = 0){
	$log_file = dirname(__FILE__, 3). '/backuply/backuply_log.php';
	$logs = [];
	$last_log = (int) $last_log;
	
	if(!file_exists($log_file)){
		$logs[] = 'Something went wrong!|error';
		echo json_encode(array('success' => false, 'progress_log' => $logs));
		die();
	}
	
	$fh = fopen($log_file, 'r');
	
	$seek_to = $last_log + 16; // 16 for php exit
	
	@fseek($fh, $seek_to);
	
	$lines = fread($fh, fstat($fh)['size']);
	fclose($fh);
	$fh = null;
	
	echo json_encode(array('success' => true, 'progress_log' => $lines));
	die();
}
backuply.php000064400000002167151526424670007111 0ustar00<?php
/*
Plugin Name: Backuply
Plugin URI: http://wordpress.org/plugins/backuply/
Description: Backuply is a Wordpress Backup plugin. Backups are the best form of security and safety a website can have.
Version: 1.5.2
Author: Softaculous
Author URI: https://backuply.com
License: LGPL v2.1
License URI: http://www.gnu.org/licenses/lgpl-2.1.html
*/

// We need the ABSPATH
if (!defined('ABSPATH')) exit;

if(!function_exists('add_action')){
	echo 'You are not allowed to access this page directly.';
	exit;
}

$backuply_tmp_plugins = get_option('active_plugins', []);

// Is the premium plugin loaded ?
if(in_array('backuply-pro/backuply-pro.php', $backuply_tmp_plugins)){
	
	// The following variable was not there prior to 1.2.1 in the pro version when there was no dependence on the free version
	$backuply_pro_version = get_option('backuply_pro_version');
	if(empty($backuply_pro_version)){
		return;
	}
}

// If BACKUPLY_VERSION exists then the plugin is loaded already !
if(defined('BACKUPLY_VERSION')) {
	return;
}

define('BACKUPLY_FILE', __FILE__);

include_once(dirname(__FILE__).'/init.php');
init.php000064400000022060151526424670006234 0ustar00<?php
/*
* BACKUPLY
* https://backuply.com
* (c) Backuply Team
*/

if(!function_exists('add_action')){
	echo 'You are not allowed to access this page directly.';
	exit;
}

define('BACKUPLY_VERSION', '1.5.2');
define('BACKUPLY_DIR', dirname(BACKUPLY_FILE));
define('BACKUPLY_URL', plugins_url('', BACKUPLY_FILE));
define('BACKUPLY_BACKUP_DIR', str_replace('\\' , '/', WP_CONTENT_DIR).'/backuply/');
define('BACKUPLY_TIMEOUT_TIME', 300);
define('BACKUPLY_DEV', file_exists(dirname(__FILE__).'/DEV.php') ? 1 : 0);

if(BACKUPLY_DEV){
	include_once BACKUPLY_DIR.'/DEV.php';
}

// Some other constants
if(!defined('BACKUPLY_API')){
	define('BACKUPLY_API', 'https://api.backuply.com');
}

define('BACKUPLY_DOCS', 'https://backuply.com/docs/');
define('BACKUPLY_WWW_URL', 'https://backuply.com/');
define('BACKUPLY_PRO_URL', 'https://backuply.com/pricing?from=plugin');

include_once(BACKUPLY_DIR.'/functions.php');

function backuply_died() {
	//backuply_log(serialize(error_get_last()));
	
	$last_error = error_get_last();

	if(!$last_error){
		return false;
	}

	// To show the memory limit error.
	if(!empty($last_error['message']) && strpos($last_error['message'], 'Allowed memory size') !== FALSE){
		backuply_status_log($last_error['message'] . ' you can solve this issue by increasing PHP memory limit', 'error');
	}
	
	// To show maximum time out error.
	if(!empty($last_error['message']) && strpos($last_error['message'], 'Maximum execution time') !== FALSE){
		backuply_status_log($last_error['message'] . ' you can solve this issue by increasing PHP max_execution_time', 'error');
		backuply_kill_process();
	}

	if(!empty($last_error['message']) && !empty($last_error['types']) && $last_error['types'] == 1){
		backuply_status_log($last_error['message'] . ' ' . $last_error['line'] . ' ' .$last_error['file'] . '', 'warning');
	}

}
register_shutdown_function('backuply_died');

// Ok so we are now ready to go
register_activation_hook(BACKUPLY_FILE, 'backuply_activation');

// Is called when the ADMIN enables the plugin
function backuply_activation(){
	global $wpdb, $error;

	update_option('backuply_version', BACKUPLY_VERSION);
	
	backuply_create_backup_folders();
	backuply_add_htaccess();
	backuply_add_web_config();
	backuply_add_index_files();
	backuply_set_config();
	backuply_set_status_key();
	backuply_add_litespeed_noabort();
}

// The function that will be called when the plugin is loaded
add_action('plugins_loaded', 'backuply_load_plugin');

function backuply_load_plugin(){
	global $backuply;
	
	// Set the array
	if(empty($backuply)){
		$backuply = array();
	}

	$backuply['settings'] = get_option('backuply_settings', []);
	$backuply['cron'] = get_option('backuply_cron_settings', []);
	$backuply['auto_backup'] = false;

	if(!defined('BACKUPLY_PRO')){
		$backuply['license'] = get_option('backuply_license', []);
	}

	$backuply['status'] = get_option('backuply_status');
	$backuply['excludes'] = get_option('backuply_excludes');
	$backuply['htaccess_error'] = true;
	$backuply['index_html_error'] = true;
	$backuply['debug_mode'] = !empty(get_option('backuply_debug')) ? true : false;
	$backuply['bcloud_key'] = get_option('bcloud_key', '');
	
	backuply_update_check();
	
	if(!defined('BACKUPLY_PRO') && !empty($backuply['bcloud_key'])){
		include_once BACKUPLY_DIR . '/main/bcloud-cron.php';
	}
	
	add_action('init', 'backuply_handle_self_call'); // To make sure all plugins are loaded.
	add_action('backuply_clean_tmp', 'backuply_delete_tmp'); // This is for daily cleaning of backups folder.
	add_action('backuply_update_quota', 'backuply_schedule_quota_updation'); // This is for scheduled quota updation
	
	if(file_exists(BACKUPLY_BACKUP_DIR . '.htaccess')) {
		$backuply['htaccess_error'] = false;
	}

	if(file_exists(BACKUPLY_BACKUP_DIR . 'index.html')) {
		$backuply['index_html_error'] = false;
	}

	add_filter('cron_schedules', 'backuply_add_cron_interval');
	
	if(is_admin()){
		include_once BACKUPLY_DIR .'/main/admin.php';
	}

	// Cron for Backing Up Files/Database
	add_action('backuply_backup_cron', 'backuply_backup_execute');
	
	// Cron to check for timeout
	add_action('backuply_timeout_check', 'backuply_timeout_check');
}

// If we are doing ajax and its a backuply ajax
if(wp_doing_ajax()){
	include_once(BACKUPLY_DIR.'/main/ajax.php');
}

/**
  * Looks if Backuply just got updated.
 */
function backuply_update_check(){
	
	$sql = array();
	$current_version = get_option('backuply_version');	
	$version = (int) str_replace('.', '', $current_version);
	
	// No update required
	if($current_version == BACKUPLY_VERSION){
		return true;
	}
	
	// Is it first run ?
	if(empty($current_version)){
		backuply_activation();
		return;
	}
	
	if($version < 108){
		backuply_create_backup_folders();
		backuply_add_web_config();
		backuply_add_index_files();
	}
	
	if($version < 109){
		backuply_update_restore_key();
	}
	
	if($version < 120){
		backuply_keys_to_db();
		
		$cron_settings = get_option('backuply_cron_settings');
		
		// Updates both Backuply key and Restore key if custom cron is not enabled.
		if(!empty($cron_settings) && !empty($cron_settings['backuply_cron_schedule']) && $cron_settings['backuply_cron_schedule'] !== 'custom'){
			backuply_set_config();
		}
	}
	
	// Save the new Version
	update_option('backuply_version', BACKUPLY_VERSION);
	backuply_set_status_key(); // We will update the status key on every update to decrease chances of it being stolen.
	
}

// List of core files to backup
function backuply_core_fileindex(){
	$default_fileindex = array('index.php', 'license.txt', 'readme.html', 'wp-activate.php', 'wp-admin', 'wp-blog-header.php', 'wp-comments-post.php', 'wp-config-sample.php', 'wp-content', 'wp-cron.php', 'wp-includes', 'wp-links-opml.php', 'wp-load.php', 'wp-login.php', 'wp-mail.php', 'wp-settings.php', 'wp-signup.php', 'wp-trackback.php', 'xmlrpc.php', '.htaccess', 'wp-config.php');

	return $default_fileindex;
}

// Cron Schedules for WordPress cron
function backuply_add_cron_interval($schedules){
	// 30 Min
	$schedules['backuply_thirty_min'] = array(
		'interval' => 1800,
		'display'  => esc_html__( 'Every 30 Minutes' )
	);
	
	$schedules['backuply_one_hour'] = array(
		'interval' => 3600,
		'display'  => esc_html__( 'Every One Hour' )
	);

	$schedules['backuply_two_hours'] = array(
		'interval' => 7200,
		'display'  => esc_html__( 'Every Two Hours' )
	);
	
	$schedules['backuply_daily'] = array(
		'interval' => 86400,
		'display'  => esc_html__( 'Once a day' )
	);

	$schedules['backuply_weekly'] = array(
		'interval' => 604800,
		'display' => esc_html__('Once a Week')
	);
	
	$schedules['backuply_monthly'] = array(
		'interval' => 2635200,
		'display' => esc_html__('Once a month')
	);
	
	return $schedules;
}

// Initiates the backup
function backuply_backup_execute(){
	global $wpdb, $backuply, $data;
	
	// Updates the $backuply['status'] var
	$is_active = backuply_active();
	
	if(empty($backuply['status'])){
		return;
	}

	// Update the last active time
	$backuply['status']['last_update'] = time();
	update_option('backuply_status', $backuply['status']);
	
	// Informaton regarding remote location
	$remote_location = '';

	if(!empty($backuply['status']['backup_location'])){
		$backuply_remote_backup_locs = get_option('backuply_remote_backup_locs');
		$backup_location_id = $backuply['status']['backup_location'];
		$remote_location = $backuply_remote_backup_locs[$backup_location_id];
	}

	include(BACKUPLY_DIR.'/backup_ins.php');
	
}

function backuply_handle_self_call(){
	// CURL call for bacukup when its incomplete
	if(isset($_GET['action'])  && ($_GET['action'] === 'backuply_curl_backup' || $_GET['action'] === 'backuply_curl_upload')) {

		if(!wp_verify_nonce(backuply_optreq('security'), 'backuply_nonce')){
			backuply_status_log('Security Check Failed', 'error');
			die();
		}

		backuply_backup_execute();
		wp_send_json(array('success' => true));
	}
}


// Sorry to see you going
register_uninstall_hook(BACKUPLY_FILE, 'backuply_deactivation');

function backuply_deactivation(){	
	delete_option('backuply_version');
	delete_option('backuply_cron_schedules');
	delete_option('backuply_cron_settings');
	delete_option('backuply_remote_backup_locs');
	delete_option('backuply_notify_email_address');
	delete_option('backuply_settings');
	delete_option('backuply_license');
	delete_option('backuply_hide_trial');
	delete_option('backuply_promo_time');
	delete_option('backuply_backup_stopped');
	delete_option('backuply_last_restore');
	delete_option('backuply_last_backup');
	delete_option('backuply_hide_holiday');
	delete_option('backuply_excludes');
	delete_option('backuply_black_friday');
	delete_option('backuply_debug');
	delete_option('external_updates-backuply-pro');
	delete_option('backuply_offer_time');	
	delete_option('backuply_backup_nag');
	delete_option('backuply_config_keys');
	
	// Cleaning all the cron events
	wp_clear_scheduled_hook('backuply_clean_tmp');
	wp_clear_scheduled_hook('backuply_timeout_check');
}
main/license.php000064400000017202151526424670007641 0ustar00<?php

if(!defined('ABSPATH')) {
	die('HACKING ATTEMPT!');
}

include_once BACKUPLY_DIR . '/main/settings.php';

// Handles submission of license
function backuply_license(){
	global $backuply, $lic_resp;

	check_admin_referer('backuply_license_form', 'backuply_license_nonce');
	
	if(!empty($_POST['delete_backuply_license'])){
		delete_option('backuply_license');
		$backuply['license'] = [];
		add_settings_error('backuply-notice', esc_attr('settings_updated'), esc_html__('The license has been deleted successfully.', 'backuply'), 'success');
		return;
	}
	
	$license = sanitize_key(backuply_optpost('backuply_license'));
	
	if(empty($license)) {
		add_settings_error('backuply-notice', esc_attr( 'settings_updated' ), esc_html__('The license key was not submitted', 'backuply'), 'error');
		
		return;
	}
	
	if(!function_exists('backuply_load_license')){
	
		$lic_resp = wp_remote_get(BACKUPLY_API.'/license.php?license='.$license.'&url='.rawurlencode(esc_url_raw(site_url())), array('timeout' => 30, 'sslverify' => false));

	}else{
		
		backuply_load_license($license);
		
	}

	if(is_array($lic_resp)){
		$json = json_decode($lic_resp['body'], true);
	}else{
		add_settings_error('backuply-notice', esc_attr( 'settings_updated' ), esc_html__('The response was malformed', 'backuply').'<br>'.var_export($lic_resp, true), 'error');
		return;
	}
	
	// Save the License
	if(empty($json['license'])){
		add_settings_error('backuply-notice', esc_attr( 'settings_updated' ), esc_html__('The license key is invalid', 'backuply'), 'error');
		
		return;
	}
	
	if(!function_exists('backuply_load_license')){
		
		if(get_option('backuply_license')) {
			update_option('backuply_license', $json);
		} else{
			add_option('backuply_license', $json);
		}
		
		$backuply['license'] = $json;
		
	}
}


function backuply_license_page() {
	global $backuply;
	
	if(!empty($_POST['save_backuply_license']) || !empty($_POST['delete_backuply_license'])){
		backuply_license();
	}
	
	// Update Cloud key and URL
	if(!empty($_POST['save_backuply_cloud_key'])){
		backuply_cloud_update();
	}
	
	backuply_page_header('License');
	settings_errors('backuply-notice');

	?>
		<table class="wp-list-table fixed striped users backuply-license-table" cellspacing="1" border="0" width="95%" cellpadding="10" align="center">
			<tbody>
				<tr>
					<th align="left" width="25%">Backuply Version</th>
					<td><?php
						echo BACKUPLY_VERSION.(defined('BACKUPLY_PRO') ? ' (Pro Version)' : '');
					?>
					</td>
				</tr>
				<tr>
					<th align="left" valign="top">Backuply License</th>
					<td align="left">
						<form method="post">
							<span style="color:red"><?php echo (defined('BACKUPLY_PRO') && empty($backuply['license']) ? '<span style="color:red">Unlicensed</span> &nbsp; &nbsp;' : '')?></span>

							<input type="text" name="backuply_license" value="<?php echo (empty($backuply['license']) || empty($backuply['license']['license']) ? '' : esc_html($backuply['license']['license']))?>" size="30" placeholder="e.g. BAKLY-11111-22222-33333-44444" style="width:300px;"> &nbsp;
							<?php wp_nonce_field( 'backuply_license_form','backuply_license_nonce' ); ?>
							<input name="save_backuply_license" class="button button-primary" value="Update License" type="submit">
							
							<?php 
							if(!empty($backuply['license']) && !empty($backuply['license']['license']) && strpos($backuply['license']['license'], 'BAKLY') === 0){
								echo '<input name="delete_backuply_license" class="button" value="'.esc_html__('Delete License', 'backuply').'" type="submit">';
							}
							?>
						</form>
						<?php
						if(!empty($backuply['license']) && !empty($backuply['license']['expires'])){

							$expires = $backuply['license']['expires'];
							$expires = substr($expires, 0, 4).'/'.substr($expires, 4, 2).'/'.substr($expires, 6);
							
							echo '<div style="margin-top:10px;">License Status : '.(empty($backuply['license']['status_txt']) ? 'N.A.' : wp_kses_post($backuply['license']['status_txt'])).' &nbsp; &nbsp; &nbsp;';

							if(empty($backuply['license']['has_plid']) || $backuply['license']['expires'] <= date('Ymd')){
								echo 'License Expires : '.($backuply['license']['expires'] <= date('Ymd') ? '<span style="color:red">'.esc_html($expires).'</span>' : esc_html($expires));
							}
							echo '</div>';
						}

						if(!empty($backuply['license']['quota']) && !empty($backuply['license']['quota'])){
							echo '<div style="margin-top:3px;">Cloud Storage: '.size_format(esc_html($backuply['license']['quota'])).'</div>';
						}
						
						if(defined('BACKUPLY_PRO') && !empty($backuply['license']['plan']) && $backuply['license']['plan'] == 'bcloud' && !empty($backuply['license']['active'])){
							$soft_wp_lic = get_option('softaculous_pro_license', []);
							
							if(!empty($soft_wp_lic['license']) && !empty($soft_wp_lic['active'])){
								echo '<div><span class="dashicons dashicons-info"></span>'.esc_html__('The Pro version will be updated using', 'backuply').' <strong><em>'.esc_html($soft_wp_lic['license']).'</em></strong></div>';
							}
						}

						?>
					</td>
				</tr>

				<tr>
					<th align="left" valign="top">Backuply Cloud Key</th>
					<?php

					echo '<td align="left">

						<div style="display:flex; flex-direction:column;">
							<form method="post">
								<label>
									<input type="text" name="bcloud_key" value="'.(!empty($backuply['bcloud_key']) ? esc_attr($backuply['bcloud_key']) : '').'" size="30" placeholder="Your Backuply Cloud Key" style="width:300px;">
									'.wp_nonce_field('backuply_cloud_form', 'backuply_cloud_nonce').'
									<input name="save_backuply_cloud_key" class="button button-primary" value="Update Cloud Key" type="submit">
									<p class="description">'.__('Backuply Cloud requires both a Backuply License and a Cloud Key.', 'backuply').'<br>'.__('The license comes with your plan, and the Cloud Key is automatically generated when you add a Backuply Cloud location for the first time on a site.', 'backuply').'<br/>
									'.__('For more details, please refer to the', 'backuply').'&nbsp;<a href="https://backuply.com/docs/backuply-cloud/how-to-get-backuply-cloud-key/" target="_blank">'.__('documentation', 'backuply').'</a></p>
								</label>
							</form>
							<label>
							<input type="text" value="'.site_url().'" size="30" placeholder="Backuply Cloud Linked Site URL" style="width:300px;" readonly>
							<p class="description">Site URL</p>
							</label>
								
						</div>
							
					</td>';
					?>
				</tr>
				<tr>
					<th align="left">URL</th>
					<td><?php echo esc_url(get_site_url()); ?></td>
				</tr>
				<tr>				
					<th align="left">Path</th>
					<td><?php echo ABSPATH; ?></td>
				</tr>
				<tr>				
					<th align="left">Server's IP Address</th>
					<td><?php echo !empty($_SERVER['SERVER_ADDR']) ? wp_kses_post(wp_unslash($_SERVER['SERVER_ADDR'])) : '-'; ?></td>
				</tr>
				<tr>
					<th align="left">.htaccess is writable</th>
					<td><?php echo (is_writable(ABSPATH.'/.htaccess') ? '<span style="color:red">Yes</span>' : '<span style="color:green">No</span>');?></td>
				</tr>		
			</tbody>
		</table>
	</td>
	<td>
		<?php backuply_promotion_tmpl(); ?>
	</td>
</tr>
</table>
</div>
</div>
</div>
</div>
	
<?php
}

function backuply_cloud_update(){
	global $backuply;

	if(!wp_verify_nonce($_POST['backuply_cloud_nonce'], 'backuply_cloud_form')){
		echo 'Security Check Failed';
		return false;
	}
	
	$backuply['bcloud_key'] = sanitize_text_field($_POST['bcloud_key']);
	update_option('bcloud_key', $backuply['bcloud_key']);
}


main/promo.php000064400000043711151526424670007357 0ustar00<?php

if(!defined('ABSPATH')){
	die();
}

echo '
<style>
.backuply_button {
background-color: #4CAF50; /* Green */
border: none;
color: white;
padding: 8px 16px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 16px;
margin: 4px 2px;
-webkit-transition-duration: 0.4s; /* Safari */
transition-duration: 0.4s;
cursor: pointer;
}

.backuply_button:focus{
border: none;
color: white;
}

.backuply_button1 {
color: white;
background-color: #4CAF50;
border:3px solid #4CAF50;
}

.backuply_button1:hover {
box-shadow: 0 6px 8px 0 rgba(0,0,0,0.24), 0 9px 25px 0 rgba(0,0,0,0.19);
color: white;
border:3px solid #4CAF50;
}

.backuply_button2 {
color: white;
background-color: #0085ba;
}

.backuply_button2:hover {
box-shadow: 0 6px 8px 0 rgba(0,0,0,0.24), 0 9px 25px 0 rgba(0,0,0,0.19);
color: white;
}

.backuply_button3 {
color: white;
background-color: #365899;
}

.backuply_button3:hover {
box-shadow: 0 6px 8px 0 rgba(0,0,0,0.24), 0 9px 25px 0 rgba(0,0,0,0.19);
color: white;
}

.backuply_button4 {
color: white;
background-color: rgb(66, 184, 221);
}

.backuply_button4:hover {
box-shadow: 0 6px 8px 0 rgba(0,0,0,0.24), 0 9px 25px 0 rgba(0,0,0,0.19);
color: white;
}

.backuply_promo-close{
float:right;
text-decoration:none;
margin: 5px 10px 0px 0px;
}

.backuply_promo-close:hover{
color: red;
}

#backuply_promo li {
list-style-position: inside;
list-style-type: circle;
}

.backuply-loc-types {
display:flex;
flex-direction: row;
align-items:center;
flex-wrap: wrap;
}

.backuply-loc-types li{
list-style-type:none !important;
margin-right: 10px;
}

.backuply-free-trial{
position:relative;
width:99%;
background-color: #000;
color:#FFF;
font-weight:500;
border-radius:4px;
padding:20px;
box-sizing:border-box;
margin-top: 10px;
}

.backuply-promo-dismiss{
position:absolute;
top:10px;
right:10px;
color:white;
}

</style>

<script>
jQuery(document).ready( function() {
	(function($) {
		$("#backuply_promo .backuply_promo-close").click(function(){
			var data;
			
			// Hide it
			$("#backuply_promo").hide();
			
			// Save this preference
			$.post("'.admin_url('?backuply_promo=0').'&security='.wp_create_nonce('backuply_promo_nonce').'", data, function(response) {
				//alert(response);
			});
		});
		
		$("#backuply_offer .backuply_offer-close").click(function(){
			var data;
			
			// Hide it
			$("#backuply_offer").hide();
			
			// Save this preference
			$.post("'.admin_url('?backuply_offer=0').'&security='.wp_create_nonce('backuply_promo_nonce').'", data, function(response) {
				//alert(response);
			});
		});
		
		$("#backuply_holiday_promo .backuply_promo-close").click(function(){
			var data;
			
			// Hide it
			$("#backuply_holiday_promo").hide();
			
			// Save this preference
			$.post("'.admin_url('?backuply_holiday_promo=0').'&security='.wp_create_nonce('backuply_promo_nonce').'", data, function(response) {
				//alert(response);
			});
		});
		
		$("#backuply_license_notice .backuply_promo-close").click(function(){
			var data;
			
			// Hide it
			$("#backuply_license_notice").hide();
			
			// Save this preference
			$.post("'.admin_url('?backuply_license_notice=0').'&security='.wp_create_nonce('backuply_promo_nonce').'", data, function(response) {
				//alert(response);
			});
		});
		
		$("#backuply-litespeed-notice .backuply_promo-close").on("click", function(){
			var data;
			
			// Hide it
			$("#backuply-litespeed-notice").hide();
			
			// Save this preference
			$.post("'.admin_url('admin-ajax.php?action=backuply_close_litespeed_notice').'&security='.wp_create_nonce('backuply_promo_nonce').'", data, function(response) {
				//alert(response);
			});
		});
		
		$("#backuply-plugin-update-notice").on("click", function(e){
			let target = jQuery(e.target);

			if(!target.hasClass("notice-dismiss")){
				return;
			}

			var data;
			
			// Hide it
			$("#backuply-plugin-update-notice").hide();
			
			// Save this preference
			$.post("'.admin_url('admin-ajax.php?action=backuply_close_update_notice').'&security='.wp_create_nonce('backuply_promo_nonce').'", data, function(response) {
				//alert(response);
			});
		});
	})(jQuery);
});
</script>';

function backuply_base_promo(){
	echo '<div class="notice notice-success" id="backuply_promo" style="min-height:120px; background-color:#FFF; padding: 10px;">
	<a class="backuply_promo-close" href="javascript:" aria-label="Dismiss this Notice">
		<span class="dashicons dashicons-dismiss"></span> Dismiss
	</a>
	<table>
	<tr>
		<th>
			<img src="'.BACKUPLY_URL.'/assets/images/backuply-square.png" style="float:left; margin:10px 20px 10px 10px" width="100" />
		</th>
		<td>
			<p style="font-size:16px;">You have been using Backuply for few days and we hope we were able to add some value through Backuply.
			</p>
			<p style="font-size:16px">
			If you like our plugin would you please show some love by doing actions like
			</p>
			<p>
				<a class="backuply_button backuply_button1" target="_blank" href="https://backuply.com/pricing">Upgrade to Pro</a>
				<a class="backuply_button backuply_button2" target="_blank" href="https://wordpress.org/support/view/plugin-reviews/backuply">Rate it 5★\'s</a>
				<a class="backuply_button backuply_button3" target="_blank" href="https://www.facebook.com/backuply/">Like Us on Facebook</a>
				<a class="backuply_button backuply_button4" target="_blank" href="https://twitter.com/intent/tweet?text='.rawurlencode('I use @wpbackuply to backup my #WordPress site - https://backuply.com').'">Tweet about Backuply</a>
			</p>
	</td>
	</tr>
	</table>
</div>';
}

function backuply_holiday_offers(){

	$time = date('nj');

	if($time == 1225 || $time == 1224){
		backuply_christmas_offer();
	}
	
	if($time == 11){
		backuply_newyear_offer();
	}
}

function backuply_christmas_offer(){
	echo '<div class="notice notice-success" id="backuply_holiday_promo" style="min-height:120px; background-color:#FFF; padding: 10px;">
	<a class="backuply_promo-close" href="javascript:" aria-label="Dismiss this Notice">
		<span class="dashicons dashicons-dismiss"></span> Dismiss
	</a>
	<table>
	<tr>
		<th>
			<img src="'.BACKUPLY_URL.'/assets/images/25off.png" style="float:left; margin:10px 20px 10px 10px" width="100" />
		</th>
		<td><h2>Backuply Wishes you Merry Christmas 🎄</h2>
	<p style="font-size:16px">We are offering 25% off on every Backuply Plan today, so upgrade to Backuply Pro now and forget the need to create backups manully with Backuply\'s Auto Backups.</p>
	<a class="backuply_button backuply_button1" target="_blank" href="https://backuply.com/pricing">Upgrade to Pro</a>
	</td>
	</tr>
	</table>
</div>';
}

function backuply_newyear_offer(){
	echo '<div class="notice notice-success" id="backuply_holiday_promo" style="min-height:120px; background-color:#FFF; padding: 10px;">
	<a class="backuply_promo-close" href="javascript:" aria-label="Dismiss this Notice">
		<span class="dashicons dashicons-dismiss"></span> Dismiss
	</a>
	<table>
	<tr>
		<th>
			<img src="'.BACKUPLY_URL.'/assets/images/25off.png" style="float:left; margin:10px 20px 10px 10px" width="100" />
		</th>
		<td><h2>Backuply Wishes you a Happy New Year 🎉</h2>
	<p style="font-size:16px">We are offering 25% off on every Backuply Plan today, so upgrade to Backuply Pro now and forget the need to create backups manully with Backuply\'s Auto Backups.</p>
	<a class="backuply_button backuply_button1" target="_blank" href="https://backuply.com/pricing">Upgrade to Pro</a>
	</td>
	</tr>
	</table>
</div>';
}

function backuply_litespeed_notice(){
	echo '<div class="notice notice-info" id="backuply-litespeed-notice">
		<a class="backuply_promo-close" href="javascript:" aria-label="Dismiss this Notice">
			<span class="dashicons dashicons-dismiss"></span> Dismiss for 30 days
		</a>
        <p>'.esc_html__('Your website is running on LiteSpeed server, it might cause issue creating a backup, please', 'backuply').' <a href="https://backuply.com/docs/common-issues/litespeed-killing-process/" target="_blank">follow this guide to fix this issue.</a></p>
    </div>';
}

function backuply_free_trial(){
	global $backuply, $error;
	
	$has_license = false;
	
	if(defined('BACKUPLY_PRO') && !empty($backuply['license']['license'])){
		$has_license = true;
	}
	
	$verification_wait = false;
	
	if(empty($backuply['bcloud_key']) && !empty($_GET['license']) && !empty($_GET['token'])){
		if($_GET['token'] !== get_transient('bcloud_trial_token')){
			$error[] = 'Your Security Check failed!';
		} else {
			delete_transient('bcloud_trial_token');
			
			$license = sanitize_text_field($_GET['license']);
			
			if(!empty($backuply['license'])){
				$error[] = __('You already have a license linked to this WordPress install, you dont need trial license you can directly add Backuply Cloud', 'backuply');
			}
			
			backuply_update_trial_license($license);
			
			if(empty($error)){
				$verification_wait = true;
			}
			
		}
	}
	
	$token = wp_generate_password(32,false);
	set_transient('bcloud_trial_token', $token, 3600);
	

	echo '<div class="notice notice-success" id="backuply_free-trial" style="min-height:120px; background-color:#FFF; padding: 10px;">
	<a class="backuply_promo-close" href="javascript:" aria-label="Dismiss this Notice">
		<span class="dashicons dashicons-dismiss"></span> Dismiss
	</a>
	<table>
	<tr>
		<th>
			<img src="'.BACKUPLY_URL.'/assets/images/backuply-square.png" style="float:left; margin:10px 20px 10px 10px" width="100" />
		</th>
		<td>
			<p style="font-size:16px; font-weight:bold;">Stress free backups in Cloud</p>
			<p style="font-size:16px">';
			
			if(defined('BACKUPLY_PRO')){
				echo 'With Backuply Pro you get 10GB free storage on Backuply Cloud. Start backing up your website today !<br>
				Backuply Cloud is a secure and reliable cloud backup service that makes it easy to protect your website data.';
			} else {
				echo 'Try Backuply Cloud for free for 30 days with 10GB of storage. With just a click store your WordPress backups on our Cloud. Backups are the best form of security, never lose your data with Backuply Cloud.';
			}

			echo '</p>
			<button class="button button-primary" id="backuply-cloud-trial">Try Now</button>
		</td>
	</tr>
	</table>
	</div>
	<div id="bcloud-dialog" title="Backuply Cloud Trial" style="display:none;">
		<div class="backuply-cloud-state">
			<div class="bcloud-trial-email" '.(!empty($has_license) || !empty($verification_wait) ? esc_html('style=display:none;') : '').'>
				<h2>Get a Trial License</h2>
				<p>Click on the button below and you will be redirected <b>backuply.com</b> to register for a Trail License</p>
				<a href="'.BACKUPLY_API . '/cloud/new_account.php?token='.esc_attr($token).'&callback='.admin_url('admin.php?page=backuply').'" class="button button-primary backuply-email-link">Create a Trial License</a>
				<p><input type="checkbox" id="backuply_has_license"/>I have a License</p>
			</div>
			<div class="backuply-bcloud-trial-verify" '.(empty($verification_wait) ? esc_html('style=display:none;') : '').'>
				<p>A trial license has been created please go to your email and verify</p>
				<p>If you have completed the verification then</p>
				<input type="checkbox" name="backuply-verify-checkbox" id="backuply-verify-checkbox"/>I confirm that I have verified email
				<button class="button button-primary backuply-verify-email" disabled>Click here</button><span class="spinner"></span>
			</div>

			<div class="bcloud-trial-license" '.(empty($has_license) ? esc_html('style=display:none;') : '').'>
				<h2>Enter your License</h2>
				<p>Your License will be used to generate a key to connect to Backuply Cloud</p>
				<input type="text" style="width:100%" value="'.(empty($backuply['license']) || empty($backuply['license']['license']) ? '' : esc_attr($backuply['license']['license'])).'" placeholder="BAKLY-00000-11111-22222-44444" name="backuply_license"/><br/>';
				
				if(!defined('BACKUPLY_PRO')){
					echo '<p><input type="checkbox" id="backuply_no_license"/>Does not have a license</p>';
				}
				
				echo '<button class="button button-primary backuply-license-link" style="margin-top:10px;">Submit</button><span class="spinner"></span>
			</div>
		</div>';

		if(!empty($backuply['cron'])){
			echo '<div class="backuply-cloud-trial-settings" style="display:none;">
				<h3>Updating Settings</h3>
				<p>We have detected that you have a default storage and schedule already set. Do you want to set Backuply Cloud as your default backup location ?</p>
				<div style="text-align:center;">
					<button class="button button-primary backuply-default-yes">Yes</button>
					<button class="button backuply-default-no">No</button>
				</div>
			</div>';
		}

		echo '
		
		<div class="backuply-cloud-state" style="text-align:center; display:none;">
			<p>Integration has been successful now you can try creating Backup on Backuply Cloud</p>
			<a href="'.admin_url('admin.php?page=backuply').'" class="button button-primary">Start Creating Backups to Backuply Cloud</a>
		</div>
	</div>
	';
}

function backuply_promo_scripts(){
	wp_enqueue_script('backuply-promo', BACKUPLY_URL . '/assets/js/promo.js', array('jquery', 'jquery-ui-dialog'), BACKUPLY_VERSION);
	wp_enqueue_style('backuply-dialog', BACKUPLY_URL . '/assets/css/base-jquery-ui.css', [], BACKUPLY_VERSION);
	
	wp_localize_script('backuply-promo', 'backuply_promo', array(
		'nonce' => wp_create_nonce('backuply_trial_nonce'),
		'ajax' => admin_url('admin-ajax.php')
	));
}

function backuply_update_trial_license($license){
	global $backuply, $error;

	$resp = wp_remote_get(BACKUPLY_API.'/license.php?license='.$license.'&url='.rawurlencode(site_url()), array('timeout' => 30));
	$json = json_decode($resp['body'], true);

	if(empty($json['license'])){
		$error[] = __('There was issue fetching License details', 'backuply');
	}
	
	$backuply['license'] = $json;
	update_option('backuply_license', $backuply['license']);
}

function backuply_regular_offer(){
	
	// The time period this should be visible to the users.
	if(time() > strtotime('20 October 2023')){
		return;
	}

	echo '<div class="notice notice-success" id="backuply_offer" style="min-height:120px; background-color:#FFF; padding: 10px;">
	<a class="backuply_offer-close" href="javascript:" aria-label="Dismiss this Notice">
		<span class="dashicons dashicons-dismiss"></span> Dismiss for 6 months
	</a>
	<table>
	<tr>
		<th>
			<img src="'.BACKUPLY_URL.'/assets/images/30off.png" style="float:left; margin:10px 20px 10px 10px" width="100" />
		</th>
		<td><p style="font-size:16px">Backuply is offering a 30% discount on all subscription plans today! Upgrade to Backuply Pro and receive up to 100 GB of cloud storage, and forget about manually creating backups with our automatic backups feature. Use the code <strong>NEW30</strong> to receive this offer.</p>
		<a class="backuply_button backuply_button1" target="_blank" href="https://backuply.com/pricing">Upgrade to Pro</a>
	</td>
	</tr>
	</table>
	</div>
	</div>';

}

function backuply_check_expires(){
	global $backuply;
	
	// We do not want to show the expiry notice if the license is by SoftWP.
	if(!empty($backuply['license']) && !empty($backuply['license']['has_plid'])){
	    return;
	}

	$current_timestamp = time();
	$expiration_timestamp = strtotime($backuply['license']['expires']);
	$time_diff = $expiration_timestamp - $current_timestamp;
	
	// Renew link
	$backuply_user_license = $backuply['license']['license'];
	$backuply_user_plan = $backuply['license']['plan'];
	$backuply_renew_url = 'https://www.softaculous.com/clients?ca=backuply_buy&plan=' . $backuply_user_plan . '&license=' . $backuply_user_license;

	if($time_diff > 0 && $time_diff <= WEEK_IN_SECONDS){
		$human_time = human_time_diff($current_timestamp, $expiration_timestamp);

		echo '<div class="notice notice-error" id="backuply_license_notice">
		<a class="backuply_promo-close" href="javascript:" aria-label="Dismiss this Notice">
			<span class="dashicons dashicons-dismiss"></span> '.esc_html__('Dismiss for 60 days', 'backuply').'
		</a>
		<p>' . sprintf(esc_html__('Alert : Your Backuply license will expire in %s. Renew to keep getting updates!', 'backuply'), esc_html($human_time)).'
		<a href="' . esc_url($backuply_renew_url) . '" target="_blank">' . esc_html__('Click here to renew', 'backuply') . '</a>
		</p>
		</div>';

	} else if($time_diff <= 0){
		echo '<div class="notice notice-error" id="backuply_license_notice">
		<a class="backuply_promo-close" href="javascript:" aria-label="Dismiss this Notice">
			<span class="dashicons dashicons-dismiss"></span> '.esc_html__('Dismiss for 60 days', 'backuply').'
		</a>
		<p>' . esc_html__('Alert: Your Backuply license has expired. Please renew immediately to keep getting updates ', 'backuply').'
		<a href="' . esc_url($backuply_renew_url) . '" target="_blank">' . esc_html__('Click here to renew', 'backuply') . '</a></p>
		</div>';
	}
}

function backuply_update_notice(){
	if(defined('SOFTACULOUS_PLUGIN_UPDATE_NOTICE')){
		return;
	}

	$to_update_plugins = apply_filters('softaculous_plugin_update_notice', []);

	if(empty($to_update_plugins)){
		return;
	}

	/* translators: %1$s is replaced with a "string" of name of plugins, and %2$s is replaced with "string" which can be "is" or "are" based on the count of the plugin */
	$msg = sprintf(__('New versions of %1$s %2$s available. Updating ensures better performance, security, and access to the latest features.', 'backuply'), '<b>'.esc_html(implode(', ', $to_update_plugins)).'</b>', (count($to_update_plugins) > 1 ? 'are' : 'is')) . ' <a class="button button-primary" href='.esc_url(admin_url('plugins.php?plugin_status=upgrade')).'>Update Now</a>';

	define('SOFTACULOUS_PLUGIN_UPDATE_NOTICE', true); // To make sure other plugins don't return a Notice
	echo '<div class="notice notice-info is-dismissible" id="backuply-plugin-update-notice">
		<p>'.$msg. '</p>
	</div>';
}
main/admin.php000064400000026507151526424670007317 0ustar00<?php

if(!defined('ABSPATH')){
	die('HACKING ATTEMPT!');
}

add_action('admin_init', 'backuply_admin_init');
add_action('admin_menu', 'backuply_admin_menu');

function backuply_admin_init(){
	$showing_promo = false; // flag for single nag
	
	if(current_user_can('install_plugins')){
		add_filter('upload_mimes', 'backuply_add_mime_types'); // In case tar or gz are not supported
		add_action('admin_post_backuply_download_backup', 'backuply_direct_download_file');

		// === Trial Promo ===
		$trial_time = get_option('backuply_hide_trial', 0);
		
		// It will show one day after install
		if(empty($trial_time)){
			$trial_time = time();
			update_option('backuply_hide_trial', $trial_time, false);
		}

		if($trial_time >= 0 && empty($backuply['bcloud_key']) && $trial_time < (time() - (86400)) && isset($_GET['page']) && $_GET['page'] === 'backuply'){
			$showing_promo = true;
			add_action('admin_notices', 'backuply_free_trial_promo');
		}
		// === Trial Promo Ends here === //
		
		// === Last Backup Notice Start === //
		// Backup notice for user to backup the if its been a week user took a backup
		$last_backup = get_option('backuply_last_backup');
		$backup_nag = get_option('backuply_backup_nag');
		
		// We want to show it one day after install.
		if(empty($backup_nag)){
			update_option('backuply_backup_nag', time() - 518400, false);
		}
		
		if((time() - $last_backup) >= 604800 && (time() - $backup_nag) >= 604800){
			add_action('admin_notices', 'backuply_backup_nag');
		}
		
		// === Last Backup Notice End === //
		
		// === License Notice Start === //
		// Are we to disable the license notice for 2 months.
		if(isset($_REQUEST['backuply_license_notice']) && (int)$_REQUEST['backuply_license_notice'] == 0 ){
			if(!wp_verify_nonce(backuply_optreq('security'), 'backuply_promo_nonce')) {
				die('Security Check Failed');
			}

			update_option('backuply_license_notice', (0 - time()), false);
			die('DONE');
		}
		
		$backuply_license_notice = get_option('backuply_license_notice', 0);
		
		if(empty($backuply_license_notice)){
			$backuply_license_notice = time();
			update_option('backuply_license_notice', $backuply_license_notice);
		}

		// Here we are making sure that we have license and Cloud trial has ended and if dismissed it does not shows for next 2 months.
		if(!empty($backuply['license']) && !empty($backuply['license']['expires']) && isset($_GET['page']) && strpos($_GET['page'], 'backuply') !== FALSE && get_option('bcloud_trial_time', 0) <= 0 && ($backuply_license_notice > 0 || (abs($backuply_license_notice) + MONTH_IN_SECONDS * 2) < time())){
			$current_timestamp = time();
			$expiration_timestamp = strtotime($backuply['license']['expires']);
			$timediff = $expiration_timestamp - $current_timestamp;

			if($timediff <= WEEK_IN_SECONDS){
				add_action('admin_notices', 'backuply_license_renew');
			}
		}
		
		// === License Notice End === //
		
		// === Plugin Update Notice === //
		$plugin_update_notice = get_option('softaculous_plugin_update_notice');
		$available_update_list = get_site_transient('update_plugins'); 

		if(
			!empty($available_update_list) &&
			!empty($available_update_list->response) &&
			!empty($available_update_list->response['backuply/backuply.php']) && 
			(empty($plugin_update_notice) || empty($plugin_update_notice['backuply/backuply.php']) || (!empty($plugin_update_notice['backuply/backuply.php']) &&
			version_compare($plugin_update_notice['backuply/backuply.php'], $available_update_list->response['backuply/backuply.php']->new_version, '<')))
		){
			add_action('admin_notices', 'backuply_update_notice_handler');
			add_filter('softaculous_plugin_update_notice', 'backuply_update_notice_filter');
		}
		// === Plugin Update Notice === //

		// Schedule for backup folder tmp cleanup.
		if(!wp_next_scheduled('backuply_clean_tmp')){
			wp_schedule_event(time(), 'backuply_daily', 'backuply_clean_tmp');
		}
	}

	// Are we pro ?
	if(!defined('BACKUPLY_PRO') && current_user_can('install_plugins')){

		// The holiday promo time
		$holiday_time = get_option('backuply_hide_holiday');
		if(empty($holiday_time) || (time() - abs($holiday_time)) > 172800){
			$holiday_time = time();
			update_option('backuply_hide_holiday', $holiday_time, false);
		}

		$time = date('nj');
		$days = array(1225, 1224, 11);
		if(!empty($holiday_time) && $holiday_time > 0 && isset($_GET['page']) && $_GET['page'] === 'backuply' && in_array($time, $days) && empty($showing_promo)){
			$showing_promo = true;
			add_action('admin_notices', 'backuply_holiday_promo');
		}
		
		// Are we to disable the holiday promo for 48 hours
		if(isset($_REQUEST['backuply_holiday_promo']) && (int)$_REQUEST['backuply_holiday_promo'] == 0 ){
			if(!wp_verify_nonce(backuply_optreq('security'), 'backuply_promo_nonce')) {
				die('Security Check Failed');
			}

			update_option('backuply_hide_holiday', (0 - time()), false);
			die('DONE');
		}

		// The promo time
		$promo_time = get_option('backuply_promo_time');
		if(empty($promo_time)){
			$promo_time = time();
			update_option('backuply_promo_time', $promo_time, false);
		}

		// Are we to show the backuply promo, and it will show up after 7 days of install.
		if(empty($showing_promo) && !empty($promo_time) && $promo_time > 0 && $promo_time < (time() - (7 * 86400))){
			$showing_promo = true;
			add_action('admin_notices', 'backuply_promo');
		}

		// Are we to disable the promo
		if(isset($_REQUEST['backuply_promo']) && (int)$_REQUEST['backuply_promo'] == 0 ){
			if(!wp_verify_nonce(backuply_optreq('security'), 'backuply_promo_nonce')) {
				die('Security Check Failed');
			}

			update_option('backuply_promo_time', (0 - time()), false);
			die('DONE');
		}
		
		// The offer time
		$offer_time = get_option('backuply_offer_time', '');
		if(empty($offer_time)){
			$offer_time = time();
			update_option('backuply_offer_time', $offer_time, false);
		}

		// Are we to show the backuply offer, and it will show up after 7 days of install.
		if(empty($showing_promo) && !empty($offer_time) && ($offer_time > 0  || abs($offer_time + time()) > 15780000) && $offer_time  < time() - (7 * 86400) && !empty($_GET['page']) && strpos(backuply_optget('page'), 'backuply') !== FALSE){
			add_action('admin_notices', 'backuply_offer_handler');
		}
		
		// Are we to disable the offer
		if(isset($_REQUEST['backuply_offer']) && (int)$_REQUEST['backuply_offer'] == 0 ){
			if(!wp_verify_nonce(backuply_optreq('security'), 'backuply_promo_nonce')) {
				die('Security Check Failed');
			}

			update_option('backuply_offer_time', (0 - time()), false);
			die('DONE');
		}
	}
	
	if(!isset($_GET['page']) || $_GET['page'] !== 'backuply'){
		return;
	}

	$litespeed_time = get_option('backuply_litespeed_notice', time());
	if(extension_loaded('litespeed') && $litespeed_time <= time()){
		if(!file_exists(ABSPATH .'.htaccess') || !preg_match('/noabort/i', file_get_contents(ABSPATH .'.htaccess'))){
			add_action('admin_notices', 'backuply_litespeed_handler');
		}
	}
}

// Shows a nag to the user, 1 week after last backup
function backuply_backup_nag(){
	
	$last_backup = get_option('backuply_last_backup');

	echo 
	'<div class="notice notice-error is-dismissible backuply-backup-nag">';
	
	if(!empty($last_backup)){
		$time_diff = time() - $last_backup;
		$days = floor(abs($time_diff / 86400));
		
		echo '<p>'. sprintf(esc_html__( 'It\'s been %1$s days you took a backup, would you like to take a backup with Backuply and secure your website!', 'backuply' ), $days).'&nbsp; <a href="'.menu_page_url('backuply', false).'" class="button button-primary">Backup Now</a>'.(!defined('BACKUPLY_PRO') ? ' <span style="float:right;">For automatic backup schedules please  <a href="https://backuply.com/pricing" target="_blank" class="button" style="background-color:#64b450; border-color:#64b450; color:white;">Upgrade to Pro</a></span>' : '').'</p>';
	} else{
		echo '<p>'. esc_html__( 'You haven\'t taken a backup since you activated Backuply, Take a backup and secure your website!', 'backuply' ).'&nbsp; <a href="'.menu_page_url('backuply', false).'" class="button button-primary">Backup Now</a></p>';
	}

	echo '</div>';
	
	wp_register_script('backuply_time_nag', '', array('jquery'), '', true);
	wp_enqueue_script('backuply_time_nag');
	
	wp_add_inline_script('backuply_time_nag' ,'

		jQuery(document).ready(function(){
			jQuery(".backuply-backup-nag .notice-dismiss").on("click", function(){
			
				jQuery.ajax({
					method : "GET",
					url : "' . admin_url('admin-ajax.php') .'?action=backuply_hide_backup_nag&security=' . wp_create_nonce('backuply_nonce'). '",
					success : function(res){
						console.log(res);
					}
				});
			});
		});'
	);

}

// Shows the admin menu of Backuply
function backuply_admin_menu(){
	global $backuply;

	$capability = 'activate_plugins';
	
	// Add the menu page
	add_menu_page(__('Backuply Dashboard', 'backuply'), __('Backuply', 'backuply'), $capability, 'backuply', 'backuply_settings_page_handle', BACKUPLY_URL .'/assets/images/icon.svg');
	
	// Dashboard
	add_submenu_page('backuply', __('Backuply Dashboard', 'backuply'), __('Dashboard', 'backuply'), $capability, 'backuply', 'backuply_settings_page_handle');
	
	if(defined('BACKUPLY_PRO')){
		add_submenu_page('backuply', __('License', 'backuply'), __('License', 'backuply'), $capability, 'backuply-license', 'backuply_license_page_handle');
	} else {
		add_submenu_page('backuply', __('Backuply Cloud', 'backuply'), __('Backuply Cloud', 'backuply'), $capability, 'backuply-license', 'backuply_license_page_handle');
	}

	// Its Free
	if(!defined('BACKUPLY_PRO')){

		// Go Pro link
		add_submenu_page('backuply', __('Backuply Go Pro'), __('Go Pro'), $capability, BACKUPLY_PRO_URL);

	}
}

// Backuply - Backup Page
function backuply_settings_page_handle(){
	include_once BACKUPLY_DIR . '/main/settings.php';

	backuply_page_backup();
	backuply_page_theme();
}

// Backuply - License Page
function backuply_license_page_handle(){
	include_once BACKUPLY_DIR . '/main/license.php';
	backuply_license_page();
}

// Show the promo
function backuply_promo(){
	include_once(BACKUPLY_DIR.'/main/promo.php');
	
	backuply_base_promo();
}

function backuply_holiday_promo(){
	include_once(BACKUPLY_DIR.'/main/promo.php');
	
	backuply_holiday_offers();
}

function backuply_license_renew(){
	if(!function_exists('backuply_check_expires')){
		include_once BACKUPLY_DIR.'/main/promo.php';
	}
	
	backuply_check_expires();
}

function backuply_free_trial_promo(){
	if(!function_exists('backuply_free_trial')){
		include_once(BACKUPLY_DIR.'/main/promo.php');
	}
	
	backuply_promo_scripts();
	backuply_free_trial();
}

function backuply_offer_handler(){
	if(!function_exists('backuply_regular_offer')){
		include_once(BACKUPLY_DIR.'/main/promo.php');
	}
	
	backuply_regular_offer();
}

function backuply_litespeed_handler(){
	if(!function_exists('backuply_litespeed_notice')){
		include_once(BACKUPLY_DIR.'/main/promo.php');
	}
	
	backuply_litespeed_notice();
}

function backuply_update_notice_handler(){
	if(!function_exists('backuply_update_notice')){
		include_once(BACKUPLY_DIR.'/main/promo.php');
	}
	
	backuply_update_notice();
}

function backuply_update_notice_filter($plugins = []){
	$plugins['backuply/backuply.php'] = 'Backuply';
	
	return $plugins;
}main/settings.php000064400000313401151526424670010057 0ustar00<?php

/*
* BACKUPLY
* https://backuply.com
* (c) Backuply Team
*/

if(!defined('ABSPATH')) {
	die('HACKING ATTEMPT!');
}

// The Backuply Admin Options Page
function backuply_page_header($title = 'Settings') {
	global $backuply;
	
	wp_enqueue_style('backuply-styles', BACKUPLY_URL . '/assets/css/styles.css', array(), BACKUPLY_VERSION);
	
	// TODO:: Is only being used for a modal so create custom modal.
	wp_enqueue_style('backuply-jquery-ui', BACKUPLY_URL . '/assets/css/base-jquery-ui.css', array(), BACKUPLY_VERSION);
	wp_enqueue_style('backuply-jstree', BACKUPLY_URL . '/assets/css/jstree.css', array(), BACKUPLY_VERSION);

	wp_enqueue_script('backuply-js', BACKUPLY_URL . '/assets/js/backuply.js', array('jquery-ui-dialog'), BACKUPLY_VERSION, true);
	wp_enqueue_script('backuply-jstree', BACKUPLY_URL . '/assets/js/jstree.min.js', array('jquery'), BACKUPLY_VERSION, true);
	
	wp_localize_script('backuply-js', 'backuply_obj', array(
		'nonce' => wp_create_nonce('backuply_nonce'),
		'ajax_url' => admin_url('admin-ajax.php'),
		'cron_task' => get_option('backuply_cron_settings'),
		'images' => BACKUPLY_URL . '/assets/images/',
		'backuply_url' => BACKUPLY_URL,
		'creating_session' => wp_generate_password(32, false),
		'status_key' => urlencode(backuply_get_status_key()),
		'site_url' => site_url(),
	));
	
	if(defined('BACKUPLY_PRO')){
		backuply_load_license();
	}

	// Updating the Timezone to match the time of the users WordPress timezone
	$time_zone_string = wp_timezone_string();
	
	if(strpos($time_zone_string, '-') === 0 || strpos($time_zone_string, '+') === 0){
		$time_zone_string = 'UTC';
	}
	
	date_default_timezone_set($time_zone_string);
	
	$bcloud_trial_time = get_option('bcloud_trial_time', 0);

	if(!empty($bcloud_trial_time)){
		$bcloud_rem_time = $bcloud_trial_time - time();
		$bcloud_rem_time = floor($bcloud_rem_time/86400);
		if($bcloud_rem_time < 0 || empty($backuply['bcloud_key']) || defined('BACKUPLY_PRO')){
			delete_option('bcloud_trial_time');
			$bcloud_rem_time = '';
		}
		
	}

	echo '<div id="backuply-snackbar"></div>
	<div style="margin: 10px 20px 0 2px;">	
<div class="metabox-holder columns-2">
<div class="postbox-container">	
<div id="top-sortables" class="meta-box-sortables ui-sortable">
	
	<table cellpadding="2" cellspacing="1" width="100%" class="fixed" border="0">
		<tr>
			<td valign="top"><h3>Backuply - '.esc_html($title). (!empty($bcloud_rem_time) ? '&nbsp;<span style="background-color:red; font-size:12px; color:white; padding: 5px 7px; border-radius:3px;">'.esc_html($bcloud_rem_time).' days left for Backuply Cloud trial</span>' : '').'</h3></td>
			<td valign="center" align="right" style="font-size:1.1rem; line-height:1.6;">'.
			(!defined('SITEPAD') ? '<a href="https://wordpress.org/plugins/backuply" target="_blank" class="button button-secondary" style="margin-right:10px">Review Backuply</a>' : '').
			'<a href="https://twitter.com/wpbackuply" target="_blank" title="Twitter Profile"><span class="dashicons dashicons-twitter"></span></a>
			<a href="https://facebook.com/backuply" target="_blank" title="Facebook Profile"><span class="dashicons dashicons-facebook-alt"></span></a>
			<a href="'.BACKUPLY_WWW_URL.'" target="_blank" title="Backuply Website"><span class="dashicons dashicons-admin-site-alt3"></span></a>
			<a href="'.BACKUPLY_DOCS.'" target="_blank" title="Backuply Docs"><span class="dashicons dashicons-media-document"></span></a>
		</td>
		</tr>
	</table>
	<hr />
	
	<!--Main Table-->
	<table cellpadding="8" cellspacing="1" width="100%" class="fixed">
	<tr>
		<td valign="top" width="82%">';
}

function backuply_promotion_tmpl() {
	global $backuply;
	
?>
	<a href="https://wordpress.org/support/plugin/backuply/reviews/?filter=5#new-post" target="_blank" style="text-decoration:none;">
	<div class="backuply-promotion-content" style="background: rgb(56,120,255);
background: linear-gradient(61deg, rgba(56,120,255,1) 0%, rgba(98,178,255,1) 100%);
 color: white; margin-bottom:10px; position:relative;">
		<h2 style="color:white; margin:0 0 5px 0; padding:0;">Rate us <span class="dashicons dashicons-star-filled"></span></h2>
		<p style="margin:0; padding:0;"><?php esc_html_e('If you find it useful, Please rate and support us.', 'backuply');?></p>
	</div>
	</a>
	
	<?php
	// The promo should be only visible to Free versions and SOFTWP license users
	if(
		empty($backuply['license']) || 
		(!empty($backuply['license']['license']) && strpos($backuply['license']['license'], 'BAKLY') !== 0)
	){
		echo '<div class="backuply-promotion-content backuply-cloud-banner" style="background-color:#000;">
			<div class="backuply-cloud-gtext"><div>Backuply</div> <div>Cloud</div></div>
			<div class="bcloud-banner-content">
				<ul>
					<li>'.__('Never lose your data with Backuply Cloud.', 'backuply').'</li>
					<li>'.__('Easy to integrate with Backuply.', 'backuply').'</li>
					<li>'.__('10 GB of free storage for All Pro users', 'backuply').'</li>
				</ul>
				<div style="text-align:center;">
					<a href="https://backuply.com/wordpress-backup-trial" class="backuply-trial-btn" target="_blank">'.__('Try Now').' <span class="dashicons dashicons-external"></span></a>
				</div>
			</div>
		</div>';
	}
	
	?>
	<div class="backuply-promotion-content" style="margin-top: 20px;">
			<h2 class="hndle ui-sortable-handle">
				<span><a target="_blank" href="https://pagelayer.com/?from=backuply-plugin"><img src="<?php echo BACKUPLY_URL ?>/assets/images/pagelayer_product.png" width="100%" /></a></span>
			</h2>
			<div>
				<em>The Best WordPress <b>Site Builder</b> </em>:<br>
				<ul>
					<li>Gutenberg Blocks</li>
					<li>Drag & Drop Editor</li>
					<li>Widgets</li>
					<li>In-line Editing</li>
					<li>Styling Options</li>
					<li>Animations</li>
					<li>Easily customizable</li>
					<li>Real Time Design</li>
					<li>And many more ...</li>
				</ul>
				<center><a class="button button-primary" target="_blank" href="https://pagelayer.com/?from=backuply-plugin">Visit Pagelayer</a></center>
			</div>
	</div>

	<div class="backuply-promotion-content" style="margin-top: 20px;">
		<h2 class="hndle ui-sortable-handle">
			<span><a target="_blank" href="https://loginizer.com/?from=backuply-plugin"><img src="<?php echo BACKUPLY_URL ?>/assets/images/loginizer_product.png" width="100%" /></a></span>
		</h2>
		<div>
			<em>Protect your WordPress website from <b>unauthorized access and malware</b> </em>:<br>
			<ul>
				<li>BruteForce Protection</li>
				<li>reCaptcha</li>
				<li>Two Factor Authentication</li>
				<li>Black/Whitelist IP</li>
				<li>Detailed Logs</li>
				<li>Extended Lockouts</li>
				<li>2FA via Email</li>
				<li>And many more ...</li>
			</ul>
			<center><a class="button button-primary" target="_blank" href="https://loginizer.com/?from=backuply-plugin">Visit Loginizer</a></center>
		</div>
	</div>
<?php
}

function backuply_page_backup(){
	
	global $wpdb, $error, $backuply, $success, $protocols, $bcloud_keys;

	$protocols = backuply_get_protocols();
	
	// Get the current Users Information
	$current_user = wp_get_current_user();

	// Load Backuply's remote backup locations.
	$backuply_remote_backup_locs = get_option('backuply_remote_backup_locs');

	$backuply_backup_dir = backuply_cleanpath(BACKUPLY_BACKUP_DIR);

	// Check if backup/restore is under process
	if(is_dir($backuply_backup_dir.'/restoration')){
		$restoring_up = true;
	}
	
	//if(!get_option('backuply_status') && $timestamp = wp_next_scheduled( 'backuply_backup_cron' )){
		//Unshedule Events here incase the backup fails for some reason. Can tell the users to either delete the sql option or add a button to do that for them
		//wp_unschedule_event( $timestamp, 'backuply_backup_cron' );
	//}

	if(isset($_POST['restore'])){
		
		// Verify Nonce	
		if(!wp_verify_nonce(backuply_optreq('security'), 'backuply_nonce')){
			$error[] = __('Security check Failed!', 'backuply');
			return false;
		}
		
		backuply_restore_curl($_POST);
	}
	
	if(isset($_POST['backuply_delete_backup'])){
		
		// Verify Nonce
		if(!wp_verify_nonce(backuply_optreq('security'), 'backuply_nonce')){
			$error[] = __('Security check Failed!', 'backuply');
			return false;
		}
		
		$backup_file = backuply_optpost('tar_file');
		$backup_file = backuply_sanitize_filename($backup_file);
		$res = backuply_delete_backup($backup_file);
		
		if($res) {
			$success = __('The backup was deleted successfully.', 'backuply');
			return true;
		}
	}
	
	// Save backuply Settings
	if(isset($_POST['backuply_save_settings'])) {
		
		// Verify Nonce
		if(!wp_verify_nonce(backuply_optreq('security'), 'backuply_nonce')){
			$error[] = __('Security check Failed!', 'backuply');
			return false;
		}
		
		$tmp_add_to_fileindex = array();
		
		// Save additional file/folder details
		if(isset($_POST['add_to_fileindex'])){
			$tmp_add_to_fileindex = map_deep($_POST['add_to_fileindex'], 'sanitize_text_field');
		}
		
		$saved = false;
		
		if(!empty($tmp_add_to_fileindex)){
			
			foreach($tmp_add_to_fileindex as $tk => $tv){
				
				if(substr_count(trim($tv), './') > 0){
					$error[] = __('There were some invalid files/folders selected', 'backuply'). ' - '.esc_attr($tv);
				}
			}

			$fetch_fileindex = get_option('backuply_additional_fileindex');
			if(empty($fetch_fileindex)){
				add_option('backuply_additional_fileindex', $tmp_add_to_fileindex, false);
				$saved = true;
			}else{
				update_option('backuply_additional_fileindex', $tmp_add_to_fileindex, false);
				$saved = true;
			}
		}else{
			delete_option('backuply_additional_fileindex');
		}

		// Save Email setting
		$notify_email_address = sanitize_email(backuply_optpost('notify_email_address'));

		if(isset($notify_email_address)){
			update_option('backuply_notify_email_address', is_email($notify_email_address) ? $notify_email_address : '');
			$saved = true;
		}

		if(!empty($error)){
			return false;
		}
	
		if(isset($_POST['backuply_cron_schedule'])){
			
			if(empty(backuply_optpost('backuply_cron_schedule'))){
				delete_option('backuply_cron_settings');
				$timestamp = wp_next_scheduled( 'backuply_auto_backup_cron' );
				wp_unschedule_event( $timestamp, 'backuply_auto_backup_cron' );
			}
			
			if(!empty(backuply_optpost('backuply_cron_schedule')) && (!empty(backuply_optpost('auto_backup_dir')) || !empty(backuply_optpost('auto_backup_db')))){

				$cron_settings = [];

				$cron_settings['backup_dir'] = isset($_POST['auto_backup_dir']) ? 1 : 0;
				$cron_settings['backup_db'] = isset($_POST['auto_backup_db']) ? 1 : 0;
				$cron_settings['backup_rotation'] = backuply_optpost('backup_rotation');
				$cron_settings['backup_location'] = backuply_optpost('backup_location');

				if($_POST['backuply_cron_schedule'] == 'custom') {
					$cron_settings['backuply_cron_schedule'] = backuply_optpost('backuply_cron_schedule');
					$cron_settings['backuply_custom_cron'][] = backuply_optpost('cron_minute');
					$cron_settings['backuply_custom_cron'][] = backuply_optpost('cron_hour');
					$cron_settings['backuply_custom_cron'][] = backuply_optpost('cron_day');
					$cron_settings['backuply_custom_cron'][] = backuply_optpost('cron_month');
					$cron_settings['backuply_custom_cron'][] = backuply_optpost('cron_weekday');
				} else {
					$cron_settings['backuply_cron_schedule'] = backuply_optpost('backuply_cron_schedule');
				}

				update_option('backuply_cron_settings', $cron_settings);
				
				if($timestamp = wp_next_scheduled( 'backuply_auto_backup_cron' )) {
					wp_unschedule_event( $timestamp, 'backuply_auto_backup_cron' );
				}

				if(function_exists('backuply_add_auto_backup_schedule')){
					backuply_add_auto_backup_schedule();
				}
			}
			
			$backuply['settings']['backup_dir'] = !empty($_POST['backup_dir']) ? 1 : 0;
			$backuply['settings']['backup_db'] = !empty($_POST['backup_db']) ? 1 : 0;
			$backuply['settings']['backup_location'] = !empty($_POST['backup_location']) ? backuply_optpost('backup_location') : '';
			
			update_option('backuply_settings', $backuply['settings']);
			
			if(!empty($error)){
				return false;
			}
			
			update_option('backuply_debug', backuply_is_checked('debug_mode'));
		}
		
		// Saving db excludes
		if(!empty($_POST['exclude_db_table'])) {
			$backuply['excludes']['db'] = map_deep($_POST['exclude_db_table'], 'sanitize_text_field');
			update_option('backuply_excludes', $backuply['excludes']);
		} else {
			unset($backuply['excludes']['db']);
			update_option('backuply_excludes', $backuply['excludes']);
		}
		

		$success = __('The Backup settings were saved successfully', 'backuply');
		return true;
	}

	$del_loc_id = backuply_optreq('del_loc_id');
	$edit_loc_id = backuply_optreq('edit_loc_id');
	$backuply_remote_backup_locs = get_option('backuply_remote_backup_locs');

	// Handle backup location delete request
	if(isset($_REQUEST['backuply_delete_location']) && array_key_exists($del_loc_id, $backuply_remote_backup_locs)){
		
		// Verify Nonce
		if(!wp_verify_nonce(backuply_optreq('security'), 'backuply_nonce')){
			$error[] = __('Security check Failed!', 'backuply');
			return false;
		}
		
		unset($backuply_remote_backup_locs[$del_loc_id]);
		
		if(empty($backuply_remote_backup_locs)){
			delete_option('backuply_remote_backup_locs');
		}else{
			update_option('backuply_remote_backup_locs', $backuply_remote_backup_locs);
		}

		$success = __('Backup location was deleted successfully', 'backuply');
		return true;
	}

	// Handle edit backup location request
	if(isset($_REQUEST['backuply_edit_location']) && array_key_exists($edit_loc_id, (array)$backuply_remote_backup_locs)){
	
		// Verify Nonce
		if(!wp_verify_nonce(backuply_optreq('security'), 'backuply_nonce')){
			$error[] = __('Security check Failed!', 'backuply');
			return false;
		}

		$backuply_remote_backup_locs = get_option('backuply_remote_backup_locs');
		$edit_loc_id = backuply_optreq('edit_loc_id');
		$edit_loc_name = backuply_optreq('location_name');
		$edit_backup_loc = backuply_optreq('backup_loc');
		$protocol = $backuply_remote_backup_locs[$edit_loc_id]['protocol'];

		if(empty($protocol)){
			$protocol = 'ftp';
		}

		// Let it be any protocol, we welcome all. But class is must. - Jelastic
		if(!backuply_include_lib($protocol)) {
			$error[] = __('Invalid Protocol', 'backuply');
		}
		
		$proto_arr = array('dropbox', 'gdrive', 'aws', 'caws', 'bcloud', 'onedrive');
		
		if(in_array($protocol, $proto_arr)){
			
			// The Backup PATH
			$edit_backup_loc = @trim($edit_backup_loc, '/');
			if(!empty($edit_backup_loc)){
				$edit_backup_loc = '/'.$edit_backup_loc;
			}
			
			if($protocol == 'dropbox'){
				
				$dropbox_access_token = $backuply_remote_backup_locs[$edit_loc_id]['dropbox_token'];
				$dropbox_refresh_token = $backuply_remote_backup_locs[$edit_loc_id]['refresh_token'];

				$full_backup_loc = $protocol.'://'.$dropbox_refresh_token.$edit_backup_loc;
				
			}elseif($protocol == 'bcloud'){
				$bcloud = backuply_load_remote_backup('bcloud'); 
				
				
			}elseif($protocol == 'gdrive'){
				$gdrive = backuply_load_remote_backup('gdrive');

				$gdrive_refresh_token = $backuply_remote_backup_locs[$edit_loc_id]['gdrive_refresh_token'];
				$gdrive_old_folder = $backuply_remote_backup_locs[$edit_loc_id]['backup_loc'];
				
				$app_dir_loc = $protocol.'://'.rawurlencode($gdrive_refresh_token).'/'.$gdrive->app_dir;
				$full_backup_loc = $protocol.'://'.rawurlencode($gdrive_refresh_token).'/'.$gdrive->app_dir.$edit_backup_loc;
				$backup_old_loc = $protocol.'://'.rawurlencode($gdrive_refresh_token).'/'.$gdrive->app_dir.$gdrive_old_folder;
				
				// Updating the target Folder
				if(!empty($edit_backup_loc)) {
					backuply_stream_wrapper_register($protocol, $protocol);
					
					if(file_exists($backup_old_loc) && $backup_old_loc != $app_dir_loc){
						if(!@rename($backup_old_loc, $full_backup_loc)) {
							$error[] = __('Unable to rename the folder', 'backuply');
						}
					} else {
						if(!@mkdir($full_backup_loc)){
							$error[] = __('Failed to create a folder', 'backuply');
						}
					}
				}

			}elseif($protocol == 'aws' || $protocol == 'caws'){
				$endpoint = $backuply_remote_backup_locs[$edit_loc_id]['aws_endpoint'];
				$region = $backuply_remote_backup_locs[$edit_loc_id]['aws_region'];
				$bucketName = $backuply_remote_backup_locs[$edit_loc_id]['aws_bucketname'];
				$accessKey = $backuply_remote_backup_locs[$edit_loc_id]['aws_accessKey'];
				$secretKey = !empty($_REQUEST['aws_secretKey']) ? backuply_optreq('aws_secretKey') : $backuply_remote_backup_locs[$edit_loc_id]['aws_secretKey'];
				$defaultdir = '/'. $aws->app_dir;

				backuply_stream_wrapper_register($protocol, $protocol);
				
				$full_backup_loc = $protocol.'://'.rawurlencode($accessKey).':'.rawurlencode($secretKey).'@'.$bucketName.'/'.$endpoint.'/'.$region.$defaultdir.$edit_backup_loc;
				
				if(!@opendir($full_backup_loc)){
					if(!@mkdir($full_backup_loc)){
						$error[] = __('Failed to create bucket', 'backuply');
					}
				}
			}elseif($protocol == 'onedrive'){
				$onedrive = backuply_load_remote_backup('onedrive');
				$onedrive_refresh_token = $backuply_remote_backup_locs[$edit_loc_id]['onedrive_refresh_token'];
				
				$full_backup_loc = $protocol.'://'.rawurlencode($onedrive_refresh_token).'/'.$onedrive->app_dir.$edit_backup_loc;
				$onedrive->create_onedrive_app_dir($onedrive_refresh_token);
			}
		}else{
			// Server Host
			$server_host = $backuply_remote_backup_locs[$edit_loc_id]['server_host'];	
			$server_host = @rtrim($server_host, '/');
			
			$port = (int) $backuply_remote_backup_locs[$edit_loc_id]['port'];
			if(empty($port)){
				$port = ($protocol == 'softsftp' ? 22 : 21);
			}
			
			// The FTP user
			$ftp_user = $backuply_remote_backup_locs[$edit_loc_id]['ftp_user'];
			
			// FTP Pass
			$ftp_pass = !empty($_REQUEST['ftp_pass']) ? backuply_optreq('ftp_pass') : $backuply_remote_backup_locs[$edit_loc_id]['ftp_pass'];
			
			// The Private Key
			// $private_key = str_replace("\r", '', rawGPC(optPOST('private_key')));
			// $private_key = trim($private_key);			
			
			// SFTP using keys
			// if(!empty($private_key)){
				
			// 	// Passphrase
			// 	if(isset($_POST['passphrase']) && !empty($_POST['passphrase'])){
			// 		$passphrase = rawGPC($_POST['passphrase']);
			// 	}
			// }			
			
			if(empty($ftp_pass)){
				$error[] = __('Please provide either a password or private key', 'backuply'); 
			}
			
			// The Backup PATH
			$edit_backup_loc = '/'.@trim($edit_backup_loc, '/');
			
			//'@' in username was causing issue in fopen while creating backup
			$full_backup_loc = $protocol.'://'.rawurlencode(($protocol == 'softsftp' && empty($ftp_pass) ? $edit_loc_id : $ftp_user)).':'.rawurlencode($ftp_pass).'@'.$server_host.(!empty($port) ? ':'.$port : '').$edit_backup_loc;
			
			
			// Test the connection
			if($protocol == 'webdav'){
				backuply_stream_wrapper_register($protocol, $protocol);
				
				if(!empty($edit_backup_loc)){
					mkdir($full_backup_loc);
				}
				
				$webdav_connect = stat($full_backup_loc);
				
				if(empty($webdav_connect['mtime']) && empty($webdav_connect['ctime'])){
					$error[] = 'Failed to connect to the WebDAV server';
				}
			}
		}

		//Check for Duplicate Backup Location
		$existing_backup_locs = get_option('backuply_remote_backup_locs');

		foreach($existing_backup_locs as $k => $v){
			if($edit_loc_id != $k && $full_backup_loc == $v['full_backup_loc']){
				$error[] = __('Backup Location with the same path already exists', 'backuply');
				break;
			}
		}	

		if($protocol != 'dropbox' && $protocol != 'gdrive' && $protocol != 'webdav' && $protocol != 'aws' && $protocol != 'caws' && $protocol != 'onedrive'){
		
			//Connection established or not?
			$ftp = backuply_sftp_connect($server_host, $ftp_user, $ftp_pass, $protocol, $port, false);

			if(!is_object($ftp) && $ftp == '-2'){
				$error[] = __('Could not login with specified details', 'backuply');
			}
			
			if(!is_object($ftp) && $ftp == '-1'){
				$error[] = __('Could not Resolve Domain Name', 'backuply');
			}
			
			if(!is_object($ftp) && $ftp == '-3'){
				$error[] = sprintf( esc_html__( 'Specified %1$s Path does not exist', 'backuply'), $protocols[$protocol]);
			}
			
			if($ftp == '-4'){
				$error[] = __('Could not connect to the server', 'backuply');
			}
			
			if($ftp == '-5'){
				$error[] = __('Could not connect to the server', 'backuply');
			}
			//backuply_log('isobject ftp : '.var_export($ftp, 1));
			
			if(!is_object($ftp)){
				$error[] = __('Could not connect to the server', 'backuply');
			}
			
			if(!empty($error)){
				return false;
			}

			if($protocol == 'softsftp'){
				
				$ftp->chdir('~');
				$pwd = $ftp->pwd();
				
				// Some servers pwd is empty and some / in that case we cannot check if it is absolute dir
				if(!empty($pwd) && $pwd != '/'){
					$homedir = $pwd.'/';
					
					if(!preg_match('/^'.preg_quote($homedir, '/').'/is', $edit_backup_loc)){
						$error[] = __('The backup path is not an absolute path. Please provide an absolute path', 'backuply');
					}
				}
			}

			//backuply_log('ftp connection is successful');

			// Create backup locaion dir for ftp/sftp
			backuply_stream_wrapper_register($protocol, $protocol);
			if(!empty($edit_backup_loc)){
				mkdir($full_backup_loc);
			}
		}

		$backuply_remote_backup_locs[$edit_loc_id]['name'] = $edit_loc_name;
		$backuply_remote_backup_locs[$edit_loc_id]['backup_loc'] = $edit_backup_loc;
		$backuply_remote_backup_locs[$edit_loc_id]['full_backup_loc'] = $full_backup_loc;
	
		if('aws' == $protocol){
			$backuply_remote_backup_locs[$edit_loc_id]['aws_sse'] = isset($_POST['aws_sse']) ? true : false;
		}

		if(!empty($error)){
			return false;
		}
		
		update_option('backuply_remote_backup_locs', $backuply_remote_backup_locs);
		
		if(!empty($_POST['backup_sync_infos'])){
			backuply_sync_remote_backup_infos($edit_loc_id);
		}
		
		$saved = true;
		
		if(!empty($saved)){
			$success = __('Backup location details saved successfully', 'backuply');
			return true;
		}
	}
	
	// Handles Adding New Backup Location
	if(isset($_REQUEST['addbackuploc'])){
		
		// Verify Nonce
		if(!wp_verify_nonce(backuply_optreq('security'), 'backuply_nonce')){
			$error[] = __('Security check Failed!', 'backuply');
			return false;
		}
		
		$protocol = backuply_optreq('protocol');
		if(empty($protocol)){
			$protocol = 'ftp';
		}
		
		// We dont ask the user location_name so we are fixing it here when Backuply Cloud is selected.
		if($protocol == 'bcloud'){
			$_REQUEST['location_name'] = 'Backuply Cloud';
		}
		
		$loc_name = backuply_REQUEST('location_name', __('No backup location name was specified', 'backuply'));

		$existing_backup_locs = get_option('backuply_remote_backup_locs');
		$remote_backup_locs = (!empty($existing_backup_locs) ? $existing_backup_locs: array());
		$location_id = (empty($remote_backup_locs) ? 1 : max(array_keys($remote_backup_locs)) + 1);

		$dropbox = backuply_load_remote_backup('dropbox');
		$proto_arr = ['dropbox', 'gdrive', 'aws', 'caws', 'onedrive', 'bcloud'];
		
		if(in_array($protocol, $proto_arr)){

			$backup_loc = backuply_optreq('backup_loc');
			$backup_loc = @trim($backup_loc, '/');
			if(!empty($backup_loc)){
				$backup_loc = '/'.$backup_loc;
			}

			if($protocol == 'onedrive'){
				
				$onedrive = backuply_load_remote_backup('onedrive');
				$callback_uri = menu_page_url('backuply', false) . '&security='.wp_create_nonce('backuply_nonce');
				
				$onedrive_error = backuply_optget('error');
				$onedrive_auth_code = backuply_optget('onedrive_auth_code');

				if(!empty($onedrive_error)){
					$error[] = __('It seems you cancelled the authorization process', 'backuply');
				}
				
				if(empty($onedrive_auth_code)){

					$auth_url = 'https://api.backuply.com/onedrive/token.php?action=add_location&loc_name='.rawurlencode($loc_name).'&backup_loc='.rawurlencode($backup_loc).'&url='.rawurlencode($callback_uri).'&softtoken='.rawurlencode(backuply_csrf_get_token()).'&scope='.rawurlencode($onedrive->scopes);
					
					backuply_redirect(filter_var($auth_url, FILTER_SANITIZE_URL), false);
					exit;
					
				}else{
					
					$gen_token_resp = $onedrive->generate_onedrive_token($onedrive_auth_code);
					
					$onedrive_access_token = $gen_token_resp['access_token'];
					$onedrive_refresh_token = $gen_token_resp['refresh_token'];
					
					if(empty($onedrive_access_token)){
						$error[] = __('Failed to generate OneDrive Access Token', 'backuply');
					}
				}
				
				$full_backup_loc = $protocol.'://'.rawurlencode($onedrive_refresh_token).'/'.$onedrive->app_dir.$backup_loc;
				$onedrive->create_onedrive_app_dir($onedrive_refresh_token);
			}elseif($protocol == 'bcloud'){
				$bcloud = backuply_load_remote_backup('bcloud');
				backuply_stream_wrapper_register($protocol, $protocol);
	
				$license = get_option('backuply_license');
				$bcloud_key = backuply_optreq('bcloud_key');
	
				if(!empty($bcloud) && !empty($bcloud->bcloud_key)){
					$error[] = __('Backuply Cloud is already added as a Location');
				} else if(empty($license) || empty($license['license']) || empty($license['active'])){
					$error[] = __('Your License is not linked yet', 'backuply');
				} else {
					$full_backup_loc = $protocol . '://'. rawurlencode(site_url()).'/'. $license['license'] . '?bcloud_key='.$bcloud_key;

					if(!$oepn_dir = @opendir($full_backup_loc)){
						$error[] = __('Failed to create a folder', 'backuply');
					}
				}

			}elseif($protocol == 'gdrive'){
				
				$gdrive = backuply_load_remote_backup('gdrive');
				$callback_uri = menu_page_url('backuply', false) . '&security='.wp_create_nonce('backuply_nonce');
				
				$gdrive_error = backuply_optget('error');
				$gdrive_auth_code = backuply_optget('gdrive_auth_code');
				
				if(!empty($gdrive_error)){
					$error[] = __('It seems you cancelled the authorization process', 'backuply');
				}
				
				if(empty($gdrive_auth_code)){

					$auth_url = 'https://api.backuply.com/gdrive/token.php?action=add_location&loc_name='.rawurlencode($loc_name).'&backup_loc='.rawurlencode($backup_loc).'&url='.rawurlencode($callback_uri).'&softtoken='.rawurlencode(backuply_csrf_get_token());
					
					backuply_redirect(filter_var($auth_url, FILTER_SANITIZE_URL), false, true);
					exit;
					
				}else{
					$gen_token_resp = $gdrive->generate_gdrive_token($gdrive_auth_code);
					
					$gdrive_access_token = $gen_token_resp['access_token'];
					$gdrive_refresh_token = $gen_token_resp['refresh_token'];
					
					if(empty($gdrive_access_token)){
						$error[] = __('Failed to generate Google Drive Access Token', 'backuply');
					}
				}

				$full_backup_loc = $protocol.'://'.rawurlencode($gdrive_refresh_token).'/'.$gdrive->app_dir.$backup_loc;
				$gdrive->create_gdrive_app_dir($gdrive_refresh_token);
				
				backuply_stream_wrapper_register($protocol, $protocol);
				
				if(!@opendir($full_backup_loc)){
					if(!@mkdir($full_backup_loc)){
						$error[] = __('Failed to create a folder', 'backuply');
					}
				}

			}elseif($protocol == 'aws' || $protocol == 'caws'){
				
				$aws = backuply_load_remote_backup($protocol);
				
				$endpoint = backuply_POST('aws_endpoint', 
					__('Please provide the AWS S3 endpoint', 'backuply'));
				$region = backuply_POST('aws_region', 
					__('Please provide the AWS S3 region', 'backuply'));
				$bucketName = backuply_POST('aws_bucketname', 
					__('Please provide the AWS S3 bucket name', 'backuply'));
				$accessKey = backuply_POST('aws_accessKey', 
					__('Please provide the AWS S3 access key', 'backuply'));
				$secretKey = backuply_POST('aws_secretKey', 
					__('Please provide the AWS S3 secret key', 'backuply'));
					
				if('aws' == $protocol){
					$aws_sse = isset($_POST['aws_sse']) ? true : false;
				}
				
				if('caws' == $protocol){
					$s3_compat = backuply_optpost('s3_compatible');
				}

				$defaultdir = '/'. $aws->app_dir;
				backuply_stream_wrapper_register($protocol, $protocol);
				
				$full_backup_loc = $protocol.'://'.rawurlencode($accessKey).':'.rawurlencode($secretKey).'@'.$bucketName.'/'.$endpoint.'/'.$region.$defaultdir.$backup_loc;
			
				if(!@opendir($full_backup_loc)){
					
					if(!@mkdir($full_backup_loc)){
						$error[] = __('Failed to create bucket', 'backuply');
					}
				}

			}elseif($protocol == 'dropbox'){
				
				$access_code = backuply_optget('access_code');
				
				if(empty($access_code)){
					$callback_uri = menu_page_url('backuply', false) . '&security='.wp_create_nonce('backuply_nonce');
					
					$url = 'https://api.backuply.com/dropbox/token.php?action=add_location&loc_name='.rawurlencode($loc_name).'&backup_loc='.rawurlencode($backup_loc).'&url='.rawurlencode($callback_uri).'&softtoken='.rawurlencode(backuply_csrf_get_token());
					
					backuply_redirect($url, false);
					exit;
					
				}else {
					$dropbox_tokens = $dropbox->generate_dropbox_token($access_code);
					$dropbox_access_token = $dropbox_tokens['access_token'];
					$dropbox_refresh_token = $dropbox_tokens['refresh_token'];
					
					if(empty($dropbox_access_token) && !empty($access_code)){
						$error[] = __('Failed to generate Dropbox Access Token', 'backuply');
					}
					
					$full_backup_loc = $protocol.'://'.$dropbox_refresh_token.$backup_loc;
				}

			}
		}else{
			// Server Host
			$server_host = backuply_optreq('server_host');
			$server_host = @rtrim($server_host, '/');
			
			// The Port
			$port = (int) backuply_optreq('port');
			if(empty($port)){
				$port = ($protocol == 'softsftp' ? 22 : 21);
			}
			
			// The FTP user
			$ftp_user = backuply_POST('ftp_user', __('No FTP user was specified', 'backuply'));
			
			// FTP Pass
			if(backuply_optpost('ftp_pass') && !empty(backuply_optpost('ftp_pass'))){
				$ftp_pass = backuply_optpost('ftp_pass');
			}

			// The Backup PATH
			$backup_loc = backuply_POST('backup_loc', __('No Backup Location was specified', 'backuply'));
			
			$backup_loc = '/'.@trim($backup_loc, '/');

			//'@' in username was causing issue in fopen while creating backup
			$full_backup_loc = $protocol.'://'.rawurlencode(($protocol == 'softsftp' && empty($ftp_pass) ? $location_id : $ftp_user)).':'.rawurlencode($ftp_pass).'@'.$server_host.(!empty($port) ? ':'.$port : '').$backup_loc;

			// Test the connection
			if($protocol == 'webdav'){
				backuply_stream_wrapper_register($protocol, $protocol);
				
				if(!empty($backup_loc)){
					mkdir($full_backup_loc);
				}
				
				$webdav_connect = stat($full_backup_loc);
				
				if(empty($webdav_connect['mtime']) && empty($webdav_connect['ctime'])){
					$error[] = __('Failed to connect to the WebDAV server', 'backuply');
				}
			}
		}

		//Check for Duplicate Backup Location
		if(!empty($existing_backup_locs)){
			// We do not want to go in the loop if there are no existing backup locations
			foreach($existing_backup_locs as $k => $v){
				if($full_backup_loc == $v['full_backup_loc']){
					$error[] = __('Backup Location with the same path already exists', 'backuply');
					break;
				}
			}
		}

		if($protocol != 'dropbox' && $protocol != 'gdrive' && $protocol != 'webdav' && $protocol != 'aws' && $protocol != 'caws' && $protocol != 'onedrive' && $protocol != 'bcloud'){
			
			//Connection established or not?
			$ftp = backuply_sftp_connect($server_host, $ftp_user, $ftp_pass, $protocol, $port, false);

			if(!is_object($ftp) && $ftp == '-2'){
				$error[] = __('Could not login with specified details', 'backuply');
			}
			
			if(!is_object($ftp) && $ftp == '-1'){
				$error[] = __('Could not Resolve Domain Name', 'backuply');
			}
			
			if(!is_object($ftp) && $ftp == '-3'){
				$error[] = sprintf(esc_html__('Specified %1$s Path does not exist', 'backuply'), $protocols[$protocol]);
			}
			
			if($ftp == '-4'){
				$error[] = __('Could not connect to the server', 'backuply');
			}
			
			if($ftp == '-5'){
				$error[] = __('Could not connect to the server', 'backuply');
			}
			//backuply_log('isobject ftp : '.var_export($ftp, 1));
			
			if(!is_object($ftp)){
				$error[] = __('Could not connect to the server', 'backuply');
			}
			
			if(!empty($error)){
				return false;
			}

			if($protocol == 'softsftp'){
				$ftp->chdir('~');
				$pwd = $ftp->pwd();
				
				// Some servers pwd is empty and some / in that case we cannot check if it is absolute dir
				if(!empty($pwd) && $pwd != '/'){
					$homedir = $pwd.'/';
					if(!preg_match('/^'.preg_quote($homedir, '/').'/is', backuply_cleanpath($backup_loc).'/')){
						$error[] = sprintf(esc_html__('The backup path is not an absolute path (%1$s). Please provide an absolute path within your home dir (%2$s)', 'backuply'), $backup_loc, $homedir);
					}
				}
			}

			//backuply_log('ftp connection is successful');

			// Create backup locaion dir for ftp/sftp
			backuply_stream_wrapper_register($protocol, $protocol);
			if(!empty($backup_loc)){
				mkdir($full_backup_loc);
			}
		}

		$remote_backup_locs[$location_id]['id'] = $location_id;
		$remote_backup_locs[$location_id]['name'] = $loc_name;
		$remote_backup_locs[$location_id]['protocol'] = $protocol;
		$remote_backup_locs[$location_id]['backup_loc'] = $backup_loc;
		$remote_backup_locs[$location_id]['full_backup_loc'] = !empty($full_backup_loc) ? $full_backup_loc : '';

		if($protocol == 'dropbox'){
			$remote_backup_locs[$location_id]['dropbox_token'] = $dropbox_access_token;
			$remote_backup_locs[$location_id]['refresh_token'] = $dropbox_refresh_token;
		}elseif($protocol == 'gdrive'){
			$remote_backup_locs[$location_id]['gdrive_token'] = $gdrive_access_token;
			$remote_backup_locs[$location_id]['gdrive_refresh_token'] = $gdrive_refresh_token;

		}elseif($protocol == 'onedrive'){
			$remote_backup_locs[$location_id]['onedrive_token'] = $onedrive_access_token;
			$remote_backup_locs[$location_id]['onedrive_refresh_token'] = $onedrive_refresh_token;

		}elseif($protocol == 'aws' || $protocol == 'caws'){
			$remote_backup_locs[$location_id]['aws_accessKey'] = $accessKey;
			$remote_backup_locs[$location_id]['aws_secretKey'] = $secretKey;
			$remote_backup_locs[$location_id]['aws_endpoint'] = $endpoint;
			$remote_backup_locs[$location_id]['aws_region'] = $region;
			$remote_backup_locs[$location_id]['aws_bucketname'] = $bucketName;
			if(!empty($s3_compat)){
				$remote_backup_locs[$location_id]['s3_compatible'] = $s3_compat;
			}
			
			if(!empty($aws_sse)){
				$remote_backup_locs[$location_id]['aws_sse'] = $aws_sse;
			}

		}elseif($protocol == 'bcloud'){
			$remote_backup_locs[$location_id]['bcloud_key'] = !empty($bcloud_keys['bcloud_key']) ? sanitize_key($bcloud_keys['bcloud_key']) : '';
			$remote_backup_locs[$location_id]['full_backup_loc'] = !empty($bcloud_keys) ? 'bcloud://'.$bcloud_keys['access_key'].':'.$bcloud_keys['secret_key'].'@'.$license['license'].'/'.$bcloud_keys['region'].'/us-east-1/'.$bcloud_keys['bcloud_key'] : '';
			
			if(!empty($bcloud_keys['bcloud_key'])){
				update_option('bcloud_key', $bcloud_keys['bcloud_key']);
			}
			
		}else{
			$remote_backup_locs[$location_id]['server_host'] = $server_host;
			$remote_backup_locs[$location_id]['port'] = $port;
			$remote_backup_locs[$location_id]['ftp_user'] = $ftp_user;
			$remote_backup_locs[$location_id]['ftp_pass'] = $ftp_pass;
		}

		if(!empty($error)){
			return false;
		}
		
		update_option('backuply_remote_backup_locs', $remote_backup_locs);
		
		if(!empty($_POST['backup_sync_infos'])){
			backuply_sync_remote_backup_infos($location_id);
		}

		$saved = true;
		$success = __('Backup Location added successfully', 'backuply');
		return true;
		
	}
	
}
	
function backuply_page_theme(){
	
global $backuply, $error, $success, $protocols, $wpdb;
	
	//Load the theme's header
	backuply_page_header('Backup');
	
	$backups_dir = backuply_glob('backups');
	$backups_info_dir = backuply_glob('backups_info');
	
	if(empty($backups_dir) || empty($backups_info_dir)){
		
		$backup_folder_suffix = wp_generate_password(6, false);
		
		$error['folder_issue'] = __('Backuply was unable to create a directory where it creates backups, please create the following folders in wp-content/backuply directory', 'backuply') . '<code>backups_info-' . $backup_folder_suffix .'</code> and <code>backups-' . $backup_folder_suffix . '</code> <a href="https://backuply.com/docs/common-issues/backup-unable-to-open-in-write-mode/" target="_blank">Read More for detailed guide</a>';
	}

	if(!empty($error)){
		backuply_report_error($error);
	}
	
	if(!empty($success)){
		backuply_report_success($success);
	}
	
	//Load Backuply's cron task, if any.
	$cron_task = get_option('backuply_cron_settings');

	//Get the main part of the backup file location
	$backup_file_loc = preg_replace("/wp-admin\/admin.php/", '', wp_kses_post($_SERVER['PHP_SELF']));
	$backup_file_loc = preg_replace("/\/$/", "", $backup_file_loc);
	
	//Get the home path and remove the "/" at the end.
	$dir_path = backuply_cleanpath(get_home_path());
	
	// Cron schedules
	$cron_schedules = backuply_add_cron_interval([]);
	$backuply_nonce = wp_create_nonce('backuply_nonce');
?>

<div id="process_message" <?php echo !empty(get_option('backuply_status')) ? '' : 'style="display:none"';?>>
	<div id="message" class="updated">
		<div style="display:flex; justify-content: space-between; align-items:center;  user-select: none;">
			<p><?php esc_html_e('Backup is under process...', 'backuply'); ?></p>
			<div class="backuply-check-status" style="display:flex; flex-direction:row; cursor:pointer;">
				<div class="backuply-ring-wrap">
					<div class="backuply-ring-outer"></div>
					<div class="backuply-ring-circle"></div>
				</div>
				<span style="font-weight:bold;">Check Status</span>
			</div>
		</div>
	</div>
	<br />
</div>

<?php
$is_restoring = false;

if(file_exists(BACKUPLY_BACKUP_DIR . 'restoration/restoration.php')){
	$is_restoring = true;
}

?>

<div id="restore_message"  <?php echo !empty($is_restoring) ? '' : 'style="display:none"';?>>
	<div id="message" class="updated">
		<div style="display:flex; justify-content: space-between; align-items:center;">
			<p><?php esc_html_e('Restoration is under process...', 'backuply'); ?></p>
			<div class="backuply-check-status" style="display:flex; flex-direction:row; cursor:pointer; user-select: none;">
				<div class="backuply-ring-wrap">
					<div class="backuply-ring-outer"></div>
					<div class="backuply-ring-circle"></div>
				</div>
				<span style="font-weight:bold;">Check Status</span>
			</div>
		</div>
	</div><br />
</div>

<div id="backuply_htaccess_error" style="display: <?php echo (isset($backuply['htaccess_error']) && $backuply['htaccess_error'] ? '' : 'none');?>">
	<div id="message" class="notice notice-error is-dismissible">
		<p><?php esc_html_e('Your Backup folder is not secure please fix it', 'backuply'); ?> <a href="#" id="backuply-htaccess-fix"/>Read More</a></p>
	</div>
</div>

<div id="backuply_index_html_error" style="display: <?php echo (isset($backuply['index_html_error']) && $backuply['index_html_error'] ? '' : 'none');?>">
	<div id="message" class="notice notice-error is-dismissible">
		<p><?php esc_html_e('Your Backup folder is not secure, index.html file is missing', 'backuply'); ?> <a href="#" id="backuply-index-html-fix"/>Read More</a></p>
	</div>
</div>

<!-- Create Backup -->
<div class="tabs-wrapper">
	<h2 class="nav-tab-wrapper backuply-tab-wrapper">
		<a href="#backuply-dashboard" class="nav-tab "><?php esc_html_e('Dashboard', 'backuply');?></a>
		<a href="#backuply-settings" class="nav-tab"><?php esc_html_e('Settings', 'backuply');?></a>
		<a href="#backuply-location" class="nav-tab"><?php esc_html_e('Backup Locations', 'backuply');?></a>
		<a href="#backuply-history" class="nav-tab"><?php esc_html_e('Backup History', 'backuply');?></a>
		<a href="#backuply-support" class="nav-tab "><?php esc_html_e('Support', 'backuply');?></a>
		<?php echo !defined('BACKUPLY_PRO') ? '<a href="#backuply-pro" class="nav-tab ">'. esc_html__('Pro Version', 'backuply'). '</a>' : ''; ?>
	</h2>
	
	<?php
		$backuply_active = backuply_active();

		$backup_last_log = (file_exists(BACKUPLY_BACKUP_DIR . 'backuply_backup_log.php')) ? ' <span class="backuply-backup-last-log">(Last log)</span>' : '';
		$restore_last_log = (file_exists(BACKUPLY_BACKUP_DIR . 'backuply_restore_log.php')) ? ' <span class="backuply-restore-last-log">(Last log)</span>' : '';
		
		$last_backup = get_option('backuply_last_backup') ? backuply_format_unix_time(get_option('backuply_last_backup')) . $backup_last_log : 'None';
		$last_restore = get_option('backuply_last_restore') ? backuply_format_unix_time(get_option('backuply_last_restore')) . $restore_last_log : 'None';
		$auto_backup_schedule = wp_next_scheduled('backuply_auto_backup_cron') ? date('Y-m-d h:i A', wp_next_scheduled('backuply_auto_backup_cron')) : '';
		
		if(!empty($auto_backup_schedule)) {
			$now = new DateTime();
			$date = new DateTime($auto_backup_schedule);
			$diff = $date->diff($now);
			
			if($diff->d == 0 && $diff->h == 0 && $diff->i == 0)
				$auto_backup_schedule = 'Now';
			elseif($diff->d == 0 && $diff->h == 0)
				$auto_backup_schedule = $diff->format("%i minutes");
			elseif($diff->d == 0)
				$auto_backup_schedule = $diff->format("%h hours and %i minutes");
			else
				$auto_backup_schedule = $diff->format("%d days, %h hours and %i minutes");
		}
	?>
	
	<div id="backuply-dashboard" class="postbox backuply-tab" style="display:none;">	
		<div class="postbox-header">
			<h2 class="hndle">
				<span><?php esc_html_e('Dashboard', 'backuply'); ?> <span></span></span>
			</h2>
		</div>
		<div class="inside">
			<div class="backuply-settings-block">
				<div style="display:flex; flex-direction: column; row-gap: 5px; font-size: 1rem !important;">
					<span><strong>Last Backup:</strong> <?php echo wp_kses_post($last_backup); ?></span>
					<span><strong>Last Restore:</strong> <?php echo wp_kses_post($last_restore); ?></span>
					<?php
					if(defined('BACKUPLY_PRO') || !empty($backuply['bcloud_key'])){
						$auto_sche = !empty($auto_backup_schedule) ? $auto_backup_schedule : 'Nothing Scheduled';
						echo '<span><strong>Auto Backup Next Schedule:</strong> '.esc_html($auto_sche).'</span>';
					}
					?>
				</div>
			</div>
		
			<div class="backuply-settings-block">
				<h2 class="backuply-heading-2">
					<?php esc_html_e('Create Backup', 'backuply'); ?>
				</h2>
				
				<div class="backuply-form-wrap">
				<form method="post">
					<div class="backuply-option-wrap">
						<label class="form-check-label">
							<input type="checkbox" class="form-check-input disable" id="backup_dir" name="backup_dir" value="1" <?php echo(!empty($backuply['settings']['backup_dir']) ? ' checked' : '');?>/><?php esc_html_e('Backup Directories', 'backuply'); ?>
						</label>
					</div>
					<div class="backuply-option-wrap">	
						<label class="form-check-label">
							<input type="checkbox" class="form-check-input disable" id="backup_db" name="backup_db" value="1" <?php echo(!empty($backuply['settings']['backup_db']) ? ' checked' : '');?>/><?php esc_html_e('Backup Database', 'backuply'); ?>
						</label>
					</div>
					<br>
					<select name="backup_location" class="disable">
						<option value="">Local Folder (Default)</option>
						<?php
						$backuply_remote_backup_locs = get_option('backuply_remote_backup_locs');
						
						if(!empty($backuply_remote_backup_locs)){
							foreach($backuply_remote_backup_locs as $k => $v){
								if(!defined('BACKUPLY_PRO') && !array_key_exists($v['protocol'], backuply_get_protocols())){
									continue;
								}
								
								$selected = '';
								
								if(!empty($backuply['settings']['backup_location']) && $backuply['settings']['backup_location'] == $k) {
									$selected = 'selected';
								}
								
								echo '<option value="'.esc_attr($k).'" '.esc_attr($selected).' data-protocol="'.esc_attr($v['protocol']).'">'.esc_attr($v['name']).' ('.esc_attr($protocols[$v['protocol']]).')</option>';
								
							}
						}
						?>
					</select>
					<details style="margin:6px 0 15px 0;">
						<summary style="color:rgba(56,120,255); cursor:pointer; user-select: none;">Additional Options</summary>
						<label style="font-weight:500;" for="backup-note"><?php _e('Backup Note(Optional)', 'backuply');?></label><br/>
						<textarea name="backup_note" id="backup-note" maxlength="80" cols="40" placeholder="<?php _e('You can write maximum of 80 characters', 'backuply'); ?>"></textarea>
					</details>
					<input name="backuply_create_backup" class="button action" style="background: #5cb85c; color:white; border:#5cb85c" value="<?php esc_html_e('Create Backup', 'backuply'); ?>" type="submit" <?php echo ($backuply_active ? 'disabled' : '');?>/>
					<input name="backuply_stop_backup" class="button-secondary" value="<?php esc_html_e('Stop Backup', 'backuply');?>" type="submit" <?php echo ($backuply_active ? '' : 'disabled'); ?>>
				</form>
				
				</div>
			</div>
		</div>
	</div>

	<!-- Backup Locations -->
	<div id="backuply-location" class="postbox backuply-tab" style="display:none;">
		<div class="postbox-header">
			<h2 class="hndle">
				<span><?php esc_html_e('Backup Locations', 'backuply'); ?></span>
			</h2>
		</div>
		<div class="inside">
			<div class="row mt-4 backuply-settings-block">
				<div class="col-12 px-4">

					<table border="0" cellpadding="5" cellspacing="0" width="100%" class="table table-hover mb-2 borderless backup-table">
						<thead class="sai_head2" style="text-align:left;">
							<!--<th style="text-align:center;"><?php //esc_html_e('Default', 'backuply'); ?></th>-->
							<th style="min-width:20%;"><?php esc_html_e('Name', 'backuply'); ?></th>
							<th><?php esc_html_e('Protocol', 'backuply'); ?></th>
							<th><?php esc_html_e('Host', 'backuply'); ?></th>
							<th><?php esc_html_e('Backup Location', 'backuply'); ?></th>
							<th><?php esc_html_e('Quota', 'backuply'); ?></th>
							<th><?php esc_html_e('Edit', 'backuply'); ?></th>
							<th><?php esc_html_e('Delete', 'backuply'); ?></th>
						</thead>
					
						<tr style="text-align:left;">
							<!--<td style="text-align:center;"><input type="radio" name="default_backup_location" value="0" /></td>-->
							<td><?php esc_html_e('Local Folder', 'backuply'); ?></td>
							<td>-</td>
							<td>-</td>
							<td><?php echo esc_html(backuply_cleanpath(BACKUPLY_BACKUP_DIR.'backups')); ?></td>
							<td>-</td>
							<td>-</td>
							<td>-</td>
						</tr>
						
				<?php
				
				// Load Backuply's remote backup locations.
				$backuply_remote_backup_locs = get_option('backuply_remote_backup_locs');

				if(!empty($backuply_remote_backup_locs) ){

					foreach($backuply_remote_backup_locs as $k => $v){ 
					
						if(!defined('BACKUPLY_PRO') && !array_key_exists($v['protocol'], backuply_get_protocols())){
							continue;
						}
					
					?>
						<tr style="text-align:left;">
							<form method="post">
								<!--<td style="text-align:center;"><input type="radio" name="default_backup_location" /></td>-->
								<td><?php echo esc_html($v['name']); ?></td>
								<td>
								<?php
									$logo = esc_attr($v['protocol']).'.svg';

									if(!empty($v['s3_compatible'])){
										$logo = esc_attr($v['s3_compatible']).'.svg';
										if($v['s3_compatible'] == 'custom'){
										    $logo = 'caws.svg';
										}
									}

								?>
									<div style="display:flex; align-items:center;">
										<img src="<?php echo BACKUPLY_URL . '/assets/images/'.$logo; ?>" height="26" width="26"/> &nbsp;<?php echo esc_html($protocols[$v['protocol']]); ?>
									</div>
								</td>
								<td><?php echo isset($v['server_host']) ? esc_html($v['server_host']) : '-' ?></td>
								<td><?php echo !empty($v['backup_loc']) ? esc_html($v['backup_loc']) : '-' ?></td>
								<td><?php
									$class_to_add = '';
									if(in_array($v['protocol'], ['onedrive', 'dropbox', 'gdrive', 'bcloud'])){
										$class_to_add = 'backuply-update-quota';
									}

									echo '<div class="backuply-quota '.esc_attr($class_to_add).'" data-storage="'.esc_attr($v['protocol']).'" title="Click to refresh">';

									if(!empty($v['backup_quota']) || in_array($v['protocol'], ['onedrive', 'dropbox', 'gdrive', 'bcloud'])){
										echo '<span class="backuply-quota-text">' . (!empty($v['backup_quota']) ? esc_html(size_format($v['backup_quota'])) : '-') . '</span>';

										if(!empty($v['allocated_storage'])){
											echo '/'. size_format(esc_html($v['allocated_storage']));
										}

									} else {
										echo '-';
									}
								
									echo '</div></td>
									<td>';

								if($v['protocol'] === 'bcloud'){
									echo '-';
								} else {
									echo '<input type="hidden" name="edit_loc_id" value="'.esc_attr($k).'"/>
									<input type="hidden" name="edit_protocol" value="'.esc_attr($v['protocol']).'"/>
									<input type="hidden" name="security" value="'.esc_attr($backuply_nonce).'"/>
									<input name="backuply_edit_loc" class="button button-primary action" value="'.esc_html__('Edit Location', 'backuply').'"  type="submit" />';
								}?>
								</td>
							</form>
							<td>
								<form method="post">
									<input type="hidden" name="security" value="<?php echo esc_attr($backuply_nonce); ?>"/>
									<input type="hidden" name="del_loc_id" value="<?php echo esc_attr($k); ?>"/>
									<input name="backuply_delete_location" class="button button-primary action" onclick="return conf_del('Are you sure you want to delete this backup location ?');" value="<?php esc_html_e('Delete', 'backuply'); ?>"  type="submit" />
								</form>
							</td>
						</tr> <?php
					}
				}
				?>
					</table><br/>
						<button type="button" class="button button-primary" id="add_backup_loc_btn"><?php esc_html_e('Add Backup Location', 'backuply'); ?></button>
					<?php if(!defined('BACKUPLY_PRO')) { ?>
						<div class="backuply-settings-block backuply-premium-box">
							<h2 align="center"><a href="<?php echo BACKUPLY_PRO_URL; ?>" target="_blank">Upgrade to Backuply Pro</a></h2>
							<p align="center">To unlock more backup locations</p>
							<br/>
							<ul class="backuply-loc-types-showcase">
								<li><img class="backuply-grayscale" src="<?php echo BACKUPLY_URL . '/assets/images/softftpes.svg'?>" height="64" width="64" alt="FTPS Logo" title="FTPS"/></li>
								<li><img class="backuply-grayscale" src="<?php echo BACKUPLY_URL . '/assets/images/softsftp.svg'?>" height="64" width="64" alt="SFTP Logo" title="SFTP"/></li>
								<li><img class="backuply-grayscale" src="<?php echo BACKUPLY_URL . '/assets/images/dropbox.svg'?>" height="64" width="64" alt="Dropbox Logo" title="Dropbox"/></li>
								<li><img class="backuply-grayscale" src="<?php echo BACKUPLY_URL . '/assets/images/onedrive.svg'?>" height="64" width="64" alt="OneDrive Logo" title="OneDrive"/></li>
								<li><img class="backuply-grayscale" src="<?php echo BACKUPLY_URL . '/assets/images/aws.svg'?>" height="64" width="64" alt="Amazon S3 Logo" title="Amazon S3"/></li>
								<li><img class="backuply-grayscale" src="<?php echo BACKUPLY_URL . '/assets/images/webdav.svg'?>" height="64" width="64" alt="WebDav Logo" title="WebDav"/></li>
								<li><img class="backuply-grayscale" src="<?php echo BACKUPLY_URL . '/assets/images/digitalocean.svg'?>" height="64" width="64" alt="DigitalOcean Logo" title="DigitalOcean Spaces"/></li><li><img class="backuply-grayscale" src="<?php echo BACKUPLY_URL . '/assets/images/cloudflare.svg'?>" height="64" width="64" alt="Cloudflare Logo" title="Cloudflare R2"/></li>
								<li><img class="backuply-grayscale" src="<?php echo BACKUPLY_URL . '/assets/images/vultr.svg'?>" height="64" width="64" alt="Vultr Logo" title="Vultr Object Storage"/></li>
								<li><img class="backuply-grayscale" src="<?php echo BACKUPLY_URL . '/assets/images/linode.svg'?>" height="64" width="64" alt="Linode Logo" title="Linode Object Storage"/></li>
							</ul>
						</div>
					<?php } ?>
				</div>
			</div>
		</div>
	</div>

	<!-- Add Backup Location Modal -->
	<div class="postbox" id="add_backup_loc_form" title="Add Backup Location" style="display:none;">
		
		<div class="inside">
			<form method="post">	
				<?php
				backuply_report_error($error);
				
				$loc_name = $protocol = $aws_endpoint = $aws_region = $aws_access_key = $aws_secret_key = $aws_basket_name = $access_code = $server_host = $port = $ftp_user = $ftp_pass = $backup_loc = $bcloud_region = '';
				
				if(!empty($error)) {
					$loc_name = !empty($_POST['location_name']) ? backuply_optpost('location_name') : '';
					$protocol = !empty($_POST['protocol']) ? backuply_optpost('protocol') : '';
					$bcloud_key = !empty($_POST['bcloud_key']) ? backuply_optpost('bcloud_key') : '';
					$s3_compatible = !empty($_POST['s3_compatible']) ? backuply_optpost('s3_compatible') : '';
					$aws_endpoint = !empty($_POST['aws_endpoint']) ? backuply_optpost('aws_endpoint') : '';
					$aws_region = !empty($_POST['aws_region']) ? backuply_optpost('aws_region') : '';
					$aws_access_key = !empty($_POST['aws_accessKey']) ? backuply_optpost('aws_accessKey') : '';
					$aws_secret_key = !empty($_POST['aws_secretKey']) ? backuply_optpost('aws_secretKey') : '';
					$aws_sse = !empty($_POST) ? (isset($_POST['aws_sse']) ? 'checked' : '') : '';
					$aws_basket_name = !empty($_POST['aws_bucketname']) ? backuply_optpost('aws_bucketname') : '';
					$access_code = !empty($_POST['access_code']) ? backuply_optpost('access_code') : '';
					$server_host = !empty($_POST['server_host']) ? backuply_optpost('server_host') : '';
					$port = !empty($_POST['port']) ? backuply_optpost('port') : '';
					$ftp_user = !empty($_POST['ftp_user']) ? backuply_optpost('ftp_user') : '';
					$ftp_pass = !empty($_POST['ftp_pass']) ? backuply_optpost('ftp_pass') : '';
					$backup_loc = !empty($_POST['backup_loc']) ? backuply_optpost('backup_loc') : '';
					$backup_sync_infos = !empty($_POST) ? (isset($_POST['backup_sync_infos']) ? 'checked' : '') : 'checked';
				}
				?>
				
					
				<div class="backuply-option-wrap">
					<label class="backuply-opt-label" for="location_name">
						<span class="backuply-opt-label__title"><?php esc_html_e('Location Name', 'backuply'); ?></span>
						<span class="backuply-opt-label__helper"><?php esc_html_e('Choose a name for backup location for your reference', 'backuply'); ?></span>
					</label>
					<input type="text" size="50" name="location_name" id="location_name" value="<?php echo esc_attr($loc_name); ?>"/>
				</div>
				<div class="backuply-option-wrap">
					<label class="backuply-opt-label" for="protocol">
						<span class="backuply-opt-label__title"><?php esc_html_e('Protocol', 'backuply'); ?></span>
						<span class="backuply-opt-label__helper"><?php esc_html_e('Select the protocol by which Backuply will communicate', 'backuply'); ?></span>
					</label>
				
					<select name="protocol" class="form-control" id="protocol" value="<?php echo  esc_attr($protocol); ?>">
						<?php
						foreach(backuply_get_protocols() as $key => $remote_loc) {
							$selected = (isset($protocol) && $protocol == $key) ? ' selected' : '';
							echo '<option value="'.esc_attr($key).'" '.esc_attr($selected).'>'.esc_attr($remote_loc).'</option>';
						}
						?>
					</select>
				</div>
				<div class="backuply-option-wrap" style="display:none;">
					<label class="backuply-opt-label" for="backuply-cloud-key">
						<span class="backuply-opt-label__title"><?php esc_html_e('Backuply Cloud Key', 'backuply'); ?>
							<input type="text" size="50" name="bcloud_key" id="backuply-cloud-key" value="<?php echo !empty($backuply['bcloud_key']) ? esc_attr($backuply['bcloud_key']) : ''?>"/>
						</span>
						<span class="backuply-opt-label__helper"><?php esc_html_e('Keep this empty if you dont already have a Backuply Cloud Key', 'backuply'); ?></span>
					</label>

				</div>
				
				<?php 
				if(defined('BACKUPLY_PRO')){ ?>
				<div class="backuply-option-wrap aws_s3bucket bakuply-s3-compatible">
					<label class="backuply-opt-label" for="s3_compatible">
						<span class="backuply-opt-label__title"><?php esc_html_e('S3 Compatible Storages', 'backuply'); ?></span>
						<span class="backuply-opt-label__helper"><?php esc_html_e('Select the S3 Compatible Storage if any', 'backuply'); ?></span>
					</label>
				
					<select name="s3_compatible" class="form-control" id="s3_compatible" value="<?php echo esc_attr($protocol); ?>">
						<?php
						$s3_comp = array('digitalocean' => 'DigitalOcean Spaces', 'linode' => 'Linode Object Storage', 'vultr' => 'Vultr Object Storage', 'cloudflare' => 'Cloudflare R2', 'wasabi' => 'Wasabi Object Storage', 'custom' => 'Custom');
						
						foreach($s3_comp as $key => $remote_loc) {
							$selected = (isset($s3_compatible) && $s3_compatible == $key) ? ' selected' : '';
							echo '<option value="'.esc_attr($key).'" '.esc_attr($selected).'>'.esc_attr($remote_loc).'</option>';
						}
						?>
					</select>
				</div>
				<div class="backuply-option-wrap aws_s3bucket">
					<label class="backuply-opt-label" for="aws_endpoint">
						<span class="backuply-opt-label__title"><?php esc_html_e('AWS S3 Endpoint', 'backuply'); ?></span>
						<span class="backuply-opt-label__helper"><?php esc_html_e('Enter your AWS S3 Endpoint e.g. "s3.amazonaws.com"', 'backuply'); ?></span>
					</label>
					<input type="text" size="50" name="aws_endpoint" id="aws_endpoint" value="<?php echo esc_attr($aws_endpoint); ?>"/>
				</div>
				<div class="backuply-option-wrap aws_s3bucket">
					<label class="backuply-opt-label" for="aws_region">
						<span class="backuply-opt-label__title"><?php esc_html_e('AWS S3 Region', 'backuply'); ?></span>
						<span class="backuply-opt-label__helper"><?php esc_html_e('Enter your AWS S3 Region e.g. "us-east-1"', 'backuply'); ?></span>
					</label>
					<input type="text" size="50" name="aws_region" id="aws_region" value="<?php echo esc_attr($aws_region); ?>"/>
				</div>
				<div class="backuply-option-wrap aws_s3bucket">
					<label class="backuply-opt-label" for="aws_accessKey">
						<span class="backuply-opt-label__title"><?php esc_html_e('AWS S3 Access Key', 'backuply'); ?></span>
					</label>
					<input type="text" size="50" name="aws_accessKey" id="aws_accessKey" value="<?php echo esc_attr($aws_access_key); ?>"/>
				</div>
				<div class="backuply-option-wrap aws_s3bucket">
					<label class="backuply-opt-label" for="aws_secretKey">
						<span class="backuply-opt-label__title"><?php esc_html_e('AWS S3 Secret Key', 'backuply'); ?></span>
					</label>
					<input type="password" size="50" name="aws_secretKey" id="aws_secretKey" value="<?php echo esc_attr($aws_secret_key); ?>"/>
				</div>
				<div class="backuply-option-wrap aws_s3bucket">
					<label class="backuply-opt-label" for="aws_bucketname">
						<span class="backuply-opt-label__title"><?php esc_html_e('AWS S3 Bucket Name', 'backuply'); ?></span>
						<span class="backuply-opt-label__helper"><?php esc_html_e('Enter the AWS S3 bucket name where you wish to create Backuply backups. If the bucket is not present, it will be created automatically', 'backuply'); ?></span>
					</label>
					<input type="text" size="50" name="aws_bucketname" id="aws_bucketname" value="<?php echo esc_attr($aws_basket_name); ?>"/>
				</div>
				<div class="backuply-option-wrap aws_s3bucket aws_sse">
					<label class="backuply-opt-label" for="aws_sse">
						<span class="backuply-opt-label__title"><?php esc_html_e('Enable Server Side Encryption', 'backuply'); ?>
							<input type="checkbox" size="50" name="aws_sse" id="aws_sse" <?php echo !empty($aws_sse) ? esc_attr($aws_sse) : ''; ?>/>
						</span>
						<span class="backuply-opt-label__helper"><?php esc_html_e('If checked, AWS will encrypt the data we upload', 'backuply'); ?></span>
						
					</label>
				</div>

				<?php } ?>
				<div class="backuply-option-wrap ftp_details">
					<label class="backuply-opt-label" for="server_host">
						<span class="backuply-opt-label__title"><?php esc_html_e('Server Host (Required)', 'backuply'); ?></span>
						<span class="backuply-opt-label__helper"><?php esc_html_e('Enter the server host e.g. ftp.mydomain.com', 'backuply'); ?></span>
					</label>
					<input type="text" size="50" name="server_host" id="server_host" value="<?php echo esc_attr($server_host); ?>"/>
				</div>
				<div class="backuply-option-wrap ftp_details">
					<label class="backuply-opt-label" for="port">
						<span class="backuply-opt-label__title"><?php esc_html_e('Port', 'backuply'); ?></span>
						<span class="backuply-opt-label__helper"><?php esc_html_e('Enter the port to connect (default FTP port is 21)', 'backuply'); ?></span>
					</label>
					<input type="number" size="50" name="port" id="port" value="<?php echo esc_attr($port); ?>"/>
				</div>
				<div class="backuply-option-wrap ftp_credentials">
					<label class="backuply-opt-label" for="ftp_user">
						<span class="backuply-opt-label__title"><?php esc_html_e('FTP Username', 'backuply'); ?></span>
						<span class="backuply-opt-label__helper"><?php esc_html_e('The Username of your FTP Account', 'backuply'); ?></span>
					</label>
					<input type="text" size="50" name="ftp_user" id="ftp_user" value="<?php echo esc_attr($ftp_user); ?>"/>
				</div>
				<div class="backuply-option-wrap ftp_credentials">
					<label class="backuply-opt-label" for="ftp_pass">
						<span class="backuply-opt-label__title"><?php esc_html_e('FTP Password', 'backuply'); ?></span>
						<span class="backuply-opt-label__helper"><?php esc_html_e('The Password of your FTP account', 'backuply'); ?></span>
					</label>
					<input type="password" size="50" name="ftp_pass" id="ftp_pass" value="<?php echo esc_attr($ftp_pass); ?>"/>
				</div>
				<div class="backuply-option-wrap">
					<label class="backuply-opt-label" for="backup_loc">
						<span class="backuply-opt-label__title"><?php esc_html_e('Backup Location (Optional)', 'backuply'); ?></span>
						<span class="backuply-opt-label__helper"><?php esc_html_e('Backup Directory e.g. /backups or you can leave empty to allow Backuply to manage the', 'backuply'); ?></span>
					</label>
					<input type="text" size="50" name="backup_loc" id="backup_loc" value="<?php echo esc_attr($backup_loc); ?>"/>
				</div>
				<div class="backuply-option-wrap">
					<label class="backuply-opt-label" for="backup_sync_infos">
						<span class="backuply-opt-label__title">
							<?php esc_html_e('Sync Infos', 'backuply'); ?>
							<input type="checkbox" name="backup_sync_infos" id="backup_sync_infos" <?php echo isset($backup_sync_infos) ? esc_attr($backup_sync_infos) : ''; ?> />
						</span>
						<span class="backuply-opt-label__helper"><?php esc_html_e('If checked, Backuply will check for any existing info files on this Backup Location and compare it with the local info files. Any info file not present on the local system, will be synced from the remote location', 'backuply'); ?></span>
					</label>
				</div>
				<input type="hidden" name="security" value="<?php echo esc_attr($backuply_nonce);?>"/>
				<div class="backuply-option-wrap">
					<input type="hidden" name="edit_loc_id" value="" />
					<input type="hidden" name="addbackuploc" value="" />
					<input type="hidden" name="backuply_edit_location" value=""/>
					<button class="button button-primary action" type="submit"><?php esc_html_e('Add Backup Location', 'backuply'); ?></button>
				</div>
			</form>
		</div>
	</div>
	
	<!-- Backup Settings -->
	<div id="backuply-settings" class="postbox backuply-tab" style="display:none;">
		<div class="postbox-header">
			<h2 class="hndle">
				<span><?php esc_html_e('General Settings', 'backuply'); ?></span>
			</h2>
		</div>
		<div class="inside">
			<form method="post">
				<!--Backup Settings-->
				<div class="backuply-settings-block">
					<h2 class="backuply-heading-2">
						<?php esc_html_e('Backups Settings', 'backuply'); ?>
					</h2>
					
					<div class="backuply-form-wrap">
						<div class="backuply-option-wrap">
							<div class="backuply-opt-label">
								<span class="backuply-opt-label__title"><?php esc_html_e('Backup Options', 'backuply'); ?></span>
							</div>
							<div style="margin-left:5px;">
								<div class="form-check">
									<label class="form-check-label">
									<input type="checkbox" class="form-check-input" id="setting_backup_dir" name="backup_dir" <?php echo(!empty($backuply['settings']['backup_dir']) ? ' checked' : '');?>><?php esc_html_e('Backup Directories', 'backuply'); ?>
								  </label>
								</div>

								<div class="form-check">
									<label class="form-check-label">
										<input type="checkbox" class="form-check-input" id="setting_backup_db" name="backup_db" <?php echo(!empty($backuply['settings']['backup_db']) ? ' checked' : '');?>><?php esc_html_e('Backup Database', 'backuply'); ?>
									</label>
								</div>
							</div>
						</div>
						
						<div class="backuply-option-wrap">
							<label class="backuply-opt-label" for="backup_location">
								<span class="backuply-opt-label__title"><?php esc_html_e('Backup Location', 'backuply'); ?></span>
							</label>
							<select name="backup_location">
								<option value="">Local Folder (Default)</option>
								<?php
								if(!empty($backuply_remote_backup_locs)){
									foreach($backuply_remote_backup_locs as $k => $v){ 
										if(!defined('BACKUPLY_PRO') && !array_key_exists($v['protocol'], backuply_get_protocols())){
											continue;
										}
									
										$selected = '';
								
										if(!empty($backuply['settings']['backup_location']) && $backuply['settings']['backup_location'] == $k) {
											$selected = 'selected';
										}
									?>
										<option value="<?php echo esc_attr($k); ?>" <?php echo esc_attr($selected);?>><?php echo esc_html($v['name']); ?></option>
									<?php }
								} ?>
							</select>
						</div>
					</div>
				</div>
				
				<!--Auto Backups-->
				<div class="backuply-settings-block">
					<?php if(!defined('BACKUPLY_PRO') && empty($backuply['bcloud_key'])){
							echo '<span class="backuply-pro-block-badge"><span class="dashicons dashicons-lock"></span> Pro Feature</span><div class="backuply-pro-block-notice"></div>';
						}
						
					?>
					<h2 class="backuply-heading-2">
						<?php esc_html_e('Auto Backups Settings', 'backuply'); ?>
					</h2>
					<div class="backuply-form-wrap">
						<div class="backuply-option-wrap">
							<label class="backuply-opt-label">
								<span class="backuply-opt-label__title"><?php esc_html_e('Auto Backup', 'backuply'); ?></span>
							</label>
							<select name="backuply_cron_schedule" onchange="backuply_cron_backup_style(this.value)">
								<option value=""><?php esc_html_e('Don\'t Backup', 'backuply');?></option>
									<?php foreach($cron_schedules as $schedule_key => $schedule_value){
											$selected = '';
											if(!empty($cron_task) && $cron_task['backuply_cron_schedule'] == $schedule_key){
												$selected = 'selected';
											}
									?>
								<option value="<?php echo esc_attr($schedule_key); ?>" <?php echo esc_attr($selected); ?>><?php echo esc_attr($schedule_value['display']); ?></option>
								<?php } 
								
								$custom = '';
								
								if(!empty($cron_task) && $cron_task['backuply_cron_schedule'] == 'custom') {
									$custom = 'selected';
								}
								?>
								
								<option value="custom" <?php echo esc_attr($custom); ?>>Custom</option>
							</select>
						</div>
						
						<div class="backuply-option-wrap">
							<label class="backuply-opt-label" for="backup_rotation">
								<span class="backuply-opt-label__title"><?php esc_html_e('Backup Rotation', 'backuply'); ?></span>
							</label>
							<select id="backup_rotation" name="backup_rotation" disabled >
								<option value=""><?php esc_html_e('Unlimited', 'backuply'); ?></option>
								<?php for($i = 1; $i <= 10; $i++) {
									
									$selected = '';
									
									if(isset($cron_task['backup_rotation']) && $cron_task['backup_rotation'] == $i) {
										$selected = 'selected';
									}

									?>
								<option value="<?php echo esc_attr($i);?>" <?php echo esc_attr($selected);?>><?php echo esc_attr($i);?></option>
								<?php } ?>
							</select>
						</div>
	
						<div class="backuply-option-wrap" id="backuply_cron_checkbox">
							<div class="backuply-opt-label">
								<span class="backuply-opt-label__title"><?php esc_html_e('Backup options', 'backuply'); ?></span>
							</div>
							<div style="margin-left:5px;">
								<div class="form-check">
									<label class="form-check-label">
										<input type="checkbox" class="form-check-input" value="1" id="setting_auto_backup_dir" name="auto_backup_dir" <?php echo(!empty($cron_task['backup_dir']) ? 'checked': '');?>><?php esc_html_e('Backup Directories', 'backuply'); ?>
									</label>
								</div>
								<div class="form-check">
									<label class="form-check-label">
										<input type="checkbox" class="form-check-input" value="1" id="setting_auto_backup_db" name="auto_backup_db" <?php echo(!empty($cron_task['backup_db']) ? 'checked' : '');?>><?php esc_html_e('Backup Database', 'backuply'); ?> 
									</label>
								</div>
							</div>
						</div>

						<div class="backuply-option-wrap" id="backuply-custom-cron"  style="<?php echo (!empty($cron_task['backuply_cron_schedule']) && $cron_task['backuply_cron_schedule'] == 'custom') ? 'display:none' : ''?>">
							<div class="backuply-opt-label">
								<span class="backuply-opt-label__title"><?php esc_html_e('Auto Backup Cron Command', 'backuply')?></span>
								<span class="backuply-opt-label_helper"><?php esc_html_e('You will need to manually set Custom Cron', 'backuply'); ?> <a href="https://backuply.com/docs/how-to/how-to-setup-custom-auto-backup/" target="_blank" title="<?php esc_html_e('Doc on how to setup Custom Auto Backup', 'backuply');?>"><span class="dashicons dashicons-external"></span></a></span>
								<span class="backuply-opt-label_helper"><?php esc_html_e('Set cron time as per your choice in the Cron Job wizard', 'backuply'); ?></span>
							</div>
							<div class="backuply-code-text-wrap">
								<span class="backuply-code-text">
									wget --delete-after "<?php echo esc_url(site_url()); ?>/?action=backuply_custom_cron&backuply_key=<?php echo esc_html(get_option('backuply_config_keys')['BACKUPLY_KEY']); ?>"</span>
								<span class="backuply-code-copy">Copy</span>
								<span class="backuply-code-copied">Copied</span>
							</div>
						</div>
					</div>
				</div>
				
				<!-- Exclude Block -->
				<div class="backuply-settings-block">
					<h2 class="backuply-heading-2">
						<?php esc_html_e('Exclude Settings', 'backuply'); ?>
					</h2>
					
					<div class="backuply-form-wrap">
						<div class="backuply-option-wrap">
							<label class="backuply-opt-label">
								<span class="backuply-opt-label__title"><span class="dashicons dashicons-database"></span> <?php esc_html_e('Exclude DB Table', 'backuply'); ?></span>
							</label>
							<div id="advoptions_toggle" onclick="toggle_advoptions('exclude_table');" class="dashicons-before dashicons-plus-alt" style="cursor:pointer;">
								<label class="form-check-label"><?php esc_html_e('Select database tables from the following list', 'backuply'); ?>
								</label>
							</div>
							<div id="exclude_table" style="display:none; overflow-y:auto; max-height: 250px;">
								<table class="table table-hover">
									<?php
									$tables = $wpdb->get_results('SHOW TABLES');
									
									if(empty($tables)){
										$tables = array();
									}
									
									foreach($tables as $table){
										foreach($table as $t){
											$is_checked = '';

											if(!empty($backuply['excludes']['db']) && in_array($t, $backuply['excludes']['db'])){
												$is_checked = 'checked';
											}

											echo '<tr>
												<td><input type="checkbox" name="exclude_db_table[]" class="soft_filelist" value="'. esc_attr($t) .'" id="exclude_db_table_'. esc_attr($t). '" ' . esc_attr($is_checked) . '/></td>
												<td><label for="add_to_fileindex_'. esc_attr($t).'" style="cursor:pointer;">'. esc_html($t).'</label></td>
											</tr>';
										}
									} ?>
								</table>
							</div>
						</div>
						
						<div class="backuply-option-wrap">
							<label class="backuply-opt-label" for="backuply_exclude_files">
								<span class="backuply-opt-label__title"><span class="dashicons dashicons-category"></span> <?php esc_html_e('Exclude Files/Folders', 'backuply'); ?></span>
								<span class="backuply-opt-label__helper"><?php esc_html_e('Exclude specific files, or though certain patters', 'backuply'); ?></span>
								<div class="backuply_exclude_file_block" id="backuply-exclude-file-specific">
									<div class="backuply_exclude_file_header"><?php esc_html_e('Exclude Specific Folder/Folder', 'backuply'); ?></div>
									<div class="backuply_exclude_file_list"></div>
								</div>
								<div class="backuply_exclude_file_block" id="backuply-exclude-file-pattern">
									<div class="backuply_exclude_file_header"><?php esc_html_e('Exclude a pattern', 'backuply'); ?></div>
									<div class="backuply_exclude_file_list"></div>
								</div>
							</label>
						</div>
					</div>
				</div>

				<!-- Additional Settings -->
				<div class="backuply-settings-block">
					<h2 class="backuply-heading-2">
						<?php esc_html_e('Additional Settings', 'backuply'); ?>
					</h2>
					<?php $notify_email_address = get_option('backuply_notify_email_address'); ?>
					<div class="backuply-form-wrap">
						<div class="backuply-option-wrap">
							<label class="backuply-opt-label" for="notify_email_address">
								<span class="backuply-opt-label__title"><?php esc_html_e('Email', 'backuply'); ?></span>
								<span class="backuply-opt-label__helper"><?php esc_html_e('The email address to send mails to', 'backuply'); ?></span>
							</label>
								
							<input type="email" size="50" value="<?php echo esc_attr($notify_email_address); ?>" name="notify_email_address" id="notify_email_address"/>
						</div>
							
						<?php
						$add_to_fileindex = backuply_sfilelist($dir_path, 0);
						
						if(!empty($add_to_fileindex)){?>
							<div class="backuply-option-wrap">
								<label class="backuply-opt-label">
									<span class="backuply-opt-label__title"><?php esc_html_e('Additional Files', 'backuply'); ?></span>
								</label>
								<div id="advoptions_toggle" onclick="toggle_advoptions('selectfile');" class="dashicons-before dashicons-plus-alt" style="cursor:pointer;">
									<label class="form-check-label"><?php esc_html_e('Select additional files/folders from the following list', 'backuply'); ?>
									</label>
								</div>
								<div id="selectfile" style="display:none">
									<table class="table table-hover">
										<thead style="text-align: left">
											<tr>
												<th width="10%"><input type="checkbox" id="check_all_edit" name="check_all_edit"></th>
												<th colspan="2"><?php esc_html_e('Check All', 'backuply'); ?></th>
											</tr>
										</thead>

										<?php
										$backuply_core_fileindex = backuply_core_fileindex();
										$backuply_additional_fileindex = get_option('backuply_additional_fileindex');
										
										if(empty($backuply_additional_fileindex)){
											$backuply_additional_fileindex = array();
										}
										
										foreach($add_to_fileindex as $ck => $cv){
											if(in_array($cv['name'], $backuply_core_fileindex)) continue; ?>
											<tr>
												<td><input type="checkbox" name="add_to_fileindex[]" class="soft_filelist" value="<?php echo esc_attr($cv['name']); ?>" id="add_to_fileindex_<?php echo esc_attr($cv['name']);  ?>" <?php echo esc_attr(backuply_POSTmulticheck('add_to_fileindex', $cv['name'], $backuply_additional_fileindex)) ?> /></td>
												<?php
												if(!empty($cv['dir'])){ ?>
													<td width="5%"><div class ="dashicons-before dashicons-open-folder"></div></td>
												<?php }else{ ?>
													<td width="5%"><div class ="dashicons-before dashicons-format-aside"></div></td>
												<?php }
												?>
												<td><label for="add_to_fileindex_"<?php echo esc_attr($cv['name']);?> style="cursor:pointer;"><?php echo esc_html($cv['name']); ?></label></td>
											</tr>
										<?php }
										?>
									</table>
								</div>
							</div>
						<?php } ?>
						<div class="backuply-option-wrap">
							<?php	
							$checked = !empty(get_option('backuply_debug')) ? 'checked' : '';	
							?>
							<label class="backuply-opt-label" for="backuply_debug_mode">
								<span class="backuply-opt-label__title"><?php esc_html_e('Debug Mode', 'backuply'); ?></span>
								<input type="checkbox" name="debug_mode" id="backuply_debug_mode"  <?php echo esc_attr($checked); ?>/>
								<span class="backuply-opt-label__helper"><?php esc_html_e('Enable Debug Mode (Don\'t keep it always enabled)', 'backuply'); ?></span>
							</label>
						</div>
					</div>
				</div>
				
				<div style="margin-top:20px; text-align:center;">
					<input type="hidden" name="security" value="<?php echo esc_attr($backuply_nonce);?>"/>
					<input name="backuply_save_settings" class="button-primary" value="<?php esc_html_e('Save Settings', 'backuply'); ?>" type="submit" />
				</div>
			</form>
		</div>
	</div>
	
	<!-- Backup History -->
	<div id="backuply-history" class="postbox backuply-tab" style="display:none;">
		<div class="postbox-header">
			<h2 class="hndle">
				<div>
				<?php
					echo '<select name="backup_sync_id">
						<option value="loc">Local Folder</option>';


					if(!empty($backuply_remote_backup_locs)){
						foreach($backuply_remote_backup_locs as $k => $v){
							if(!array_key_exists($v['protocol'], backuply_get_protocols())){
								continue;
							}
							
							echo '<option value="'.esc_attr($k).'">'.esc_html($v['name']).' ('.esc_html($protocols[$v['protocol']]).')</option>';
						}
					}

					echo '</select>
					<button class="button button-primary" id="backuply-btn-sync-bak">Sync Backups</button>
					<button class="button button-primary" id="backuply-btn-upload-bak" style="margin-left:10px;" title="Upload Backup"><span class="dashicons dashicons-upload" style="vertical-align:sub;"></span></button>';
					
					?>
					</div>
					
				<span><?php esc_html_e('Backup History', 'backuply'); ?></span>
				<div style="display:flex; gap:10px;">
					<span class="spinner"></span>
					<button class="button button-primary" id="backuply-bak-select-all">Select all</button>
					<button class="backuply-btn backuply-btn--danger" id="backuply-bak-multi-delete">Delete</button>
				</div>
			</h2>
		</div>
		<div class="inside">
			<div class="backuply-settings-block">
				<table class="table" style="width:100%;" id="backuply-history-table">
					<thead>
						<tr>
							<th style="width:3%;text-align:left;">&nbsp;</th>
							<th style="width:30%;text-align:left;"><?php esc_html_e('Backup Time', 'backuply'); ?></th>
							<th style="width:15%;text-align:left;"><?php esc_html_e('Backup Location', 'backuply'); ?></th>
							<th style="width:15%;text-align:left;"><?php esc_html_e('Host', 'backuply'); ?></th>
							<th style="width:20%;text-align:left;"><?php esc_html_e('File Size', 'backuply'); ?></th>
							<th style="width:15%;text-align:left;"><?php esc_html_e('Will Restore', 'backuply'); ?></th>
							<th style="width:15%;text-align:center;"><?php esc_html_e('Restore', 'backuply'); ?></th>
							<th style="width:15%;text-align:center;"><?php esc_html_e('Delete', 'backuply'); ?></th>
							<th style="width:15%;text-align:center;"><?php esc_html_e('Download', 'backuply'); ?></th>
						</tr>
					</thead>
					<tbody>
					<?php
					$history_page = !empty($_GET['history_page']) ? (int)$_GET['history_page'] : 0;
					$backups_per_page = 20;
					$history_offset = ($history_page - 1)*$backups_per_page;
					
					$backup_infos = backuply_get_backups_info_data($history_offset, $backups_per_page);

					foreach($backup_infos['backup_infos'] as $count => $all_info){
						$backup_loc_name = 'Local';
						$backup_protocol = 'local';
						$backup_server_host = '-';
						$proto_id = !empty($all_info->backup_location) ? $all_info->backup_location : '';
		
						if(!empty($all_info->backup_location)) {

							if(empty($backuply_remote_backup_locs[$all_info->backup_location]) || empty($backuply_remote_backup_locs[$all_info->backup_location]['protocol'])) {
								$backups_folder = backuply_glob('backups');

								// This is to fix the given case: When the user uploads the backup file, and syncs it and if 
								// the info file has a backup_location set with some id and there is no backup location added
								// with that ID then the backup does not shows in the history tab.
								// So if that case happens we unset the backup_location so that the backups could be shown as
								// local folder backup.
								if(empty($backups_folder) ||  !file_exists($backups_folder . '/'. $all_info->name. '.tar.gz')){
									continue;
								}

								$all_info->backup_location = null;
							}

							if(!empty($all_info->backup_location) && !array_key_exists($backuply_remote_backup_locs[$all_info->backup_location]['protocol'], backuply_get_protocols())) {
								continue;
							}
							
							if(!empty($all_info->backup_location)){
								$backup_protocol = $backuply_remote_backup_locs[$all_info->backup_location]['protocol'];
								$s3_compat = !empty($backuply_remote_backup_locs[$all_info->backup_location]['s3_compatible']) ? $backuply_remote_backup_locs[$all_info->backup_location]['s3_compatible'] : '';
								$backup_loc_name = $backuply_remote_backup_locs[$all_info->backup_location]['name'];
								$backup_server_host = isset($backuply_remote_backup_locs[$all_info->backup_location]['server_host']) ? $backuply_remote_backup_locs[$all_info->backup_location]['server_host'] : '-';
							}

						}

						echo '
						<tr data-proto-id="'.esc_attr($proto_id).'">
							<td>
								<input type="checkbox" name="backuply_selected_bak[]" value="'.esc_attr($all_info->name .'.'. $all_info->ext).'"/>
							</td>
							<td>
								<div style="position:relative;" title="URL where the Backup was created '.(!empty($all_info->backup_site_url) ? esc_url($all_info->backup_site_url) : '').'">'.esc_html(backuply_format_unix_time($all_info->btime));

						if(!empty($all_info->auto_backup)){
							echo ' <span class="backuply-auto-mark">Auto</span>';
						}

						echo '<span class="dashicons dashicons-media-text backuply-backup-last-log" title="Logs" style="cursor:pointer; text-decoration:none;" data-file-name="'.esc_attr($all_info->name) . '_log.php"></span>';

						if(!empty($all_info->backup_note)){
							echo '<span class="backuply-backup-note-tip" title="'.esc_attr($all_info->backup_note).'" style="cursor:pointer; vertical-align:middle;"><svg xmlns="http://www.w3.org/2000/svg" height="16" width="14" viewBox="0 0 448 512" fill="#f9be01"><path d="M64 32C28.7 32 0 60.7 0 96V416c0 35.3 28.7 64 64 64H288V368c0-26.5 21.5-48 48-48H448V96c0-35.3-28.7-64-64-64H64zM448 352H402.7 336c-8.8 0-16 7.2-16 16v66.7V480l32-32 64-64 32-32z"/></svg></span>';
						}

						echo'</div>
						</td>';

						$remote_icon = $backup_protocol;
						if(!empty($s3_compat)){
							$remote_icon = $s3_compat;

							if($s3_compat == 'custom'){
								$remote_icon = 'caws';
							}
						}

						echo '<td>
							<div style="display:flex; align-items:center;">';
								if(!empty($all_info->backup_location)){
									echo '<img src="'.BACKUPLY_URL.'/assets/images/'.esc_attr($remote_icon).'.svg" height="26" width="26" alt="Remote Location: '.esc_attr($backup_protocol).'"/ > &nbsp; ';
								}

								if($backup_loc_name == 'Local') {
									echo '<img src="'.BACKUPLY_URL . '/assets/images/local.svg" height="26" width="26" alt="Location : Local" /> &nbsp; ';
								}
								
								echo esc_html($backup_loc_name).'
							</div>	
						</td>
						<td>'.esc_html($backup_server_host).'</td>
						<td>'.esc_html(backuply_format_size($all_info->size)).'</td>';
						?>
							<td><?php if(!empty($all_info->backup_dir) && !empty($all_info->backup_db)){echo 'Files & Folders, Database';}else{if(!empty($all_info->backup_dir)){echo 'Files & Folders'; }else{echo 'Database';}} ?></td>
							<td style="text-align:right;">
					
								<form id="restoreform_<?php echo esc_attr($count); ?>" data-protocol="<?php echo esc_attr($backup_protocol); ?>" data-bak-name="<?php echo esc_attr($backup_loc_name); ?>">
									<input type="hidden" name="fname" value="<?php echo esc_attr($all_info->name .'.'. $all_info->ext); ?>" />
									
									<input name="backuply_restore_submit" class="button button-primary action" value="<?php esc_html_e('Restore', 'backuply'); ?>" onclick="backuply_restorequery('#restoreform_<?php echo esc_attr($count); ?>')" type="submit" />
							
								</form>
							</td>
							<td style="text-align:center;">
								<form method="post">
									<input type="hidden" name="tar_file" value="<?php echo esc_attr($all_info->name .'.'. $all_info->ext); ?>"/>
									<input type="hidden" name="security" value="<?php echo esc_attr($backuply_nonce); ?>"/>
									<input name="backuply_delete_backup" class="button button-primary action" onclick="return conf_del('Are you sure you want to delete the backup file ?');" value="<?php esc_html_e('Delete', 'backuply'); ?>"  type="submit" />
								</form>
							</td>
							<td style="text-align:center;">
								<?php if($backup_loc_name == 'Local') {
									?>
									<a class="button button-primary" href="<?php echo admin_url('admin-post.php?backup_name='.esc_attr($all_info->name .'.'. $all_info->ext) . '&security='.wp_create_nonce('backuply_download_security').'&action=backuply_download_backup'); ?>" download><?php esc_html_e('Download', 'backuply'); ?></a>
								<?php
								}else if($backup_loc_name == 'Backuply Cloud'){
									echo '<button type="button" class="button button-primary backuply-download-bcloud" data-name="'.esc_attr($all_info->name .'.'. $all_info->ext).'">'.esc_html__('Download', 'backuply').'</button>';
								}else {
									echo '-';
								} ?>
							</td>
						</tr>
					<?php } ?>
					</tbody>
				</table>
			</div>
			
			<?php 
			$page_count = ceil($backup_infos['total_backups']/$backups_per_page);
			
			if(!empty($page_count) && $page_count > 1){
			?>
			<div class="backuply-tablenav">
				<div class="backuply-tablenav-pages" id="backuply-pagination">
					<div class="backuply-total-items">Total Backups: <?php echo esc_html($backup_infos['total_backups']);?></div>
					<div class="backuply-pagination-controls">
					<?php
						if(empty($history_page) || $history_page < 1){
							$history_page = 1;
						} else if($history_page > $page_count){
							$history_page = $page_count;
						}

						echo '<div class="backuply-pagination-links">
							<div class="backuply-pagination-links">
								<a class="button backuply-prev-first-page" '.($history_page  <= 1 ? 'disabled' : 'href="'.esc_url(admin_url('?page=backuply#backuply-history')).'"').'>‹‹</a>
								
								<a class="button backuply-prev-page" '.($history_page <= 1 ? 'disabled' : 'href="'.esc_url(admin_url('?page=backuply&history_page='.($history_page-1).'#backuply-history')).'"').'>‹</a>
								<span class="backuply-pagination-info"> Page '.esc_html($history_page).' of '.esc_html($page_count).' </span>
								<a class="button backuply-next-page" '.(($page_count <= 1 || $history_page == $page_count) ? 'disabled' : 'href="'.esc_url(admin_url('?page=backuply&history_page='.($history_page+1).'#backuply-history')).'"').'>›</a>
								<a class="button backuply-last-next-page" '.(($page_count <= 1 || $history_page == $page_count) ? 'disabled' : 'href="'.esc_url(admin_url('?page=backuply&history_page='.($page_count).'#backuply-history')).'"').'>››</a>
								<form method="GET" action="'.esc_url(admin_url('?page=backuply#backuply-history')).'">
								<input type="hidden" value="backuply" name="page"/>
								<span class="backuply-pagination-input">Go to <input type="number" name="history_page" min="1" max="'.esc_attr($page_count).'" value="'.esc_attr($history_page).'"> Page</span>
								</form>
								</div></div>';
					?>
					</div>
				</div>
			</div>
			<?php } ?>
		</div>
	</div>

	<div class="postbox" id="backuply-upload-backup" title="Upload Backup File" style="display:none;">
	<?php
	
		echo '<div class="backuply-backup-uploader-selection">
			<input type="file" id="backuply-upload-backup-input" name="backuply-upload-backup" accept=".tar.gz, application/gzip" style="display:none;"/>
			<p style="font-size:18px; margin-bottom:6px;">Drag and Drop a file</p>
			<p style="font-size: 14px; margin-bottom:6px;">OR</p>
			<p><button class="button button-primary backuply-upload-select-file-btn">'.__('Select File').'</button></p>
			<p style="color:#6d6d6d; font-size:12px; margin-top:4px;">Supported file format .tar.gz</p>
		
		</div>
		<div class="backuply-upload-backup">
			<div class="backuply-upload-info-row">
				<div class="backuply-upload-info">
					<div class="backuply-upload-info-image">
						<img src="'.BACKUPLY_URL.'/assets/images/targz.png"/>
					</div>
					<div class="backuply-upload-info-text">
						<span class="backuply-upload-backup-name">Backup Name</span>
						<span class="backuply-upload-backup-size">Size</span>
					</div>
				</div>
				<div class="backuply-upload-stop-upload">
					<span class="dashicons dashicons-no-alt"></span>
				</div>
			</div>
			<div class="backuply-upload-progress-row">
				<div class="backuply-upload-bar">
					<div id="backuply-upload-bar-progress"></div>
				</div>
				<div class="backuply-upload-percentage">0%</div>
			</div>	
		</div>
		<div id="backuply-upload-alert" class="backuply-upload-alert">Backup Upload Alert</div>
		';
	?>
	</div>
	
	<!--Support-->
	<div id="backuply-support"  class="postbox backuply-tab" style="display:none;">
		<div class="postbox-header">
			<h2 class="hndle">
				<span><?php esc_html_e('Support', 'backuply'); ?></span>
			</h2>
		</div>
		<div class="backuply-settings-block">
			You can contact the Backuply Team via email. Our email address is <a href="mailto:support@backuply.com">support@backuply.com</a> or through Our <a href="https://softaculous.deskuss.com/open.php?topicId=17" target="_blank">Support Ticket System</a>
			<p>You can also check the docs <a href="https://backuply.com/docs/" target="_blank">https://backuply.com/docs/</a> to review some common issues. You might find something helpful there.</p>
			
			<h3><?php esc_html_e('Environment Info', 'backuply');?></h3>
			<table class="widefat striped">
				<tbody>
					<tr>
						<td>WP_MEMORY_LIMIT</td>
						<td><?php echo(defined('WP_MEMORY_LIMIT') ? WP_MEMORY_LIMIT : '-');?></td>
					</tr>
					
					<tr>
						<td>WP_MAX_MEMORY_LIMIT</td>
						<td><?php echo(defined('WP_MAX_MEMORY_LIMIT') ? WP_MAX_MEMORY_LIMIT : '-');?></td>
					</tr>
					<?php
					if(function_exists('ini_get')){ ?>
					
					<tr>
						<td><?php esc_html_e('PHP memory limit', 'backuply');?></td>
						<td><?php echo ini_get('memory_limit');?></td>
					</tr>
					
					<tr>
						<td><?php esc_html_e('PHP time limit', 'backuply');?></td>
						<td><?php echo ini_get('max_execution_time');?></td>
					</tr>
					<tr>
						<td><?php esc_html_e('PHP post max size', 'backuply');?></td>
						<td><?php echo ini_get('post_max_size');?></td>
					<?php } ?>
					<tr>
						<td>Server</td>
						<td><?php echo(isset($_SERVER['SERVER_SOFTWARE']) ? esc_html($_SERVER['SERVER_SOFTWARE']) : __('Unknown server', 'backuply'));?></td>
					</tr>
				</tbody>
			</table>
		</div>
	</div>
	<?php 
	if(!defined('BACKUPLY_PRO')){ ?>
	<!--Pro-->
	<div id="backuply-pro"  class="postbox backuply-tab" style="display:none;">
		<div class="postbox-header">
			<h2 class="hndle">
				<span><?php esc_html_e('Backuply Pro', 'backuply'); ?></span>
			</h2>
		</div>
		<div class="backuply-settings-block">
			<table class="wp-list-table widefat fixed striped table-view-list pages" style="text-align:center;">
				<thead>
					<tr>
						<th style="text-align:center;"><strong>Features</strong></th>
						<th style="text-align:center;"><strong>Backuply Free</strong></th>
						<th style="text-align:center;"><strong>Backuply Pro</strong></th>
					</tr>
				</thead>
				<tbody>
				<?php 
				
					$features = array(
						array('Local Backup', true),
						array('One-Click Restore', true),
						array('Direct Site-to-Site Migration', true),
						array('Migration Clone Ability', true),
						array('FTP Backups', true),
						array('SFTP And FTPS Backups', false),
						array('Backup To Dropbox', false),
						array('Backup To Google Drive', true),
						array('Backup To OneDrive', false),
						array('Backup To S3', false),
						array('Backup To WebDAV', false),
						array('Backup To S3 Compatible Storage', false),
						array('Auto Backups', false),
						array('Backup Rotation', false),
						array('WP-CLI Support', false),
						array('Faster Support', false)
					);
				
					foreach($features as $feature){
						
						$style = 'style=color:red';
						if(!empty($feature[1])){
							$style = 'style=color:green';
						}
						
						echo '<tr>
						<td>'.esc_html($feature[0]). '</td>
						<td><span class="dashicons '. esc_html(!empty($feature[1]) ? 'dashicons-yes' : 'dashicons-no-alt').'" '.esc_attr($style). '></span></td>
						<td><span class="dashicons dashicons-yes" style="color:green"></span></td>
					</tr>';
					} ?>
					
					<tr>
						<td></td>
						<td>Active Now</td>
						<td><a href="https://backuply.com/pricing" target="_blank" class="button button-primary">Get Pro</a></td>
					</tr>
				</tbody>
			</table>
		</div>
	</div>
	<?php } ?>
</div>
<div class="backuply-modal" id="backuply-backup-progress" <?php echo $is_restoring ? '' : 'style="display:none;"';?> data-process="<?php echo $is_restoring ? 'restore' : 'backup';?>">
	<div class="backuply-modal__inner">
		<div class="backuply-modal__header">
			<div class="backuply-modal-header__title">
				<?php 
				$active_proto = 'local';
				$active_name = 'Local';
				
				if(isset($backuply['status']['backup_location']) && !empty($backuply_remote_backup_locs[$backuply['status']['backup_location']]['protocol'])){
					$active_proto = $backuply_remote_backup_locs[$backuply['status']['backup_location']]['protocol'];
					$active_name = $backuply_remote_backup_locs[$backuply['status']['backup_location']]['name'];
				}
				
				if($is_restoring){
					$restro_info = backuply_get_restoration_data();
					
					if(!empty($restro_info)){
						$active_proto = $restro_info['protocol'];
						$active_name = $restro_info['name'];
					}
				}
				
				echo '<img src="'.BACKUPLY_URL . '/assets/images/'.esc_attr($active_proto).'.svg'.'" height="26" width="26" title="'.esc_attr($active_name).'" class="backuply-modal-bak-icon"/>'
				
				?>
				<span class="backuply-title-text">
					<span class="backuply-title-backup"><?php esc_html_e('Backup in Progress', 'backuply'); ?></span>
					<span class="backuply-title-restore"><?php esc_html_e('Restore in progress', 'backuply'); ?></span>
				</span>
				
			</div>
			
			<div class="backuply-modal-header__actions">
				<?php echo !empty($is_restoring) ? '' : '<span class="dashicons dashicons-no"></span>'; ?>
			</div>
		</div>
		<div class="backuply-modal__content">
			<p class="backuply-loc-bak-name" align="center"><?php echo esc_html__('Backup Location', 'backuply').':'.esc_html($active_proto); ?></p>
			<p class="backuply-loc-restore-name" style="display:none" align="center">Restoring From: <?php echo esc_attr($active_proto); ?></p>
			<p class="backuply-progress-extra-backup" align="center"><?php esc_html_e('We are backing up your site it may take some time.', 'backuply'); ?></p>
			<p class="backuply-progress-extra-restore" align="center" style="display:none;"><?php esc_html_e('We are restoring your site it may take some time.', 'backuply'); ?></p>
			<div class="backuply-progress-bar" ><div class="backuply-progress-value" style="width:0%;"  data-done="0%"></div></div>
			<p id="backuply-rate-on-restore" align="center" style="display:none;"><a href="https://wordpress.org/support/plugin/backuply/reviews/?filter=5#new-post" target="_blank"><?php esc_html_e('Rate Us if you find Backuply useful', 'backuply'); ?></a></p>
			<div class="backuply-backup-status">
				
			</div>
		</div>
		<div class="backuply-modal_footer">
			<div>
				<button class="button-secondary" id="backuply-kill-process-btn"><?php esc_html_e('Kill Process', 'backuply'); ?></button>
			</div>
			<div>
				<button class="backuply-btn backuply-btn--danger backuply-stop-backup"><?php esc_html_e('Stop', 'backuply'); ?></button>
				<button class="backuply-btn backuply-btn--success backuply-disabled backuply-backup-finish" disabled><?php esc_html_e('Finish', 'backuply'); ?></button>
			</div>
			</div>
		</div>
	</div>
</div>

<div class="postbox" id="backuply-backup-last-log" title="Last Backup Log" style="display:none;">
	<span class="spinner"></span>
	<div class="backuply-last-logs-block"></div>
</div>
<div class="postbox" id="backuply-restore-last-log" title="Last Restore Log" style="display:none;">
	<span class="spinner"></span>
	<div class="backuply-last-logs-block"></div>
</div>

<div class="postbox" id="backuply-exclude-pattern" title="Exclude By Pattern" style="display:none;">
	<div class="backuply-exclude-pattern-block">
		<select name="exclude_pattern_type">
			<option value="extension"><?php echo backuply_pattern_type_text('extension'); ?></option>
			<option value="beginning"><?php echo backuply_pattern_type_text('beginning'); ?></option>
			<option value="end"><?php echo backuply_pattern_type_text('end'); ?></option>
			<option value="anywhere"><?php echo backuply_pattern_type_text('anywhere'); ?></option>
		</select>
		<input type="text" name="exclude_pattern_val" style="width:55%;"/>
		<span class="dashicons dashicons-insert backuply-pattern-insert"></span>
	</div>

	<?php
	if(!empty($backuply['excludes'])){
		
		foreach($backuply['excludes'] as $type => $pattern_arr) {
			
			if($type == 'exact' || $type == 'db'){
				continue;
			}
			
			foreach($pattern_arr as $key => $pattern) {
				echo '<div class="backuply-exclude-pattern-block" data-edit="true" data-type="'.esc_attr($type).'" data-key="'.esc_attr($key).'">
					<span class="backuply-exclude-pattern-type">'.backuply_pattern_type_text($type).'</span>
					<span class="backuply-exclude-pattern-val"><input type="text" name="exclude_pattern_val" style="width:90%;" value="'.esc_attr($pattern).'" disabled/></span>
					<span class="dashicons dashicons-trash backuply-pattern-delete"></span>
					<span class="dashicons dashicons-edit backuply-pattern-edit"></span>
					<span class="dashicons dashicons-insert backuply-pattern-insert" style="display:none;"></span>
					<span class="spinner" style="display:none;"></span>
				</div>';
			}
		}
	}

?>	
	
</div>

<div class="postbox" id="backuply-exclude-specific" title="Exclude Specific File/Folder" style="display:none;">
	<?php
	
		echo '<h3 align="center">Select the file/folder you want to exclude</h3>
		<div class="backuply-js-tree" style="max-height: 60%; overflow:scroll;"></div>
		<button class="button button-primary backuply-exclude-add-exact">Exclude this</button>
		<h4 align="center">List of Excluded Files/Folders</h4>';
		
		if(!empty($backuply['excludes']['exact'])){
		
			foreach($backuply['excludes']['exact'] as $key => $pattern) {
				
				echo '<div class="backuply-exclude-pattern-block" data-type="exact" data-key="'.esc_attr($key).'">
				<span class="backuply-exclude-pattern-val" style="width:95%;">'.esc_html($pattern).'</span>
				<span class="dashicons dashicons-trash backuply-pattern-delete"></span></div>';
			}
		}
	?>
</div>
</td>

<td valign="top">
	<?php
	if(!defined('SITEPAD')) {
		backuply_promotion_tmpl();
	}
	?>
</td>
</tr>
</table>
</div>
</div>
</div>
</div>

	<?php 

	if($backuply['htaccess_error']) { ?>

	<div class="backuply-modal" id="backuply-htaccess-modal" style="display:none;">
		<div class="backuply-modal__inner">
			<div class="backuply-modal__header">
				<div class="backuply-modal-header__title">
					<span class="dashicons dashicons-privacy"></span><span> Secure your backup folder</span>
				</div>
				
				<div class="backuply-modal-header__actions">
					<span class="dashicons dashicons-no" onclick="backuply_close_modal(this)"></span>
				</div>
			</div>
			<div class="backuply-modal__content">
				<p></p>
				<span>We were not able to create a <strong>.htaccess</strong> file so you will need to do it manually.</span>
				<p>To retry creation of .htaccess <button class="button-primary" id="backuply_retry_htaccess">Click here</button></p>
				<p><strong>Follow the given steps to secure the backup folder manually:</strong></p>
				
				<ul style="list-style: disk inside;">
					<li>Go to the your Wordpress Install.</li>
					<li>Go in wp-content folder and you will find a folder named <strong>backuply</strong> inside it.</li>
					<li>In backuply folder create a <strong>.htaccess</strong> file and in it paste the text given below and save it</li>
				</ul>
				<div class="backuply-code-text-wrap">
					<span class="backuply-code-text">deny from all</span>
					<span class="backuply-code-copy">Copy</span>
					<span class="backuply-code-copied">Copied</span>
				</div>
			</div>
		</div>
	</div>

	<?php }
	
	if($backuply['index_html_error']) { ?>

	<div class="backuply-modal" id="backuply-index-html-modal" style="display:none;">
		<div class="backuply-modal__inner">
			<div class="backuply-modal__header">
				<div class="backuply-modal-header__title">
					<span class="dashicons dashicons-privacy"></span><span> Secure your backup folder</span>
				</div>
				
				<div class="backuply-modal-header__actions">
					<span class="dashicons dashicons-no" onclick="backuply_close_modal(this)"></span>
				</div>
			</div>
			<div class="backuply-modal__content">
				<p></p>
				<span>We were not able to create a <strong>index.html</strong> file so you will need to do it manually.</span>
				<p><strong>Follow the given steps to secure the backup folder manually:</strong></p>
				
				<ul style="list-style: disk inside;">
					<li>Go to the your Wordpress Install.</li>
					<li>Go in wp-content folder and you will find a folder named <strong>backuply</strong> inside it.</li>
					<li>In backuply folder create a <strong>index.html</strong> file and in it paste the text given below and save it</li>
					<li>There would be more folders inside backuply folder like backups-randomstring and backups_info-randomstring, so do the same as above inside those folders too.</li>
					<li>Or you can contact backuply at support@backuply.com we will help you out</li>
				</ul>
				<div class="backuply-code-text-wrap">
					<span class="backuply-code-text"><?php echo esc_html('<html><body><a href="https://backuply.com" target="_blank">WordPress backups by Backuply</a></body></html>'); ?></span>
					<span class="backuply-code-copy">Copy</span>
					<span class="backuply-code-copied">Copied</span>
				</div>
			</div>
		</div>
	</div>

	<?php }
}

// Formats time if the time is in utc timezone
function backuply_format_unix_time($unix_time){
	// Making time zone conversions.
	$unix_time = (int) $unix_time;

	$default_timezone = date_default_timezone_get();
	if($default_timezone == 'UTC' && class_exists('DateTime') && class_exists('DateTimeZone')){
		$time_zone_string = wp_timezone_string();
		$time_zone = new DateTimeZone($time_zone_string);
		$date_time = new DateTime('@'.$unix_time);
		$date_time->setTimezone($time_zone);
		$formated_time = $date_time->format('jS F Y h:i A');

		return $formated_time;
	}

	$formated_time = date('jS F Y h:i A', $unix_time);	
	return $formated_time;
}main/ajax.php000064400000111360151526424670007142 0ustar00<?php
/*
* BACKUPLY
* https://backuply.com
* (c) Backuply Team
*/

// Are we being accessed directly ?
if(!defined('BACKUPLY_VERSION')) {
	exit('Hacking Attempt !');
}

set_time_limit(60);
ignore_user_abort(true);

// Is the nonce there ?
if(empty($_REQUEST['security'])){
	return;
}

// AJAX Actions
add_action('wp_ajax_backuply_create_backup', 'backuply_create_backup');
add_action('wp_ajax_backuply_stop_backup', 'backuply_stop_backup');
add_action('wp_ajax_backuply_download_backup', 'backuply_download_backup');
add_action('wp_ajax_backuply_multi_backup_delete', 'backuply_multi_backup_delete');
add_action('wp_ajax_backuply_check_status', 'backuply_check_status');
add_action('wp_ajax_backuply_check_backup_status', 'backuply_backup_progress_status');
add_action('wp_ajax_backuply_checkrestorestatus_action', 'backuply_checkrestorestatus_action');
add_action('wp_ajax_backuply_restore_curl_query', 'backuply_restore_curl_query');
add_action('wp_ajax_backuply_retry_htaccess', 'backuply_retry_htaccess');
add_action('wp_ajax_backuply_kill_proccess', 'backuply_force_stop');
add_action('wp_ajax_backuply_get_loc_details', 'backuply_get_loc_details');
add_action('wp_ajax_backuply_sync_backups', 'backuply_sync_backups');
add_action('wp_ajax_nopriv_backuply_restore_response', 'backuply_restore_response');
add_action('wp_ajax_nopriv_backuply_update_serialization', 'backuply_update_serialization_ajax');
add_action('wp_ajax_backuply_creating_session', 'backuply_creating_session');
add_action('wp_ajax_nopriv_backuply_creating_session', 'backuply_creating_session');
add_action('wp_ajax_backuply_last_logs', 'backuply_get_last_logs');
add_action('wp_ajax_backuply_save_excludes', 'backuply_save_excludes');
add_action('wp_ajax_backuply_exclude_rule_delete', 'backuply_exclude_rule_delete');
add_action('wp_ajax_backuply_get_jstree', 'backuply_get_jstree');
add_action('wp_ajax_backuply_hide_backup_nag', 'backuply_hide_backup_nag');
add_action('wp_ajax_backuply_get_restore_key', 'backuply_get_restore_key');
add_action('wp_ajax_backuply_handle_backup', 'backuply_handle_backup_request');
add_action('wp_ajax_backuply_download_bcloud', 'backuply_download_bcloud');
add_action('wp_ajax_backuply_update_quota', 'backuply_update_quota');
add_action('wp_ajax_backuply_backup_upload', 'backuply_backup_upload');
add_action('wp_ajax_nopriv_backuply_restore_status_log', 'backuply_restore_status_log');
add_action('wp_ajax_backuply_restore_status_log', 'backuply_restore_status_log');
add_action('wp_ajax_backuply_close_litespeed_notice', 'backuply_close_litespeed_notice');
add_action('wp_ajax_backuply_close_update_notice', 'backuply_close_update_notice');
add_action('wp_ajax_backuply_trial_promo', 'backuply_close_trial_promo');

// Backuply CLoud
add_action('wp_ajax_bcloud_trial', 'backuply_bcloud_trial');
add_action('wp_ajax_backuply_verify_trial', 'backuply_verify_trial');
add_action('wp_ajax_backuply_trial_settings', 'backuply_trial_settings');

function backuply_ajax_nonce_verify($key = 'security'){
	
	if(!wp_verify_nonce($_REQUEST[$key], 'backuply_nonce')) {
		wp_send_json(array('success' => false, 'message' => 'Security Check Failed.'));
	}
	
	// Check capability
	if(!current_user_can( 'activate_plugins' )){
		wp_send_json(array('success' => false, 'message' => 'You cannot create backups as per your capabilities !'));
	}
	
	return true;
}

// AJAX handle to download backup
// TODO:: Delete this after pushing out the direct download version.
function backuply_download_backup() {
	
	backuply_ajax_nonce_verify();
	
	if(empty($_GET['backup_name'])) {
		wp_send_json(array('success' => false, 'message' => 'Wrong File name provided.'));
	}
	
	$filename = backuply_optget('backup_name');
	$filename = backuply_sanitize_filename($filename);
	$backups_dir = backuply_glob('backups');
	
	$file = $backups_dir . '/'. $filename;
	
	if(!file_exists($file)) {
		wp_send_json(array('success' => false, 'message' => 'File not found.'));
	}
	
	ob_start();
	header('Content-Type: application/octet-stream');
	header('Content-Disposition: attachment; filename="' . basename($filename) . '"');
	header('Content-Transfer-Encoding: binary');
	header('Content-Length: ' . filesize($file));
	header('Content-Range: 0-' . (filesize($file) - 1) . '/' . filesize($file));
	wp_ob_end_flush_all();

	readfile($file);
	wp_die();
}

// AJAX handle to delete Multiple backups
function backuply_multi_backup_delete() {
	global $error;
	
	backuply_ajax_nonce_verify();
	
	if(empty($_POST['backup_name'])) {
		wp_send_json(array('success' => false, 'message' => 'No Backup selected for deletion.'));
	}
	
	$backup = backuply_optpost('backup_name');
	$backup = backuply_sanitize_filename($backup);
	
	if(empty($backup)) {
		wp_send_json(array('success' => false, 'message' => 'No File was provided to be deleted'));
	}
	
	if(!backuply_delete_backup($backup)) {
		$error_string = __('Below are the errors faced', 'backuply');
		
		foreach($error as $e) {
			$error_string .= $e . "\n";
		}
		
		wp_send_json(array('success' => false, 'message' => $error_string));
	}
	
	wp_send_json(array('success' => true));
}

// AJAX handle to create backup
function backuply_create_backup() {
	
	backuply_ajax_nonce_verify();
	
	$bak_options = json_decode(sanitize_text_field(wp_unslash($_POST['values'])), true);

	backuply_create_log_file();
	
	update_option('backuply_backup_stopped', false);
	update_option('backuply_status', $bak_options);
	backuply_status_log('Initializing...', 'info', 13);
	backuply_status_log('Creating a job to start Backup', 'info', 17);

	if(backuply_backup_request()) {
		wp_schedule_single_event(time() + BACKUPLY_TIMEOUT_TIME, 'backuply_timeout_check', array('is_restore' => false));
		wp_send_json(array('success' => true));
	}
	
	// Failed !
	wp_send_json(array('success' => false, 'message' => 'Unable to start a backup at this moment, Please try again later'));
}

function backuply_backup_request(){

	$url = admin_url('admin-ajax.php') . '?action=backuply_handle_backup&security=' . wp_create_nonce('backuply_create_backup');

	$res = wp_remote_get($url, array(
		'timeout' => 0.01,
		'blocking' => false,
		'cookies' => array(LOGGED_IN_COOKIE => $_COOKIE[LOGGED_IN_COOKIE]),
		'sslverify' => false,
		'user-agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36',
	));

	if(empty($res) || is_wp_error($res)){
		return false;
	}
	
	$res_code = wp_remote_retrieve_response_code($res);	

	if(!empty($res_code) && $res_code != 200){
		return false;
	}
	
	if(isset($res[0]) && $res[0] == false){
		return false;
	}

	return true;
	
}

function backuply_handle_backup_request(){

	if(!wp_verify_nonce($_REQUEST['security'], 'backuply_create_backup')) {
		backuply_status_log('Security Failed', 'error', 100);

		return false;
	}

	// Check capability
	if(!current_user_can( 'activate_plugins' )){
		backuply_status_log('You cannot create backups as per your capabilities !', 'error', 100);
		return false;
	}

	backuply_backup_execute();
	return true;
}

// Returns status for backup and restore
function backuply_backup_progress_status() {
	// Security Check
	backuply_ajax_nonce_verify();
	
	$last_status = !empty($_POST['last_status']) ? backuply_optpost('last_status') : 0;

	// negative progress means backup is being stopped
	wp_send_json(array(
		'success' => true,
		'is_stoppable' => true,
		'progress_log' => backuply_get_status($last_status)
		)
	);
}

function backuply_stop_backup() {
	
	backuply_ajax_nonce_verify();
	
	backuply_status_log('Stopping the Backup', 'info', -1);
	update_option('backuply_backup_stopped', true, false);
	wp_send_json(array('success' => true));
}

// Retries creating htaccess
function backuply_retry_htaccess() {
	
	backuply_ajax_nonce_verify();

	$res = backuply_add_htaccess();
	
	if($res) {
		wp_send_json(array('success' => true));
	}
	
	wp_send_json(array('success' => false, 'message' => 'We are not able to create the htaccess file, So please use the manual way.'));
}

// AJAX handle to restore backupp
function backuply_restore_curl_query(){

	backuply_ajax_nonce_verify();

	if(!empty($_POST['fname'])) {
		$info = [];
		$backup_name = backuply_sanitize_filename($_POST['fname']);
		$backup_info = backuply_get_backup_info($backup_name);
		$info['restore_dir'] = !empty($backup_info['backup_dir']);
		$info['restore_db'] = !empty($backup_info['backup_db']);
		$info['backup_backup_dir'] = wp_normalize_path(BACKUPLY_BACKUP_DIR);
		$info['softpath'] = wp_normalize_path(get_home_path());
		$info['fname'] = $backup_name;
		$info['size'] = (int) sanitize_text_field($backup_info['size']);
		$info['backup_site_url'] = sanitize_url($backup_info['backup_site_url']);
		$info['backup_site_path'] = wp_normalize_path($backup_info['backup_site_path']);
		$info['sess_key'] = sanitize_text_field($_POST['sess_key']);
		$info['security'] = sanitize_text_field($_POST['security']);
		$info['loc_id'] = !empty($backup_info['backup_location']) ? (int) $backup_info['backup_location'] : '';

		if(!empty($info['restore_db'])){
			$info['dbexist'] = 'softsql.sql';
		}

		backuply_init_restore($info);
		exit();
	}
}

// Kills process
function backuply_force_stop() {
	backuply_ajax_nonce_verify();
	
	delete_option('backuply_status');
	update_option('backuply_backup_stopped', true, false);
	
	if(file_exists(BACKUPLY_BACKUP_DIR . 'restoration/restoration.php')){
		@unlink(BACKUPLY_BACKUP_DIR . 'restoration/restoration.php');
	}
	
	wp_send_json(['success' => true]);
}

// Fetches details of a specific location
function backuply_get_loc_details() {
	
	//Security check
	backuply_ajax_nonce_verify();
	
	$loc_id = backuply_optpost('loc_id');
	
	if(empty($loc_id)){
		wp_send_json(array('success' => false, 'message' => __('No location id specified', 'backuply')));
	}
	
	// The filters are the fields which we dont want to show in edit as these are keys.
	$filter = ['ftp_pass', 'aws_secretKey', 'aws_accessKey'];
	$loc_info = backuply_get_loc_by_id($loc_id, $filter);
	
	if(empty($loc_info)) {
		wp_send_json(array('success' => false, 'message' => __('The specified location not found', 'backuply')));
	}
	
	wp_send_json(array('success' => true, 'data' => $loc_info));
}

// Syncs the backups in the remote location with us
function backuply_sync_backups(){
	//Security check
	backuply_ajax_nonce_verify();
	
	$loc_id = backuply_optget('id');
	
	if(empty($loc_id)){
		wp_send_json(array('success' => false, 'message' => __('No location id specified', 'backuply')));
	}
	
	$sync = backuply_sync_remote_backup_infos($loc_id);
	
	wp_send_json(array('success' => true));
}

// Deletes all remote info files on Restore Success
function backuply_delete_rinfo_on_restore() {
	$backup_info_f = backuply_glob('backups_info') . '/';
	$backup_info = backuply_get_backups_info();

	foreach($backup_info as $info){
		if(!isset($info->backup_location)){
			continue;
		}
		
		@unlink($backup_info_f . $info->name . '.php');
	}
}


// Handles WP related functionality after restore has happened Restore
function backuply_restore_response($is_last = false) {
	
	$keepalive = (int) time() + 25;

	if(!backuply_verify_self(backuply_optreq('security'), true)){
		backuply_status_log('Security Check Failed', 'error');
		die();
	}

	if(!$is_last && !empty($_REQUEST['restore_db']) && !empty($_REQUEST['is_migrating'])){
		$session_data = array('time' => time(), 'key' => backuply_optreq('sess_key'), 'user_id' => backuply_optreq('user_id'));
	
		update_option('backuply_restore_session_key', $session_data, false);
		backuply_status_log('Repairing database serialization', 'info', 78);

		// NOTE:: If you add any table here make sure to update the same in the backuply_wp_clone_sql function as well.
		$clones = ['options' => 'option', 'postmeta' => 'meta', 'commentmeta' => 'meta'];
		backuply_update_serialization($keepalive, $clones);
	}

	// Clears WP Cron for timeout
	if($timestamp = wp_next_scheduled('backuply_timeout_check', array('is_restore' => true))) {
		wp_unschedule_event($timestamp, 'backuply_timeout_check', array('is_restore' => true));
	}
	
	// Delete the config file.
	if(file_exists(BACKUPLY_BACKUP_DIR . 'backuply_config.php')){
		backuply_keys_to_db(); // After restore we need push the keys back to db.
	}
	
	$email = get_option('backuply_notify_email_address');
	$site_url = get_site_url();
	$dir_path = backuply_cleanpath(ABSPATH);
	$backuply_backup_dir = backuply_cleanpath(BACKUPLY_BACKUP_DIR);
	
	// Was there an error ?
	if(backuply_optget('error')){
	
		$error_string = urldecode(backuply_optget('error_string'));
		// Send mail
		$mail = array();
		$mail['to'] = $email;   
		$mail['subject'] = 'Restore of your WordPress installation failed - Backuply';
		$mail['headers'] = "Content-Type: text/html; charset=UTF-8\r\n";
		$mail['message'] = 'Hi, <br><br>

The most recent restore attempt for your WordPress site has failed. <br>
Installation URL : '.$site_url.' <br>
'.$error_string.' <br><br>


Regards,<br>
Backuply';

		if(!empty($mail['to'])){
			wp_mail($mail['to'], $mail['subject'], $mail['message'], $mail['headers']);
		}
		backuply_report_error(backuply_optget('error_string'));
		
		backuply_status_log('Restore Failed!.','error');
		backuply_copy_log_file(true);
		backuply_clean_restoration_file();

		exit(1);
	}

	backuply_status_log('Sending an Email notification.','working', 84);
	
	// Send mail
	$mail = array();
	$mail['to'] = $email;   
	$mail['subject'] = 'Restore of your WordPress - Backuply';
	$mail['headers'] = "Content-Type: text/html; charset=UTF-8\r\n";
	$mail['message'] = 'Hi, <br><br>

The restore of your WordPress backup was completed successfully. <br>
The details are as follows : <br><br>

Installation Path : '.$dir_path.'<br>
Installation URL : '.$site_url.'<br>
Regards,<br>
Backuply';

	if(!empty($mail['to'])){
		wp_mail($mail['to'], $mail['subject'], $mail['message'], $mail['headers']);
	}
	
	if(!empty($_GET['not_writable'])){
		backuply_status_log(__('Please check the logs, there were some files, which Backuply was unable to replace as those files were not writable', 'backuply') . ' <a href="https://backuply.com/docs/common-issues/files-not-writable/" target="_blank">Read More</a>', 'info');
	}

	backuply_status_log('Restore performed successfully.', 'success', 100);
	update_option('backuply_last_restore', time(), false);
	backuply_delete_rinfo_on_restore();
	backuply_copy_log_file(true);
	backuply_clean_restoration_file();

	die();
}

// Loops(based on timeout) through the fixing serialized
function backuply_update_serialization($keepalive, $options = array(), $i = null) {
	
	if(!function_exists('backuply_wp_clone_sql')){
		include_once BACKUPLY_DIR . '/functions.php';
	}

	$keys = array_keys($options);
	$repair_log = get_option('backuply_sql_repair_log');
	
	if(empty($repair_log)) {
		$repair_log = array('table' => $keys[0], 'try' => 0);
		update_option('backuply_sql_repair_log', $repair_log);
	}

	$res = backuply_wp_clone_sql($keys[0], $options[$keys[0]], $keepalive, $i);

	if(!is_numeric($res)) {
		delete_option('backuply_sql_repair_log');
		if(isset($options[$keys[0]])){
			unset($options[$keys[0]]);
		}
	}

	if($res === false){
		backuply_status_log('Something went wrong while repairing database', 'error');
		die();
	}
	
	if(empty($options)){
		backuply_status_log('Successfully repaired the database', 'info', 81);
		backuply_restore_response(true);
		die();
	}
	
	$config = backuply_get_config();
	if(empty($config['RESTORE_KEY'])){
		backuply_status_log('Restore key not found!', 'error');
		die();
	}
	
	$body = array('options' => $options);
	
	if(is_numeric($res)){
		
		if($keys[0] == $repair_log['table'] && $repair_log['try'] > 1){
			backuply_status_log('Repairing of the database serialization failed, Restoration has completed but some plugins may work weirdly', 'error', 100);
		}
		
		if(!empty($restore_log['i']) && $repair_log['i'] == $res && $keys[0] == $repair_log['table']){
			$repair_log['try'] += 1;
		}
		
		$repair_log['i'] = $res;
		
		update_option('backuply_sql_repair_log', $repair_log);
		
		$body['i'] = $res;
	}
	
	$url = admin_url('admin-ajax.php'). '?action=backuply_update_serialization&security='. $config['RESTORE_KEY'];
	
	wp_remote_post($url, array(
		'body' => $body,
		'timeout' => 2,
		'sslverify' => false,
		'user-agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36',
	));
	
	die();
}

// Ajax to handle the loop of fixing serialized
function backuply_update_serialization_ajax() {

	//Security Check
	if(!backuply_verify_self(backuply_optreq('security'), true)){
		backuply_status_log('Security Check Failed', 'error');
		die();
	}
	
	@touch(BACKUPLY_BACKUP_DIR.'/restoration/restoration.php'); // Updating restore time
	@touch(BACKUPLY_BACKUP_DIR.'/status.lock'); // Updating Status Lock mtime
	
	$keepalive = time() + 25;

	$i = !empty(backuply_optpost('i')) ? (int) backuply_optpost('i') : null;
	$options = map_deep(wp_unslash($_POST['options']), 'sanitize_text_field');
	
	backuply_update_serialization($keepalive, $options, $i);
}

function backuply_get_restore_key(){
	
	backuply_ajax_nonce_verify();
	backuply_update_restore_key();

	$config_set = backuply_set_config_file(); // Add the config keys to the file.
	
	if(empty($config_set)){
		backuply_status_log('Unable to set Config file', 'error', 100);
		unlink($backuply_backup_dir.'/restoration/restoration.php');
		wp_send_json(array('success' => false, 'message' => 'Unable to create the config file!'));
	}

	@touch(BACKUPLY_BACKUP_DIR. '/status.lock');
	
	$config = backuply_get_config();
	
	if(empty($config) || empty($config['RESTORE_KEY'])){
		wp_send_json(array('success' => false, 'message' => 'Config is empty, please try again'));
	}
	
	wp_send_json(array('success' => true, 'restore_key' => $config['RESTORE_KEY'], 'backuply_key' => $config['BACKUPLY_KEY']));
}


// Creates a WP session if user is not logged in
function backuply_creating_session(){
	
	// Security Check
	if(!backuply_verify_self(backuply_optreq('security'), true)){
		backuply_status_log('Security Check Failed', 'error');
		die();
	}
	
	$key = get_option('backuply_restore_session_key');
	
	// Search for the user ID
	if(empty($key)){
		wp_send_json(array('success' => false, 'error' => true, 'message' => 'Session Key has not been updated yet!'));
	}
	
	if((time() - $key['time']) > 600 || (isset($_REQUEST['sess_key']) && $_REQUEST['sess_key'] != $key['key'])){
		//backuply_status_log('Session key verification failed', 'error');
		die();
	}
	
	if(is_user_logged_in()){
		wp_send_json(array('success' => false, 'message' => 'Already logged in'));
	}
	
	// Setting Session
	if(!empty($key['user_id'])){
		$user = get_user_by('id', $key['user_id']);
	}else{
		$user = get_userdata(1);
		
		// Try to find an admin if we do not have any admin with ID => 1
		if(empty($user) || empty($user->user_login)){
			$admin_id = get_users(array('role__in' => array('administrator'), 'number' => 1, 'fields' => array('ID')));
			$user = get_userdata($admin_id[0]->ID);
		}
		
		$username = $user->user_login;
		$user = get_user_by('login', $username);
	}

	if(isset($user) && is_object($user) && property_exists($user, 'ID')){
		clean_user_cache(get_current_user_id());
		clean_user_cache($user->ID);
		wp_clear_auth_cookie();
		wp_set_current_user($user->ID, $user->user_login);
		wp_set_auth_cookie($user->ID, 1, is_ssl());
		do_action('wp_login', $user->user_login, $user);
		update_user_caches($user);

		wp_send_json(array('success' => true));
	}
}

// Returns logs of last backup/restore
function backuply_get_last_logs(){
	
	backuply_ajax_nonce_verify();
	
	$is_restore = backuply_optget('is_restore');
	$backup_log_name = !empty($_GET['file_name']) ? backuply_optget('file_name') : 'backuply_backup_log.php';
	$location_id = !empty($_GET['proto_id']) ? backuply_optget('proto_id') : '';	
	$backup_log_name = backuply_sanitize_filename($backup_log_name);
	
	$log_fname = !empty($is_restore) ? 'backuply_restore_log.php' : $backup_log_name;
	$log_file = BACKUPLY_BACKUP_DIR . $log_fname;
	$logs = array();
	
	if(!file_exists($log_file)){
		if(!backuply_sync_remote_backup_logs($location_id, $log_fname)){
			wp_send_json(array('success' => false, 'progress_log' => 'No log found!|writing\n'));
		}
	}
	
	$fh = fopen($log_file, 'r');

	@fseek($fh, 16);
	
	$lines = fread($fh, fstat($fh)['size']);
	fclose($fh);
	$fh = null;
	
	wp_send_json(array('success' => true, 'progress_log' => $lines));
}

function backuply_save_excludes() {
	
	global $backuply;
	
	backuply_ajax_nonce_verify();
	
	$type = backuply_optpost('type');
	$pattern = backuply_optpost('pattern'); // Pattern is also used as path when the type is specific
	
	// Clean the pattern in case its a full path
	if('exact' == $type){
		$pattern = str_replace(['..', './'], '', $pattern);
		$pattern = backuply_cleanpath($pattern);
	}
	
	if(!empty($_POST['key'])) {
		$key = backuply_optpost('key');
	}
	
	// Remove dot in case the user adds it
	if($type == 'extension'){
		$pattern = trim($pattern, '.');
	}
	
	if(empty($backuply['excludes'][$type])){
		$backuply['excludes'][$type] = array();
	}
	
	$this_type = &$backuply['excludes'][$type];

	if(in_array($pattern, $this_type)){
		wp_send_json(array('success' => false, 'message' => 'Exclude rule is already present'));
	}

	if(empty($key)){
		do{
			$key = wp_generate_password(6, false);
		} while(array_key_exists($key, $this_type));
	}
	$this_type[$key] = $pattern;

	update_option('backuply_excludes', $backuply['excludes'], false);
	
	wp_send_json(array('success' => true, 'key' => $key));
	
}

function backuply_exclude_rule_delete() {
	
	global $backuply;
	
	backuply_ajax_nonce_verify();
	
	$type = backuply_optget('type');
	$key = backuply_optget('key');
	
	if(empty($type) || empty($key)){
		wp_send_json(array('success' => false, 'message' => 'Unable to delete this Exclude rule'));
	}
	
	$this_type = &$backuply['excludes'][$type];

	// Deleting the rule
	if(empty($this_type)){
		wp_send_json(array('success' => false, 'message' => 'Rule not found'));
	}
	
	unset($this_type[$key]);
	update_option('backuply_excludes', $backuply['excludes'], false);
	
	wp_send_json(array('success' => true));
}


function backuply_get_jstree() {
	
	backuply_ajax_nonce_verify();
	
	$node = map_deep($_POST['nodeid'], 'sanitize_text_field');
	$scan_path = $node['id'];

	if('#' == $node['id']){
		$scan_path = WP_CONTENT_DIR;
	}
	
	// Cleaning the path to prevent directory traversal
	$scan_path = str_replace('..', '', $scan_path);
	$scan_path = backuply_cleanpath($scan_path);

	$nodes = array();

	if(empty($scan_path)){
		wp_send_json(array('success' => true, 'nodes' => $nodes));
	}
	
	// Making sure we only show files inside WP Content Dir.
	if(strpos($scan_path, backuply_cleanpath(WP_CONTENT_DIR)) !== 0){
		wp_send_json(array('success' => true, 'nodes' => $nodes));
	}

	$contents = @scandir($scan_path);
	
	if(empty($contents)){
		wp_send_json(array('success' => true, 'nodes' => $nodes));
	}
	
	foreach($contents as $con){
		if(in_array($con, array('.', '..'))){
			continue;
		}
		
		if(is_dir($scan_path . DIRECTORY_SEPARATOR . $con)){
			$nodes[] = array(
				'text' => $con,
				'children' => true,
				'id' => backuply_cleanpath($scan_path . DIRECTORY_SEPARATOR . $con),
				'type' => 'folder',
				'icon' => 'jstree-folder'
			);
		} else {
			$ext = pathinfo($con, PATHINFO_EXTENSION);
			
			$icon = 'jstree-file';
			
			if('php' == $ext){
				$icon = BACKUPLY_URL . '/assets/images/php-logo32.svg';
			}
			
			$nodes[] = array(
				'text' => $con,
				'children' => false,
				'id' => backuply_cleanpath($scan_path . DIRECTORY_SEPARATOR . $con),
				'type' => 'file',
				'icon' => $icon
			);
		}
	}

	wp_send_json(array('success' => true, 'nodes' => $nodes));
	
}

// Updates the backuply_backup_nag to current timestamp
function backuply_hide_backup_nag(){

	backuply_ajax_nonce_verify();
	
	update_option('backuply_backup_nag', time());
	
	wp_send_json(true);
}

function backuply_bcloud_trial(){
	global $backuply;

	if(!wp_verify_nonce($_POST['security'], 'backuply_trial_nonce')){
		wp_send_json_error(null, 401);
	}
	
	$remote_locs = get_option('backuply_remote_backup_locs', []);

	// Getting the bcloud ID
	foreach($remote_locs as $loc){
		if($loc['protocol'] === 'bcloud'){
			wp_send_json_error(__('Backuply Cloud is already added as a Location', 'backuply'));
		}
	}

	$url = BACKUPLY_API . '/cloud/token.php';
	$args = array(
		'body' => array(
			'url' => site_url(),
		),
		'sslverify' => false,
		'timeout' => 30
	);

	if(empty($_POST['value'])){
		wp_send_json_error(__('Please enter a license to Proceed', 'backuply'), 422);
	}
	
	$args['body']['license'] = sanitize_text_field($_POST['value']);
	$license['license'] = sanitize_text_field($_POST['value']);

	// Checking if License is inactive.
	if(!empty($backuply['license']) && !empty($backuply['license']['license']) && empty($backuply['license']['active'])){
		wp_send_json_error(__('Your license is not activated, please go to License page and activate it', 'backuply'));
	}

	// Sending Request
	$res = wp_remote_post($url, $args);
	
	if(empty($res) || is_wp_error($res)){
		wp_send_json_error(__('Something went wrong while sending request to Backuply API', 'backuply'), 500);
	}

	// Reading Body
	$body = wp_remote_retrieve_body($res);
	
	if(empty($body)){
		wp_send_json_error(__('Did not get any response from Backuply API', 'backuply'));
	}
	
	$body = json_decode($body, 1);
	
	// Updating the license if we create a trial account else the request will not return license as an array.
	if(!empty($body['license']) && is_array($body['license'])){
		$license = map_deep($body['license'], 'sanitize_text_field');
		update_option('backuply_license', $body['license']);
	}
	
	if(empty($body['success'])){
		wp_send_json_error($body['message']);
	} 
	
	if(empty($body['data']) || empty($body['data']['bcloud_key'])){
		wp_send_json_error(__('Did not got the Backuply Cloud key, contact support!', 'backuply'));
	}
	
	// Adding bacloud as a location
	$bcloud_keys = map_deep($body['data'], 'sanitize_text_field');
	$location_id = (empty($remote_locs) ? 1 : max(array_keys($remote_locs)) + 1);
	
	// Basic info for remote location
	$remote_locs[$location_id]['id'] = $location_id;
	$remote_locs[$location_id]['name'] = 'Backuply Cloud';
	$remote_locs[$location_id]['protocol'] = 'bcloud';
	$remote_locs[$location_id]['backup_loc'] = '';
	$remote_locs[$location_id]['bcloud_key'] = !empty($bcloud_keys['bcloud_key']) ? sanitize_key($bcloud_keys['bcloud_key']) : '';
	
	// Building full path, it will contain access key and other details to use.
	$remote_locs[$location_id]['full_backup_loc'] = !empty($bcloud_keys) ? 'bcloud://'.$bcloud_keys['access_key'].':'.$bcloud_keys['secret_key'].'@'.$license['license'].'/'.$bcloud_keys['region'].'/us-east-1/'.$bcloud_keys['bcloud_key'] : '';

	// Adding the bcloud key
	update_option('bcloud_key', $bcloud_keys['bcloud_key']);
	update_option('backuply_remote_backup_locs', $remote_locs);
	$backuply['bcloud_key'] = $bcloud_keys['bcloud_key'];

	/* We are updating Cron and default backup location if the Cron is not set yet,
		we are doing so to make sure we do not break users cron if its already set.*/
	if(empty($backuply['cron'])){
		$backuply['settings']['backup_location'] = $location_id;
		update_option('backuply_settings', $backuply['settings']);
		
		$backuply['cron']['backuply_cron_schedule'] = 'backuply_daily';
		$backuply['cron']['backup_dir'] = 1;
		$backuply['cron']['backup_db'] = 1;
		$backuply['cron']['backup_rotation'] = 4;
		$backuply['cron']['backup_location'] = $location_id;
		
		update_option('backuply_cron_settings', $backuply['cron']);
		
		if(!function_exists('backuply_add_auto_backup_schedule')){
			include_once BACKUPLY_DIR . '/main/bcloud-cron.php';
		}
		
		backuply_add_auto_backup_schedule($backuply['cron']['backuply_cron_schedule']); // Will create a WP Cron event
	}
	
	if(!defined('BACKUPLY_PRO')){
		update_option('bcloud_trial_time', time() + 2592000, false);
	}

	wp_send_json_success(__('Backuply Cloud has been integrated Successfully, It\'s ready to use now', 'backuply'));
}

// Verify if the user has verified the email for the trial account by checking if the license is active.
function backuply_verify_trial(){
	global $backuply;
	
	// Security Check
	if(!wp_verify_nonce($_POST['security'], 'backuply_trial_nonce')){
		wp_send_json_error(null, 401);
	}
	
	if(empty($backuply['license']) || empty($backuply['license']['license'])){
		wp_send_json_error(__('You could not find a license key to verify the confirmation', 'backuply'));
	}

	$resp = wp_remote_get(BACKUPLY_API.'/license.php?license='.$backuply['license']['license'].'&url='.rawurlencode(site_url()), array('timeout' => 30));
	
	$json = json_decode($resp['body'], true);

	if(empty($json['license'])){
		wp_send_json_error(__('There was issue fetching License details', 'backuply'));
	}
	
	$is_active = false;
	
	if(!empty($json['active'])){
		$is_active = true;
	}

	update_option('backuply_license', $json);
	$backuply['license'] = $json;

	if(!empty($is_active)){
		wp_send_json_success(array('message' => __('Verification Completed!','backuply'), 'license' => $json['license']), 200);
	}

	wp_send_json_error(__('The license is still inactive, please check if you have checked the Confirmation email sent to your email', 'backuply'));
	
}

// Updates the settings When the user is PRO
function backuply_trial_settings(){
	global $backuply;
	
	// Security Check
	if(!wp_verify_nonce($_POST['security'], 'backuply_trial_nonce')){
		wp_send_json_error(null, 401);
	}

	$remote_locs = get_option('backuply_remote_backup_locs', []);
	
	if(empty($remote_locs)){
		wp_send_json_success();
	}
	
	// Getting the bcloud ID
	foreach($remote_locs as $loc){
		if(empty($loc['protocol']) || $loc['protocol'] != 'bcloud'){
			continue;
		}
		
		$bcloud_id = $loc['id'];
	}
	
	if(empty($bcloud_id)){
		wp_send_json_success();
	}
	
	// Updating Backup Location
	$backuply['settings']['backup_location'] = $bcloud_id;
	update_option('backuply_settings', $backuply['settings']);

	// Updating the Cron settings
	$backuply['cron']['backuply_cron_schedule'] = 'backuply_daily';
	$backuply['cron']['backup_dir'] = 1;
	$backuply['cron']['backup_db'] = 1;
	$backuply['cron']['backup_rotation'] = 4;
	$backuply['cron']['backup_location'] = $bcloud_id; 
	
	update_option('backuply_cron_settings', $backuply['cron']);
	
	if(!function_exists('backuply_add_auto_backup_schedule')){
		include_once BACKUPLY_DIR . '/main/bcloud-cron.php';
	}

	backuply_add_auto_backup_schedule($backuply['cron']['backuply_cron_schedule']); // Will create a WP Cron event

	wp_send_json_success();
	
}

// Download Backuply Cloud Files
function backuply_download_bcloud(){

	// Security Check
	if(!wp_verify_nonce($_POST['security'], 'backuply_nonce')){
		wp_send_json_error('Security Check failed!');
	}
	
	if(empty($_POST['filename'])){
		wp_send_json_error(esc_html__('File name was not given, so download can not proceed.', 'backuply'));
	}
	
	$filename = backuply_sanitize_filename($_POST['filename']);
	$bcloud = backuply_load_remote_backup('bcloud');
	
	if(empty($bcloud)){
		wp_send_json_error(esc_html__('Backuply Cloud Not found', 'backuply'));
	}

	$bcloud_info = backuply_load_remote_backup_info('bcloud');

	if(empty($bcloud_info['full_backup_loc'])){
		wp_send_json_error(esc_html__('Backuply Cloud has not been added yet as a Backup location, if you have already added it then remove it and add it again.', 'backuply'));
	}
	
	$download_path = $bcloud_info['full_backup_loc'] . '/' . $filename;
	$download_link = $bcloud->download_direct($download_path);
	
	if(empty($download_link)){
		wp_send_json_error(esc_html__('Unable to download the file', 'backuply'));
	}
	
	wp_send_json_success(array('url' => $download_link, 'filename' => $filename));
}

// Fetches the usage on the given storage location.
function backuply_update_quota(){
	
	// Security Check
	if(!wp_verify_nonce($_POST['security'], 'backuply_nonce')){
		wp_send_json_error('Security Check failed!');
	}

	$storage_loc = sanitize_text_field($_POST['location']);
	
	if(empty($storage_loc)){
		wp_send_json_error(__('No Storage location provided', 'backuply'));
	}

	$quota = backuply_get_quota($storage_loc);
	
	if(empty($quota)){
		wp_send_json_error();
	}
	
	$info = get_option('backuply_remote_backup_locs', []);
	
	if(!empty($info)){
		foreach($info as $key => $locs){
			if($locs['protocol'] === $storage_loc){
				$info[$key]['backup_quota'] = (int) $quota['used'];
				$info[$key]['allocated_storage'] = (int) $quota['total'];
			}
		}
		
		update_option('backuply_remote_backup_locs', $info);
	}

	wp_send_json_success();
	
}

function backuply_backup_upload(){
	
	if(!wp_verify_nonce($_POST['security'], 'backuply_nonce')){
		wp_send_json_error('Security Check failed!');
	}
	
	if(!current_user_can('manage_options')){
		wp_send_json_error('You don\'t have privilege to upload the backup!');
	}

	$file_name = backuply_optpost('file_name');
	$file_name = backuply_cleanpath($file_name); // Makes sure the file name is safe
	$file_name = backuply_sanitize_filename($file_name);
	$backup_dir = backuply_glob('backups');
	
	if(!preg_match('/\.tar\.gz$/i', $file_name)){
		wp_send_json_error(__('You are not uploading a Backup file, please choose the correct backup file', 'backuply'));
	}
	
	// Attempting to abort the process
	if(!empty($_POST['abort'])){
		if(file_exists($backup_dir . '/.' . $file_name)){
			if(unlink($backup_dir . '/.' . $file_name)){
				wp_send_json_success(__('Abort successful', 'backuply'));
			}
			
			wp_send_json_error(__('Unable to clean the already uploaded data.', 'backuply'));
		}
		
		wp_send_json_error(__('Unable to clean the already uploaded data.', 'backuply'));
	}
	
	// Sanitizing the parameters.
	$chunk_number = (int) sanitize_text_field($_POST['chunk_number']);
	$total_chunks = (int) sanitize_text_field($_POST['total_chunks']);
	$chunk_data = file_get_contents($_FILES['file']['tmp_name']);

	$chunk_size = 2 * 1024 * 1024; // 2MB
	$chunk_data_size = strlen($chunk_data);
	
	if(file_exists($backup_dir . '/' . $file_name)){
		wp_send_json_error(__('File with same name already exists', 'backuply'));
	}
	
	if($chunk_data_size < $chunk_size && $total_chunks !== $chunk_number){
		wp_send_json_error(__('The data recieved is malformed, the size of data is less then the data sent!', 'backuply'));
	}
	
	if($chunk_data_size > $chunk_size){
		wp_send_json_error(__('The data recieved is malformed, the size of data is more then the data sent!', 'backuply'));
	}

	$file_loc = $backup_dir . '/.' . $file_name;

	$fh = fopen($file_loc, 'ab');
	if($chunk_number > 1){
		fseek($fh, (($chunk_number - 1) * $chunk_size));
	}

	fwrite($fh, $chunk_data);
	fclose($fh);
	
	if($chunk_number === $total_chunks){
		if(function_exists('mime_content_type')){
			$mime = mime_content_type($file_loc);
		
			$possible_mime = ['application/gzip', 'application/x-gzip'];
			if(!in_array($mime, $possible_mime)){
				wp_send_json_error(__('Upload failed, file type is different than the expected', 'backuply'));
			}
		}
		
		rename($file_loc, $backup_dir . '/' . $file_name);
	}
	
	wp_send_json_success($chunk_number * $chunk_size);

}

function backuply_restore_status_log(){
	
	// Checking the Status key.
	if(!backuply_verify_status_log()){
		wp_send_json(array('success' => false, 'progress_log' => 'Ajax Security Check Failed!|error'));
		die();
	}
	
	$log_file = BACKUPLY_BACKUP_DIR. '/backuply_log.php';
	$logs = [];
	$last_log = (int) sanitize_text_field(wp_unslash($_REQUEST['last_status']));

	if(!file_exists($log_file)){
		$logs[] = 'Something went wrong!|error';
		wp_send_json(array('success' => false, 'progress_log' => $logs));
		die();
	}
	
	$fh = fopen($log_file, 'r');
	
	$seek_to = $last_log + 16; // 16 for php exit
	
	@fseek($fh, $seek_to);
	
	$lines = fread($fh, fstat($fh)['size']);
	fclose($fh);
	$fh = null;
	
	wp_send_json(array('success' => true, 'progress_log' => $lines));
}

function backuply_close_litespeed_notice(){

	if(!wp_verify_nonce($_GET['security'], 'backuply_promo_nonce')){
		wp_send_json_error('Security Check failed!');
	}
	
	if(!current_user_can('manage_options')){
		wp_send_json_error('You don\'t have privilege to close this notice!');
	}
	
	update_option('backuply_litespeed_notice', time()+MONTH_IN_SECONDS);

}

function backuply_close_update_notice(){

	if(!wp_verify_nonce($_GET['security'], 'backuply_promo_nonce')){
		wp_send_json_error('Security Check failed!');
	}
	
	if(!current_user_can('manage_options')){
		wp_send_json_error('You don\'t have privilege to close this notice!');
	}
	
	$plugin_update_notice = get_option('softaculous_plugin_update_notice', []);
	$available_update_list = get_site_transient('update_plugins');
	$to_update_plugins = apply_filters('softaculous_plugin_update_notice', []);
	
	if(empty($available_update_list) || empty($available_update_list->response)){
		return;
	}
	
	foreach($to_update_plugins as $plugin_path => $plugin_name){
		if(isset($available_update_list->response[$plugin_path])){
			$plugin_update_notice[$plugin_path] = $available_update_list->response[$plugin_path]->new_version;
		}
	}

	update_option('softaculous_plugin_update_notice', $plugin_update_notice);
}

function backuply_close_trial_promo(){
	if(!wp_verify_nonce(backuply_optreq('security'), 'backuply_trial_nonce')) {
		die('Security Check Failed');
	}
	
	if(!current_user_can('manage_options')){
		wp_send_json_error('You don\'t have privilege to close this notice!');
	}
	
	update_option('backuply_hide_trial', (0 - time()), false);
	die('DONE');
}main/bcloud-cron.php000064400000007327151526424670010435 0ustar00<?php

if(!defined('ABSPATH')){
	die('Hacking Attempt!');
}

// Cron for Calling Auto Backup
add_action('backuply_auto_backup_cron', 'backuply_auto_backup_execute');

// Auto Backup using custom cron
if(isset($_GET['action'])  && $_GET['action'] == 'backuply_custom_cron'){

	if(!backuply_verify_self(sanitize_text_field(wp_unslash($_REQUEST['backuply_key'])))){
		backuply_status_log('Security Check Failed', 'error');
		die();
	}
	
	backuply_auto_backup_execute();
}

// Adds a Wp-Cron for autobackup
if(!function_exists('backuply_add_auto_backup_schedule')){
function backuply_add_auto_backup_schedule($schedule = '') {
	global $backuply;

	if(empty($schedule)){
		$schedule = backuply_optpost('backuply_cron_schedule');
	}
	
	if (!wp_next_scheduled( 'backuply_auto_backup_cron' ) && !empty($backuply['bcloud_key'])){
		wp_schedule_event(time(), $schedule, 'backuply_auto_backup_cron');
	}
}
}

// Initiates auto backup
if(!function_exists('backuply_auto_backup_execute')){
function backuply_auto_backup_execute(){
	global $backuply;

	if(empty($backuply['bcloud_key'])){
		return false;
	}

	$access_key = backuply_bcloud_isallowed();

	if(empty($access_key)){
		return;
	}

	//$backuply['auto_backup'] = true;
	backuply_create_log_file();

	if($auto_backup_settings = get_option('backuply_cron_settings')){
		$auto_backup_settings['auto_backup'] = true;
		update_option('backuply_status', $auto_backup_settings);
		backuply_backup_execute();
	}
}
}

// Rotate the backups
if(!function_exists('backuply_backup_rotation')){
function backuply_backup_rotation() {
	global $backuply;

	if(empty($backuply['status']['backup_rotation'])) {
		return;
	}

	$backup_info = backuply_get_backups_info();

	if(empty($backup_info)) {
		return;
	}

	$backup_info = array_filter($backup_info, 'backuply_bcloud_filter_backups_on_loc');
	usort($backup_info, 'backuply_bcloud_oldest_backup');

	if(count($backup_info) >= $backuply['status']['backup_rotation']) {
		if(empty($backup_info[0])) {
			return;
		}

		backuply_log('Deleting Files because of Backup rotation');
		backuply_status_log('Deleting backup because of Backup rotation', 39);

		$extra_backups = count($backup_info) - $backuply['status']['backup_rotation'];
		
		if($extra_backups > 0) {
			for($i = 0; $i < $extra_backups; $i++) {
				backuply_delete_backup($backup_info[$i]->name .'.'. $backup_info[$i]->ext);
			}
		}
	}
}
}

function backuply_bcloud_oldest_backup($a, $b) {
	return (int) $a->btime - (int) $b->btime;
}

// Returns backups based on location
function backuply_bcloud_filter_backups_on_loc($backup) {
	global $backuply;

	if(!isset($backup->backup_location)){
		return ($backup->auto_backup);
	}

	return ($backuply['status']['backup_location'] == $backup->backup_location && $backup->auto_backup);
}

function backuply_bcloud_isallowed(){
	global $backuply;

	if(!empty(get_transient('bcloud_data'))){
		return true;
	}

	$url = BACKUPLY_API . '/cloud/token.php';
	
	// Check if License is present and active.
	if(empty($backuply['license']['license'] || empty($backuply['license']['active']))){
		return false;
	}
	
	// Check if Bcloud key is there.
	if(empty($backuply['bcloud_key'])){
		return false;
	}

	$args = array(
		'sslverfiy' => false,
		'body' => array(
			'license' => $backuply['license']['license'],
			'bcloud_key' => $backuply['bcloud_key'],
			'url' => site_url()
		),
		'timeout' => 30
	);

	$res = wp_remote_post($url, $args);
	
	if(empty($res) && is_wp_error($res)){
		return false;
	}
	
	if(empty($res['body'])){
		return false;
	}
	
	$body = json_decode($res['body'], true);
	
	if(empty($body['success'])){
		return false;
	}
	
	return true;
}backup_ins.php000064400000200751151526424670007414 0ustar00<?php
/*
* BACKUPLY
* https://backuply.com
* (c) Backuply Team
*/

if(!defined('ABSPATH')){
	die('HACKING ATTEMPT!');
}

//PHP Options
if(!set_time_limit(300)){
	set_time_limit(60);
}

error_reporting(E_ALL);
ignore_user_abort(true);

//Constants
define('ARCHIVE_TAR_ATT_SEPARATOR', 90001);
define('ARCHIVE_TAR_END_BLOCK', pack('a512', ''));

include_once BACKUPLY_DIR . '/backuplytar.php'; // Including the TAR class
	
function backuply_can_create_file(){
	$file = BACKUPLY_BACKUP_DIR . '/soft.tmp';
	$fp = @fopen($file, 'wb');
	if($fp === FALSE){
		return false;
	}

	if(@fwrite($fp, 'backuply') === FALSE){
		return false;
	}

	@fclose($fp);

	// Check if the file exists

	if(file_exists($file)){
		@unlink($file);
		return true;
	}

	return false;	
}

function backuply_tar_archive($tarname, $file_list, $handle_remote = false){
	backuply_log('Archiving your WP INSTALL Now');

	$tar_archive = new backuply_tar($tarname, '', $handle_remote);
	$tar_archive->setIgnoreList(['debug.log', 'wp-content/cache', '*.\.log', 'error-log']);

	$res = $tar_archive->createModify($file_list, '', '');
	
	if(!$res){
		return false;	
	}
	
	//backuply_log('Backup Process Completed !!');
	return true;
}

function backuply_resetfilelist(){
	global $directorylist;
	$directorylist = array();
}

// Back up the database !!!
function backuply_mysql_fn($shost, $suser, $spass, $sdb, $sdbfile){
	//echo $shost.' == '. $suser.' == '. $spass.' == '. $sdb.' == '. $sdbfile;
	
	global $data, $backuply;
	
	$link = backuply_mysql_connect($shost, $suser, $spass);
	
	backuply_mysql_query('SET CHARACTER SET utf8mb4', $link);
	
	// Open and create a file handle for sql.
	$handle = fopen($sdbfile,'a');
	
	$s_def = $alter_queries = $sresponse = '';
	$sql_alter = $tables = array();
	
	$ser_ver = backuply_PMA_sversion($link);
	$s_def = backuply_PMA_exportHeader($sdb, $ser_ver);
	if(empty($GLOBALS['backup_tables'])){
		fwrite($handle, $s_def);
	}
		
	// We did not create the database ! So just backup the tables required for this database
	if(!empty($data['exclude_db'])){
		
		$thisdb_tables = $data['exclude_db'];
		
		if(!is_array($data['exclude_db'])){
			$thisdb_tables = unserialize($data['exclude_db']);
		}
		
		// This is just to remove the ` since we are not getting it in $tables below
		foreach($thisdb_tables as $tk => $tv){
			// There was a bug since Softaculous 4.7.2 that did not save exclude_db for ins causing empty array. Fixed in Softaculous 4.7.7
			if(empty($tv)) continue;
			$_thisdb_tables[trim($tk, '`')] = trim($tv, '`');
		}
	}

	//List Views
	$squery = backuply_mysql_query('SHOW TABLE STATUS FROM `' . $sdb . '` WHERE COMMENT = \'VIEW\'', $link);
	
	$views = array();	
	if(backuply_mysql_num_rows($squery) > 0){
		while($row = backuply_mysql_fetch_row($squery)){
			$views[] = $row[0];
		}
	}
	
	// Sort the views
	usort($views, 'strnatcasecmp');
	
	// List the tables
	$squery = backuply_mysql_query('SHOW TABLES FROM `' . $sdb . '`', $link);
	
	while($row = backuply_mysql_fetch_row($squery)){
		
		// We do not need to backup this table
		if(!empty($_thisdb_tables) && is_array($_thisdb_tables) && in_array($row[0], $_thisdb_tables)){
			continue;
		}
		
		if(in_array($row[0], $views)){
			continue;
		}
		
		$tables[] = $row[0];
	}
	
	// Sort the tables
	usort($tables, 'strnatcasecmp');	
	
	foreach($tables as $table => $v){
		// We are resuming so we dont need to backup every table again
		if(!empty($GLOBALS['backup_tables']) && in_array($v, $GLOBALS['backup_tables'])){
			continue;
		}

		backuply_backup_stop_checkpoint();
		
		if(empty($GLOBALS['db_in_progress'])){	
			backuply_status_log('Adding (L'.$backuply['status']['loop'].') : '. $v .' table', 'working', 50);
			// Get the table structure(table definition)
			$stable_defn = backuply_PMA_getTableDef($sdb, $v, "\n", false, true, $link);
			
			$s_def = $stable_defn['structure']."\n";
			fwrite($handle, $s_def);
		} else {
			backuply_status_log('Resuming (L'.$backuply['status']['loop'].') : '. $GLOBALS['db_in_progress'] .' table', 'working', 52);
		}
		
		// Get the table data(table contents)
		// We have added $handle so that we can write the INSERT queries directly when we get it. 
		// Basically To avoid MEMORY EXHAUST FOR  BIG INSERTS
		backuply_PMA_exportData($sdb, $v, "\n", $handle, $link);
		$GLOBALS['backup_tables'][] = $v;
		
		// List of alter queries 
		// We have changed this because the OLD method was putting the ALTER queries after CREATE table query which was causing issues.
		if(!empty($stable_defn['alter'])){
			$alter_queries .= $stable_defn['alter'];
		}
	}
	
	//Save Views
	foreach($views as $view){
		
		$defn = backuply_PMA_getViews($sdb, $view, "\n", $link);
		
		$view_def = $defn['structure']."\n";
		fwrite($handle, $view_def);
	}
	
	fwrite($handle, $alter_queries);
	
	//List Triggers/Events/Procedures/Functions	
	//Triggers
	$triggers = backuply_PMA_getTriggers($sdb, $link);
	foreach($triggers as $trigger){
		fwrite($handle, "\n".$trigger['drop']."\nDELIMITER //\n");
		fwrite($handle, $trigger['create']."// \nDELIMITER ;\n\n");
	}
	
	//Events
	$events = backuply_PMA_getEvents($sdb, $link);
	foreach($events as $event){
		fwrite($handle, "\n".$event['drop']."\nDELIMITER $$ \n-- \n-- Events \n--\n");
		fwrite($handle, $event['create']);
		fwrite($handle, "\n$$ \nDELIMITER ;\n\n");
	}
	
	//Functions
	$functions = backuply_PMA_getProceduresOrFunctions($sdb, 'FUNCTION', $link);
	foreach($functions as $function){
		fwrite($handle, "\n".$function['drop']."\nDELIMITER $$ \n-- \n-- Functions \n--\n");
		fwrite($handle, $function['create']);
		fwrite($handle, "\n$$ \nDELIMITER ;\n\n");
	}
	
	//Procedures
	$procedures = backuply_PMA_getProceduresOrFunctions($sdb, 'PROCEDURE', $link);
	foreach($procedures as $procedure){
		fwrite($handle, "\n".$procedure['drop']."\nDELIMITER $$ \n-- \n-- Procedures \n--\n");
		fwrite($handle, $procedure['create']);
		fwrite($handle, "\n$$ \nDELIMITER ;\n\n");
	}	
	
	$sresponse = backuply_PMA_exportFooter(); // Just to add the finishing lines
	fwrite($handle, $sresponse);
	fclose($handle);
	
	backuply_backup_stop_checkpoint();

	// Close the connection
	if(!empty($link)){
		backuply_mysql_close($link);
		$link = null;
	}

	// Just check that file is created or not ??
	if(file_exists($sdbfile)){
	
		return true;
	}
	
	return false;
	
} //End of database backup

function backuply_PMA_getViews($db, $view, $crlf, $link){
	
	$schema_create = $auto_increment = $dump = '';
	$new_crlf = $crlf;
	
	// This is for foreign language characters
	//To read the values from the old DB in UTF8 format
	//backuply_mysql_query('SET NAMES "utf8mb4"', $link);
	
	// Complete view dump,
	// Whether to quote view and fields names or not
	backuply_mysql_query('SET SQL_QUOTE_SHOW_CREATE = 1', $link);
	
	// Create view structure
	$result = backuply_mysql_query('SHOW CREATE VIEW `'.$db.'`.`'.$view.'`', $link);

	// Construct the dump for the view structure
	$dump .=  '--' . $crlf
			. '-- Structure for view ' . '`' . $view.'`' . $crlf
			. '--' . $crlf
			. 'DROP VIEW IF EXISTS `' . $view . '`;' . $crlf . $crlf;
	
	if ($row = backuply_mysql_fetch_assoc($result)) {
			
		$create_query = $row['Create View'];
		
		preg_match('/DEFINER=(.*?) SQL/is', $create_query, $matches);
		$create_query = str_replace($matches[1], 'CURRENT_USER', $create_query);

		$schema_create .= $new_crlf . $dump;

		// Convert end of line chars to one that we want (note that MySQL doesn't return query it will accept in all cases)
		if (strpos($create_query, "(\r\n ")) {
			$create_query = str_replace("\r\n", $crlf, $create_query);
		} elseif (strpos($create_query, "(\n ")) {
			$create_query = str_replace("\n", $crlf, $create_query);
		} elseif (strpos($create_query, "(\r ")) {
			$create_query = str_replace("\r", $crlf, $create_query);
		}
		
		$schema_create .= $create_query;
	}
		
	backuply_mysql_free_result($result);
		
	// Dump the structure !!!
	$return['structure'] = $schema_create . ';' . $crlf;
	
	return $return;
}

function backuply_PMA_getTriggers($db, $link){
	$query = backuply_mysql_query('SHOW TRIGGERS FROM `' . $db . '`', $link);
	$result = array(); //added as empty so don't give warning when data is empty..
	
	while($trigger = backuply_mysql_fetch_assoc($query)){
		
		$one_result = array();
		$one_result['name'] = $trigger['Trigger'];
		$one_result['table'] = $trigger['Table'];
		$one_result['action_timing'] = $trigger['Timing'];
		$one_result['event_manipulation'] = $trigger['Event'];
		$one_result['definition'] = $trigger['Statement'];
		$one_result['definer'] = $trigger['Definer'];
		$one_result['full_trigger_name'] = '`'.$trigger['Trigger'].'`';
		$one_result['drop'] = 'DROP TRIGGER IF EXISTS `' . $db .'`.'. $one_result['full_trigger_name'].';';
		$one_result['create'] = 'CREATE TRIGGER '
			. $one_result['full_trigger_name'] . ' '
			. $trigger['Timing'] . ' '
			. $trigger['Event']
			. ' ON ' . '`'. $trigger['Table'].'`'
			. "\n" . ' FOR EACH ROW '
			. $trigger['Statement'] . "\n" . $delimiter . "\n";
			
		$result[] = $one_result;
	}

	// Sort results by name
	$name = array();
	foreach ($result as $value) {
		$name[] = $value['name'];
	}
	array_multisort($name, SORT_ASC, $result);
	
	return($result);
	
}

function backuply_PMA_getEvents($db, $link){
	
	$query = backuply_mysql_query('SHOW EVENTS FROM `' . $db . '`', $link);

	$result = array();
	while ($event = backuply_mysql_fetch_assoc($query)) {
			$one_result = array();
			$one_result['name'] = $event['Name'];
			$one_result['type'] = $event['Type'];
			$one_result['status'] = $event['Status'];
			$one_result['drop'] = 'DROP EVENT IF EXISTS `' . $db .'`.`'. $one_result['name'].'`;';
			$one_result['create'] = backuply_PMA_getDefinition($db, 'EVENT', $one_result['name'], $link);
			
			$result[] = $one_result;
	}
	
	// Sort results by name
	$name = array();
	foreach ($result as $value) {
		$name[] = $value['name'];
	}
	array_multisort($name, SORT_ASC, $result);

	return $result;
}

/**
 * returns the array of PROCEDURE/FUNCTION names
 *
 * @param string $db	db name
 * @param string $which PROCEDURE | FUNCTION | EVENT
 * @param string $link  connection link to the database
 *
 * @return array names of Procedures/Functions
 */
function backuply_PMA_getProceduresOrFunctions($db, $which, $link)
{
	$query = backuply_mysql_query('SHOW ' . $which . ' STATUS;', $link);
	$result = array();
	
	while($one_show = backuply_mysql_fetch_assoc($query)) {
		if ($one_show['Db'] == $db && $one_show['Type'] == $which) {
			$one_show['drop'] = 'DROP '.$which.' IF EXISTS `' . $db .'`.`'. $one_show['Name'].'`;';
			$one_show['create'] = backuply_PMA_getDefinition($db, $which, $one_show['Name'], $link);
			
			$result[] = $one_show;
		}
	}
	
	return $result;
}

/**
 * returns the definition of a specific PROCEDURE, FUNCTION or EVENT
 *
 * @param string $db	db name
 * @param string $which PROCEDURE | FUNCTION | EVENT
 * @param string $name  the procedure|function|event name
 * @param string $link  connection link to the database
 *
 * @return string the definition
 */
function backuply_PMA_getDefinition($db, $which, $name, $link)
{
	$returned_field = array(
		'PROCEDURE' => 'Create Procedure',
		'FUNCTION'  => 'Create Function',
		'EVENT'	 => 'Create Event'
	);
	$query = backuply_mysql_query('SHOW CREATE '.$which.' `'.$db.'`.`'.$name.'`;', $link);
	
	if ($res = backuply_mysql_fetch_assoc($query)){
		return($res[$returned_field[$which]]);
	}
	
}

// Internal function to add slashes to row values 
function backuply_PMA_sqlAddslashes(&$a_string = '', $is_like = false, $crlf = false, $php_code = false) {

	if ($is_like) {
		$a_string = str_replace('\\', '\\\\\\\\', $a_string);
	} else {
		$a_string = str_replace('\\', '\\\\', $a_string);
	}

	if ($crlf) {
		$a_string = str_replace("\n", '\n', $a_string);
		$a_string = str_replace("\r", '\r', $a_string);
		$a_string = str_replace("\t", '\t', $a_string);
	}

	if ($php_code) {
		$a_string = str_replace('\'', '\\\'', $a_string);
	} else {
		$a_string = str_replace('\'', '\'\'', $a_string);
	}

	return $a_string;
} // end of the 'backuply_PMA_sqlAddslashes()' function


// Form the table structure && the alter queries if any !! 
function backuply_PMA_getTableDef($db, $table, $crlf, $show_dates, $add_semicolon, $link) {
	
	global $sql_drop_table, $sql_alter;
	global $sql_constraints;
	global $sql_constraints_query; // just the text of the query
	global $sql_drop_foreign_keys;

	$schema_create = $auto_increment = $sql_constraints = '';
	$new_crlf = $crlf;
	
	// Get the Status of the table so as to produce the auto increment value
	$qresult = backuply_mysql_query('SHOW TABLE STATUS FROM `'.$db.'` LIKE \''.$table.'\'', $link);

	// Handle auto-increment values
	if (backuply_mysql_num_rows($qresult) > 0) {
		
		$tmpres = backuply_mysql_fetch_assoc($qresult);
		
		// Is auto-increment value is set ??
		if(!empty($tmpres['Auto_increment'])){
			$auto_increment .= ' AUTO_INCREMENT=' . $tmpres['Auto_increment'] . ' ';
		}
	
	}
	// Free resourse
	backuply_mysql_free_result($qresult);
	
	//added as empty so don't give warning when data is empty..
	$dump = '';
	
	// Adding query to delete any existing table if exists.
	$dump .= '-- Delete any existing table `' . $table . '`' . $crlf;
	$dump .= 'DROP TABLE IF EXISTS `'.$table.'`;' . $crlf;

	// Construct the dump for the table structure
	$dump .=  '--' . $crlf
			. '-- Table structure for table ' . '`' . $table.'`' . $crlf
			. '--' . $crlf . $crlf;
		 
	$schema_create .= $new_crlf . $dump;

	// Complete table dump,
	// Whether to quote table and fields names or not
	backuply_mysql_query('SET SQL_QUOTE_SHOW_CREATE = 1', $link);
	
	// Create table structure
	$result = backuply_mysql_query('SHOW CREATE TABLE `'.$db.'`.`'.$table.'`', $link);
	
	if ($row = backuply_mysql_fetch_assoc($result)) {
		
		$create_query = $row['Create Table'];
		unset($row);

		// Convert end of line chars to one that we want (note that MySQL doesn't return query it will accept in all cases)
		if (strpos($create_query, "(\r\n ")) {
			$create_query = str_replace("\r\n", $crlf, $create_query);
		} elseif (strpos($create_query, "(\n ")) {
			$create_query = str_replace("\n", $crlf, $create_query);
		} elseif (strpos($create_query, "(\r ")) {
			$create_query = str_replace("\r", $crlf, $create_query);
		}

		// are there any constraints to cut out?
		if (preg_match('@CONSTRAINT|FOREIGN[\s]+KEY@', $create_query)) {

			// Split the query into lines, so we can easily handle it.
			// We know lines are separated by $crlf (done few lines above).	
			$sql_lines = explode($crlf, $create_query);
			$sql_count = count($sql_lines);

			// Lets find first line with constraints
			for ($i = 0; $i < $sql_count; $i++) {
				if (preg_match('@^[\s]*(CONSTRAINT|FOREIGN[\s]+KEY)@', $sql_lines[$i])) {
				 	break;
				}
			}

			// If we really found a constraint
			if ($i != $sql_count) {
				
				// remove , from the end of create statement
				$sql_lines[$i - 1] = preg_replace('@,$@', '', $sql_lines[$i - 1]);

				// comments for current table
				$sql_constraints .= $crlf
								 . backuply_PMA_exportComment()
								 . backuply_PMA_exportComment('Constraints for table ' . '`' . $table.'`')
								 . backuply_PMA_exportComment();
				
				// Let's do the work
				$sql_constraints_query .= 'ALTER TABLE `'.$table.'`' . $crlf;
				$sql_constraints .= 'ALTER TABLE `'.$table.'`' . $crlf;
				$sql_drop_foreign_keys .= 'ALTER TABLE `'.$table.'` `'.$db.'`' . $crlf;

				$first = TRUE;
				for ($j = $i; $j < $sql_count; $j++) {
					if (preg_match('@CONSTRAINT|FOREIGN[\s]+KEY@', $sql_lines[$j])) {
						if (!$first) {
							$sql_constraints .= $crlf;
						}
						if (strpos($sql_lines[$j], 'CONSTRAINT') === FALSE) {
							$tmp_str = preg_replace('/(FOREIGN[\s]+KEY)/', 'ADD \1', $sql_lines[$j]);
							$sql_constraints_query .= $tmp_str;
							$sql_constraints .= $tmp_str;
						} else {
							$tmp_str = preg_replace('/(CONSTRAINT)/', 'ADD \1', $sql_lines[$j]);
							$sql_constraints_query .= $tmp_str;
							$sql_constraints .= $tmp_str;
							preg_match('/(CONSTRAINT)([\s])([\S]*)([\s])/', $sql_lines[$j], $matches);
							if (! $first) {
								$sql_drop_foreign_keys .= ', ';
							}
							$sql_drop_foreign_keys .= 'DROP FOREIGN KEY ' . $matches[3];
						}
						$first = FALSE;
					} else {
						break;
					}
				}
				$sql_constraints .= ';' . $crlf;
				$sql_constraints_query .= ';';
				
				// Dump the alter queries!!!
				$return['alter'] = $sql_constraints; 
				
				$create_query = implode($crlf, array_slice($sql_lines, 0, $i)) . $crlf . implode($crlf, array_slice($sql_lines, $j, $sql_count - 1));
				unset($sql_lines);
			}
		}
		$schema_create .= $create_query;
	}

	// remove a possible "AUTO_INCREMENT = value" clause
	// that could be there starting with MySQL 5.0.24
	$schema_create = preg_replace('/AUTO_INCREMENT\s*=\s*([0-9])+/', '', $schema_create);

	$schema_create .= $auto_increment;
		
	backuply_mysql_free_result($result);
		
	// Dump the structure !!!
	$return['structure'] = $schema_create . ($add_semicolon ? ';' . $crlf : '');
	
	return $return;
	 
} // end of the 'backuply_PMA_getTableDef()' function

// Internal function to get meta details about the database 
function backuply_PMA_DBI_get_fields_meta($sresult) {
	$fields	   = array();
	$num_fields   = mysql_num_fields($sresult);
	for ($i = 0; $i < $num_fields; $i++) {
		$field = mysql_fetch_field($sresult, $i);
		$field->flags = mysql_field_flags($sresult, $i);
		$field->orgtable = mysql_field_table($sresult, $i);
		$field->orgname = mysql_field_name($sresult, $i);
		$fields[] = $field;
	}
	return $fields;
}

// Export data - values 
function backuply_PMA_exportData($db, $table, $crlf, $handle, $link){
	
	global $current_row, $backuply;
	$count = 10000;
	$limit = !empty($GLOBALS['database_row']) ? intval(esc_sql($GLOBALS['database_row'])) : 0;

	// We have modified this code because we were getting error if inserts were >50000
	if(strpos($table, 'options') !== false){
		$cnt_qry = 'SELECT count(*) FROM `'.$db . '`.`' . $table . '` WHERE option_name != "backuply_status"';
	}else{
		$cnt_qry = 'SELECT count(*) FROM `'.$db . '`.`' . $table . '`';	
	}
	
	$cnt_res = backuply_mysql_fetch_row(backuply_mysql_query($cnt_qry, $link));
	
	if(strpos($table, 'options') !== false){
		$sql_query  = 'SELECT * FROM `'.$db . '`.`' . $table . '` WHERE option_name != "backuply_status" LIMIT '.$limit.',10000';
	}else{
		$sql_query  = 'SELECT * FROM `'.$db . '`.`' . $table . '` LIMIT '.$limit.',10000';
	}
	
	$formatted_table_name = '`' . $table . '`';
	
	$squery = backuply_mysql_query($sql_query, $link);
	
	$fields_cnt = backuply_mysql_num_fields($squery);

	// Get field information
	if(extension_loaded('mysqli')){
		$fields_meta	= backuply_getFieldsMeta($squery);
	}else{
		$fields_meta	= backuply_PMA_DBI_get_fields_meta($squery);
	}
	
	$field_flags	= array();
	for ($j = 0; $j < $fields_cnt; $j++) {
		$field_flags[$j] = backuply_mysql_field_flags($squery, $j);
	}

	for ($j = 0; $j < $fields_cnt; $j++) {
		$field_set[$j] = '`'.$fields_meta[$j]->name . '`';
	}

	$sql_command = 'INSERT';
   
	$insert_delayed = '';
	$separator = ',';

	$schema_insert = $sql_command . $insert_delayed .' INTO `' . $table . '` VALUES';
	
	$search	   = array("\x00", "\x0a", "\x0d", "\x1a"); //\x08\\x09, not required
	$replace	  = array('\0', '\n', '\r', '\Z');
	$current_row  = !empty($GLOBALS['database_row']) ? intval($GLOBALS['database_row']) : 0;
	$new_query  = 0;
	$query_length = 0;
	
	if($GLOBALS['db_in_progress'] === $table && !empty($GLOBALS['database_row_done'])){
		$cnt_res[0] = intval($GLOBALS['database_row_done']);
	}

	$GLOBALS['db_in_progress'] = '';

	$schema_insert .= $crlf;
	for($i = $cnt_res[0]; $i >= 0; $i--){
		
		if(time() > $GLOBALS['end']) {
			backuply_log('Database Backup: Short on time!');

			if(empty($current_row)){
				backuply_status_log('Database Backup: Closing (L'.$backuply['status']['loop'].') : '.$table . ' at row number '. $current_row . ' ' . $i);

				$GLOBALS['db_in_progress'] = $table;
				backuply_die('INCOMPLETE_DB');
				die();
			}
			
			$GLOBALS['database_row'] = $current_row;
			$GLOBALS['database_row_done'] = $i;
			
			backuply_status_log('Database Backup: Closing (L'.$backuply['status']['loop'].') : '.$table . ' at row number '. $current_row . ' ' . $i);
			
			$query_buffer = ';' . $crlf;
			@fwrite($handle, $query_buffer);
			@fclose($handle);
			
			$GLOBALS['db_in_progress'] = $table;
			backuply_mysql_free_result($squery);
			
			backuply_die('INCOMPLETE_DB');
			die();
		}

		// Now if 10000 rows has been processed than select next.
		if($count == 0){
			// Now free the result for preventing memory exhaust
			backuply_mysql_free_result($squery);
			$count = 10000;
			$limit = $limit+10000;
			$sql_query  = 'SELECT * FROM `'.$db . '`.`' . $table . '` LIMIT '.($limit).', 10000';
			$squery= backuply_mysql_query($sql_query, $link);
		}
		
		$row = backuply_mysql_fetch_array($squery);
		
		// If we get empty result than break the loop
		if(!$row){
			break;
		}
		
		if ($current_row == 0) {
			$head = backuply_PMA_exportComment()
				  . backuply_PMA_exportComment('Dumping data for table' . ' ' . $formatted_table_name)
				  . backuply_PMA_exportComment()
				  . $crlf;
			fwrite($handle, $head);
		}
		$current_row++;
		
		if ($current_row == 1 || $new_query == 1 || !empty($GLOBALS['database_row'])) {
			fwrite($handle, $schema_insert .'(');
			$GLOBALS['database_row'] = null;
		}else{
			fwrite($handle, ','.$crlf.'(');
		}
		
		$add_comma = 0;
		for ($j = 0; $j < $fields_cnt; $j++) {
			
			$separator = ($add_comma > 0 ? ', ' : '');
			
			// NULL
			if (!isset($row[$j]) || is_null($row[$j])) {
				fwrite($handle, $separator . 'NULL');
			// a number
			// timestamp is numeric on some MySQL 4.1, BLOBs are sometimes numeric
			} elseif ($fields_meta[$j]->numeric && $fields_meta[$j]->type != 'timestamp' 
					&& !$fields_meta[$j]->blob) {
				fwrite($handle, $separator . $row[$j]);
			} elseif ($fields_meta[$j]->type == 'bit') {
				fwrite($handle, $separator . backuply_PMA_printableBitValue($row[$j], $fields_meta[$j]->length));
			} else { 
				backuply_PMA_sqlAddslashes($row[$j]);
				fwrite($handle, $separator . '\'' . str_replace($search, $replace, $row[$j]) . '\'');				
			} // end if
			
			if(!is_null($row[$j])){
				$query_length += strlen($row[$j]);
			}
			
			$add_comma++;
			$new_query = 0;
		} // end for
		
		fwrite($handle, ')');
		
		// Stop extended insert after 50K chars and open a new INSERT
		if($query_length > 50000){
			$query_buffer = ';' . $crlf;
			fwrite($handle, $query_buffer);
			$add_comma = 0;
			$new_query = 1;
			$query_length = 0;
		}
	
		// Decrement till 0 so that next 10000 rows can be selected
		$count--;
		
	}// End of FOR
	
	if ($current_row > 0) {
		$query_buffer = ';' . $crlf;
		fwrite($handle, $query_buffer);
	}
	
	// Free resourses
	backuply_mysql_free_result($squery);
	
	$end_line = (!empty($query_buffer) ? $crlf : '' ). backuply_PMA_exportComment('--------------------------------------------------------');
	fwrite($handle, $end_line);
	//return $query_buffer . $end_line;
		
} 

function backuply_PMA_exportComment($text = '')
{
	$crlf = "\n";
	$ret = '--' . (empty($text) ? '' : ' ') . $text . $crlf;
	return $ret;
}

function backuply_PMA_exportHeader($db, $ser_ver)
{
	$crlf = "\n";  

	$head  =  backuply_PMA_exportComment('Softaculous SQL Dump')
		   .  backuply_PMA_exportComment('http://www.softaculous.com')
		   .  backuply_PMA_exportComment()
		   .  backuply_PMA_exportComment('Host: localhost')
		   .  backuply_PMA_exportComment('Generation Time: '. date("F j, Y, g:i a") .'')
		   .  backuply_PMA_exportComment('Server version: '. $ser_ver .'')
		   .  backuply_PMA_exportComment('PHP Version' . ': ' . phpversion())
		   .  $crlf;

	/* We want exported AUTO_INCREMENT fields to have still same value, do this only for recent MySQL exports */
	$head .=  'SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";' . $crlf;
	
	/* Change timezone if we should export timestamps in UTC */
	$head .= 'SET time_zone = "+00:00";' . $crlf . $crlf;
  
	// by default we use the connection charset
	$set_names = 'utf8mb4';
		
	$head .=  $crlf
		   . '/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;' . $crlf
		   . '/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;' . $crlf
		   . '/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;' . $crlf
		   . '/*!40101 SET NAMES ' . $set_names . ' */;' . $crlf . $crlf;
	
	$head .= backuply_PMA_exportComment()
		  . backuply_PMA_exportComment('Database: `' . $db . '`')
		  . backuply_PMA_exportComment()
		  . $crlf
		  . backuply_PMA_exportComment('--------------------------------------------------------');

	return $head;

}

function backuply_PMA_exportFooter()
{
	$crlf = "\n";
	$foot = '';

	$foot .=  $crlf
	   . '/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;' . $crlf
	   . '/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;' . $crlf
	   . '/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;' . $crlf;
	
	return $foot;
}

function backuply_PMA_sversion($link){

	// Get version
	$version = backuply_mysql_query('SELECT VERSION()', $link);
	$version = backuply_mysql_fetch_assoc($version);
	
	// Explode to extract version
	$version = explode('-', $version['VERSION()']);
	return $version[0];
	
}

function backuply_PMA_printableBitValue($value, $length){
	// if running on a 64-bit server or the length is safe for decbin()
	if (PHP_INT_SIZE == 8 || $length < 33) {
		$printable = decbin($value);
	} else {
		// FIXME: does not work for the leftmost bit of a 64-bit value
		$i = 0;
		$printable = '';
		while ($value >= pow(2, $i)) {
			++$i;
		}
		if ($i != 0) {
			--$i;
		}

		while ($i >= 0) {
			if ($value - pow(2, $i) < 0) {
				$printable = '0' . $printable;
			} else {
				$printable = '1' . $printable;
				$value = $value - pow(2, $i);
			}
			--$i;
		}
		$printable = strrev($printable);
	}
	$printable = str_pad($printable, $length, '0', STR_PAD_LEFT);
	return $printable;
}

function backuply_mysql_connect($host, $user, $pass, $newlink = false){
	
	if(extension_loaded('mysqli')){
		//To handle connection if user passes a custom port along with the host as localhost:6446
		$exh = explode(':', $host);

		if(!empty($exh[1])){
			$sock = null;
			$port = $exh[1];

			// This is when the db connection is made using socket.
			if(!is_numeric($exh[1])){
				$sock = $exh[1];
				$port = null;
			}

			$sconn = @mysqli_connect($exh[0], $user, $pass, '', $port, $sock);
		}else{
			$sconn = @mysqli_connect($host, $user, $pass);
		}
	}else{
		//echo 'mysql';
		$sconn = @mysql_connect($host, $user, $pass, $newlink);
	}

	if(empty($sconn)){
		backuply_status_log(mysqli_connect_error(), 'error');
	}

	return $sconn;
}

function backuply_mysql_select_db($db, $conn){
	
	if(extension_loaded('mysqli')){
		$return = @mysqli_select_db($conn, $db);
	}else{
		$return = @mysql_select_db($db, $conn);
	}
	
	return $return;
}

function backuply_mysql_query($query, $conn){
	
	if(extension_loaded('mysqli')){
		$return = @mysqli_query($conn, $query);
	}else{
		$return = @mysql_query($query, $conn);
	}
	
	return $return;
}

function backuply_mysql_fetch_array($result){
	
	if(is_bool($result)){
		return false;
	}
	
	if(extension_loaded('mysqli')){
		$return = @mysqli_fetch_array($result);
	}else{
		$return = @mysql_fetch_array($result);
	}
	
	return $return;
}

function backuply_mysql_fetch_assoc($result){
	
	if(is_bool($result)){
		return $result;
	}
	
	if(extension_loaded('mysqli')){
		$return = @mysqli_fetch_assoc($result);
	}else{
		$return = @mysql_fetch_assoc($result);
	}
	
	return $return;
}

function backuply_mysql_fetch_row($result){
	
	if(is_bool($result)){
		return false;
	}
	
	if(extension_loaded('mysqli')){
		$return = @mysqli_fetch_row($result);
	}else{
		$return = @mysql_fetch_row($result);
	}
	
	return $return;
}


function backuply_mysql_field_flags($result, $i){
	
	if(!extension_loaded('mysqli')){
		return mysql_field_flags($result, $i);
	}
	
	$f = mysqli_fetch_field_direct($result, $i);
	$type = $f->type;
	$charsetnr = $f->charsetnr;
	$f = $f->flags;
	$flags = '';
	if ($f & MYSQLI_UNIQUE_KEY_FLAG) {
		$flags .= 'unique ';
	}
	if ($f & MYSQLI_NUM_FLAG) {
		$flags .= 'num ';
	}
	if ($f & MYSQLI_PART_KEY_FLAG) {
		$flags .= 'part_key ';
	}
	if ($f & MYSQLI_SET_FLAG) {
		$flags .= 'set ';
	}
	if ($f & MYSQLI_TIMESTAMP_FLAG) {
		$flags .= 'timestamp ';
	}
	if ($f & MYSQLI_AUTO_INCREMENT_FLAG) {
		$flags .= 'auto_increment ';
	}
	if ($f & MYSQLI_ENUM_FLAG) {
		$flags .= 'enum ';
	}
	// See http://dev.mysql.com/doc/refman/6.0/en/c-api-datatypes.html:
	// to determine if a string is binary, we should not use MYSQLI_BINARY_FLAG
	// but instead the charsetnr member of the MYSQL_FIELD
	// structure. Watch out: some types like DATE returns 63 in charsetnr
	// so we have to check also the type.
	// Unfortunately there is no equivalent in the mysql extension.
	if (($type == MYSQLI_TYPE_TINY_BLOB || $type == MYSQLI_TYPE_BLOB
		|| $type == MYSQLI_TYPE_MEDIUM_BLOB || $type == MYSQLI_TYPE_LONG_BLOB
		|| $type == MYSQLI_TYPE_VAR_STRING || $type == MYSQLI_TYPE_STRING)
		&& 63 == $charsetnr
	) {
		$flags .= 'binary ';
	}
	if ($f & MYSQLI_ZEROFILL_FLAG) {
		$flags .= 'zerofill ';
	}
	if ($f & MYSQLI_UNSIGNED_FLAG) {
		$flags .= 'unsigned ';
	}
	if ($f & MYSQLI_BLOB_FLAG) {
		$flags .= 'blob ';
	}
	if ($f & MYSQLI_MULTIPLE_KEY_FLAG) {
		$flags .= 'multiple_key ';
	}
	if ($f & MYSQLI_UNIQUE_KEY_FLAG) {
		$flags .= 'unique_key ';
	}
	if ($f & MYSQLI_PRI_KEY_FLAG) {
		$flags .= 'primary_key ';
	}
	if ($f & MYSQLI_NOT_NULL_FLAG) {
		$flags .= 'not_null ';
	}
	return trim($flags);
}


function backuply_mysql_num_rows($result){
	
	if(is_bool($result)){
		return false;
	}
	
	if(extension_loaded('mysqli')){
		$return = @mysqli_num_rows($result);
	}else{
		$return = @mysql_num_rows($result);
	}
	
	return $return;
}

function backuply_mysql_num_fields($result){
	
	if(is_bool($result)){
		return false;
	}
	
	if(extension_loaded('mysqli')){
		$return = @mysqli_num_fields($result);
	}else{
		$return = @mysql_num_fields($result);
	}
	
	return $return;
}

function backuply_mysql_free_result($result){
	
	if(is_bool($result)){
		return false;
	}
	
	if(extension_loaded('mysqli')){
		$return = @mysqli_free_result($result);
	}else{
		$return = @mysql_free_result($result);
	}
	
	return $return;
}

// Close mysql connection
function backuply_mysql_close($conn){
	if(empty($conn)){
		return true;
	}

	if(extension_loaded('mysqli')){
		@mysqli_close($conn);
	} else {
		@mysql_close($conn);
	}

	return true;
}

function backuply_getFieldsMeta($result){
	// Build an associative array for a type look up
	
	if(is_bool($result)){
		return false;
	}
	
	if(!defined('MYSQLI_TYPE_VARCHAR')){
		define('MYSQLI_TYPE_VARCHAR', 15);
	}
	
	$typeAr = array();
	$typeAr[MYSQLI_TYPE_DECIMAL]	 = 'real';
	$typeAr[MYSQLI_TYPE_NEWDECIMAL]  = 'real';
	$typeAr[MYSQLI_TYPE_BIT]		 = 'int';
	$typeAr[MYSQLI_TYPE_TINY]		= 'int';
	$typeAr[MYSQLI_TYPE_SHORT]	   = 'int';
	$typeAr[MYSQLI_TYPE_LONG]		= 'int';
	$typeAr[MYSQLI_TYPE_FLOAT]	   = 'real';
	$typeAr[MYSQLI_TYPE_DOUBLE]	  = 'real';
	$typeAr[MYSQLI_TYPE_NULL]		= 'null';
	$typeAr[MYSQLI_TYPE_TIMESTAMP]   = 'timestamp';
	$typeAr[MYSQLI_TYPE_LONGLONG]	= 'int';
	$typeAr[MYSQLI_TYPE_INT24]	   = 'int';
	$typeAr[MYSQLI_TYPE_DATE]		= 'date';
	$typeAr[MYSQLI_TYPE_TIME]		= 'time';
	$typeAr[MYSQLI_TYPE_DATETIME]	= 'datetime';
	$typeAr[MYSQLI_TYPE_YEAR]		= 'year';
	$typeAr[MYSQLI_TYPE_NEWDATE]	 = 'date';
	$typeAr[MYSQLI_TYPE_ENUM]		= 'unknown';
	$typeAr[MYSQLI_TYPE_SET]		 = 'unknown';
	$typeAr[MYSQLI_TYPE_TINY_BLOB]   = 'blob';
	$typeAr[MYSQLI_TYPE_MEDIUM_BLOB] = 'blob';
	$typeAr[MYSQLI_TYPE_LONG_BLOB]   = 'blob';
	$typeAr[MYSQLI_TYPE_BLOB]		= 'blob';
	$typeAr[MYSQLI_TYPE_VAR_STRING]  = 'string';
	$typeAr[MYSQLI_TYPE_STRING]	  = 'string';
	$typeAr[MYSQLI_TYPE_VARCHAR]	 = 'string'; // for Drizzle
	// MySQL returns MYSQLI_TYPE_STRING for CHAR
	// and MYSQLI_TYPE_CHAR === MYSQLI_TYPE_TINY
	// so this would override TINYINT and mark all TINYINT as string
	// https://sourceforge.net/p/phpmyadmin/bugs/2205/
	//$typeAr[MYSQLI_TYPE_CHAR]		= 'string';
	$typeAr[MYSQLI_TYPE_GEOMETRY]	= 'geometry';
	$typeAr[MYSQLI_TYPE_BIT]		 = 'bit';

	$fields = mysqli_fetch_fields($result);

	// this happens sometimes (seen under MySQL 4.0.25)
	if (!is_array($fields)) {
		return false;
	}

	foreach ($fields as $k => $field) {
		$fields[$k]->_type = $field->type;
		$fields[$k]->type = $typeAr[$field->type];
		$fields[$k]->_flags = $field->flags;
		$fields[$k]->flags = backuply_mysql_field_flags($result, $k);

		// Enhance the field objects for mysql-extension compatibilty
		//$flags = explode(' ', $fields[$k]->flags);
		//array_unshift($flags, 'dummy');
		$fields[$k]->multiple_key
			= (int) (bool) ($fields[$k]->_flags & MYSQLI_MULTIPLE_KEY_FLAG);
		$fields[$k]->primary_key
			= (int) (bool) ($fields[$k]->_flags & MYSQLI_PRI_KEY_FLAG);
		$fields[$k]->unique_key
			= (int) (bool) ($fields[$k]->_flags & MYSQLI_UNIQUE_KEY_FLAG);
		$fields[$k]->not_null
			= (int) (bool) ($fields[$k]->_flags & MYSQLI_NOT_NULL_FLAG);
		$fields[$k]->unsigned
			= (int) (bool) ($fields[$k]->_flags & MYSQLI_UNSIGNED_FLAG);
		$fields[$k]->zerofill
			= (int) (bool) ($fields[$k]->_flags & MYSQLI_ZEROFILL_FLAG);
		$fields[$k]->numeric
			= (int) (bool) ($fields[$k]->_flags & MYSQLI_NUM_FLAG);
		$fields[$k]->blob
			= (int) (bool) ($fields[$k]->_flags & MYSQLI_BLOB_FLAG);
	}
	return $fields;
}

function backuply_rmdir_recursive_fn($path){
	
	$path = (substr($path, -1) == '/' || substr($path, -1) == '\\' ? $path : $path.'/');
	
	backuply_resetfilelist();
	
	$files = backuply_filelist_fn($path, 1, 0, 'all');
	$files = (!is_array($files) ? array() : $files);
	
	//First delete the files only
	foreach($files as $k => $v){
		@chmod($k, 0777);
		if(file_exists($k) && is_file($k) && @filetype($k) == "file"){
			@unlink($k);
		}
	}
	
	@clearstatcache();
	
	$folders = backuply_filelist_fn($path, 1, 1, 'all');
	$folders = (!is_array($folders) ? array() : $folders);
	@krsort($folders);

	//Now Delete the FOLDERS
	foreach($folders as $k => $v){
		@chmod($k, 0777);
		if(is_dir($k)){
			@rmdir($k);
		}
	}
	
	@rmdir($path);
	
	@clearstatcache();
}

// To delete any file created while backing up
function backuply_clean_on_stop() {
	global $data, $backuply;
	
	backuply_status_log('Stopping your backup', 'info');
	
	if(!isset($data['name'])) {
		return;
	}
	
	$ext = !empty($data['ext']) ? $data['ext'] : 'tar.gz';
	
	//backuply_rmdir_recursive_fn(BACKUPLY_BACKUP_DIR.'backups/tmp');
	
	// clean the tmp files
	backuply_clean($data);
	
	// Delete the tar file with dot at the start
	if(file_exists($data['path'] . '/.' . $data['name'] .'.'. $ext)) {
		@unlink($data['path'] . '/.' . $data['name'] .'.'. $ext);
	}
	
	// Deletes File from remote
	if(!empty($backuply['status']['remote_file_path'])){
		backuply_log('Removing remote file');
		@unlink($backuply['status']['remote_file_path']);
		@unlink($backuply['status']['successfile']);
	}
	
	backuply_status_log('Cleaning the backup folder', 'info', -1);
	
	$backup_info_dir = backuply_glob('backups_info');
	
	if(empty($backup_info_dir)){
		return;
	}
	
	// Delete the Info file
	if(file_exists($backup_info_dir .'/'. $data['name'] . '.php')) {
		@unlink($backup_info_dir . '/' . $data['name'] . '.php');
	}
}

// To check if backup has been stopped
function backuply_backup_stop_checkpoint() {
	global $data, $wpdb, $backuply;
	
	$query = 'SELECT * FROM `'.$wpdb->prefix.'options` WHERE `option_name` = "backuply_backup_stopped"';
	$result = $wpdb->get_results($query);
	
	if(!empty($result[0]->option_value)) {
		delete_option('backuply_backup_stopped');
		backuply_clean_on_stop();
		backuply_status_log('Backup Successfully Stopped', 'success');
		unset($backuply['status']['incomplete_upload']);
		
		backuply_die('stopped');
	}
}

//Updates the Status in the data base to be used when incomplete
function backuply_update_status(){
	global $data, $backuply;
	
	//An array to store only the required fields in sql.
	
	if(isset($backuply['status']['successfile']) && !isset($GLOBALS['successfile'])) {
		$GLOBALS['successfile'] = $backuply['status']['successfile'];
	}
	
	if(!isset($backuply['status']['incomplete_upload']) && empty($GLOBALS['end_file']) && empty($GLOBALS['db_in_progress'])){
		return;
	}

	$backuply['status']['name'] = $data['name'];
	$backuply['status']['last_file'] = !empty($GLOBALS['end_file']) ? base64_encode($GLOBALS['end_file']) : '';
	$backuply['status']['added_file_count'] = !empty($GLOBALS['added_file_count']) ? $GLOBALS['added_file_count'] : 0;
	$backuply['status']['backup_db'] = $data['backup_db'];
	$backuply['status']['backup_dir'] = $data['backup_dir'];
	$backuply['status']['successfile'] = isset($GLOBALS['successfile']) ? $GLOBALS['successfile'] : '';
	$backuply['status']['database_row'] = !empty($GLOBALS['database_row']) ? $GLOBALS['database_row'] : '';
	$backuply['status']['database_row_done'] = !empty($GLOBALS['database_row_done']) ? $GLOBALS['database_row_done'] : '';
	$backuply['status']['backup_tables'] = !empty($GLOBALS['backup_tables']) ? $GLOBALS['backup_tables'] : array();
	$backuply['status']['db_in_progress'] = !empty($GLOBALS['db_in_progress']) ? $GLOBALS['db_in_progress'] : '';
	
	//Store the $backuply['status'] variable in sql.
	update_option('backuply_status', $backuply['status']);
}

function backuply_info_json(&$info_data = []){
	
	global $data, $can_write, $backuply;
	
	//Get the current Users Information
	$current_user = wp_get_current_user();
	
	if(!function_exists('get_home_path')){
		include_once backuply_cleanpath(ABSPATH) . '/wp-admin/includes/file.php';
	}
	
	//Store all needed information for the info file
	$info_data = array();
	$info_data['name'] = $GLOBALS['data']['name']; 
	$info_data['backup_dir'] = $GLOBALS['data']['backup_dir'];
	$info_data['backup_db'] = $GLOBALS['data']['backup_db'];
	$info_data['email'] = $current_user->user_email;
	$info_data['date_time'] = date("Y-m-d H:i:a");
	$info_data['btime'] = time();
	$info_data['auto_backup'] = isset($data['auto_backup']) ? $data['auto_backup'] : false;
	$info_data['ext'] = 'tar.gz';

	if(isset($backuply['status']['remote_file_path'])){
		// We need to handle ftp size manually because, ftp stream does not gives correct size when the file is over 2GB
		// As on some systems the ftp stream could be using 32bit.
		if(strpos($backuply['status']['remote_file_path'], 'ftp:') === 0 && function_exists('ftp_connect')){
			$ftp_url = parse_url($backuply['status']['remote_file_path']);
			if(!isset($ftp_url['port'])){
				$ftp_url['port'] = 21;
			}

			$ftp_conn = ftp_connect($ftp_url['host'], $ftp_url['port']);
			if(!empty($ftp_conn)){
				if(ftp_login($ftp_conn, rawurldecode($ftp_url['user']), rawurldecode($ftp_url['pass']))){
					$ftp_size = ftp_size($ftp_conn, $ftp_url['path']);
				}
			}
		}

		$info_data['size'] = (empty($ftp_size) ? filesize($backuply['status']['remote_file_path']) : $ftp_size);

	} else if(isset($GLOBALS['successfile'])){
		$info_data['size'] = filesize($GLOBALS['successfile']);
	} else {
		$info_data['size'] = false;
	}

	$info_data['backup_site_url'] = get_site_url();
	$info_data['backup_site_path'] = backuply_cleanpath(get_home_path());
	
	if(isset($data['backup_location']) && !empty($data['backup_location'])){
		$info_data['backup_location'] = $data['backup_location'];
	}
	
	if(!empty($backuply['status']['backup_note'])){
		$info_data['backup_note'] = esc_html($backuply['status']['backup_note']);
	}

	//Encode the Data and store it in a file
	return "<?php exit();?>\n".json_encode($info_data, JSON_PRETTY_PRINT);
	
}

// Uploads the backup log file
function backuply_upload_log() {
	global $backuply, $data;

	$backuply['status']['successfile'] = BACKUPLY_BACKUP_DIR . $data['name'] . '_log.php';
	
	// Upload the info file as well
	$GLOBALS['start_pos'] = 0;
	unset($backuply['status']['init_data']);
	unset($backuply['status']['proto']);
	$backuply['status']['proto_file_size'] = filesize($backuply['status']['successfile']);
	
	$remote_fp = fopen(dirname($backuply['status']['remote_file_path']).'/'.$data['name'].'.log', 'ab');

	fwrite($remote_fp, file_get_contents($backuply['status']['successfile']));
	fclose($remote_fp);
}

function backuply_die($txt){
	global $data, $can_write, $backuply;
	
	$email = get_option('backuply_notify_email_address');
	$site_url = get_site_url();
	backuply_update_status(); //Updates the Globals in the Status
	
	// Was there an error ?
	if(!empty($GLOBALS['error'])){
	
		// Deletes File from remote
		if(!empty($backuply['status']['remote_file_path'])){
			backuply_log('Removing remote file');
			@unlink($backuply['status']['remote_file_path']);
			@unlink($backuply['status']['successfile']);
		}
	
		$error = $GLOBALS['error'];
		$error_string = '<b>Below are the error(s) :</b> <br />';
	
		foreach($error as $ek => $ev){
			$error_string .= '* '.$ev.'<br />';
		}

		backuply_status_log($error_string, 'info', 100);
		
		
		// Notify user about the backup failure
		$mail = array();
		$mail['to'] = $email;   
		$mail['subject'] = 'Backup of your WordPress installation failed - Backuply';
		$mail['headers'] = "Content-Type: text/html; charset=UTF-8\r\n";
		$mail['message'] = 'Hi, <br><br>

The last backup of your WordPress installation was failed. <br>
Installation URL : '.$site_url.' <br>
'.$error_string.' <br><br>


Regards,<br>
Backuply';
		
		// Send Email
		if(!empty($mail['to'])){
			wp_mail($mail['to'], $mail['subject'], $mail['message'], $mail['headers']);
		}

		backuply_status_log('Backup failed', 'error', 100);
		backuply_report_error($GLOBALS['error']);		
		
		if($timestamp = wp_next_scheduled('backuply_timeout_check', array('is_restore' => false))) {
			wp_unschedule_event($timestamp, 'backuply_timeout_check', array('is_restore' => false));
		}
		
		delete_option('backuply_status');
		backuply_clean($data);
		backuply_copy_log_file(false); // For Last Log File

		die();
	}
	
	if($txt == 'DONE'){
		backuply_backup_stop_checkpoint();
		
		$backups_info_dir = backuply_glob('backups_info');

		//Create & store the file in the backups_info folder
		$file = fopen($backups_info_dir . '/' . $GLOBALS['data']['name'] . '.php', 'w');
		fwrite($file, backuply_info_json($info_data));
		@fclose($file);
		
		// Send the mail
		if(!empty($email)){
			//backuply_log(' email to : '.$email);
			//$backup_path = (!empty($GLOBALS['is_remote']) ? '/'.$GLOBALS['data']['name'] : $GLOBALS['successfile'] );

			if(!empty($GLOBALS['is_remote'])){
				$backup_location = 'Backup Location : '.$GLOBALS['is_remote_loc']['name'];
				$backup_path = '/'.$GLOBALS['data']['name'];
			}else{
				$backup_location = '';
				$backup_path = $GLOBALS['successfile'];
			}

			$mail = array();
				$mail['to'] = $email;   
				$mail['subject'] = 'Backup of your WordPress installation - Backuply';
				$mail['message'] = 'Hi,

The backup of your WordPress installation was completed successfully.
The details are as follows :
Installation Path : '.$GLOBALS['data']['softpath'].'
Installation URL : '.$site_url.'
Backup Path : '.$backup_path.'
'.$backup_location.'

Regards,
Backuply';

			wp_mail($mail['to'], $mail['subject'], $mail['message']);
			//backuply_log(' mail data : '. var_export($mail, 1));
		}
		
		backuply_status_log('Total files added to the backup are ' . $GLOBALS['added_file_count']);
		backuply_status_log('Archive created with a file size of '. backuply_format_size($info_data['size']) , 'info', 100);
		update_option('backuply_last_backup', time(), false);
		backuply_status_log('Backup Successfully Completed', 'success', 100);
		
		backuply_copy_log_file(false); // For Last Log File
		backuply_copy_log_file(false, $info_data['name']); // Log file for that specific backup
		
		if(isset($backuply['status']['remote_file_path'])) {
			backuply_upload_log();
		}

		// To update the storage data on creation of Backup.
		if(!empty($backuply['status']['remote_file_path']) && strpos($backuply['status']['remote_file_path'], 'bcloud://') !== FALSE){
			$args = ['bcloud'];
			$schedule_time = wp_next_scheduled('backuply_update_quota', $args);

			// Check functions.php function backuply_delete_backup for more info.
			if(empty($schedule_time)){
				wp_schedule_single_event(time() + 10, 'backuply_update_quota', $args);
			}
		}

		if(!empty($backuply['status']['backup_rotation'])){
			if(!function_exists('backuply_backup_rotation') && !defined('BACKUPLY_PRO') && file_exists(BACKUPLY_DIR . '/main/bcloud-cron.php')){
				include_once(BACKUPLY_DIR . '/main/bcloud-cron.php');
			}
			
			// The functions file of Pro Will already be included so we dont need to include it again.
			// Just in case it wont be included we have to add this check.
			if(function_exists('backuply_backup_rotation')){
				backuply_backup_rotation();
			}
		}
	}
	
	if(strpos($txt, 'INCOMPLETE') !== FALSE) {
		backuply_log('Going to next loop - '.($backuply['status']['loop'] + 1));

		if(file_exists($backuply['zipfile'])){
			backuply_status_log('Current size of the backup is : '.backuply_format_size(filesize($backuply['zipfile'])), 'adding', 65);
		}
		backuply_backup_curl('backuply_curl_backup');
		die();
	}
	
	if($txt === 'incomplete_upload' || isset($backuply['status']['incomplete_upload'])) {
		update_option('backuply_status', $backuply['status']);
		backuply_backup_curl('backuply_curl_upload');
		die();
	}

	if($timestamp = wp_next_scheduled('backuply_timeout_check', array('is_restore' => false))) {
		wp_unschedule_event($timestamp, 'backuply_timeout_check', array('is_restore' => false));
	}
	
	delete_option('backuply_status');
	backuply_clean($data);
	die();
}

// Clean the Backup files
function backuply_clean($data){

	if(isset($GLOBALS['bfh']) && $GLOBALS['bfh']) {
		foreach($GLOBALS['bfh'] as $v){
			if(!empty($v) && is_resource($v)){
				@fclose($v);
			}
		}
	}

	// Delete tmp/ folder only if the process was completed
	if(empty($GLOBALS['end_file'])){
		backuply_rmdir_recursive_fn($data['path'].'/tmp/'.$data['name']);
	}
	
	return false;
}

// Requests backup via curl
function backuply_backup_curl($action) {
	global $data;
	
	// Note: A user was having a non zero user ID from a WP Cron request
	// So this unsets the user id to 0(logged out ID)
	// Some plugin was causing this dont have more info as user didnt gave access.
	if(!empty($data['auto_backup']) && !empty(get_current_user_id())){
		wp_set_current_user(0);
	}

	$nonce = wp_create_nonce('backuply_nonce');

	if(empty($nonce)) {
		backuply_kill_process();
		return;
	}

	$url = site_url() . '/?action='.$action.'&security='. $nonce;

	// Cloudflare was returning cached HIT on this request making the request to fail
	// So we will be adding a cache buster to prevent cached version of the endpoint.
	if(isset($_SERVER['HTTP_CF_RAY'])){
	    $url .= '&cachebuster='.time();
	}
	
	backuply_status_log('About to call self to prevent timeout', 'info');

	$args = array(
		'timeout' => (int) apply_filters('backuply_backup_self_timeout', 10),
		'blocking' => false,
		'sslverify' => false,
		'user-agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36',
		'headers' => [
			'Cache-Control' => 'max-age=0, no-cache',
		]
	);

	if(!empty($_COOKIE[LOGGED_IN_COOKIE])){
		$args['cookies'] = array(LOGGED_IN_COOKIE => $_COOKIE[LOGGED_IN_COOKIE]);
	}

	wp_remote_get($url, $args);
	
	die();
}

function backuply_remote_upload($finished = false){
	global $backuply, $error;

	// Do we have a remote file ?
	if(empty($backuply['status']['successfile']) || !file_exists($backuply['status']['successfile'])){
		$error['fopen_failed'] = 'Upload Failed! Because the file is not present on the server';
		unset($backuply['status']['incomplete_upload']);
		backuply_die('upload_failed');
	}
	
	if(empty($backuply['status']['init_pos'])){
		$backuply['status']['init_pos'] = 0;
	}	
	$GLOBALS['start_pos'] = $backuply['status']['init_pos'];
	$backuply['status']['proto_file_size'] = filesize($backuply['status']['successfile']);
	
	// This code uses PHP's Stream API, which allows handling various storage mechanisms transparently.
	// Documentation: https://www.php.net/manual/en/class.streamwrapper.php
	//
	// The fopen() function internally calls stream_open(), which is implemented by the specific stream wrapper
	// associated with the given file path. For eg: if you are using OneDrive, check /lib/onedrive.php for its implementation.
	//
	// Similarly, other file functions like fwrite(), fread(), etc., have corresponding stream functions.
	// You can refer to the provided link for details on how they work.
	$remote_fp = fopen($backuply['status']['remote_file_path'], 'ab');

	if($remote_fp == false){
		$error['fopen_failed'] = 'Unable to open the remote location for writing the backup data. Please make sure the Backup Location details and credentials are correct !';
		unset($backuply['status']['incomplete_upload']);
		backuply_die('fopen_failed');
	}
	
	backuply_status_log('Upload Start Position (L'.$backuply['status']['loop'].') : '.$backuply['status']['init_pos']);
	
	$backuply['status']['chunk'] = 262144; // 2MB
	
	// For storages who use bcloud lib, like aws, caws, and bcloud the chunk size need to be 5MB
	// NOTE: If you plan to increase this size, make sure to increase it in the bcloud.php chunksize as well
	if(
		strpos($backuply['status']['remote_file_path'], 'bcloud') === 0 || 
		strpos($backuply['status']['remote_file_path'], 'aws') === 0 || 
		strpos($backuply['status']['remote_file_path'], 'caws') === 0
	){
		$backuply['status']['chunk'] = 5242880; // 5MB
	}

	$file_size = filesize($backuply['status']['successfile']);
	$chunks = ceil($file_size / $backuply['status']['chunk']);
	$chunk_no = isset($backuply['status']['chunk_no']) ? $backuply['status']['chunk_no'] : 1;
	
	while($chunk_no <= $chunks) {
		$backuply['status']['chunk_no'] = $chunk_no;
		
		if(!empty($error)) {
			backuply_die('uploaderror');
		}
		
		// Timeout check
		if(time() + 5 > $GLOBALS['end']) {
			backuply_log('Upload: Short on time!');
			$backuply['status']['incomplete_upload'] = true;
			
			if(!isset($backuply['status']['init_data'])) {
				$backuply['status']['init_data'] = $backuply['status']['protocol'];
			};
			
			backuply_status_log('Upload Time Closing (L'.$backuply['status']['loop'].') : '.$backuply['status']['init_pos']);
			
			@fclose($remote_fp);
			
			backuply_die('incomplete_upload');
			die();
		}
		
		backuply_backup_stop_checkpoint();
		
		// For last chunk
		if($chunk_no == $chunks) {
			$backuply['status']['chunk'] = $file_size - $backuply['status']['init_pos'];
			unset($backuply['status']['incomplete_upload']);
		}
		
		$content = file_get_contents($backuply['status']['successfile'], false, null, $backuply['status']['init_pos'], $backuply['status']['chunk']);
		$clen = strlen($content);

		if(!empty($content)){
			fwrite($remote_fp, $content, $clen); // Write to the stream
			
			// If we had to retry then we should use the start_pos to update init_pos
			if(!empty($backuply['status']['upload_retry'])){
				$backuply['status']['init_pos'] = $GLOBALS['start_pos']; // Update length
				$backuply['status']['upload_retry'] = false;
			} else {
				$backuply['status']['init_pos'] += $clen; // Update Length
			}
			
			
		}
		$content = '';
		
		backuply_status_log('Uploaded till (L'.$backuply['status']['loop'].') : '.$backuply['status']['init_pos'].' / '.$file_size);
		
		//Updating the UI status log
		$percentage = ($chunk_no / $chunks) * 100;
		backuply_status_log('<div class="backuply-upload-progress"><span class="backuply-upload-progress-bar" style="width:'.round($percentage).'%;"></span><span class="backuply-upload-size">'.round($percentage).'%</span></div>', 'uploading', 73);
		
		$chunk_no++;
	}
	
	@fclose($remote_fp);
	
	// If we are done, lets delete this file
	if(!isset($backuply['status']['incomplete_upload'])){
		
		// Delete local file
		@unlink($backuply['status']['successfile']);
		
		if(empty($error)){
		
			$info_file = backuply_info_json();
			
			// Upload the info file as well
			$GLOBALS['start_pos'] = 0;
			unset($backuply['status']['init_data']);
			unset($backuply['status']['proto']);
			$backuply['status']['proto_file_size'] = strlen($info_file);
			
			$remote_fp = fopen(dirname($backuply['status']['remote_file_path']).'/'.$GLOBALS['data']['name'].'.info', 'ab');
			fwrite($remote_fp, $info_file);
			fclose($remote_fp);

		}
		
		backuply_die('DONE');
	}
	
	backuply_die('incomplete_upload');
}

#####################################################
# BACKUP LOGIC STARTS HERE !
#####################################################

global $user, $globals, $can_write, $error, $backuply;

// Check if we can write
$can_write = backuply_can_create_file();

if(empty($can_write)){
	$error[] = __('Cannot write a temporary file !', 'backuply');
	backuply_die('cannot_write');
}

// Retrieve all the information from the form
$data = array();

if(empty($backuply['excludes'])){
	$backuply['excludes'] = [];
}

//Exclude the "backuply" folder
$backuply['excludes']['exact'][] = backuply_cleanpath(BACKUPLY_BACKUP_DIR);

//Exclude the "ai1wm-backups" & the "updraft" folder
$backuply['excludes']['exact'][] = backuply_cleanpath(WP_CONTENT_DIR . '/ai1wm-backups');
$backuply['excludes']['exact'][] = backuply_cleanpath(WP_CONTENT_DIR . '/updraft');

if(!empty($backuply['excludes']['exact'])) {
	foreach($backuply['excludes']['exact'] as $exact_path){
		$backuply['excludes']['exact'][] = backuply_cleanpath($exact_path);
	}
}

//Create the filename
$server_name = !empty($_SERVER['SERVER_NAME']) ? backuply_sanitize_filename(wp_unslash($_SERVER['SERVER_NAME'])) : '';
$data['name'] =  !isset($backuply['status']['name']) ? (defined('SITEPAD') ? 'sp_' : 'wp_').$server_name.'_'.date('Y-m-d_H-i-s') : $backuply['status']['name'];

//The path where all backups are stored
$backups_dir = backuply_glob('backups');
$data['path'] = backuply_cleanpath($backups_dir);

//Create the tmp folder
if(!is_dir($data['path'].'/tmp/'.$data['name'])) {
	mkdir($data['path'].'/tmp/'.$data['name'], 0755, true);
}

//Check if the user wants to backup the database
//$data['backup_db'] = isset($backuply['status']['backup_db']) ? 1 : 0;
$data['backup_db'] = !empty($backuply['status']['backup_db']) ? $backuply['status']['backup_db'] : false;
$data['auto_backup'] = isset($backuply['status']['auto_backup']) ? $backuply['status']['auto_backup'] : false;

// Setting upload try
if(empty($backuply['status']['upload_try'])){
	$backuply['status']['upload_try'] = 0;
}
$backuply['status']['upload_retry'] = false;

//Database Information
$data['softdb'] = $wpdb->dbname;
$data['softdbhost'] = $wpdb->dbhost;
$data['softdbuser'] = $wpdb->dbuser;
$data['softdbpass'] = $wpdb->dbpassword;

//Check if the user wants to backup the directories
$data['backup_dir'] = !empty($backuply['status']['backup_dir']) ? $backuply['status']['backup_dir'] : 0;

//The directory path that needs to be backed up
$data['softpath'] = backuply_cleanpath(ABSPATH);

// Get backuply core file index as well as additional files for backup
$data['fileindex'] = backuply_core_fileindex();
$data['additional_files_for_backup'] = get_option('backuply_additional_fileindex');

$data['exclude_db'] = !empty($backuply['excludes']['db']) ? $backuply['excludes']['db'] : array();

// Data used to resume backup of database.
$GLOBALS['database_row'] = !empty($backuply['status']['database_row']) ? $backuply['status']['database_row'] : null;
$GLOBALS['database_row_done'] = !empty($backuply['status']['database_row_done']) ? $backuply['status']['database_row_done'] : null;
$GLOBALS['backup_tables'] = !empty($backuply['status']['backup_tables']) ? $backuply['status']['backup_tables'] : array();
$GLOBALS['db_in_progress'] = !empty($backuply['status']['db_in_progress']) ? $backuply['status']['db_in_progress'] : '';

backuply_backup_stop_checkpoint();

// We need to stop execution in 25 secs.. We will be called again if the process is incomplete
// Set default value
$keepalive = 25;
$GLOBALS['end'] = (int) time() + $keepalive;

$name = $data['name'];
$tmpdir = $data['path'].'/tmp';

// For libraries which are creating copies here and then uploading !
$GLOBALS['local_dest'] = $data['path'];
$GLOBALS['is_remote'] = 0;

$backuply['status']['loop'] = (empty($backuply['status']['loop'])) ? 1 : ($backuply['status']['loop'] + 1);

if(!empty($remote_location)){
	$GLOBALS['is_remote'] = 1;
	$GLOBALS['is_remote_loc'] = $remote_location;
	
	$path = $remote_location['full_backup_loc'];
	$backuply['status']['remote_file_path'] = $path.'/'.$name.'.tar.gz';
	$backuply['status']['protocol'] = $remote_location['protocol'];

	$data['backup_location'] = $remote_location['id'];
	
	// Server Side Encryption for AWS
	if('aws' == $remote_location['protocol'] && isset($remote_location['aws_sse'])){
		$backuply['status']['aws_sse'] = $remote_location['aws_sse'];
	}

	backuply_stream_wrapper_register($remote_location['protocol'], $remote_location['protocol']);
}

$path = $data['path'];
$zipfile = $path.'/.'.$name.'.tar.gz';
$backuply['zipfile'] = $zipfile;
$successfile = $path.'/'.$name.'.tar.gz';

$GLOBALS['doing_soft_files'] = 0;

$f_list = $pre_soft_list = $post_soft_list = array(); // Files/Folder which has to be added to the tar.gz

// Empty last file everytime as a precaution
$GLOBALS['added_file_count'] = !empty($backuply['status']['added_file_count']) ? $backuply['status']['added_file_count'] : '';
$GLOBALS['last_file'] = '';
$GLOBALS['last_file'] = !empty($backuply['status']['last_file']) ? base64_decode($backuply['status']['last_file']) : '';

if(!empty($GLOBALS['last_file'])){
	$GLOBALS['last_file'] = rawurldecode($GLOBALS['last_file']);
	
	// If the last file is the DB file, we need to skip to start the loop for the next file because we dont add the db file in the tar list once the SQL file is backed up
	$GLOBALS['last_file'] = strpos($GLOBALS['last_file'], 'softsql.sql') !== FALSE ? '' : $GLOBALS['last_file']; 	
}

$GLOBALS['init_pos'] = 0;

//Sets the Position of pointer in the file
if(isset($backuply['status']['init_pos']) && $backuply['status']['init_pos']) {
	$GLOBALS['init_pos'] = (int) $backuply['status']['init_pos'];
}

// Resume uploads - Calls for upload start in the remote upload option. This is subsequent loops
if(!empty($backuply['status']['init_data'])) {
	backuply_log('Resuming upload');
	backuply_remote_upload();
	die();
}

// Save the version
if(!file_exists($data['path'].'/tmp/'.$data['name'].'/softver.txt')){
	@file_put_contents($data['path'].'/tmp/'.$data['name'].'/softver.txt', BACKUPLY_VERSION);
}
$GLOBALS['replace']['from']['softver'] = $data['path'].'/tmp/'.$data['name'].'/softver.txt';
$GLOBALS['replace']['to']['softver'] = 'softver.txt';

// Save the info file data
if(!file_exists($data['path'].'/tmp/'.$data['name'].'/'.$data['name'].'.php')){
	@file_put_contents($data['path'].'/tmp/'.$data['name'].'/'.$data['name'].'.php', backuply_info_json());
}
$GLOBALS['replace']['from']['backupinfo'] = $data['path'].'/tmp/'.$data['name'].'/'.$data['name'].'.php';
$GLOBALS['replace']['to']['backupinfo'] = $data['name'] . '.php';


//Backup the DATABASE
if(!empty($data['backup_db']) && !empty($data['softdb']) && empty($backuply['status']['backup_db_done'])){
	// Store the progress
	backuply_status_log('Starting to Backup Database', 'info', 20);
	
	$dbfile = $data['path'].'/tmp/'.$data['name'].'/softsql.sql';
	backuply_status_log('Creating softsql', 'working', 23);

	$pre_soft_list[] = $dbfile;
	
	$GLOBALS['replace']['from']['softsql'] = $dbfile;
	$GLOBALS['replace']['to']['softsql'] = 'softsql.sql';
	
	$dbuser = $data['softdbuser'];
	$dbpass = $data['softdbpass'];
	
	$sql_conn = backuply_mysql_connect($data['softdbhost'], $dbuser, $dbpass);
		
	if(!$sql_conn){
		//$error['mysql_connect'] = 'Cannot connect mysql.';
		$GLOBALS['error']['mysql_connect'] = __('Cannot connect to mysql.', 'backuply');
		backuply_die('conn');
	}
	
	$sel = backuply_mysql_select_db($data['softdb'], $sql_conn);
	
	if(!$sel){
		//$error['mysql_sel_db'] = 'Could not select the database';
		$GLOBALS['error']['mysql_sel_db'] = __('Could not select the database.', 'backuply');
		backuply_die('conn');
	}
	
	$host = $data['softdbhost'];
	$user = $data['softdbuser'];
	$pass = $data['softdbpass'];
	$db = $data['softdb'];

	//include_once('mysql_functions.php');
	backuply_backup_stop_checkpoint();

	if(!backuply_mysql_fn($host, $user, $pass, $db, $dbfile)){
		//$error[] = 'Back up was not successful';
		$GLOBALS['error'][] = __('Back up was unsuccessful.', 'backuply');
		backuply_die('conn');
	}
	
	if(!file_exists($dbfile)){
		//$error['backup_db'] = 'Could not create sql file from database.';
		$GLOBALS['error']['backup_db'] = __('Could not create sql file from database.', 'backuply');

		backuply_die('error');
	}
	
	$backuply['status']['backup_db_done'] = 1;
	backuply_status_log('Creation of SQL dump completed', 'working', 24);

	// Close the mysql connection opened, creating for dump
	if(!empty($sql_conn)){
		backuply_mysql_close($sql_conn);
		$sql_conn = null;
	}
}

//Backup the DIRECTORY
if(!empty($data['backup_dir'])){
	
	// Store the progress
	backuply_status_log('Backing up your Wordpress Install', 'info', empty($data['backup_db']) ? 31 : 39);	
	backuply_backup_stop_checkpoint();
	
	if(!empty($data['fileindex'])){
		$_root_filelist = backuply_filelist_fn(backuply_cleanpath($data['softpath']), 0);
		$root_filelist = array();

		// Lets get the full paths in fileindex
		$full_fileindex = array();
		foreach($data['fileindex'] as $sfk => $sfv){
			$full_fileindex[] = trim(backuply_cleanpath($data['softpath'])).'/'.$sfv;
		}
		
		// Add additional files in fileindex if selected by user
		if(!empty($data['additional_files_for_backup'])){
			foreach($data['additional_files_for_backup'] as $sfk => $sfv){
				$full_fileindex[] = trim(backuply_cleanpath($data['softpath'])).'/'.$sfv;
			}
		}
		
		foreach($_root_filelist as $rk => $rv){
			$tmp_rk = backuply_cleanpath($rk);
			$tmp_rv = $rv;

			// Do we need to exclude the files ? 
			if(!in_array(trim($tmp_rk), $full_fileindex)){
				continue;
			}
			
			$tmp_rv['path'] = backuply_cleanpath($rv['path']);
			$root_filelist[$tmp_rk] = $tmp_rv;
		}
		
		$final_filelist = array_keys($root_filelist);
		
		foreach($final_filelist as $fk => $fv){
			$f_list[] = $fv;
		}
		
	}else{
		// Adding the directory in $f_list to add to tar
		$f_list[] = $data['softpath'].'/';
	}
	
	// File Permission
	$GLOBALS['bfh']['softperms'] = @fopen($data['path'].'/tmp/'.$data['name'].'/softperms.txt', 'a');
	
	$GLOBALS['replace']['from']['softperms'] = $data['path'].'/tmp/'.$data['name'].'/softperms.txt';
	$GLOBALS['replace']['to']['softperms'] = 'softperms.txt';

	//Did it open the File Stream
	if(!$GLOBALS['bfh']['softperms']){
		$GLOBALS['error'][] = __('There were errors while trying to make a file of permissions', 'backuply');
		backuply_die('permdir');
	}
	
	backuply_backup_stop_checkpoint();
	
	// The directory itself
	@fwrite($GLOBALS['bfh']['softperms'], '/ '.@substr(sprintf('%o', fileperms($data['softpath'])), -4)."\n");
}

// This is done at the end to make sure we have added all possible replace paths before the softpath
if(!empty($data['backup_dir'])){
	$GLOBALS['replace']['from']['softpath'] = $data['softpath'].'/';
	$GLOBALS['replace']['to']['softpath'] = '';
}

// Now we will have to add the permission file to the end os an array of directory list.
if(!empty($GLOBALS['bfh']['softperms'])){
	$GLOBALS['post_soft_list'][] = $data['path'].'/tmp/'.$data['name'].'/softperms.txt';
}

$GLOBALS['post_soft_list'][] = $data['path'].'/tmp/'.$data['name'].'/softver.txt';
$GLOBALS['post_soft_list'][] = $data['path'].'/tmp/'.$data['name'].'/'.$data['name'].'.php';

if(empty($GLOBALS['error']) && (!empty($f_list) || !empty($GLOBALS['post_soft_list']) || !empty($pre_soft_list))){
	// Set default values
	$GLOBALS['start'] = 0;
	$GLOBALS['end_file'] = '';
	$GLOBALS['pre_soft_list'] = $pre_soft_list;

	backuply_backup_stop_checkpoint();
	
	if(empty($backuply['status']['loop'])){
		backuply_status_log('Starting to create archive', 'info', 60);
	} else {
		backuply_status_log('Adding to the archive', 'info', 60);
	}
	if(!backuply_tar_archive($zipfile, $f_list, true)){
		backuply_clean($data);
		
		//backuply_log('The backup utility could not back up the files.');
		$GLOBALS['error']['backup_dir'] = __('The backup utility could not back up the files.', 'backuply');
		@unlink($zipfile);
		backuply_die('failbackup');
	}
}

if(!empty($GLOBALS['error'])){
	backuply_die('failbackup');
}

//@print_r($GLOBALS['error']);

// CHMOD it to something Safe
@chmod($zipfile, 0600);

// if(empty($remote_location)){
// 	schown($zipfile);
// }

backuply_clean($data);

// Is the backup tar process INCOMPLETE ?
if(!empty($GLOBALS['end_file'])){
	
	//fwrite($file, "\n end file ke check me gya  \n");
	//echo $data['name']."+".$GLOBALS['end_file']."+".$GLOBALS['progress'];
	$data['last_file'] = $GLOBALS['end_file'];
	
	//Let the script know that the process is still incomplete.
	backuply_die('INCOMPLETE');

// Backup tar is created, lets upload if its a remote backup OR simple finish the whole process for a local backup
}else{
	
	// Rename the ZIP file
	@rename($zipfile, $successfile);
	
	backuply_backup_stop_checkpoint();
	$backuply['status']['successfile'] = $successfile;
	
	//Send the users email address & the plugin directory path
	$GLOBALS['data'] = $data;
	
	// Lets upload as this is a remote backup
	if(isset($backuply['status']['remote_file_path'])) {
		backuply_log('Starting to upload file to the selected remote location');
		backuply_remote_upload();
		die();
	}
	
	//Delete the backup information from sql
	if(!isset($backuply['status']['incomplete_upload'])){
		delete_option('backuply_status');
	}
	//fwrite($file, "\n deleted backuply_status  \n");

	backuply_die('DONE', $l_file = '', BACKUPLY_BACKUP_DIR);
}license.txt000064400000063642151526424670006756 0ustar00                  GNU LESSER GENERAL PUBLIC LICENSE
                       Version 2.1, February 1999

 Copyright (C) 1991, 1999 Free Software Foundation, Inc.
 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

[This is the first released version of the Lesser GPL.  It also counts
 as the successor of the GNU Library Public License, version 2, hence
 the version number 2.1.]

                            Preamble

  The licenses for most software are designed to take away your
freedom to share and change it.  By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.

  This license, the Lesser General Public License, applies to some
specially designated software packages--typically libraries--of the
Free Software Foundation and other authors who decide to use it.  You
can use it too, but we suggest you first think carefully about whether
this license or the ordinary General Public License is the better
strategy to use in any particular case, based on the explanations below.

  When we speak of free software, we are referring to freedom of use,
not price.  Our General Public Licenses are designed to make sure that
you have the freedom to distribute copies of free software (and charge
for this service if you wish); that you receive source code or can get
it if you want it; that you can change the software and use pieces of
it in new free programs; and that you are informed that you can do
these things.

  To protect your rights, we need to make restrictions that forbid
distributors to deny you these rights or to ask you to surrender these
rights.  These restrictions translate to certain responsibilities for
you if you distribute copies of the library or if you modify it.

  For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you.  You must make sure that they, too, receive or can get the source
code.  If you link other code with the library, you must provide
complete object files to the recipients, so that they can relink them
with the library after making changes to the library and recompiling
it.  And you must show them these terms so they know their rights.

  We protect your rights with a two-step method: (1) we copyright the
library, and (2) we offer you this license, which gives you legal
permission to copy, distribute and/or modify the library.

  To protect each distributor, we want to make it very clear that
there is no warranty for the free library.  Also, if the library is
modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original
author's reputation will not be affected by problems that might be
introduced by others.

  Finally, software patents pose a constant threat to the existence of
any free program.  We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a
restrictive license from a patent holder.  Therefore, we insist that
any patent license obtained for a version of the library must be
consistent with the full freedom of use specified in this license.

  Most GNU software, including some libraries, is covered by the
ordinary GNU General Public License.  This license, the GNU Lesser
General Public License, applies to certain designated libraries, and
is quite different from the ordinary General Public License.  We use
this license for certain libraries in order to permit linking those
libraries into non-free programs.

  When a program is linked with a library, whether statically or using
a shared library, the combination of the two is legally speaking a
combined work, a derivative of the original library.  The ordinary
General Public License therefore permits such linking only if the
entire combination fits its criteria of freedom.  The Lesser General
Public License permits more lax criteria for linking other code with
the library.

  We call this license the "Lesser" General Public License because it
does Less to protect the user's freedom than the ordinary General
Public License.  It also provides other free software developers Less
of an advantage over competing non-free programs.  These disadvantages
are the reason we use the ordinary General Public License for many
libraries.  However, the Lesser license provides advantages in certain
special circumstances.

  For example, on rare occasions, there may be a special need to
encourage the widest possible use of a certain library, so that it becomes
a de-facto standard.  To achieve this, non-free programs must be
allowed to use the library.  A more frequent case is that a free
library does the same job as widely used non-free libraries.  In this
case, there is little to gain by limiting the free library to free
software only, so we use the Lesser General Public License.

  In other cases, permission to use a particular library in non-free
programs enables a greater number of people to use a large body of
free software.  For example, permission to use the GNU C Library in
non-free programs enables many more people to use the whole GNU
operating system, as well as its variant, the GNU/Linux operating
system.

  Although the Lesser General Public License is Less protective of the
users' freedom, it does ensure that the user of a program that is
linked with the Library has the freedom and the wherewithal to run
that program using a modified version of the Library.

  The precise terms and conditions for copying, distribution and
modification follow.  Pay close attention to the difference between a
"work based on the library" and a "work that uses the library".  The
former contains code derived from the library, whereas the latter must
be combined with the library in order to run.

                  GNU LESSER GENERAL PUBLIC LICENSE
   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  0. This License Agreement applies to any software library or other
program which contains a notice placed by the copyright holder or
other authorized party saying it may be distributed under the terms of
this Lesser General Public License (also called "this License").
Each licensee is addressed as "you".

  A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.

  The "Library", below, refers to any such software library or work
which has been distributed under these terms.  A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language.  (Hereinafter, translation is
included without limitation in the term "modification".)

  "Source code" for a work means the preferred form of the work for
making modifications to it.  For a library, complete source code means
all the source code for all modules it contains, plus any associated
interface definition files, plus the scripts used to control compilation
and installation of the library.

  Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope.  The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it).  Whether that is true depends on what the Library does
and what the program that uses the Library does.

  1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an
appropriate copyright notice and disclaimer of warranty; keep intact
all the notices that refer to this License and to the absence of any
warranty; and distribute a copy of this License along with the
Library.

  You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.

  2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:

    a) The modified work must itself be a software library.

    b) You must cause the files modified to carry prominent notices
    stating that you changed the files and the date of any change.

    c) You must cause the whole of the work to be licensed at no
    charge to all third parties under the terms of this License.

    d) If a facility in the modified Library refers to a function or a
    table of data to be supplied by an application program that uses
    the facility, other than as an argument passed when the facility
    is invoked, then you must make a good faith effort to ensure that,
    in the event an application does not supply such function or
    table, the facility still operates, and performs whatever part of
    its purpose remains meaningful.

    (For example, a function in a library to compute square roots has
    a purpose that is entirely well-defined independent of the
    application.  Therefore, Subsection 2d requires that any
    application-supplied function or table used by this function must
    be optional: if the application does not supply it, the square
    root function must still compute square roots.)

These requirements apply to the modified work as a whole.  If
identifiable sections of that work are not derived from the Library,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works.  But when you
distribute the same sections as part of a whole which is a work based
on the Library, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote
it.

Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Library.

In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.

  3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library.  To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License.  (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.)  Do not make any other change in
these notices.

  Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.

  This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.

  4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you accompany
it with the complete corresponding machine-readable source code, which
must be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange.

  If distribution of object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the
source code from the same place satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.

  5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library".  Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.

  However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library".  The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.

  When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library.  The
threshold for this to be true is not precisely defined by law.

  If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work.  (Executables containing this object code plus portions of the
Library will still fall under Section 6.)

  Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.

  6. As an exception to the Sections above, you may also combine or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.

  You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License.  You must supply a copy of this License.  If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License.  Also, you must do one
of these things:

    a) Accompany the work with the complete corresponding
    machine-readable source code for the Library including whatever
    changes were used in the work (which must be distributed under
    Sections 1 and 2 above); and, if the work is an executable linked
    with the Library, with the complete machine-readable "work that
    uses the Library", as object code and/or source code, so that the
    user can modify the Library and then relink to produce a modified
    executable containing the modified Library.  (It is understood
    that the user who changes the contents of definitions files in the
    Library will not necessarily be able to recompile the application
    to use the modified definitions.)

    b) Use a suitable shared library mechanism for linking with the
    Library.  A suitable mechanism is one that (1) uses at run time a
    copy of the library already present on the user's computer system,
    rather than copying library functions into the executable, and (2)
    will operate properly with a modified version of the library, if
    the user installs one, as long as the modified version is
    interface-compatible with the version that the work was made with.

    c) Accompany the work with a written offer, valid for at
    least three years, to give the same user the materials
    specified in Subsection 6a, above, for a charge no more
    than the cost of performing this distribution.

    d) If distribution of the work is made by offering access to copy
    from a designated place, offer equivalent access to copy the above
    specified materials from the same place.

    e) Verify that the user has already received a copy of these
    materials or that you have already sent this user a copy.

  For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it.  However, as a special exception,
the materials to be distributed need not include anything that is
normally distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies
the executable.

  It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system.  Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.

  7. 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 not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:

    a) Accompany the combined library with a copy of the same work
    based on the Library, uncombined with any other library
    facilities.  This must be distributed under the terms of the
    Sections above.

    b) Give prominent notice with the combined library of the fact
    that part of it is a work based on the Library, and explaining
    where to find the accompanying uncombined form of the same work.

  8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License.  Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your
rights under this License.  However, parties who have received copies,
or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.

  9. You are not required to accept this License, since you have not
signed it.  However, nothing else grants you permission to modify or
distribute the Library or its derivative works.  These actions are
prohibited by law if you do not accept this License.  Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.

  10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
subject to these terms and conditions.  You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties with
this License.

  11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Library at all.  For example, if a patent
license would not permit royalty-free redistribution of the Library by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Library.

If any portion of this section is held invalid or unenforceable under any
particular circumstance, the balance of the section is intended to apply,
and the section as a whole is intended to apply in other circumstances.

It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system which is
implemented by public license practices.  Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.

This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.

  12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library under this License may add
an explicit geographical distribution limitation excluding those countries,
so that distribution is permitted only in or among countries not thus
excluded.  In such case, this License incorporates the limitation as if
written in the body of this License.

  13. The Free Software Foundation may publish revised and/or new
versions of the 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
specifies a version number of this License which applies to it and
"any later version", you have the option of following the terms and
conditions either of that version or of any later version published by
the Free Software Foundation.  If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.

  14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission.  For software which is
copyrighted by the Free Software Foundation, write to the Free
Software Foundation; we sometimes make exceptions for this.  Our
decision will be guided by the two goals of preserving the free status
of all derivatives of our free software and of promoting the sharing
and reuse of software generally.

                            NO WARRANTY

  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.

                     END OF TERMS AND CONDITIONS

           How to Apply These Terms to Your New Libraries

  If you develop a new library, and you want it to be of the greatest
possible use to the public, we recommend making it free software that
everyone can redistribute and change.  You can do so by permitting
redistribution under these terms (or, alternatively, under the terms of the
ordinary General Public License).

  To apply these terms, attach the following notices to the library.  It is
safest to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.

    <one line to give the library's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This library 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 2.1 of the License, or (at your option) any later version.

    This library 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 this library; if not, write to the Free Software
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA

Also add information on how to contact you by electronic and paper mail.

You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the library, if
necessary.  Here is a sample; alter the names:

  Yoyodyne, Inc., hereby disclaims all copyright interest in the
  library `Frob' (a library for tweaking knobs) written by James Random Hacker.

  <signature of Ty Coon>, 1 April 1990
  Ty Coon, President of Vice

That's all there is to it!
backuplytar.php000064400000150511151526424670007615 0ustar00<?php

if(!defined('ABSPATH')){
	die('HACKING ATTEMPT');
}

class backuply_tar{

	var $_tarname = '';
	var $_compress = false;
	var $_compress_type = 'none';
	var $_separator = ',';
	var $_file = 0;
	var $_temp_tarname = '';
	var $_ignore_regexp = '';
	var $error_object = null;
	
	var $_local_tar = ''; // The local file	
	var $_orig_tar = ''; // The remote file
	var $remote_fp = ''; // The remote file pointer	
	var $remote_fp_filter = NULL;
	var $remote_hctx = NULL;
	var $remote_content_size = 0;
	
	function __construct($p_tarname, $p_compress = null, $handle_remote = false){
		
		$this->_compress = false;
		$this->_compress_type = 'none';
		if (($p_compress === null) || ($p_compress == '')) {
			if (@file_exists($p_tarname) && !is_dir($p_tarname)) {
				if ($fp = @fopen($p_tarname, "rb")) {
					// look for gzip magic cookie
					$data = fread($fp, 2);
					fclose($fp);
					if ($data == "\37\213") {
						$this->_compress = true;
						$this->_compress_type = 'gz';
						// No sure it's enought for a magic code ....
					} elseif ($data == "BZ") {
						$this->_compress = true;
						$this->_compress_type = 'bz2';
					}
				}
			} else {
				// probably a remote file or some file accessible
				// through a stream interface
				if (substr($p_tarname, -2) == 'gz') {
					$this->_compress = true;
					$this->_compress_type = 'gz';
				} elseif ((substr($p_tarname, -3) == 'bz2') ||
						  (substr($p_tarname, -2) == 'bz')) {
					$this->_compress = true;
					$this->_compress_type = 'bz2';
				}
			}
		} else {
			if (($p_compress === true) || ($p_compress == 'gz')) {
				$this->_compress = true;
				$this->_compress_type = 'gz';
			} else if ($p_compress == 'bz2') {
				$this->_compress = true;
				$this->_compress_type = 'bz2';
			} else {
				$this->_error("Unsupported compression type '$p_compress'\n".
					"Supported types are 'gz' and 'bz2'.\n");
				return false;
			}
		}
		$this->_tarname = $p_tarname;
		if ($this->_compress) { // assert zlib or bz2 extension support
			if ($this->_compress_type == 'gz')
				$extname = 'zlib';
			else if ($this->_compress_type == 'bz2')
				$extname = 'bz2';

			if (!extension_loaded($extname)) {
				PEAR::loadExtension($extname);
			}
			if (!extension_loaded($extname)) {
				$this->_error("The extension '$extname' couldn't be found.\n".
					"Please make sure your version of PHP was built ".
					"with '$extname' support.\n");
				return false;
			}
		}
	}
	// }}}

	// {{{ destructor
	function _backuply_tar()
	{
		$this->_close();
		// ----- Look for a local copy to delete
		if ($this->_temp_tarname != '')
		   @unlink($this->_temp_tarname);
		
		// In case of REMOTE
		if(!empty($this->_orig_tar) && empty($GLOBALS['end_file'])){
			unlink($this->_local_tar);
		}
	}
	// }}}
	
	function __destruct(){
		$this->_backuply_tar();
	}

	// {{{ create()
	function create($p_filelist)
	{
		return $this->createModify($p_filelist, '', '');
	}
	// }}}

	// {{{ add()
	function add($p_filelist)
	{	
		return $this->addModify($p_filelist, '', '');
	}
	// }}}

	// {{{ extract()
	function extract($p_path='', $p_preserve=false)
	{
		return $this->extractModify($p_path, '', $p_preserve);
	}
	// }}}

	// {{{ listContent()
	function listContent()
	{
		$v_list_detail = array();

		if ($this->_openRead()) {
			if (!$this->_extractList('', $v_list_detail, "list", '', '')) {
				unset($v_list_detail);
				$v_list_detail = 0;
			}
			$this->_close();
		}

		return $v_list_detail;
	}
	// }}}
		
	// {{{ createModify()
	function createModify($p_filelist, $p_add_dir, $p_remove_dir='')
	{
	
		$v_result = true;

		if (!$this->_openWrite())
			return false;
		
		// Backup the Softaculous pre list (e.g. softsql.sql)
		if(!empty($GLOBALS['pre_soft_list'])){
			$GLOBALS['doing_soft_files'] = 1;
			$v_result = $this->_addList($GLOBALS['pre_soft_list'], $p_add_dir, $p_remove_dir);
			$GLOBALS['doing_soft_files'] = 0;
		}
		
		if ($p_filelist != '') {
			if (is_array($p_filelist))
				$v_list = $p_filelist;
			elseif (is_string($p_filelist))
				$v_list = explode($this->_separator, $p_filelist);
			else {
				$this->_cleanFile();
				$this->_error('Invalid file list');
				return false;
			}
			
			$v_result = $this->_addList($v_list, $p_add_dir, $p_remove_dir);
		}
		
		if ($v_result) {
			// --- write footer only if end file is empty..
			if(empty($GLOBALS['end_file'])){ 
				
				// Add the Softaculous post files i.e. softperms.txt at the end
				if(!empty($GLOBALS['post_soft_list'])){
					$GLOBALS['doing_soft_files'] = 1;
					$v_result = $this->_addList($GLOBALS['post_soft_list'], $p_add_dir, $p_remove_dir);
					$GLOBALS['doing_soft_files'] = 0;
				}
				
				if($v_result){
					$this->_writeFooter();
				}
			}
			$this->_close();
		} else
			$this->_cleanFile();
	
		return $v_result;
	}
	// }}}

	// {{{ addModify()
	function addModify($p_filelist, $p_add_dir, $p_remove_dir='')
	{
		$v_result = true;
		
		if (!$this->_isArchive())
			$v_result = $this->createModify($p_filelist, $p_add_dir,
											$p_remove_dir);
		else {
			if (is_array($p_filelist))
				$v_list = $p_filelist;
			elseif (is_string($p_filelist))
				$v_list = explode($this->_separator, $p_filelist);
			else {
				$this->_error('Invalid file list');
				return false;
			}

			$v_result = $this->_append($v_list, $p_add_dir, $p_remove_dir);
		}

		return $v_result;
	}
	// }}}

	// {{{ addString()
	function addString($p_filename, $p_string)
	{
		$v_result = true;

		if (!$this->_isArchive()) {
			if (!$this->_openWrite()) {
				return false;
			}
			$this->_close();
		}

		if (!$this->_openAppend())
			return false;

		// Need to check the get back to the temporary file ? ....
		$v_result = $this->_addString($p_filename, $p_string);

		$this->_writeFooter();

		$this->_close();

		return $v_result;
	}
	// }}}

	// {{{ extractModify()
	function extractModify($p_path, $p_remove_path, $p_preserve=false)
	{
		$v_result = true;
		$v_list_detail = array();

		if ($v_result = $this->_openRead()) {
			$v_result = $this->_extractList($p_path, $v_list_detail,
				"complete", 0, $p_remove_path, $p_preserve);
			$this->_close();
		}

		return $v_result;
	}
	// }}}

	// {{{ extractInString()
	function extractInString($p_filename)
	{
		if ($this->_openRead()) {
			$v_result = $this->_extractInString($p_filename);
			$this->_close();
		} else {
			$v_result = null;
		}

		return $v_result;
	}
	// }}}

	// {{{ extractList()
	function extractList($p_filelist, $p_path='', $p_remove_path='', $p_preserve=false)
	{
		$v_result = true;
		$v_list_detail = array();

		if (is_array($p_filelist))
			$v_list = $p_filelist;
		elseif (is_string($p_filelist))
			$v_list = explode($this->_separator, $p_filelist);
		else {
			$this->_error('Invalid string list');
			return false;
		}
		

		if ($v_result = $this->_openRead()) {
			$v_result = $this->_extractList($p_path, $v_list_detail, "partial",
				$v_list, $p_remove_path, $p_preserve);
			$this->_close();
		}

		return $v_result;
	}
	// }}}

	// {{{ setAttribute()
	function setAttribute()
	{
		$v_result = true;

		// ----- Get the number of variable list of arguments
		if (($v_size = func_num_args()) == 0) {
			return true;
		}

		// ----- Get the arguments
		$v_att_list = func_get_args();

		// ----- Read the attributes
		$i=0;
		while ($i<$v_size) {

			// ----- Look for next option
			switch ($v_att_list[$i]) {
				// ----- Look for options that request a string value
				case ARCHIVE_TAR_ATT_SEPARATOR :
					// ----- Check the number of parameters
					if (($i+1) >= $v_size) {
						$this->_error('Invalid number of parameters for '
									  .'attribute ARCHIVE_TAR_ATT_SEPARATOR');
						return false;
					}

					// ----- Get the value
					$this->_separator = $v_att_list[$i+1];
					$i++;
				break;

				default :
					$this->_error('Unknow attribute code '.$v_att_list[$i].'');
					return false;
			}

			// ----- Next attribute
			$i++;
		}

		return $v_result;
	}
	// }}}

	// {{{ setIgnoreRegexp()
	function setIgnoreRegexp($regexp)
	{
		$this->_ignore_regexp = $regexp;
	}
	// }}}

	// {{{ setIgnoreList()
	function setIgnoreList($list)
	{
		$regexp = str_replace(array('#', '.', '^', '$'), array('\#', '\.', '\^', '\$'), $list);
		$regexp = '#/'.join('$|/', $list).'#';
		$this->setIgnoreRegexp($regexp);
	}
	// }}}

	// {{{ _error()
	function _error($p_message)
	{
		//we have changed this since PEAR is not used
		//$this->error_object = &$this->raiseError($p_message); 
		backuply_status_log($p_message);
	}
	// }}}

	// {{{ _warning()
	function _warning($p_message)
	{
		//we have changed this since PEAR is not used
		//$this->error_object = &$this->raiseError($p_message); 
		backuply_status_log($p_message);
	}
	// }}}

	// {{{ _isArchive()
	function _isArchive($p_filename=null)
	{
		if ($p_filename == null) {
			$p_filename = $this->_tarname;
		}
		clearstatcache();
		return @is_file($p_filename) && !@is_link($p_filename);
	}
	// }}}

	// {{{ _openWrite()
	function _openWrite()
	{
		if ($this->_compress_type == 'gz' && function_exists('gzopen'))
		{
			$this->_file = @gzopen($this->_tarname, "ab9"); //added 'a' for append as 'w' mode truncated the file...
		}
		else if ($this->_compress_type == 'bz2' && function_exists('bzopen'))
		{
			$this->_file = @bzopen($this->_tarname, "w");
			echo 'bz+';
		}
		else if ($this->_compress_type == 'none')
		{
			$this->_file = @fopen($this->_tarname, "ab");
			echo 'ez+';
		}
		else
		{
			$this->_error('Unknown or missing compression type ('
						  .$this->_compress_type.')');
		}

		if ($this->_file == 0) {
			$this->_error('Unable to open in write mode \''
						  .$this->_tarname.'\'');
			return false;
		}

		return true;
	}
	// }}}

	// {{{ _openRead()
	function _openRead()
	{
		if (strtolower(substr($this->_tarname, 0, 7)) == 'http://') {

		  // ----- Look if a local copy need to be done
		  if ($this->_temp_tarname == '') {
			  $this->_temp_tarname = uniqid('tar').'.tmp';
			  if (!$v_file_from = @fopen($this->_tarname, 'rb')) {
				$this->_error('Unable to open in read mode \''
							  .$this->_tarname.'\'');
				$this->_temp_tarname = '';
				return false;
			  }
			  if (!$v_file_to = @fopen($this->_temp_tarname, 'wb')) {
				$this->_error('Unable to open in write mode \''
							  .$this->_temp_tarname.'\'');
				$this->_temp_tarname = '';
				return false;
			  }
			  while ($v_data = @fread($v_file_from, 1024))
				  @fwrite($v_file_to, $v_data);
			  @fclose($v_file_from);
			  @fclose($v_file_to);
		  }

		  // ----- File to open if the local copy
		  $v_filename = $this->_temp_tarname;

		} else
		  // ----- File to open if the normal Tar file
		  $v_filename = $this->_tarname;

		if ($this->_compress_type == 'gz')
			$this->_file = @gzopen($v_filename, "rb");
		else if ($this->_compress_type == 'bz2')
			$this->_file = @bzopen($v_filename, "r");
		else if ($this->_compress_type == 'none')
			$this->_file = @gzopen($v_filename, "rb");
		else
			$this->_error('Unknown or missing compression type ('
						  .$this->_compress_type.')');

		if ($this->_file == 0) {
			$this->_error('Unable to open in read mode \''.$v_filename.'\'');
			return false;
		}

		return true;
	}
	// }}}

	// {{{ _openReadWrite()
	function _openReadWrite()
	{
		if ($this->_compress_type == 'gz')
			$this->_file = @gzopen($this->_tarname, "r+b");
		else if ($this->_compress_type == 'bz2') {
			$this->_error('Unable to open bz2 in read/write mode \''
						  .$this->_tarname.'\' (limitation of bz2 extension)');
			return false;
		} else if ($this->_compress_type == 'none')
			$this->_file = @fopen($this->_tarname, "r+b");
		else
			$this->_error('Unknown or missing compression type ('
						  .$this->_compress_type.')');

		if ($this->_file == 0) {
			$this->_error('Unable to open in read/write mode \''
						  .$this->_tarname.'\'');
			return false;
		}

		return true;
	}
	// }}}

	// {{{ _close()
	function _close()
	{
		//if (isset($this->_file)) {
		if (is_resource($this->_file)) {
			if ($this->_compress_type == 'gz')
				@gzclose($this->_file);
			else if ($this->_compress_type == 'bz2')
				@bzclose($this->_file);
			else if ($this->_compress_type == 'none')
				@fclose($this->_file);
			else
				$this->_error('Unknown or missing compression type ('
							  .$this->_compress_type.')');

			$this->_file = 0;
		}

		// ----- Look if a local copy need to be erase
		// Note that it might be interesting to keep the url for a time : ToDo
		if ($this->_temp_tarname != '') {
			@unlink($this->_temp_tarname);
			$this->_temp_tarname = '';
		}

		return true;
	}
	// }}}

	// {{{ _cleanFile()
	function _cleanFile()
	{
		$this->_close();

		// ----- Look for a local copy
		if ($this->_temp_tarname != '') {
			// ----- Remove the local copy but not the remote tarname
			@unlink($this->_temp_tarname);
			$this->_temp_tarname = '';
		} else {
			// ----- Remove the local tarname file
		   @unlink($this->_tarname);
		}
		$this->_tarname = '';

		return true;
	}
	// }}}

	// {{{ _writeBlock()
	function _writeBlock($p_binary_data, $p_len=null, $finished = false)
	{
		if (is_resource($this->_file)) {
			if ($p_len === null) {
				if ($this->_compress_type == 'gz')
					$write = @gzputs($this->_file, $p_binary_data);
				else if ($this->_compress_type == 'bz2')
					$write = @bzwrite($this->_file, $p_binary_data);
				else if ($this->_compress_type == 'none')
					$write = @fputs($this->_file, $p_binary_data);
				else
					$this->_error('Unknown or missing compression type ('.$this->_compress_type.')');
			} else {
				if ($this->_compress_type == 'gz')
					$write = @gzputs($this->_file, $p_binary_data, $p_len);
				else if ($this->_compress_type == 'bz2')
					$write = @bzwrite($this->_file, $p_binary_data, $p_len);
				else if ($this->_compress_type == 'none')
					$write = @fputs($this->_file, $p_binary_data, $p_len);
				else
					$this->_error('Unknown or missing compression type ('.$this->_compress_type.')');
			}

			if(empty($write)){
				$this->_error('Failed to write to the backup file. Please check you have enough disk quota available.');
				return false;
			}

			// If there is anything to handle for remote uploads
			$this->remote_write_handle($finished);
		}
		return true;
	}
	// }}}
	
	function remote_write_handle($finished = false){
		global $error;

		// Do we have a remote file ?
		if(empty($this->_orig_tar)){
			return false;
		}
	
		clearstatcache();
		
		// Now is the size exceeding 2 MB
		if(!$finished && filesize($this->_local_tar) < 2097152){
			return false;
		}

		// Open the file pointer if not opened
		if(!is_resource($this->remote_fp)){
			
			$this->remote_fp = fopen($this->_orig_tar, 'ab');

			if($this->remote_fp == false){
				$error['fopen_failed'] = 'Unable to open in write mode';
				backuply_die('fopen_failed');
			}
			
			/*	// GZip Header
			fputs($this->remote_fp, "\x1F\x8B\x08\x08".pack("V", time())."\0\xFF");
			
			// Filename
			$oname = str_replace("\0", '', ltrim(basename($this->_orig_tar, '.gz'), '.'));
			fwrite($this->remote_fp, $oname."\0", 1+strlen($oname));
			
			// Create Stream
			$this->remote_fp_filter = stream_filter_append($this->remote_fp, "zlib.deflate", STREAM_FILTER_WRITE, -1);
			$this->remote_hctx = hash_init('crc32b');*/
			
			$this->remote_content_size = 0;
			if(!empty($GLOBALS['init_pos'])){
				$this->remote_content_size = $GLOBALS['init_pos'];
			}
			
			$GLOBALS['start_pos'] = $this->remote_content_size;
		}
		
		// Close the LOCAL file
		$this->_close();
		
		// Write to remote
		$content = file_get_contents($this->_local_tar);
		$clen = strlen($content);
		
		if(!empty($content)){
			//hash_update($this->remote_hctx, $content); // Update Hash
			fwrite($this->remote_fp, $content, $clen); // Write to the stream
			$this->remote_content_size += $clen; // Update Length
		}
		$content = '';
		
		// Delete Local file
		@unlink($this->_local_tar);
		
		// ReOpen the local tar
		$this->_openWrite();
		
		// If we are done, lets delete this file
		if($finished){
			
			/* // Remove Stream
			stream_filter_remove($this->remote_fp_filter);
			
			// Calculate Hash and write it
			$crc = hash_final($this->remote_hctx, true);
			@fwrite($this->remote_fp, $crc[3].$crc[2].$crc[1].$crc[0], 4);
			
			// Also the size
			@fwrite($this->remote_fp, pack("V", $this->remote_content_size), 4); */
			
			// Close
			@fclose($this->remote_fp);
		}
	}

	// {{{ _readBlock()
	function _readBlock()
	{
	  $v_block = null;
	  if (is_resource($this->_file)) {
		  if ($this->_compress_type == 'gz')
			  $v_block = @gzread($this->_file, 512);
		  else if ($this->_compress_type == 'bz2')
			  $v_block = @bzread($this->_file, 512);
		  else if ($this->_compress_type == 'none')
			  $v_block = @fread($this->_file, 512);
		  else
			  $this->_error('Unknown or missing compression type ('
							.$this->_compress_type.')');
	  }
	  return $v_block;
	}
	// }}}

	// {{{ _jumpBlock()
	function _jumpBlock($p_len=null)
	{
		if (is_resource($this->_file)) {
			if ($p_len === null)
				$p_len = 1;

			if ($this->_compress_type == 'gz') {
				@gzseek($this->_file, gztell($this->_file)+($p_len*512));
			}
			else if ($this->_compress_type == 'bz2') {
				// ----- Replace missing bztell() and bzseek()
				for ($i=0; $i<$p_len; $i++)
				$this->_readBlock();
			} else if ($this->_compress_type == 'none')
				@fseek($this->_file, $p_len*512, SEEK_CUR);
			else
				$this->_error('Unknown or missing compression type ('
				.$this->_compress_type.')');
		}
		return true;
	}
	// }}}

	// {{{ _writeFooter()
	function _writeFooter()
	{
		if (is_resource($this->_file)) {
			// ----- Write the last 0 filled block for end of archive
			$v_binary_data = pack('a1024', '');
			if(!$this->_writeBlock($v_binary_data, null, true)){
				return false;
			}
		}
		return true;
	}
	// }}}

	// {{{ _addList()
	function _addList($p_list, $p_add_dir, $p_remove_dir) {

		$v_result = true;
		$v_header = array();
		
		// ----- Remove potential windows directory separator
		$p_add_dir = $this->_translateWinPath($p_add_dir);
		$p_remove_dir = $this->_translateWinPath($p_remove_dir, false);

		if (!$this->_file) {
			$this->_error('Invalid file descriptor');
			return false;
		}

		if (sizeof($p_list) == 0)
			return true;
		
		foreach ($p_list as $v_filename) {
			
			if (!$v_result) {
				break;
			}
				
			// ----- Skip the current tar name
			if ($v_filename == $this->_tarname)
				continue;

			if ($v_filename == '')
				continue;

			// ----- ignore files and directories matching the ignore regular expression
			if ($this->_ignore_regexp && preg_match($this->_ignore_regexp, '/'.$v_filename)) {
				//$this->_warning("File '$v_filename' ignored");
				continue;
			}

			if (!file_exists($v_filename) && !is_link($v_filename)) {
				$this->_warning("File '$v_filename' does not exist");
				continue;
			}

			// ----- break the loop once last file is found...
			if(!empty($GLOBALS['end_file'])){
				break;
			}
			
			// ----- Add the file or directory header
			if (!$this->_addFile($v_filename, $v_header, $p_add_dir, $p_remove_dir))
				return false;

			if (@is_dir($v_filename) && !@is_link($v_filename)) {
				if (!($p_hdir = opendir($v_filename))) {
					$this->_warning("Directory '$v_filename' can not be read");
					continue;
				}
				
				$p_temp_list = array();
				while (false !== ($p_hitem = readdir($p_hdir))) {
					if (($p_hitem != '.') && ($p_hitem != '..')) {
						if ($v_filename != "."){
							//Double slashes were added and caused issue when the backup directory is inside the installation directory.
							$v_filename = $this->cleanpath($v_filename);
							$p_temp_list[0] = $v_filename.'/'.$p_hitem;
						}else{
							$p_temp_list[0] = $p_hitem;
						}

						// ----- break the loop once last file is found...
						if(!empty($GLOBALS['end_file'])){
							break;
						}
						
						$v_result = $this->_addList($p_temp_list,
												$p_add_dir,
												$p_remove_dir);
					}
				}

				unset($p_temp_list);
				unset($p_hdir);
				unset($p_hitem);
			}
		}
		
		return $v_result;
	}
	// }}}

	// {{{ _addFile()
	function _addFile($p_filename, &$p_header, $p_add_dir, $p_remove_dir) {
		
		global $backuply;
		
		// check last file and skip the files that have been already backed up...
		if(!empty($GLOBALS['last_file']) && $GLOBALS['start'] == 0){
			if(preg_match('#^'.$GLOBALS['last_file'].'$#', $p_filename)){
				
				$GLOBALS['start'] = 1; // give a jump start once the last backed up file is found..
			}
			return true; //return true to skip files
		}
	
		if (!$this->_file) {
		  $this->_error('Invalid file descriptor');
		  return false;
		}

		if ($p_filename == '') {
		  $this->_error('Invalid file name');
		  return false;
		}
		
		// ----- Calculate the stored filename
		$p_filename = $this->_translateWinPath($p_filename, false);
		$v_stored_filename = $p_filename;
		if (strcmp($p_filename, $p_remove_dir) == 0) {
		  return true;
		}
		
		// Match filename to be excluded as provided by script
		foreach($backuply['excludes']['exact'] as $ek => $ev) {
			if(empty($GLOBALS['doing_soft_files']) && !empty($ev) && preg_match('#^'.$ev.'#', $p_filename)) {
				return true;
			}
		}
		
		// Exclude the sql file if it has already been backedup
		if(strpos($p_filename, 'softsql.sql') !== FALSE && empty($GLOBALS['doing_soft_files'])){
			return true;
		}

		$home_path = backuply_cleanpath(WP_CONTENT_DIR);
		
		// Checks if the the file we are excluding is in WP CONTENT DIR
		if(strpos($p_filename, $home_path) !== FALSE){

			/* The str_replace below will change the Path to this /plugins/backuply-pro/init.php 
			*	as we just want to exclude the folders or files inside WP Content
			*/
			$rel_path = str_replace($home_path, '', $p_filename);
			
			// Excluding files with specific extension
			if(!empty($backuply['excludes']['extension'])){
				$ext = pathinfo($p_filename, PATHINFO_EXTENSION);
				
				if(in_array($ext, $backuply['excludes']['extension'])){
					return true;
				}
			}
			
			// Excluding a pattern that starts with
			if(!empty($backuply['excludes']['beginning'])){
		
				foreach($backuply['excludes']['beginning'] as $beginning){
					// Here it checks if the pattern we are looking for has slash(/) before it then its the start of the name of the folder or file
					preg_match('/\/'.preg_quote(trim($beginning)).'/', $rel_path, $matches);
					
					if(!empty($matches) && strpos($rel_path, 'softsql.sql') == FALSE){
						return true;
					}
				}
			}

			// Excluding a pattern that ends with
			if(!empty($backuply['excludes']['end'])){

				$matches = [];
				foreach($backuply['excludes']['end'] as $end){
					/* Here it checks if the pattern we are looking for has slash(/) after it then its the end of the name of the folder or file
					*	/(?:wp\/|wp$)/ this is the regex used and wp is the word that we are matching
					*/
					preg_match('/(?:' . preg_quote(trim($end)).'\/|' . preg_quote(trim($end)). '$)/', $rel_path, $matches);
					
					if(!empty($matches) && strpos($rel_path, 'softsql.sql') == FALSE){
						return true;
					}
				}
			}

			// Excluding a pattern that is anywhere in the path
			if(!empty($backuply['excludes']['anywhere'])){
				
				$matches = [];
				foreach($backuply['excludes']['anywhere'] as $pattern){
					// Here it checks if the pattern we are looking for is present anywhere in the path
					preg_match('/'.preg_quote(trim($pattern)). '/', $rel_path, $matches);
					
					if(!empty($matches) && strpos($rel_path, 'softsql.sql') == FALSE){
						return true;
					}
				}
			}
		}
		
		if ($p_remove_dir != '') {
			if (substr($p_remove_dir, -1) != '/')
			$p_remove_dir .= '/';

			if (substr($p_filename, 0, strlen($p_remove_dir)) == $p_remove_dir)
			$v_stored_filename = substr($p_filename, strlen($p_remove_dir));
		}
		
		$v_stored_filename = $this->_translateWinPath($v_stored_filename);
		if ($p_add_dir != '') {
			if (substr($p_add_dir, -1) == '/')
				$v_stored_filename = $p_add_dir.$v_stored_filename;
			else
				$v_stored_filename = $p_add_dir.'/'.$v_stored_filename;
		}

		$v_stored_filename = $this->_pathReduction($v_stored_filename);
		
		// Log folder path if we are backing up files from these directories
		if(is_dir($p_filename) && preg_match('/(wp-content|wp-admin|wp-includes|wp-content\/plugins|wp-content\/themes)$/s', $p_filename)){
			backuply_status_log('Adding files from directory (L'.$backuply['status']['loop'].') : ' . $p_filename, 'adding', 65);
		}
		
		backuply_backup_stop_checkpoint();
		
		if ($this->_isArchive($p_filename)) {
			if (($v_file = @fopen($p_filename, 'rb')) == 0) {
				$this->_warning("Unable to open file '".$p_filename
							  ."' in binary read mode");
				return true;
			}

			if (!$this->_writeHeader($p_filename, $v_stored_filename)){
				$this->_warning('Unable to write header "'.$p_filename . '"');
				return false;
			}

			while (($v_buffer = fread($v_file, 512)) != '') {
				$v_binary_data = pack('a512', "$v_buffer");
				if(!$this->_writeBlock($v_binary_data)){
					$this->_warning('Unable to write Block "'.$p_filename . '"');
					return false;
				}
			}

			fclose($v_file);

		} else {
			// ----- Only header for dir
			if (!$this->_writeHeader($p_filename, $v_stored_filename)){
				$this->_warning('Unable to writeHeader "'.$p_filename . '"');
				return false;
			}
		}
		
		$GLOBALS['added_file_count'] = intval($GLOBALS['added_file_count']) + 1; // Increasing the file count after it gets added.

		if($GLOBALS['added_file_count']%500 === 0){
			backuply_status_log('(L'.$backuply['status']['loop'].') : '.$GLOBALS['added_file_count'] . ' files have been added to the backup', 'adding', 65);
		}
		
		// We can run the scripts for the end time already set
		if(time() >= $GLOBALS['end']){
			$GLOBALS['end_file'] = $p_filename; // set end file so that we know where to start from
			backuply_status_log('Last file of (L'.$backuply['status']['loop'].') : '. $p_filename, 'adding', 65);
			backuply_status_log('Files added to Backup till (L'.$backuply['status']['loop'].') : '. $GLOBALS['added_file_count'], 'adding', 65);
		}

		return true;
	}
	// }}}

	// {{{ _addString()
	function _addString($p_filename, $p_string) {
		if (!$this->_file) {
			$this->_error('Invalid file descriptor');
			return false;
		}

		if ($p_filename == '') {
			$this->_error('Invalid file name');
			return false;
		}

		// ----- Calculate the stored filename
		$p_filename = $this->_translateWinPath($p_filename, false);

		if (!$this->_writeHeaderBlock($p_filename, strlen($p_string),
								  time(), 384, '', 0, 0))
			return false;

		$i=0;
		while (($v_buffer = substr($p_string, (($i++)*512), 512)) != '') {
			$v_binary_data = pack('a512', $v_buffer);
			if(!$this->_writeBlock($v_binary_data)) {
				return false;
			}
		}

		return true;
	}
	// }}}

	// {{{ _writeHeader()
	function _writeHeader($p_filename, $p_stored_filename)
	{
		if ($p_stored_filename == '')
			$p_stored_filename = $p_filename;
		$v_reduce_filename = $this->_pathReduction($p_stored_filename);
		
		
		//echo $v_reduce_filename." - ";
 
		$v_reduce_filename = str_replace($GLOBALS['replace']['from'], $GLOBALS['replace']['to'], $v_reduce_filename);
		
		//echo $v_reduce_filename."<br />";

		if (strlen($v_reduce_filename) > 99) {
		  if (!$this->_writeLongHeader($v_reduce_filename))
			return false;
		}
		
		// We have to write the entries in softperms.txt
		if (isset($GLOBALS['bfh']['softperms']) && preg_match('/'.preg_quote($GLOBALS['replace']['from']['softpath'], '/').'/is', $p_filename)) {
			fwrite($GLOBALS['bfh']['softperms'], trim($v_reduce_filename, '/')." ".(!empty($v_linkname) ? "linkto=".rtrim($v_linkname, '/')." " : ""). (substr(sprintf('%o', fileperms($p_filename)), -4)) ."\n");

		}

		// To make sure we have the correct data after the file is written above
		clearstatcache();

		$v_info = lstat($p_filename);
		$v_uid = sprintf("%07s", DecOct($v_info[4]));
		$v_gid = sprintf("%07s", DecOct($v_info[5]));
		$v_perms = sprintf("%07s", DecOct($v_info['mode'] & 000777));

		$v_mtime = sprintf("%011s", DecOct($v_info['mtime']));

		$v_linkname = '';

		if (@is_link($p_filename)) {
		  $v_typeflag = '2';
		  $v_linkname = readlink($p_filename);
		  $v_size = sprintf("%011s", DecOct(0));
		} elseif (@is_dir($p_filename)) {
		  $v_typeflag = '5';
		  $v_size = sprintf("%011s", DecOct(0));
		} else {
		  $v_typeflag = '0';
		  clearstatcache();
		  $v_size = sprintf("%011s", DecOct($v_info['size']));
		}
		
		$v_magic = 'ustar ';

		$v_version = ' ';
		
		if (function_exists('posix_getpwuid'))
		{
		  $userinfo = posix_getpwuid($v_info[4]);
		  $groupinfo = posix_getgrgid($v_info[5]);
		  
		  $v_uname = $userinfo['name'];
		  $v_gname = $groupinfo['name'];
		}
		else
		{
		  $v_uname = '';
		  $v_gname = '';
		}

		$v_devmajor = '';

		$v_devminor = '';

		$v_prefix = '';
		$v_linkname = ''; // This is empty because we will create symlinks with our restore utility using softperms.txt

		$v_binary_data_first = pack("a100a8a8a8a12a12",
									$v_reduce_filename, $v_perms, $v_uid,
									$v_gid, $v_size, $v_mtime);
		$v_binary_data_last = pack("a1a100a6a2a32a32a8a8a155a12",
								   $v_typeflag, $v_linkname, $v_magic,
								   $v_version, $v_uname, $v_gname,
								   $v_devmajor, $v_devminor, $v_prefix, '');

		// ----- Calculate the checksum
		$v_checksum = 0;
		// ..... First part of the header
		for ($i=0; $i<148; $i++)
			$v_checksum += ord(substr($v_binary_data_first,$i,1));
		// ..... Ignore the checksum value and replace it by ' ' (space)
		for ($i=148; $i<156; $i++)
			$v_checksum += ord(' ');
		// ..... Last part of the header
		for ($i=156, $j=0; $i<512; $i++, $j++)
			$v_checksum += ord(substr($v_binary_data_last,$j,1));

		// ----- Write the first 148 bytes of the header in the archive
		if(!$this->_writeBlock($v_binary_data_first, 148)){
			return false;
		}

		// ----- Write the calculated checksum
		$v_checksum = sprintf("%06s ", DecOct($v_checksum));
		$v_binary_data = pack("a8", $v_checksum);
		if(!$this->_writeBlock($v_binary_data, 8)){
			return false;
		}

		// ----- Write the last 356 bytes of the header in the archive
		if(!$this->_writeBlock($v_binary_data_last, 356)){
			return false;
		}

		return true;
	}
	// }}}

	// {{{ _writeHeaderBlock()
	function _writeHeaderBlock($p_filename, $p_size, $p_mtime=0, $p_perms=0,
							   $p_type='', $p_uid=0, $p_gid=0)
	{
		$p_filename = $this->_pathReduction($p_filename);

		if (strlen($p_filename) > 99) {
		  if (!$this->_writeLongHeader($p_filename))
			return false;
		}

		if ($p_type == '5') {
		  $v_size = sprintf("%011s", DecOct(0));
		} else {
		  $v_size = sprintf("%011s", DecOct($p_size));
		}

		$v_uid = sprintf("%07s", DecOct($p_uid));
		$v_gid = sprintf("%07s", DecOct($p_gid));
		$v_perms = sprintf("%07s", DecOct($p_perms & 000777));

		$v_mtime = sprintf("%11s", DecOct($p_mtime));

		$v_linkname = '';

		$v_magic = 'ustar ';

		$v_version = ' ';

		if (function_exists('posix_getpwuid'))
		{
		  $userinfo = posix_getpwuid($p_uid);
		  $groupinfo = posix_getgrgid($p_gid);
		  
		  $v_uname = $userinfo['name'];
		  $v_gname = $groupinfo['name'];
		}
		else
		{
		  $v_uname = '';
		  $v_gname = '';
		}
		
		$v_devmajor = '';

		$v_devminor = '';

		$v_prefix = '';

		$v_binary_data_first = pack("a100a8a8a8a12A12",
									$p_filename, $v_perms, $v_uid, $v_gid,
									$v_size, $v_mtime);
		$v_binary_data_last = pack("a1a100a6a2a32a32a8a8a155a12",
								   $p_type, $v_linkname, $v_magic,
								   $v_version, $v_uname, $v_gname,
								   $v_devmajor, $v_devminor, $v_prefix, '');

		// ----- Calculate the checksum
		$v_checksum = 0;
		// ..... First part of the header
		for ($i=0; $i<148; $i++)
			$v_checksum += ord(substr($v_binary_data_first,$i,1));
		// ..... Ignore the checksum value and replace it by ' ' (space)
		for ($i=148; $i<156; $i++)
			$v_checksum += ord(' ');
		// ..... Last part of the header
		for ($i=156, $j=0; $i<512; $i++, $j++)
			$v_checksum += ord(substr($v_binary_data_last,$j,1));

		// ----- Write the first 148 bytes of the header in the archive
		if(!$this->_writeBlock($v_binary_data_first, 148)){
			return false;
		}

		// ----- Write the calculated checksum
		$v_checksum = sprintf("%06s ", DecOct($v_checksum));
		$v_binary_data = pack("a8", $v_checksum);
		if(!$this->_writeBlock($v_binary_data, 8)){
			return false;
		}

		// ----- Write the last 356 bytes of the header in the archive
		if(!$this->_writeBlock($v_binary_data_last, 356)){
			return false;
		}

		return true;
	}
	// }}}

	// {{{ _writeLongHeader()
	function _writeLongHeader($p_filename)
	{
		$v_size = sprintf("%11s ", DecOct(strlen($p_filename)));

		$v_typeflag = 'L';

		$v_linkname = '';

		$v_magic = '';

		$v_version = '';

		$v_uname = '';

		$v_gname = '';

		$v_devmajor = '';

		$v_devminor = '';

		$v_prefix = '';

		$v_binary_data_first = pack("a100a8a8a8a12a12",
									'././@LongLink', 0, 0, 0, $v_size, 0);
		$v_binary_data_last = pack("a1a100a6a2a32a32a8a8a155a12",
								   $v_typeflag, $v_linkname, $v_magic,
								   $v_version, $v_uname, $v_gname,
								   $v_devmajor, $v_devminor, $v_prefix, '');

		// ----- Calculate the checksum
		$v_checksum = 0;
		// ..... First part of the header
		for ($i=0; $i<148; $i++)
			$v_checksum += ord(substr($v_binary_data_first,$i,1));
		// ..... Ignore the checksum value and replace it by ' ' (space)
		for ($i=148; $i<156; $i++)
			$v_checksum += ord(' ');
		// ..... Last part of the header
		for ($i=156, $j=0; $i<512; $i++, $j++)
			$v_checksum += ord(substr($v_binary_data_last,$j,1));

		// ----- Write the first 148 bytes of the header in the archive
		if(!$this->_writeBlock($v_binary_data_first, 148)){
			return false;
		}

		// ----- Write the calculated checksum
		$v_checksum = sprintf("%06s ", DecOct($v_checksum));
		$v_binary_data = pack("a8", $v_checksum);
		if(!$this->_writeBlock($v_binary_data, 8)){
			return false;
		}

		// ----- Write the last 356 bytes of the header in the archive
		if(!$this->_writeBlock($v_binary_data_last, 356)){
			return false;
		}

		// ----- Write the filename as content of the block
		$i=0;
		while (($v_buffer = substr($p_filename, (($i++)*512), 512)) != '') {
			$v_binary_data = pack("a512", "$v_buffer");
			if(!$this->_writeBlock($v_binary_data)){
				return false;
			}
		}

		return true;
	}
	// }}}

	// {{{ _readHeader()
	function _readHeader($v_binary_data, &$v_header)
	{
		if (strlen($v_binary_data)==0) {
			$v_header['filename'] = '';
			return true;
		}

		if (strlen($v_binary_data) != 512) {
			$v_header['filename'] = '';
			$this->_error('Invalid block size : '.strlen($v_binary_data));
			return false;
		}

		if (!is_array($v_header)) {
			$v_header = array();
		}
		// ----- Calculate the checksum
		$v_checksum = 0;
		// ..... First part of the header
		for ($i=0; $i<148; $i++)
			$v_checksum+=ord(substr($v_binary_data,$i,1));
		// ..... Ignore the checksum value and replace it by ' ' (space)
		for ($i=148; $i<156; $i++)
			$v_checksum += ord(' ');
		// ..... Last part of the header
		for ($i=156; $i<512; $i++)
		   $v_checksum+=ord(substr($v_binary_data,$i,1));

		if (version_compare(PHP_VERSION, "5.5.0-dev") < 0) {
			$fmt = "a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/" .
				"a8checksum/a1typeflag/a100link/a6magic/a2version/" .
				"a32uname/a32gname/a8devmajor/a8devminor/a131prefix";
		} else {
			$fmt = "Z100filename/Z8mode/Z8uid/Z8gid/Z12size/Z12mtime/" .
				"Z8checksum/Z1typeflag/Z100link/Z6magic/Z2version/" .
				"Z32uname/Z32gname/Z8devmajor/Z8devminor/Z131prefix";
		}
		$v_data = unpack($fmt, $v_binary_data);
						 
		if (strlen($v_data["prefix"]) > 0) {
			$v_data["filename"] = "$v_data[prefix]/$v_data[filename]";
		}

		// ----- Extract the checksum
		$v_header['checksum'] = @OctDec(trim($v_data['checksum']));
		if ($v_header['checksum'] != $v_checksum) {
			$v_header['filename'] = '';

			// ----- Look for last block (empty block)
			if (($v_checksum == 256) && ($v_header['checksum'] == 0))
				return true;

			$this->_error('Invalid checksum for file "'.$v_data['filename']
						  .'" : '.$v_checksum.' calculated, '
						  .$v_header['checksum'].' expected');
			return false;
		}

		// ----- Extract the properties
		$v_header['filename'] = $v_data['filename'];
		if ($this->_maliciousFilename($v_header['filename'])) {
			$this->_error('Malicious .tar detected, file "' . $v_header['filename'] .
				'" will not install in desired directory tree');
			return false;
		}
		$v_header['mode'] = OctDec(trim($v_data['mode']));
		$v_header['uid'] = OctDec(trim($v_data['uid']));
		$v_header['gid'] = OctDec(trim($v_data['gid']));
		$v_header['size'] = OctDec(trim($v_data['size']));
		$v_header['mtime'] = OctDec(trim($v_data['mtime']));
		if (($v_header['typeflag'] = $v_data['typeflag']) == "5") {
		  $v_header['size'] = 0;
		}
		$v_header['link'] = trim($v_data['link']);

		return true;
	}
	// }}}

	// {{{ _maliciousFilename()
	function _maliciousFilename($file)
	{
		if (strpos($file, '/../') !== false) {
			return true;
		}
		if (strpos($file, '../') === 0) {
			return true;
		}
		return false;
	}
	// }}}

	// {{{ _readLongHeader()
	function _readLongHeader(&$v_header)
	{
	  $v_filename = '';
	  $n = floor($v_header['size']/512);
	  for ($i=0; $i<$n; $i++) {
		$v_content = $this->_readBlock();
		$v_filename .= $v_content;
	  }
	  if (($v_header['size'] % 512) != 0) {
		$v_content = $this->_readBlock();
		$v_filename .= trim($v_content);
	  }

	  // ----- Read the next header
	  $v_binary_data = $this->_readBlock();

	  if (!$this->_readHeader($v_binary_data, $v_header))
		return false;

	  $v_filename = trim($v_filename);
	  $v_header['filename'] = $v_filename;
		if ($this->_maliciousFilename($v_filename)) {
			$this->_error('Malicious .tar detected, file "' . $v_filename .
				'" will not install in desired directory tree');
			return false;
	  }

	  return true;
	}
	// }}}

	// {{{ _extractInString()
	function _extractInString($p_filename)
	{
		$v_result_str = "";

		While (strlen($v_binary_data = $this->_readBlock()) != 0)
		{
		  if (!$this->_readHeader($v_binary_data, $v_header))
			return null;

		  if ($v_header['filename'] == '')
			continue;

		  // ----- Look for long filename
		  if ($v_header['typeflag'] == 'L') {
			if (!$this->_readLongHeader($v_header))
			  return null;
		  }

		  if ($v_header['filename'] == $p_filename) {
			  if ($v_header['typeflag'] == "5") {
				  $this->_error('Unable to extract in string a directory '
								.'entry {'.$v_header['filename'].'}');
				  return null;
			  } else {
				  $n = floor($v_header['size']/512);
				  for ($i=0; $i<$n; $i++) {
					  $v_result_str .= $this->_readBlock();
				  }
				  if (($v_header['size'] % 512) != 0) {
					  $v_content = $this->_readBlock();
					  $v_result_str .= substr($v_content, 0,
											  ($v_header['size'] % 512));
				  }
				  return $v_result_str;
			  }
		  } else {
			  $this->_jumpBlock(ceil(($v_header['size']/512)));
		  }
		}

		return null;
	}
	// }}}

	// {{{ _extractList()
	function _extractList($p_path, &$p_list_detail, $p_mode,
						  $p_file_list, $p_remove_path, $p_preserve=false)
	{
	$v_result=true;
	$v_nb = 0;
	$v_extract_all = true;
	$v_listing = false;

	$p_path = $this->_translateWinPath($p_path, false);
	if ($p_path == '' || (substr($p_path, 0, 1) != '/'
		&& substr($p_path, 0, 3) != "../" && !strpos($p_path, ':'))) {
	  $p_path = "./".$p_path;
	}
	$p_remove_path = $this->_translateWinPath($p_remove_path);

	// ----- Look for path to remove format (should end by /)
	if (($p_remove_path != '') && (substr($p_remove_path, -1) != '/'))
	  $p_remove_path .= '/';
	$p_remove_path_size = strlen($p_remove_path);

	switch ($p_mode) {
	  case "complete" :
		$v_extract_all = true;
		$v_listing = false;
	  break;
	  case "partial" :
		  $v_extract_all = false;
		  $v_listing = false;
	  break;
	  case "list" :
		  $v_extract_all = false;
		  $v_listing = true;
	  break;
	  default :
		$this->_error('Invalid extract mode ('.$p_mode.')');
		return false;
	}

	clearstatcache();

	while (strlen($v_binary_data = $this->_readBlock()) != 0)
	{
	  $v_extract_file = FALSE;
	  $v_extraction_stopped = 0;

	  if (!$this->_readHeader($v_binary_data, $v_header))
		return false;

	  if ($v_header['filename'] == '') {
		continue;
	  }

	  // ----- Look for long filename
	  if ($v_header['typeflag'] == 'L') {
		if (!$this->_readLongHeader($v_header))
		  return false;
	  }

	  if ((!$v_extract_all) && (is_array($p_file_list))) {
		// ----- By default no unzip if the file is not found
		$v_extract_file = false;

		for ($i=0; $i<sizeof($p_file_list); $i++) {
		  // ----- Look if it is a directory
		  if (substr($p_file_list[$i], -1) == '/') {
			// ----- Look if the directory is in the filename path
			if ((strlen($v_header['filename']) > strlen($p_file_list[$i]))
				&& (substr($v_header['filename'], 0, strlen($p_file_list[$i]))
					== $p_file_list[$i])) {
			  $v_extract_file = true;
			  break;
			}
		  }

		  // ----- It is a file, so compare the file names
		  elseif ($p_file_list[$i] == $v_header['filename']) {
			$v_extract_file = true;
			break;
		  }
		}
	  } else {
		$v_extract_file = true;
	  }

	  // ----- Look if this file need to be extracted
	  if (($v_extract_file) && (!$v_listing))
	  {
		if (($p_remove_path != '')
			&& (substr($v_header['filename'], 0, $p_remove_path_size)
				== $p_remove_path))
		  $v_header['filename'] = substr($v_header['filename'],
										 $p_remove_path_size);
		if (($p_path != './') && ($p_path != '/')) {
		  while (substr($p_path, -1) == '/')
			$p_path = substr($p_path, 0, strlen($p_path)-1);

		  if (substr($v_header['filename'], 0, 1) == '/')
			  $v_header['filename'] = $p_path.$v_header['filename'];
		  else
			$v_header['filename'] = $p_path.'/'.$v_header['filename'];
		}
		if (file_exists($v_header['filename'])) {
		  if (   (@is_dir($v_header['filename']))
			  && ($v_header['typeflag'] == '')) {
			$this->_error('File '.$v_header['filename']
						  .' already exists as a directory');
			return false;
		  }
		  if (   ($this->_isArchive($v_header['filename']))
			  && ($v_header['typeflag'] == "5")) {
			$this->_error('Directory '.$v_header['filename']
						  .' already exists as a file');
			return false;
		  }
		  if (!is_writeable($v_header['filename'])) {
			//We cannot use $globals['ofc'] here and after restoring the files we are anyways changing the file's permissions according to the perms file. Therefore, using 0644/0755 directly here shouldn't be an issue.
			if(is_dir($v_header['filename'])){
				$chmod = chmod($v_header['filename'], 0755);
			}else{
				$chmod = chmod($v_header['filename'], 0644);
			}
			if (!is_writeable($v_header['filename'])) {
				$this->_error('File '.$v_header['filename']
						  .' already exists and is write protected');
				return false;
			}
		  }
		  if (filemtime($v_header['filename']) > $v_header['mtime']) {
			// To be completed : An error or silent no replace ?
		  }
		}

		// ----- Check the directory availability and create it if necessary
		elseif (($v_result
				 = $this->_dirCheck(($v_header['typeflag'] == "5"
									?$v_header['filename']
									:dirname($v_header['filename'])))) != 1) {
			$this->_error('Unable to create path for '.$v_header['filename']);
			return false;
		}

		if ($v_extract_file) {
		  if ($v_header['typeflag'] == "5") {
			if (!@file_exists($v_header['filename'])) {
				if (!@mkdir($v_header['filename'], 0777)) {
					$this->_error('Unable to create directory {'
								  .$v_header['filename'].'}');
					return false;
				}
			}
		  } elseif ($v_header['typeflag'] == "2") {
			  if (@file_exists($v_header['filename'])) {
				 @unlink($v_header['filename']);
			  }
			  if (!@symlink($v_header['link'], $v_header['filename'])) {
				  $this->_error('Unable to extract symbolic link {'
								.$v_header['filename'].'}');
				  return false;
			  }
		  } else {
			  if (($v_dest_file = @fopen($v_header['filename'], "wb")) == 0) {
				  $this->_error('Error while opening {'.$v_header['filename']
								.'} in write binary mode');
				  return false;
			  } else {
				  $n = floor($v_header['size']/512);
				  for ($i=0; $i<$n; $i++) {
					  $v_content = $this->_readBlock();
					  fwrite($v_dest_file, $v_content, 512);
				  }
			if (($v_header['size'] % 512) != 0) {
			  $v_content = $this->_readBlock();
			  fwrite($v_dest_file, $v_content, ($v_header['size'] % 512));
			}

			@fclose($v_dest_file);
			
			if ($p_preserve) {
				@chown($v_header['filename'], $v_header['uid']);
				@chgrp($v_header['filename'], $v_header['gid']);
			}

			// ----- Change the file mode, mtime
			@touch($v_header['filename'], $v_header['mtime']);
			if ($v_header['mode'] & 0111) {
				// make file executable, obey umask
				$mode = fileperms($v_header['filename']) | (~umask() & 0111);
				@chmod($v_header['filename'], $mode);
			}
		  }

		  // ----- Check the file size
		  clearstatcache();
		  if (!is_file($v_header['filename'])) {
			  $this->_error('Extracted file '.$v_header['filename']
							.'does not exist. Archive may be corrupted.');
			  return false;
		  }
		  
		  $filesize = filesize($v_header['filename']);
		  if ($filesize != $v_header['size']) {
			  $this->_error('Extracted file '.$v_header['filename']
							.' does not have the correct file size \''
							.$filesize
							.'\' ('.$v_header['size']
							.' expected). Archive may be corrupted.');
			  return false;
		  }
		  }
		} else {
		  $this->_jumpBlock(ceil(($v_header['size']/512)));
		}
	  } else {
		  $this->_jumpBlock(ceil(($v_header['size']/512)));
	  }

	  if ($v_listing || $v_extract_file || $v_extraction_stopped) {
		// ----- Log extracted files
		if (($v_file_dir = dirname($v_header['filename']))
			== $v_header['filename'])
		  $v_file_dir = '';
		if ((substr($v_header['filename'], 0, 1) == '/') && ($v_file_dir == ''))
		  $v_file_dir = '/';

		// Only if we are to return the list i.e. in listContent() then we fill full $v_header else we just need the count
		$p_list_detail[$v_nb++] = (!empty($v_listing) ? $v_header : '');
		if (is_array($p_file_list) && (count($p_list_detail) == count($p_file_list))) {
			return true;
		}
	  }
	}

		return true;
	}
	// }}}

	// {{{ _openAppend()
	function _openAppend()
	{
		
		if (filesize($this->_tarname) == 0)
		  return $this->_openWrite();

		if ($this->_compress) {
			$this->_close();

			if (!@rename($this->_tarname, $this->_tarname.".tmp")) {
				$this->_error('Error while renaming \''.$this->_tarname
							  .'\' to temporary file \''.$this->_tarname
							  .'.tmp\'');
				return false;
			}

			if ($this->_compress_type == 'gz')
				$v_temp_tar = @gzopen($this->_tarname.".tmp", "rb");
			elseif ($this->_compress_type == 'bz2')
				$v_temp_tar = @bzopen($this->_tarname.".tmp", "r");

			if ($v_temp_tar == 0) {
				$this->_error('Unable to open file \''.$this->_tarname
							  .'.tmp\' in binary read mode');
				@rename($this->_tarname.".tmp", $this->_tarname);
				return false;
			}

			if (!$this->_openWrite()) {
				@rename($this->_tarname.".tmp", $this->_tarname);
				return false;
			}

			if ($this->_compress_type == 'gz') {
				$end_blocks = 0;
				
				while (!@gzeof($v_temp_tar)) {
					$v_buffer = @gzread($v_temp_tar, 512);
					if ($v_buffer == ARCHIVE_TAR_END_BLOCK || strlen($v_buffer) == 0) {
						$end_blocks++;
						// do not copy end blocks, we will re-make them
						// after appending
						continue;
					} elseif ($end_blocks > 0) {
						for ($i = 0; $i < $end_blocks; $i++) {
							if(!$this->_writeBlock(ARCHIVE_TAR_END_BLOCK)){
								return false;
						  }
						}
						$end_blocks = 0;
					}
					$v_binary_data = pack("a512", $v_buffer);
					if(!$this->_writeBlock($v_binary_data)){
						return false;
				  }
				}

				@gzclose($v_temp_tar);
			}
			elseif ($this->_compress_type == 'bz2') {
				$end_blocks = 0;
				
				while (strlen($v_buffer = @bzread($v_temp_tar, 512)) > 0) {
					if ($v_buffer == ARCHIVE_TAR_END_BLOCK || strlen($v_buffer) == 0) {
						$end_blocks++;
						// do not copy end blocks, we will re-make them
						// after appending
						continue;
					} elseif ($end_blocks > 0) {
						for ($i = 0; $i < $end_blocks; $i++) {
							if(!$this->_writeBlock(ARCHIVE_TAR_END_BLOCK)){
								return false;
							}
						}
						$end_blocks = 0;
					}
					$v_binary_data = pack("a512", $v_buffer);
					if(!$this->_writeBlock($v_binary_data)){
					return false;
				  }
				}

				@bzclose($v_temp_tar);
			}

			if (!@unlink($this->_tarname.".tmp")) {
				$this->_error('Error while deleting temporary file \''
							  .$this->_tarname.'.tmp\'');
			}

		} else {
			// ----- For not compressed tar, just add files before the last
			//	   one or two 512 bytes block
			if (!$this->_openReadWrite())
			   return false;

			clearstatcache();
			$v_size = filesize($this->_tarname);

			// We might have zero, one or two end blocks.
			// The standard is two, but we should try to handle
			// other cases.
			fseek($this->_file, $v_size - 1024);
			if (fread($this->_file, 512) == ARCHIVE_TAR_END_BLOCK) {
				fseek($this->_file, $v_size - 1024);
			}
			elseif (fread($this->_file, 512) == ARCHIVE_TAR_END_BLOCK) {
				fseek($this->_file, $v_size - 512);
			}
		}

		return true;
	}
	// }}}

	// {{{ _append()
	function _append($p_filelist, $p_add_dir = '', $p_remove_dir = '')
	{
		if (!$this->_openAppend())
			return false;

		if ($this->_addList($p_filelist, $p_add_dir, $p_remove_dir))
		   $this->_writeFooter();

		$this->_close();

		return true;
	}
	// }}}

	// {{{ _dirCheck()
	function _dirCheck($p_dir)
	{
		clearstatcache();
		if ((@is_dir($p_dir)) || ($p_dir == ''))
			return true;

		$p_parent_dir = dirname($p_dir);

		if (($p_parent_dir != $p_dir) &&
			($p_parent_dir != '') &&
			(!$this->_dirCheck($p_parent_dir)))
			 return false;

		if (!@mkdir($p_dir, 0777)) {
			$this->_error("Unable to create directory '$p_dir'");
			return false;
		}

		return true;
	}

	// }}}

	// {{{ _pathReduction()
	function _pathReduction($p_dir)
	{
		$v_result = '';

		// ----- Look for not empty path
		if ($p_dir != '') {
			// ----- Explode path by directory names
			$v_list = explode('/', $p_dir);

			// ----- Study directories from last to first
			for ($i=sizeof($v_list)-1; $i>=0; $i--) {
				// ----- Look for current path
				if ($v_list[$i] == ".") {
					// ----- Ignore this directory
					// Should be the first $i=0, but no check is done
				}
				else if ($v_list[$i] == "..") {
					// ----- Ignore it and ignore the $i-1
					$i--;
				}
				else if (   ($v_list[$i] == '')
						 && ($i!=(sizeof($v_list)-1))
						 && ($i!=0)) {
					// ----- Ignore only the double '//' in path,
					// but not the first and last /
				} else {
					$v_result = $v_list[$i].($i!=(sizeof($v_list)-1)?'/'
								.$v_result:'');
				}
			}
		}
		
		if (defined('OS_WINDOWS') && OS_WINDOWS) {
			$v_result = strtr($v_result, '\\', '/');
		}
		
		return $v_result;
	}

	// }}}

	// {{{ _translateWinPath()
	function _translateWinPath($p_path, $p_remove_disk_letter = true) {
		if (defined('OS_WINDOWS') && OS_WINDOWS) {
			// ----- Look for potential disk letter
			if (($p_remove_disk_letter) && (($v_position = strpos($p_path, ':')) != false)) {
				$p_path = substr($p_path, $v_position+1);
			}
			
			// ----- Change potential windows directory separator
			if ((strpos($p_path, '\\') > 0) || (substr($p_path, 0,1) == '\\')) {
				$p_path = strtr($p_path, '\\', '/');
			}
		}
		
		return $p_path;
	}
	// }}}

	function cleanpath($path){	
		$path = str_replace('\\\\', '/', $path);
		$path = str_replace('\\', '/', $path);
		return rtrim($path, '/');
	}
}lib/gdrive.php000064400000075156151526424670007335 0ustar00<?php

#[\AllowDynamicProperties]
class gdrive{

	var $access_token;
	var $refresh_token;
	var $backup_loc;
	var $path;
	var $filename;
	var $filesize = 0;
	var $init_url = '';
	var $complete = 0;
	var $offset = 0;
	var $tmpsize = 0;
	var $chunk = 2097152; //upload chunks in google drive should be multiples of 256 KB
	var $range_lower_limit = 0;
	var $range_upper_limit = 0;
	var $tpfile = '';
	var $mode = '';
	var $gdrive_fileid = '';
	var $wp = NULL; // Memory Write Pointer
	var $parents = array();
	var $local_dest = '';
	var $cache = [];
	
	// APP name is Softaculous Auto Installer and is assigned to developers@softaculous.com Google account
	var $app_key = '';
	var $app_secret = '';
	var $app_dir = 'Backuply';
	var $redirect_uri = 'https://api.backuply.com/gdrive/callback.php';
	var $token_url = 'https://api.backuply.com/gdrive/token.php';
	var $filelist = [];
	var $readsize = 0;
	var $orig_path = '';
	var $stats = [];
	var $access_generated_at = 0;
	var $expires_in = 0;
	//var $redirect_uri = 'http://test.nuftp.com/googledrive/callback.php';

	function __construct(){
		if(empty($GLOBALS['remote_data'])){
			return;
		}

		if(empty($this->access_token) && !empty($GLOBALS['remote_data']['access_token'])){
			$this->access_token = $GLOBALS['remote_data']['access_token'];
		}

		if(empty($this->cache['fileid']) && !empty($GLOBALS['remote_data']['fileid'])){
			$this->cache['fileid'] = $GLOBALS['remote_data']['fileid'];
		}

		if(empty($this->cache['stats']) && !empty($GLOBALS['remote_data']['stats'])){
			$this->cache['stats'] = $GLOBALS['remote_data']['stats'];
		}

		// The seconds in which the access token will expire its around 1 hour by default.
		if(empty($this->expires_in) && !empty($GLOBALS['remote_data']['expires_in'])){
			$this->expires_in = intval($GLOBALS['remote_data']['expires_in']);
		}

		// Timestamp when the access_token was generated
		if(empty($this->access_generated_at) && !empty($GLOBALS['remote_data']['access_generated_at'])){
			$this->access_generated_at = intval($GLOBALS['remote_data']['access_generated_at']);
		}

		$GLOBALS['remote_data'] = []; // Reset
	}

	function stream_open($path, $mode, $options, &$opened_path){
		global $error, $backuply;

		$stream = parse_url($path);
		$this->orig_path = $path;

		$this->refresh_token = $stream['host'];
		//Google Drive access token expires in an hour so we need to refresh
		$this->access_token = $this->refresh_token_func($this->refresh_token);

		$this->path = $stream['path'];
		$this->mode = $mode;

		$pathinfo = pathinfo($this->path);
		$dirlist = explode('/', $pathinfo['dirname']);

		//Generate parent directories IDs

		$this->parents = array();

		foreach($dirlist as $sk => $subdir){

			if(empty($subdir)){
				continue;
			}

			$this->parents[] = $this->get_gdrive_fileid($subdir);
		}

		$this->filename = $pathinfo['basename'];

		// if its a read mode the check if the file exists
		if(strpos($this->mode, 'r') !== FALSE){
			$file_stats = $this->url_stat($path);
			$this->filesize = $file_stats['size'];

			if(empty($this->filesize)){
				return false;
			}
		}

		//php://memory not working on localhost
		$this->tpfile = 'php://temp';

		$ret = true;
		if(preg_match('/w|a/is', $this->mode)){
			$this->offset = 0;
			$this->range_lower_limit = 0;
			
			if(empty($backuply['status']['init_data'])){
				$ret = $this->upload_start();
			}else{
				$ret = true;
			}
		}

		return $ret;
	}
	
	function stream_read($count) {
		if(!$this->access_token){
			return false;
		}

		// Get the readsize
		if(empty($this->readsize)){
			$this->readsize = filesize($this->orig_path);
		}
		
		$pathinfo = pathinfo($this->path);
		$filename = $pathinfo['basename'];
		
		// If cant get File ID
		if(empty($this->get_gdrive_fileid($filename))){
			$error[] = 'Unable to find the file';
			return false;
		}
		
		$block = $this->__read($this->offset, ($this->offset + $this->readsize - 1));

		$ret = substr($block, 0, $count);

		if(empty($ret)){
			return false;
		}
		
		$this->offset = $this->offset + $count;
		return $ret;
		
	}
	
	function stream_metadata($path, $option, $value){
		return false;
	}
	
	// Google Drive API to upload
	function upload_start(){
		global $error, $backuply;

		$upload_url = 'https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable';
		$headers = array('Authorization: Bearer '.$this->access_token,
						"Cache-Control: no-cache",
						"Content-Type: application/json; charset=UTF-8",
						"X-Upload-Content-Type: application/x-gzip");
		
		if(empty($backuply['status']['init_data'])){
			$headers[] = 'Content-Range: */*';
		}

		$post = json_encode(array('name' => $this->filename, 'parents' => array(end($this->parents))));
		$resp = $this->__curl($upload_url, $headers, '', 0, $post);

		if(!empty($resp['error'])){
			$error[] = 'Google Drive : '.$resp['error'];
			return false;
		}

		$op = explode("\r\n", $resp['result']);
		
		foreach($op as $ok => $ov){
			if(preg_match('/HTTP\/1.1(\s*?)(.*?)$/is', $ov)){
				backuply_preg_replace('/HTTP\/1.1(\s*?)(.*?)$/is', $ov, $retcode, 2);
			}
			if(preg_match('/Location:(\s*?)(.*?)$/is', $ov)){
				backuply_preg_replace('/Location:(\s*?)(.*?)$/is', $ov, $init_url, 2);
			}
		}
		
		if($retcode != '200 OK'){
			$error[] = 'Google Drive : '.$retcode;
			return false;
		}
		
		if(empty($init_url)){
			$error['gdrive_err_init'] = 'There were some errors while initiating the backup on Google Drive!!';
			return false;
		}
		$this->init_url = $init_url;
		$backuply['status']['init_data'] = $this->init_url;
		
		return true;
	}
	
	function stream_write($data){
		global $error, $backuply;
		
		if(!is_resource($this->wp)){
			$this->wp = fopen($this->tpfile, 'w+');
		}
		
		//Initially store the data in a memory
		fwrite($this->wp, $data);
		$this->tmpsize += strlen($data);
		$data_size = strlen($data);
		
		if(!empty($GLOBALS['start_pos'])){
			$this->range_lower_limit = $GLOBALS['start_pos'];
			$this->offset = $GLOBALS['start_pos'];	
		}		
		
		//$lower_limit = $this->range_lower_limit;
	
		// Are we already more than 2 MB ?
		if($this->tmpsize >= $this->chunk){
			$this->range_upper_limit = $this->range_lower_limit + $this->chunk - 1;
			
			//If the temp file contains data more than the chunk size
			$rem_data = '';
			$rem_size = $this->tmpsize - $this->chunk;
			$this->tmpsize = $rem_size;
			rewind($this->wp);
			
			if($rem_size > 0){
				$append_data = fread($this->wp, $this->chunk);
				$rem_data = fread($this->wp, $rem_size);
				fclose($this->wp);
				$this->wp = NULL;
				
				$this->wp = fopen($this->tpfile, 'w+');
				fwrite($this->wp, $append_data);
				$append_data = '';
				rewind($this->wp);
			}			
			
			//Call upload append function to write the data from PHP Memory stream to Google Drive
			$retcode = $this->upload_append($this->init_url, $this->wp, $this->chunk);
			//echo '<br />Write: ';backuply_print($retcode);
			if($retcode == '200 OK' || $retcode == '201 Created'){
				$this->complete = 1;
			}
			
			// Close the temp file and reset the variables
			fclose($this->wp);
			$this->wp = NULL;
			
			if(empty($retcode)){
				$error[] = 'Google Drive : '.$retcode;
				return false;
			}
			
			//Write the remaining data back to the temp file
			if(!empty($rem_data)){
				$this->wp = fopen($this->tpfile, 'w+');
				fwrite($this->wp, $rem_data);
			}
		}
		return $data_size;	
	}
	
	// Google Drive API to append
	function upload_append($init_url, $filep, $data_size, $final_size = '*'){
		global $error, $backuply;
		
		if(!empty($backuply['status']['init_data'])){
			$this->init_url = $backuply['status']['init_data'];
		}
		
		$headers = array('Authorization: Bearer '.$this->access_token, 
			'Content-Length: '.$data_size, 
			'Content-Type: application/x-gzip', 
			'Content-Range: bytes '. $this->range_lower_limit .'-'.$this->range_upper_limit. '/' . $backuply['status']['proto_file_size']
		);
		
		$resp = $this->__curl($this->init_url, $headers, $filep, $data_size, '', '', 'PUT');
		//backuply_log(serialize($resp));
		//echo '<br />Append: ';backuply_print($resp);

		if(!empty($resp['error'])){
			$error[] = 'Google Drive : '.$resp['error'];
			return false;
		}
		
		$op = explode("\r\n", $resp['result']);

		backuply_preg_replace('/HTTP\/1.1(\s*?)(.*?)$/is', $op[2], $retcode, 2);
		//echo '<br />Append Ret Code: '.$retcode;

		if($retcode != '308 Resume Incomplete' && $retcode != '200 OK' && $retcode != '201 Created' && $retcode != '503 Service Unavailable'){
		    backuply_preg_replace('/HTTP\/1.1(\s*?)(.*?)$/is', $op[0], $retcode, 2);
		}

		if($retcode != '308 Resume Incomplete' && $retcode != '200 OK' && $retcode != '201 Created' && $retcode != '503 Service Unavailable'){
			$error[] = 'Google Drive : '.$retcode;
			return false;
		}
		
		if($retcode == '308 Resume Incomplete'){
			foreach($op as $ok => $ov){
				if(preg_match('/Range:(\s*?)bytes=0-(.*?)$/is', $ov)){
					backuply_preg_replace('/Range:(\s*?)bytes=0-(.*?)$/is', $ov, $urange, 2);
				}
			}
			
			if(!empty($urange)){
				$this->range_lower_limit = $urange + 1;
				$this->offset = $urange + 1;
				$GLOBALS['start_pos'] = $this->offset;
			}
		}elseif($retcode == '200 OK' || $retcode == '201 Created'){
			
			preg_match('/{(.*?)}$/is', $resp['result'], $matches);
			$data = json_decode($matches[0], true);
			$this->gdrive_fileid = $data['id'];
		}
		
		if($retcode ==  '503 Service Unavailable'){
			$retcode = $this->retry_upload();
		}

		return $retcode;
	}
	
	// Retires connecting to the google drive server
	function retry_upload(){
		
		global $error, $backuply;
		
		backuply_status_log('Retrying to Connect to Google Drive to resume upload', 'info');
		
		// We need to stop just in case it was caused by overlapping of time.
		sleep(2);
		
		$backuply['status']['upload_try'] += 1;
		
		if($backuply['status']['upload_try'] > 3){
			$error[] = 'Google Drive : Upload failed after trying 3 times to reconnect with Google Drive';
			return false;
		}

		$file_size = '*';
		
		if(!empty($backuply['status']['proto_file_size'])){
			$file_size = $backuply['status']['proto_file_size'];
		}
	
		$headers = array('Authorization: Bearer '.$this->access_token,
			"Content-Length: 0",
			"Content-Range: bytes */" . $file_size);

		$resp = $this->__curl($backuply['status']['init_data'], $headers, '', '', '', '', 'PUT');
		
		$op = explode("\r\n", $resp['result']);

		backuply_preg_replace('/HTTP\/1.1(\s*?)(.*?)$/is', $op[0], $retcode, 2);
		
		// Retry if it gets same error of service unavailable.
		if($retcode == '503 Service Unavailable'){
			$this->retry_upload();
		}
		
		// If is 2xx then the file is been uploaded successfully
		if($retcode == '200 OK' || $retcode == '201 Created'){
			preg_match('/{(.*?)}$/is', $resp['result'], $matches);
			$data = json_decode($matches[0], true);
			$this->gdrive_fileid = $data['id'];

			return $retcode;
		}

		// Need to resume the file.
		if($retcode == '308 Resume Incomplete'){
			$backuply['status']['upload_retry'] = true;
			
			foreach($op as $ok => $ov){
				if(preg_match('/Range:(\s*?)bytes=0-(.*?)$/is', $ov)){
					backuply_preg_replace('/Range:(\s*?)bytes=0-(.*?)$/is', $ov, $urange, 2);
				}
			}
			
			if(!empty($urange)){
				$this->range_lower_limit = $urange + 1;
				$this->offset = $urange + 1;
				$GLOBALS['start_pos'] = $this->offset;
			}

			return $retcode;
		}

		$error[] = 'Google Drive: Unable to resume upload as upload session expired retry making a backup';
		return $retcode;

	}
	
	function stream_close(){
		global $error, $backuply;

		if(preg_match('/w|a/is', $this->mode)){
			
			// Is there still some data left to be written ?			
			if($this->tmpsize > 0){
				
				if(!empty($this->complete)){
					$error[] = 'There were some errors while committing backup to your Google Drive account!!';
					return false;
				}
				
				/* if(!empty($backuply['status']['incomplete_upload'])){
					if($this->tmpsize < $this->chunk){
						//We are doing this because in resumable uploads on gdrive, we can only upload data in multiples of 0.25MB except for the last upload. When the backup is performed in loops in aefer, at the end of every iteration, stream_close is called when the object is destroyed, hence it is not the end data everytime the iteration ends.
						//Data in the tempfile
						rewind($this->wp);
						$temp_data = fread($this->wp, $this->tmpsize);
						
						//data in the local file
						$slfp = fopen($GLOBALS['slocal_tar'], 'rb');
						$lo_data = fread($slfp, filesize($GLOBALS['slocal_tar']));
						fclose($slfp);
						
						//Combine both the data and write in the local file
						$clfp = fopen($GLOBALS['slocal_tar'], 'wb');
						$lo_data = fwrite($clfp, $temp_data.$lo_data);
						fclose($clfp);
					}
					return true;
				} */
				
				if(!empty($GLOBALS['start_pos'])){
					$this->range_lower_limit = $GLOBALS['start_pos'];
					$this->offset = $GLOBALS['start_pos'];
				}
				
				$this->range_upper_limit = $this->range_lower_limit + $this->tmpsize - 1;
				
				$this->offset += $this->tmpsize;
				rewind($this->wp);
				
				//Call upload append function to write the remaining data from PHP Memory stream to Google Drive
				if(empty($backuply['status']['incomplete_upload'])){
					$retcode = $this->upload_append($this->init_url, $this->wp, $this->tmpsize, $this->offset);
				}else{
					$retcode = $this->upload_append($this->init_url, $this->wp, $this->tmpsize);
				}
				
				// Close the temp file and reset the variables
				fclose($this->wp);
				$this->wp = NULL;
				$this->tmpsize = 0;
				
				if(empty($retcode)){
					return false;
				}
			}
		}
		return true;
	}
	
	//In response to file_exists(), is_file(), is_dir()
	function url_stat($path){
		global $error;

		$stream = parse_url($path);
		$this->refresh_token = $stream['host'];
		$pathinfo = pathinfo($stream['path']);
		$filename = $pathinfo['basename'];
		
		if(!empty($this->cache['stats']) && !empty($this->cache['stats'][$filename])){
			return $this->cache['stats'][$filename];
		}

		//Google Drive access token expires in an hour so we need to refresh
		$this->access_token = $this->refresh_token_func($this->refresh_token);
		$this->get_gdrive_fileid($filename);
		$url = 'https://www.googleapis.com/drive/v3/files/'.$this->gdrive_fileid.'?fields=kind,name,size,createdTime,modifiedTime,mimeType,explicitlyTrashed';
		$headers = array('Authorization: Bearer '.$this->access_token);

		$resp = $this->__curl($url, $headers, '', 0, '', '', 'GET');

		if(!empty($resp['error'])){
			$error[] = 'Google Drive : '.$resp['error'];
			return false;
		}
		
		preg_match('/{(.*?)}$/is', $resp['result'], $matches);
		$data = json_decode($matches[0], true);
	
		// Here error means file does not exist
		if(!empty($data['error'])){
			return false;
		}

		backuply_preg_replace('/drive#(.*?)$/is', $data['kind'], $filetype, 1);
		
		if($data['mimeType'] == 'application/vnd.google-apps.folder'){
			$mode = 0040000;	//For DIR
		}else{
			$mode = 0100000;	//For File
		}
		
		if(!empty($data['name']) && empty($data['explicitlyTrashed'])){
			$this->stats = array('dev' => 0,
						'ino' => 0,
						'mode' => $mode,
						'nlink' => 0,
						'uid' => 0,
						'gid' => 0,
						'rdev' => 0,
						'size' => $data['size'],
						'atime' => $data['createdTime'],
						'mtime' => $data['modifiedTime'],
						'ctime' => $data['createdTime'],
						'blksize' => 0,
						'blocks' => 0);

			$this->cache['stats'][$filename] = $this->stats;
			return $this->stats;	
		}
		return false;
	}
	
	function mkdir($path, $mode){
		global $error;
		
		$stream = parse_url($path);
		$this->refresh_token = $stream['host'];
		$pathinfo = pathinfo($stream['path']);
		
		$parent_dir = explode('/', $pathinfo['dirname']);
		$parent_dir = $parent_dir[1]; //It conatains "Softaculous Auto Installer" prent should be this only.
		
		$dirname = $pathinfo['basename'];
		
		$sub_dirs = explode('/', $stream['path']);
	
		//Google Drive access token expires in an hour so we need to refresh
		$this->access_token = $this->refresh_token_func($this->refresh_token);
		
		foreach($sub_dirs as $sk => $subdir){
			
			if(empty($subdir)){
				continue;
			}
			 
			$parent_id = array();
			if(!empty($parent_dir)){
				
				$parent_id[0] = $this->get_gdrive_fileid($parent_dir);
				if(empty($parent_id[0])){
					$parent_id[0] = $this->create_dir($parent_dir);
				}
				
			}
			
			$subdir_id = $this->get_gdrive_fileid($subdir);
			if(empty($subdir_id)){
				$create = $this->create_dir($subdir, $parent_id);
				if(empty($create)){
					break;
				}
			}
			
			$parent_dir = $subdir;
		}
		
		return true;
	}
	
	function create_dir($dirname, $parents = array()){
		
		global $error;

		$url = 'https://www.googleapis.com/drive/v3/files';
		$headers = array('Authorization: Bearer '.$this->access_token,
						'Accept: application/json',
						'Content-Type: application/json');
		
		if(!empty($parents)){
					
			$post = json_encode(array('name' => $dirname, 'mimeType' => "application/vnd.google-apps.folder", 'parents' => array(end($parents))));
			
		}else{
			$post = json_encode(array('name' => $dirname, 'mimeType' => "application/vnd.google-apps.folder"));
		}

		$resp = $this->__curl($url, $headers, '', 0, $post, '', 'POST');
		if(!empty($resp['error'])){
			$error[] = 'Google Drive : '.$resp['error'];
			return false;
		}
		
		preg_match('/{(.*?)}$/is', $resp['result'], $matches);
		$data = json_decode($matches[0], true);
		
		if(!empty($data['error'])){
			if(is_array($data['error'])){
				$error[] = 'Google Drive : '.$data['error']['code'].' : '.$data['error']['message'];
			}else{
				$error[] = 'Google Drive : '.$data['error'].' : '.$data['error_description'];
			}
			return false;
		}
		return $data['id'];
	}
	
	function dir_opendir($path, $options){
		$stream = parse_url($path);

		$this->refresh_token = $stream['host'];
		//Google Drive access token expires in an hour so we need to refresh
		$this->access_token = $this->refresh_token_func($this->refresh_token);
		
		// Gettting the folder name
		$dir = explode('/', $stream['path']);
		$dir_name = end($dir);
		$dir_id = $this->get_gdrive_fileid($dir_name);

		$url = "https://www.googleapis.com/drive/v3/files?q='".$dir_id."'+in+parents+and+(trashed=false)&fields=files(name)";
		$headers = array('Authorization: Bearer '.$this->access_token);
		
		$resp = $this->__curl($url , $headers, '', 0, '', 0, 'GET');
		
		if(!empty($resp['error'])){
			$error[] = 'Google Drive : '.$resp['error'];
			return false;
		}
		
		preg_match('/{(.*?)}$/is', $resp['result'], $matches);
		$this->filelist = json_decode($matches[0], true);
		
		if(empty($this->filelist['files'])){
			$error[] = 'Google Drive : No File Found';
			return false;
		}
		
		$this->filelist = $this->filelist['files'];
		
		foreach($this->filelist as $i => $file) {
			$this->filelist[$i] = $file['name'];
		}

		return true;
	}

	function dir_readdir(){
		$key = key($this->filelist);
		if(is_null($key)){
			return false;
		}
		
		$val = $this->filelist[$key];
		unset($this->filelist[$key]);
		return pathinfo($val, PATHINFO_BASENAME);
	}

	function dir_closedir(){
		// Do nothing
	}
	
	function refresh_token_func($refresh_token){
		global $error;
		
		if(!empty($this->access_token)){
			if((time() - 600) - ($this->access_generated_at + $this->expires_in) > 0){
				return $this->access_token;
			}
		}

		$refresh_token = rawurldecode($refresh_token);

		$post = array('refresh_token' => $refresh_token,
					'grant_type' => 'refresh_token',
					'action' => 'get_access_token');
				
		$resp = $this->__curl($this->token_url, array(), '', 0, $post);
		
		if(!empty($resp['error'])){
			$error[] = 'Google Drive : '.$resp['error'];
			return false;
		}
		
		preg_match('/{(.*?)}$/is', $resp['result'], $matches);
		$data = json_decode($matches[0], true);
		
		if(!empty($data['error'])){
			if(is_array($data['error'])){
				$error[] = 'Google Drive : '.$data['error']['code'].' : '.$data['error']['message'];
			}else{
				$error[] = 'Google Drive : '.$data['error'].' : '.$data['error_description'];
			}
			return false;
		}
		
		if(empty($data['access_token'])){
			$error[] = 'Google Drive : Access token not found in the response';
			return false;
		}
		
		if(!empty($data['expires_in'])){
			$GLOBALS['remote_data']['expires_in'] = intval($data['expires_in']);
			$GLOBALS['remote_data']['access_generated_at'] = time();
			$this->access_generated_at = $GLOBALS['remote_data']['access_generated_at'];
			$this->expires_in = intval($data['expires_in']);
		}

		return $data['access_token'];
	}
	
	function rename($from, $to){
		global $error;
		
		$stream_from = parse_url($from);
		$this->refresh_token = $stream_from['host'];
		$from_path = trim($stream_from['path'], '/\\');
		$from_pathinfo = pathinfo($stream_from['path']);
		$from_file = $from_pathinfo['basename'];
		
		$stream_to = parse_url($to);
		$to_path = trim($stream_to['path'], '/\\');
		$to_pathinfo = pathinfo($stream_to['path']);
		$to_file = $to_pathinfo['basename'];
		
		//Google Drive access token expires in an hour so we need to refresh
		$this->access_token = $this->refresh_token_func($this->refresh_token);

		$this->get_gdrive_fileid($from_file);
		
		$post = json_encode(array('name' => $to_file));
		$url = 'https://www.googleapis.com/drive/v3/files/'.$this->gdrive_fileid;
		$headers = array('Authorization: Bearer '.$this->access_token,
						'Content-Type: application/json; charset=UTF-8',
						'X-Upload-Content-Type: application/x-gzip');
		
		$resp = $this->__curl($url, $headers, '', 0, $post, '', 'PATCH');
		if(!empty($resp['error'])){
			$error[] = 'Google Drive : '.$resp['error'];
			return false;
		}		
		return true;
	}
	
	//Download Backup File from Google Drive to local server
	function download_file_loop($source, $dest, $startpos = 0){
		global $error;
		// backuply_log(' inside download_file_loop ');
		// backuply_log('source : '.$source);
		// backuply_log(' dest : '.$dest);
		// backuply_log(' dest : '.$startpos);
		global $error;
		//Set chunk size for download as 2 MB
		$this->chunk = 2097152;
		
		$stream = parse_url($source);
		$this->refresh_token = $stream['host'];
		$src_file = trim($stream['path'], '\//');
		
		//Google Drive access token expires in an hour so we need to refresh
		$this->access_token = $this->refresh_token_func($this->refresh_token);

		
		$pathinfo = pathinfo($stream['path']);
		$src_file = $pathinfo['basename'];
		
		if(empty($this->get_gdrive_fileid($src_file))){
		    $error[] = 'Backup file not found';
		    return;
		}

		$file_stats = $this->url_stat($source);
		$this->filesize = !empty($file_stats) ? $file_stats['size'] : 0;

		$this->range_lower_limit = $startpos;
		$this->range_upper_limit = ($this->range_lower_limit + $this->chunk) - 1;
		
		$fp = @fopen($dest, 'ab');
		while(!$this->__eof()){
			
			if(time() + 5 >= $GLOBALS['end']){
				$GLOBALS['l_readbytes'] = filesize($dest);
				$GLOBALS['remote_data']['access_token'] = $this->access_token;
				$GLOBALS['remote_data']['fileid'] = $this->cache['fileid'];
				$GLOBALS['remote_data']['stats'] = $this->cache['stats'];
				break;
			}

			if($this->range_upper_limit >= $this->filesize){
				$this->range_upper_limit = $this->filesize - 1;
			}
			
			$block = $this->__read($this->range_lower_limit, $this->range_upper_limit);
			fwrite($fp, $block);
			
			$this->offset = $this->range_upper_limit + 1;
			$this->range_lower_limit = $this->range_upper_limit + 1;
			$this->range_upper_limit = ($this->range_lower_limit + $this->chunk) - 1;
			
			$percentage = (filesize($dest) / $this->filesize) * 100;
			
			backuply_status_log('<div class="backuply-upload-progress"><span class="backuply-upload-progress-bar" style="width:'.round($percentage).'%;"></span><span class="backuply-upload-size">'.round($percentage).'%</span></div>', 'downloading', 22);
		}
		
		$GLOBALS['l_readbytes'] = filesize($dest);
		fclose($fp);
	}
	
	function __read($lower_limit, $upper_limit){
		// backuply_log('inside read');
		// backuply_log('lower limit : '.$lower_limit);
		// backuply_log('upper limit : '.$upper_limit);
		global $error;
		
		$headers = array('Authorization: Bearer '.$this->access_token, 'Range: bytes='.$lower_limit.'-'.$upper_limit);
		$url = 'https://www.googleapis.com/drive/v3/files/'.$this->gdrive_fileid.'?alt=media&acknowledgeAbuse=true';
		//backuply_log('__read URL : '.$url);
		
		$resp = $this->__curl($url, $headers, '', 0, '', 1, 'GET');
		
		if(!empty($resp['error'])){
			$error[] = 'Google Drive : '.$resp['error'];
			backuply_log('Google Drive read error : '. $resp['error']);
		}
		return $resp['result'];
	}
	
	function stream_eof(){

		if($this->offset < $this->filesize){
			return false;
		}
		return true;
	}
	
	function __eof(){
		// backuply_log('inside _eof');
		if($this->offset < $this->filesize){
			return false;
		}
		return true;
	}
	
	function get_gdrive_fileid($filename, $refresh_token = ''){
		global $error;

		// We should not make a request if we already have this value.
		if(!empty($this->cache['fileid']) && !empty($this->cache['fileid'][$filename])){
			$this->gdrive_fileid = $this->cache['fileid'][$filename];
			return $this->cache['fileid'][$filename];
		}

		if(!empty($refresh_token)){
			$this->refresh_token = $refresh_token;
		}
		
		//Google Drive access token expires in an hour so we need to refresh
		$this->access_token = $this->refresh_token_func($this->refresh_token);
		
		$url = 'https://www.googleapis.com/drive/v3/files?q=name=%27'.rawurlencode($filename).'%27%20and%20trashed=false';
		$headers = array('Authorization: Bearer '.$this->access_token);
		
		$resp = $this->__curl($url, $headers, '', 0, '', '', 'GET');
		if(!empty($resp['error'])){
			$error[] = 'Google Drive : '.$resp['error'];
			return false;
		}
		
		preg_match('/{(.*?)}$/is', $resp['result'], $matches);
		$data = json_decode($matches[0], true);
		
		if(!empty($data['error'])){
			if(is_array($data['error'])){
				$error[] = 'Google Drive : '.$data['error']['message'];
			}else{
				$error[] = 'Google Drive : '.$data['error'];
			}
			return false;
		}

		$this->gdrive_fileid = false;
		if(!empty($data['files'][0])){
			$this->gdrive_fileid = $data['files'][0]['id'];
			$this->cache['fileid'][$filename] = $this->gdrive_fileid;
		}

		return $this->gdrive_fileid;
	}
	
	//Delete the backup from Google Drive
	function unlink($path){
		global $error;

		$stream = parse_url($path);
		$this->refresh_token = $stream['host'];
		$pathinfo = pathinfo($stream['path']);
		$filename = $pathinfo['basename'];
		
		//Google Drive access token expires in an hour so we need to refresh
		$this->access_token = $this->refresh_token_func($this->refresh_token);
		
		if(empty($this->gdrive_fileid)){
			$this->get_gdrive_fileid($filename);
		}
		
		$url = 'https://www.googleapis.com/drive/v3/files/'.$this->gdrive_fileid;
		$headers = array('Authorization: Bearer '.$this->access_token);
		
		$resp = $this->__curl($url, $headers, '', 0, '', '', 'DELETE');
		
		if(!empty($resp['error'])){
			$error[] = 'Google Drive : '.$resp['error'];
			return false;
		}
		
		return true;
	}
	
	/**
	 * Generate Google Drive Refresh and Access Token from the Authorization Code provided
	 *
	 * @package	softaculous 
	 * @author	Priya Mittal
	 * @param	string $auth_code The authorization code generated by user during access grant process
	 * @return	string $data Google Drive Refresh and Access Token which we can use to create backup files
	 * @since	5.0.0
	 */
	function generate_gdrive_token($auth_code){

		global $error;
		
		$post = array('code' => $auth_code,
			'action' => 'get_refresh_token'
		);
				
		$resp = $this->__curl($this->token_url, array(), '', 0, $post);
		
		if(!empty($resp['error'])){
			$error[] = 'Google Drive : '.$resp['error'];
			return false;
		}
		
		preg_match('/{(.*?)}$/is', $resp['result'], $matches);
		$data = json_decode($matches[0], true);
		
		if(!empty($data['error'])){
			if(is_array($data['error'])){
				$error[] = 'Google Drive : '.$data['error']['code'].' : '.$data['error']['message'];
			}else{
				$error[] = 'Google Drive : '.$data['error'].' : '.$data['error_description'];
			}
			return false;
		}
		
		if(empty($data['access_token'])){
			$error[] = 'Google Drive : Access token not found in the response';
			return false;
		}

		if(empty($data['refresh_token'])){
			$error[] = 'Google Drive : Refresh token not found in the response';
			return false;
		}

		return $data;
	}

	/**
	 * Create Softaculous App Directory in user's Google Drive account
	 *
	 * @package	softaculous 
	 * @author	Priya Mittal
	 * @param	string $refresh_token Refresh Token of user's Google Drive account to generate the access token
	 * @since	5.0.0
	 */
	function create_gdrive_app_dir($refresh_token){
		global $error;
		
		$fileid = $this->get_gdrive_fileid($this->app_dir, $refresh_token);
		
		if(empty($fileid)){
			$this->create_dir($this->app_dir);
		}
		
	}
	
	function __curl($url, $headers = '', $filepointer = '', $upload_size = 0, $post = '', $download_file = 0, $request_type = 'POST'){
		global $error;
		
		// Set the curl parameters.
		$ch = curl_init($url);
		
		if(!empty($headers)){
			if(empty($download_file)){
				curl_setopt($ch, CURLOPT_HEADER, 1);
			}
			curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
		}
		
		curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $request_type);
		
		//We are setting this as on some servers, the default HTTP version was taken as 2.0 by curl, causing issue
		curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
		
		if(!empty($filepointer)){
			curl_setopt($ch, CURLOPT_UPLOAD, 1);
			curl_setopt($ch, CURLOPT_INFILE, $filepointer);
			curl_setopt($ch, CURLOPT_INFILESIZE, $upload_size);
		}
		
		if(!empty($post)){
			curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
		}
		//curl_setopt($ch, CURLOPT_VERBOSE, TRUE);

		// Turn off the server and peer verification (TrustManager Concept).
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		
		// Get response from the server.
		$resp = array();
		$resp['result'] = curl_exec($ch);
		$resp['error'] = curl_error($ch);

		/* echo '<br />Resp: ';
		$errno = curl_errno($ch);
		var_dump(curl_getinfo($ch, CURLINFO_HTTP_CODE)); */
		
		curl_close($ch);
		return $resp;
	}
	
	function get_quota($path){
		$stream = parse_url($path);
		$this->refresh_token = $stream['host'];
		
		$this->access_token = $this->refresh_token_func($this->refresh_token);

		// https://developers.google.com/drive/api/reference/rest/v3/about
		$url = 'https://www.googleapis.com/drive/v3/about?fields=storageQuota';
		$headers = array('Authorization: Bearer '.$this->access_token);
		
		$resp = $this->__curl($url, $headers, '' ,'', '', 0, 'GET');

		if(empty($resp) || empty($resp['result'])){
			return false;
		}
		
		$op = explode("\r\n", $resp['result']);

		backuply_preg_replace('/HTTP\/1.1(\s*?)(.*?)$/is', $op[0], $retcode, 2);
		
		if($retcode == '200 OK'){
			
			preg_match('/{(.*?)}$/is', $resp['result'], $matches);
			$decoded_resp = json_decode($matches[0], true);
		}

		if(empty($decoded_resp) || !is_array($decoded_resp) || empty($decoded_resp['storageQuota'])){
			return false;
		}

		return ['total' => $decoded_resp['storageQuota']['limit'], 'used' => $decoded_resp['storageQuota']['usage']];
	}
}
lib/ftp.php000064400000122766151526424670006646 0ustar00<?php

if(!defined('BACKUPLY_CRLF')) define('BACKUPLY_CRLF',"\r\n");
if(!defined('BACKUPLY_FTP_AUTOASCII')) define('BACKUPLY_FTP_AUTOASCII', -1);
if(!defined('BACKUPLY_FTP_FORCE')) define('BACKUPLY_FTP_FORCE', TRUE);
define('BACKUPLY_FTP_OS_Unix','u');
define('BACKUPLY_FTP_OS_Windows','w');
define('BACKUPLY_FTP_OS_Mac','m');

#[\AllowDynamicProperties]
class ftp_base {
	/* Public variables */
	var $LocalEcho;
	var $Verbose;
	var $OS_local;
	var $OS_remote;
	
	/* Private variables */
	var $_lastaction;
	var $_errors;
	var $_type;
	var $_umask;
	var $_timeout;
	var $_passive;
	var $_host;
	var $_fullhost;
	var $_port;
	var $_datahost;
	var $_dataport;
	var $_ftp_control_sock;
	var $_ftp_data_sock;
	var $_ftp_temp_sock;
	var $_ftp_buff_size;
	var $_login;
	var $_password;
	var $_connected;
	var $_ready;
	var $_code;
	var $_message;
	var $_can_restore;
	var $_port_available;
	var $_curtype;
	var $_features;

	var $_error_array;
	var $AuthorizedTransferMode;
	var $OS_FullName;
	var $_eol_code;
	var $AutoAsciiExt;
	var $error;

	/* Constructor */
	function ftp_base($port_mode=FALSE) {
		$this->__construct($port_mode);
	}

	function __construct($port_mode=FALSE, $verb=FALSE, $le=FALSE) {
		$this->LocalEcho=$le;
		$this->Verbose=$verb;
		$this->_lastaction=NULL;
		$this->_error_array=array();
		$this->_eol_code=array(BACKUPLY_FTP_OS_Unix=>"\n", BACKUPLY_FTP_OS_Mac=>"\r", BACKUPLY_FTP_OS_Windows=>"\r\n");
		$this->AuthorizedTransferMode=array(BACKUPLY_FTP_AUTOASCII, FTP_ASCII, FTP_BINARY);
		$this->OS_FullName=array(BACKUPLY_FTP_OS_Unix => 'UNIX', BACKUPLY_FTP_OS_Windows => 'WINDOWS', BACKUPLY_FTP_OS_Mac => 'MACOS');
		$this->AutoAsciiExt=array("ASP","BAT","C","CPP","CSS","CSV","JS","H","HTM","HTML","SHTML","INI","LOG","PHP3","PHTML","PL","PERL","SH","SQL","TXT");
		$this->_port_available=($port_mode==TRUE);
		$this->SendMSG("Staring FTP client class".($this->_port_available?"":" without PORT mode support"));
		$this->_connected=FALSE;
		$this->_ready=FALSE;
		$this->_can_restore=true;
		$this->_code=0;
		$this->_message="";
		$this->_ftp_buff_size=4096;
		$this->_curtype=NULL;
		$this->SetUmask(0022);
		$this->SetType(BACKUPLY_FTP_AUTOASCII);
		$this->SetTimeout(25);
		$this->Passive(!$this->_port_available);
		$this->_login="anonymous";
		$this->_password="anon@ftp.com";
		$this->_features=array();
	    $this->OS_local=BACKUPLY_FTP_OS_Unix;
		$this->OS_remote=BACKUPLY_FTP_OS_Unix;
		$this->features=array();
		$this->error=array();
		if(strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') $this->OS_local=BACKUPLY_FTP_OS_Windows;
		elseif(strtoupper(substr(PHP_OS, 0, 3)) === 'MAC') $this->OS_local=BACKUPLY_FTP_OS_Mac;
	}

// <!-- --------------------------------------------------------------------------------------- -->
// <!--       Public functions                                                                  -->
// <!-- --------------------------------------------------------------------------------------- -->
	function parselisting($list) {
//	Parses 1 line like:		"drwxrwx---  2 owner group 4096 Apr 23 14:57 text"
		if(preg_match("/^([-ld])([rwxst-]+)\s+(\d+)\s+([^\s]+)\s+([^\s]+)\s+(\d+)\s+(\w{3})\s+(\d+)\s+([\:\d]+)\s+(.+)$/i", $list, $ret)) {
			$v=array(
				"type"	=> ($ret[1]=="-"?"f":$ret[1]),
				"perms"	=> 0,
				"inode"	=> $ret[3],
				"owner"	=> $ret[4],
				"group"	=> $ret[5],
				"size"	=> $ret[6],
				"date"	=> $ret[7]." ".$ret[8]." ".$ret[9],
				"name"	=> $ret[10]
			);
			$bad=array("(?)");
			if(in_array($v["owner"], $bad)) $v["owner"]=NULL;
			if(in_array($v["group"], $bad)) $v["group"]=NULL;
			$v["perms"]+=00400*(int)($ret[2][0]=="r");
			$v["perms"]+=00200*(int)($ret[2][1]=="w");
			$v["perms"]+=00100*(int)in_array($ret[2][2], array("x","s"));
			$v["perms"]+=00040*(int)($ret[2][3]=="r");
			$v["perms"]+=00020*(int)($ret[2][4]=="w");
			$v["perms"]+=00010*(int)in_array($ret[2][5], array("x","s"));
			$v["perms"]+=00004*(int)($ret[2][6]=="r");
			$v["perms"]+=00002*(int)($ret[2][7]=="w");
			$v["perms"]+=00001*(int)in_array($ret[2][8], array("x","t"));
			$v["perms"]+=04000*(int)in_array($ret[2][2], array("S","s"));
			$v["perms"]+=02000*(int)in_array($ret[2][5], array("S","s"));
			$v["perms"]+=01000*(int)in_array($ret[2][8], array("T","t"));
		} 
		return $v;
	}
	
	function _parselisting($line) {
		$is_windows = ($this->OS_remote == BACKUPLY_FTP_OS_Windows);
		if ($is_windows && preg_match("/([0-9]{2})-([0-9]{2})-([0-9]{2}) +([0-9]{2}):([0-9]{2})(AM|PM) +([0-9]+|<DIR>) +(.+)/",$line,$lucifer)) {
			$b = array();
			if ($lucifer[3]<70) { $lucifer[3]+=2000; } else { $lucifer[3]+=1900; } // 4digit year fix
			$b['isdir'] = ($lucifer[7]=="<DIR>");
			if ( $b['isdir'] )
				$b['type'] = 'd';
			else
				$b['type'] = 'f';
			$b['size'] = $lucifer[7];
			$b['month'] = $lucifer[1];
			$b['day'] = $lucifer[2];
			$b['year'] = $lucifer[3];
			$b['hour'] = $lucifer[4];
			$b['minute'] = $lucifer[5];
			$b['time'] = @mktime($lucifer[4]+(strcasecmp($lucifer[6],"PM")==0?12:0),$lucifer[5],0,$lucifer[1],$lucifer[2],$lucifer[3]);
			$b['am/pm'] = $lucifer[6];
			$b['name'] = $lucifer[8];
		} else if (!$is_windows && $lucifer=preg_split("/[ ]/",$line,9,PREG_SPLIT_NO_EMPTY)) {
			//echo $line."\n";
			$lcount=count($lucifer);
			if ($lcount<8) return '';
			$b = array();
			$b['isdir'] = $lucifer[0][0] === "d";
			$b['islink'] = $lucifer[0][0] === "l";
			if ( $b['isdir'] )
				$b['type'] = 'd';
			elseif ( $b['islink'] )
				$b['type'] = 'l';
			else
				$b['type'] = 'f';
			$b['perms'] = $lucifer[0];
			$b['number'] = $lucifer[1];
			$b['owner'] = $lucifer[2];
			$b['group'] = $lucifer[3];
			$b['size'] = $lucifer[4];
			if ($lcount==8) {
				sscanf($lucifer[5],"%d-%d-%d",$b['year'],$b['month'],$b['day']);
				sscanf($lucifer[6],"%d:%d",$b['hour'],$b['minute']);
				$b['time'] = @mktime($b['hour'],$b['minute'],0,$b['month'],$b['day'],$b['year']);
				$b['name'] = $lucifer[7];
			} else {
				$b['month'] = $lucifer[5];
				$b['day'] = $lucifer[6];
				if (preg_match("/([0-9]{2}):([0-9]{2})/",$lucifer[7],$l2)) {
					$b['year'] = date("Y");
					$b['hour'] = $l2[1];
					$b['minute'] = $l2[2];
					
					// The LS command gives time for the files which are modified in the last 6 months
					// Hence if the time is there it can also be created within the last year but within 6 months
					// e.g. if today is 21st Jan, 2016, LS will show time for files created from 22ND July onwards
					// So we cannot assume the year to be the current year. We simply take the last year
					if(strtotime(sprintf("%d %s %d %02d:%02d",$b['day'],$b['month'],$b['year'],$b['hour'],$b['minute'])) > time()){
						$b['year'] = $b['year'] - 1;
					}
					
				} else {
					$b['year'] = $lucifer[7];
					$b['hour'] = 0;
					$b['minute'] = 0;
				}
				$b['time'] = strtotime(sprintf("%d %s %d %02d:%02d",$b['day'],$b['month'],$b['year'],$b['hour'],$b['minute']));
				$b['name'] = $lucifer[8];
			}
		}
		
		$bad=array("(?)");
		if(in_array($b["owner"], $bad)) $b["owner"]=NULL;
		if(in_array($b["group"], $bad)) $b["group"]=NULL;
		
		$orig_perm = substr($b["perms"], 1);
		$b["perms"] = 0;
		//echo $orig_perm.'-'.(int)($orig_perm[4]=="w").' - '.$b["perms"].'<br>';
		$b["perms"]+=00400*(int)($orig_perm[0]=="r");
		$b["perms"]+=00200*(int)($orig_perm[1]=="w");
		$b["perms"]+=00100*(int)in_array($orig_perm[2], array("x","s"));
		$b["perms"]+=00040*(int)($orig_perm[3]=="r");
		$b["perms"]+=00020*(int)($orig_perm[4]=="w");
		$b["perms"]+=00010*(int)in_array($orig_perm[5], array("x","s"));
		$b["perms"]+=00004*(int)($orig_perm[6]=="r");
		$b["perms"]+=00002*(int)($orig_perm[7]=="w");
		$b["perms"]+=00001*(int)in_array($orig_perm[8], array("x","t"));
		$b["perms"]+=04000*(int)in_array($orig_perm[2], array("S","s"));
		$b["perms"]+=02000*(int)in_array($orig_perm[5], array("S","s"));
		$b["perms"]+=01000*(int)in_array($orig_perm[8], array("T","t"));

		return $b;
	}
	
	function SendMSG($message = "", $crlf=true) {
		if ($this->Verbose) {
			echo $message.($crlf?BACKUPLY_CRLF:"");
			flush();
		}
		return TRUE;
	}

	function SetType($mode=BACKUPLY_FTP_AUTOASCII) {
		if(!in_array($mode, $this->AuthorizedTransferMode)) {
			$this->SendMSG("Wrong type");
			return FALSE;
		}
		$this->_type=$mode;
		$this->SendMSG("Transfer type: ".($this->_type==FTP_BINARY?"binary":($this->_type==FTP_ASCII?"ASCII":"auto ASCII") ) );
		return TRUE;
	}

	function _settype($mode=FTP_ASCII) {
		if($this->_ready) {
			if($mode==FTP_BINARY) {
				if($this->_curtype!=FTP_BINARY) {
					if(!$this->_exec("TYPE I", "SetType")) return FALSE;
					$this->_curtype=FTP_BINARY;
				}
			} elseif($this->_curtype!=FTP_ASCII) {
				if(!$this->_exec("TYPE A", "SetType")) return FALSE;
				$this->_curtype=FTP_ASCII;
			}
		} else return FALSE;
		return TRUE;
	}

	function Passive($pasv=NULL) {
		if(is_null($pasv)) $this->_passive=!$this->_passive;
		else $this->_passive=$pasv;
		if(!$this->_port_available and !$this->_passive) {
			$this->SendMSG("Only passive connections available!");
			$this->_passive=TRUE;
			return FALSE;
		}
		$this->SendMSG("Passive mode ".($this->_passive?"on":"off"));
		return TRUE;
	}

	function SetServer($host, $port=21, $reconnect=true) {
		if(!is_long($port)) {
	        $this->verbose=true;
    	    $this->SendMSG("Incorrect port syntax");
			return FALSE;
		} else {
			$ip=@gethostbyname($host);
	        $dns=@gethostbyaddr($host);
	        if(!$ip) $ip=$host;
	        if(!$dns) $dns=$host;
			// Validate the IPAddress PHP4 returns -1 for invalid, PHP5 false
			// -1 === "255.255.255.255" which is the broadcast address which is also going to be invalid
			$ipaslong = ip2long($ip);
			if ( ($ipaslong == false) || ($ipaslong === -1) ) {
				$this->SendMSG("Wrong host name/address \"".$host."\"");
				return FALSE;
			}
	        $this->_host=$ip;
	        $this->_fullhost=$dns;
	        $this->_port=$port;
	        $this->_dataport=$port-1;
		}
		$this->SendMSG("Host \"".$this->_fullhost."(".$this->_host."):".$this->_port."\"");
		if($reconnect){
			if($this->_connected) {
				$this->SendMSG("Reconnecting");
				if(!$this->quit(BACKUPLY_FTP_FORCE)) return FALSE;
				if(!$this->connect()) return FALSE;
			}
		}
		return TRUE;
	}

	function SetUmask($umask=0022) {
		$this->_umask=$umask;
		umask($this->_umask);
		$this->SendMSG("UMASK 0".decoct($this->_umask));
		return TRUE;
	}

	function SetTimeout($timeout=30) {
		$this->_timeout=$timeout;
		$this->SendMSG("Timeout ".$this->_timeout);
		if($this->_connected)
			if(!$this->_settimeout($this->_ftp_control_sock)) return FALSE;
		return TRUE;
	}

	function connect($server=NULL) {
		if(!empty($server)) {
			if(!$this->SetServer($server)) return false;
		}
		if($this->_ready) return true;
	    $this->SendMsg('Local OS : '.$this->OS_FullName[$this->OS_local]);
		if(!($this->_ftp_control_sock = $this->_connect($this->_host, $this->_port))) {
			$this->SendMSG("Error : Cannot connect to remote host \"".$this->_fullhost." :".$this->_port."\"");
			return FALSE;
		}
		$this->SendMSG("Connected to remote host \"".$this->_fullhost.":".$this->_port."\". Waiting for greeting.");
		do {
			if(!$this->_readmsg()) return FALSE;
			if(!$this->_checkCode()) return FALSE;
			$this->_lastaction=time();
		} while($this->_code<200);
		$this->_ready=true;
		$syst=$this->systype();
		if(!$syst) $this->SendMSG("Can't detect remote OS");
		else {
			if(preg_match("/win|dos|novell/i", $syst[0])) $this->OS_remote=BACKUPLY_FTP_OS_Windows;
			elseif(preg_match("/os/i", $syst[0])) $this->OS_remote=BACKUPLY_FTP_OS_Mac;
			elseif(preg_match("/(li|u)nix/i", $syst[0])) $this->OS_remote=BACKUPLY_FTP_OS_Unix;
			else $this->OS_remote=BACKUPLY_FTP_OS_Mac;
			$this->SendMSG("Remote OS: ".$this->OS_FullName[$this->OS_remote]);
		}
		if(!$this->features()) $this->SendMSG("Can't get features list. All supported - disabled");
		else $this->SendMSG("Supported features: ".implode(", ", array_keys($this->_features)));
		return TRUE;
	}

	function quit($force=false) {
		if($this->_ready) {
			if(!$this->_exec("QUIT") and !$force) return FALSE;
			if(!$this->_checkCode() and !$force) return FALSE;
			$this->_ready=false;
			$this->SendMSG("Session finished");
		}
		$this->_quit();
		return TRUE;
	}

	function login($user=NULL, $pass=NULL) {
		if(!is_null($user)) $this->_login=$user;
		else $this->_login="anonymous";
		if(!is_null($pass)) $this->_password=$pass;
		else $this->_password="anon@anon.com";
		if(!$this->_exec("USER ".$this->_login, "login")) return FALSE;
		if(!$this->_checkCode()) return FALSE;
		if($this->_code!=230) {
			if(!$this->_exec((($this->_code==331)?"PASS ":"ACCT ").$this->_password, "login")) return FALSE;
			if(!$this->_checkCode()) return FALSE;
		}
		$this->SendMSG("Authentication succeeded");
		if(empty($this->_features)) {
			if(!$this->features()) $this->SendMSG("Can't get features list. All supported - disabled");
			else $this->SendMSG("Supported features: ".implode(", ", array_keys($this->_features)));
		}
		return TRUE;
	}

	function pwd() {
		if(!$this->_exec("PWD", "pwd")) return FALSE;
		if(!$this->_checkCode()) return FALSE;
		//return ereg_replace("^[0-9]{3} \"(.+)\" .+".BACKUPLY_CRLF, "\\1", $this->_message);
		return trim(preg_replace("/^[0-9]{3} \"(.+)\" .+".BACKUPLY_CRLF."/", "\\1", $this->_message));
	}

	function cdup() {
		if(!$this->_exec("CDUP", "cdup")) return FALSE;
		if(!$this->_checkCode()) return FALSE;
		return true;
	}

	function chdir($pathname) {
		if(!$this->_exec("CWD ".$pathname, "chdir")) return FALSE;
		if(!$this->_checkCode()) return FALSE;
		return TRUE;
	}

	function rmdir($pathname) {
		if(!$this->_exec("RMD ".$pathname, "rmdir")) return FALSE;
		if(!$this->_checkCode()) return FALSE;
		return TRUE;
	}

	function mkdir($pathname) {
		if($pathname == "/" ) return TRUE;
		if(!$this->_exec("MKD ".$pathname, "mkdir")) return FALSE;
		if(!$this->_checkCode()) return FALSE;
		return TRUE;
	}

	function rename($from, $to) {
		if($pathname == "/") return TRUE;
		if(!$this->_exec("RNFR ".$from, "rename")) return FALSE;
		if(!$this->_checkCode()) return FALSE;
		if($this->_code==350) {
			if(!$this->_exec("RNTO ".$to, "rename")) return FALSE;
			if(!$this->_checkCode()) return FALSE;
		} else return FALSE;
		return TRUE;
	}

	function filesize($pathname) {
		if(!isset($this->_features["SIZE"])) {
			$this->PushError("filesize", "not supported by server");
			return FALSE;
		}
		if(!$this->_exec("SIZE ".$pathname, "filesize")) return FALSE;
		if(!$this->_checkCode()) return FALSE;
		return preg_replace("/^[0-9]{3} ([0-9]+).*$/s", "\\1", $this->_message);
	}

	function abort() {
		if(!$this->_exec("ABOR", "abort")) return FALSE;
		if(!$this->_checkCode()) {
			if($this->_code!=426) return FALSE;
			if(!$this->_readmsg("abort")) return FALSE;
			if(!$this->_checkCode()) return FALSE;
		}
		return true;
	}

	function mdtm($pathname) {
		if(!isset($this->_features["MDTM"])) {
			$this->PushError("mdtm", "not supported by server");
			return FALSE;
		}
		if(!$this->_exec("MDTM ".$pathname, "mdtm")) return FALSE;
		if(!$this->_checkCode()) return FALSE;
		$mdtm = preg_replace("/^[0-9]{3} ([0-9]+).*$/s", "\\1", $this->_message);
		$date = sscanf($mdtm, "%4d%2d%2d%2d%2d%2d");
		$timestamp = mktime($date[3], $date[4], $date[5], $date[1], $date[2], $date[0]);
		return $timestamp;
	}

	function systype() {
		if(!$this->_exec("SYST", "systype")) return FALSE;
		if(!$this->_checkCode()) return FALSE;
		$DATA = explode(" ", $this->_message);
		return array($DATA[1], $DATA[3]);
	}

	function delete($pathname) {
		if(!$this->_exec("DELE ".$pathname, "delete")) return FALSE;
		if(!$this->_checkCode()) return FALSE;
		return TRUE;
	}

	function site($command, $fnction="site") {
		if(!$this->_exec("SITE ".$command, $fnction)) return FALSE;
		if(!$this->_checkCode()) return FALSE;
		return TRUE;
	}

	function chmod($pathname, $mode) {
		if(!$this->site("CHMOD ".decoct($mode)." ".$pathname, "chmod")) return FALSE;
		return TRUE;
	}
	
	function utime($pathname, $mtime) {
		$this->site("UTIME ".$mtime." ".$pathname, "utime"); // Try to set the mtime if UTIME command is supported by FTP
		return TRUE;
	}

	function restore($from) {
		if(!isset($this->_features["REST"])) {
			$this->PushError("restore", "not supported by server");
			return FALSE;
		}
		if($this->_curtype!=FTP_BINARY) {
			$this->PushError("restore", "can't restore in ASCII mode");
			return FALSE;
		}
		if(!$this->_exec("REST ".$from, "resore")) return FALSE;
		if(!$this->_checkCode()) return FALSE;
		return TRUE;
	}

	function features() {
		if(!$this->_exec("FEAT", "features")) return FALSE;
		if(!$this->_checkCode()) return FALSE;
		$f=array_slice(preg_split("/[".BACKUPLY_CRLF."]+/", $this->_message, -1, PREG_SPLIT_NO_EMPTY), 1, -1);
		array_walk($f, function(&$a){
			$a = preg_replace("/[0-9]{3}[\s-]+/", '', trim($a));
		});
		$this->_features=array();
		foreach($f as $k=>$v) {
			$v=explode(" ", trim($v));
			$this->_features[array_shift($v)]=$v;
		}
		return true;
	}

	function rawlist($pathname="", $arg="") {
		return $this->_list(($arg?" ".$arg:"").($pathname?" ".$pathname:""), "LIST", "rawlist");
	}

	function nlist($pathname="") {
		return $this->_list(($arg?" ".$arg:"").($pathname?" ".$pathname:""), "NLST", "nlist");
	}

	function is_exists($pathname) {
		if($pathname == "/") return TRUE;
		return $this->file_exists($pathname);
	}

	function file_exists($pathname) {
		if($pathname == "/") return TRUE;
		$exists=true;
		if(!$this->_exec("RNFR ".$pathname, "rename")) $exists=FALSE;
		else {
		
			if($this->_code==350) {
				$this->_exec("RNTO ".$pathname, "rename");
			}
			
			if(!$this->_checkCode()) $exists=FALSE;
			//$this->abort();
		}
		if($exists) $this->SendMSG("Remote file ".$pathname." exists");
		else $this->SendMSG("Remote file ".$pathname." does not exist");
		return $exists;
	}
	
	function is_dir($dir){
			
		////////////////////////////////////////////
		// Change Directory to the path in question
		// To find if its a directory or not
		////////////////////////////////////////////
		
		// Get current directory	
		$original_directory = $this->pwd();
			
		// If it is a directory
		if($this->chdir($dir)){
			
			// Change the directory back to the original directory
			$this->chdir($original_directory);	
			return true;
			
		// It must be a non existing DIR
		}else{
			return false;
		}
		
	}

	function get($remotefile, $localfile=NULL, $rest=0) {
		if(is_null($localfile)) $localfile=$remotefile;
		if (@file_exists($localfile)) $this->SendMSG("Warning : local file will be overwritten");
		$fp = @fopen($localfile, 'ab');
		if (!$fp) {
			$this->PushError("get","Can't open local file. Cannot create \"".$localfile."\"", "Cannot create \"".$localfile."\"");
			return FALSE;
		}
		if($this->_can_restore and $rest!=0) fseek($fp, $rest);
		$pi=pathinfo($remotefile);
		if($this->_type==FTP_ASCII or ($this->_type==BACKUPLY_FTP_AUTOASCII and in_array(strtoupper($pi["extension"]), $this->AutoAsciiExt))) $mode=FTP_ASCII;
		else $mode=FTP_BINARY;
		if(!$this->_data_prepare($mode)) {
			fclose($fp);
			return FALSE;
		}
		if($this->_can_restore and $rest!=0) $this->restore($rest);
		if(!$this->_exec("RETR ".$remotefile, "get")) {
			$this->_data_close();
			fclose($fp);
			return FALSE;
		}
		if(!$this->_checkCode()) {
			$this->_data_close();
			fclose($fp);
			return FALSE;
		}
		$out=$this->_data_read($mode, $fp);
		fclose($fp);
		$this->_data_close();
		if(!$this->_readmsg()) return FALSE;
		if(!$this->_checkCode()) return FALSE;
		return $out;
	}

	function pget($remotefile, $localfile=NULL, $rest=0) {
		
		if(is_null($localfile)) $localfile=$remotefile;
		if (@file_exists($localfile)) $this->SendMSG("Warning : local file will be overwritten");
		$fp = @fopen($localfile, 'ab');
		if (!$fp) {
			$this->PushError("get","Can't open local file. Cannot create \"".$localfile."\"", "Cannot create \"".$localfile."\"");
			return FALSE;
		}
		if($this->_can_restore and $rest!=0) fseek($fp, $rest);
		$pi=pathinfo($remotefile);
		if($this->_type==FTP_ASCII or ($this->_type==BACKUPLY_FTP_AUTOASCII and in_array(strtoupper($pi["extension"]), $this->AutoAsciiExt))) $mode=FTP_ASCII;
		else $mode=FTP_BINARY;
		if(!$this->_data_prepare($mode)) {
			fclose($fp);
			return FALSE;
		}
		if($this->_can_restore and $rest!=0) $this->restore($rest);
		if(!$this->_exec("RETR ".$remotefile, "get")) {
			$this->_data_close();
			fclose($fp);
			return FALSE;
		}
		if(!$this->_checkCode()) {
			$this->_data_close();
			fclose($fp);
			return FALSE;
		}
		$out=$this->_pdata_read($mode, $fp);
		fclose($fp);
		$this->_data_close();
		if(!$this->_readmsg()) return FALSE;
		if(!$this->_checkCode()) return FALSE;
		return $out;
	}

	function put($localfile, $remotefile=NULL, $rest=0) {
		
		// Check last file and skip the files that have been already transferred...
		if(!empty($GLOBALS['last_file']) && $GLOBALS['start'] == 0){
			if(preg_match('#^'.$GLOBALS['last_file'].'$#', $localfile)){
				$GLOBALS['start'] = 1; // give a jump start once the last transferred file is found..
			}
			return true; //return true to skip files
		}
		
		if(is_null($remotefile)) $remotefile=$localfile;
		if (!@file_exists($localfile)) {
			$this->PushError("put","Can't open local file. No such file or directory \"".$localfile."\"", "No such file or directory \"".$localfile."\"");
			return FALSE;
		}
		$fp = @fopen($localfile, "r");
		if (!$fp) {
			$this->PushError("put","Can't open local file. Cannot read file \"".$localfile."\"", "Cannot read file \"".$localfile."\"");
			return FALSE;
		}
		if($this->_can_restore and $rest!=0) fseek($fp, $rest);
		$pi=pathinfo($localfile);
		if($this->_type==FTP_ASCII or ($this->_type==BACKUPLY_FTP_AUTOASCII and in_array(strtoupper($pi["extension"]), $this->AutoAsciiExt))) $mode=FTP_ASCII;
		else $mode=FTP_BINARY;
		if(!$this->_data_prepare($mode)) {
			fclose($fp);
			return FALSE;
		}
		if($this->_can_restore and $rest!=0) $this->restore($rest);
		if(!$this->_exec("STOR ".$remotefile, "put")) {
			$this->_data_close();
			fclose($fp);
			return FALSE;
		}
		if(!$this->_checkCode()) {
			$this->_data_close();
			fclose($fp);
			return FALSE;
		}
		$ret=$this->_data_write($mode, $fp);
		fclose($fp);
		$this->_data_close();
		if(!$this->_readmsg()) return FALSE;
		if(!$this->_checkCode()) return FALSE;
		
		//We can run the scripts for the end time already set
		if(time() >= $GLOBALS['end']){
			$GLOBALS['end_file'] = $localfile; // set end file so that we know where to start from
		}
		
		return $ret;
	}

	function mput($local=".", $remote=NULL, $continious=false, $include_only=array()) {
		
		global $__settings, $ftp;
		
		 if(!@$ftp->is_dir($remote)) {
			if(!@$ftp->mkdir($remote)) {
				$this->PushError("mput", "Can't create folder. Can't create remote file \"".$remote."\"", "Can't create remote file \"".$remote."\"");
				return FALSE;
			}
		}

		$list = filelist_fn($local, 0);
		
		if($list===false) {
			$this->PushError("mput", "Can't retrive directory listing of local folder \"".$local."\"", "Can't retrive directory listing of local folder \"".$local."\"");
			return FALSE;
		}
		
		if(empty($list)) return TRUE;
		
		foreach($list as $k=>$v) {
			$stat = stat($k);			
			if($v['dir'] == '0'){
				$list[$k]['type'] = 'f';
			}else{
				$list[$k]['type'] = 'd';
			}
			$list[$k]['name'] = $v['name'];
			$list[$k]['size'] = $stat['size'];
			$list[$k]['perms'] = octdec(substr(sprintf('%o', $stat['mode']), -4));
			$list[$k]['time'] = date('YmdHis', $stat['mtime']);
			
			if($list[$k]["name"]=="." or $list[$k]["name"]=="..") unset($list[$k]);
		}
		$ret=true;
		
		foreach($list as $ek => $el) {
			
			// ----- break the loop once last file is found...
			if(!empty($GLOBALS['end_file'])){
				break;
			}
				
			if($el['size'] == '0'){
				if($el['type'] == 'f'){
					//Create an empty file
					if(!$this->put($local."/".$el["name"], $remote."/".$el["name"])) {
						$this->PushError("mput", "Can't copy local file \"".$local."/".$el["name"]."\" to remote \"".$remote."/".$el["name"]."\"", "Can't copy local file \"".$local."/".$el["name"]."\" to remote \"".$remote."/".$el["name"]."\"");
						$ret=false;
						if(!$continious) break;
					}
				}elseif($el['type'] == 'd'){
					$ftp->mkdir($remote.'/'.$el['name']);
				}
				@$ftp->chmod($remote.'/'.$el['name'], $el['perms']);
			
				//Set modified time 
				$t=$el["time"];
				if($t!==-1 and $t!==false){
					$ftp->utime($remote.'/'.$el['name'], $el["time"]);
				}
			
				unset($list[$ek]);
				continue;
			}
			
			$extension = get_extension($el['name']);
			if(!empty($include_only) && !in_array($el['name'], $include_only) && $extension !== 'sql'){
				unset($list[$ek]);
				continue;
			}
			
			$current_file = $el["path"].$el["name"];
			//To exclude some files/folder
			if(!empty($__settings['exclude_files']) && in_array($current_file, $__settings['exclude_files'])){
				unset($list[$ek]);
				continue;
			}
			
			if($el["type"]=="d") {
				if(!$this->mput($local."/".$el["name"], $remote."/".$el["name"], $continious)){
					$this->PushError("mput", "Can't copy local folder \"".$local."/".$el["name"]."\" to remote \"".$remote."/".$el["name"]."\"", "Can't copy local folder \"".$local."/".$el["name"]."\" to remote \"".$remote."/".$el["name"]."\"");
					$ret=false;
					if(!$continious) break;
				}
			}else{
				//To exclude some files if set in script's clone.php's __pre_unzip() function
				if(!empty($__settings['exclude_ext']) && in_array($extension, $__settings['exclude_ext'])){
					unset($list[$ek]);
					continue;
				}
				
				if(!$this->put($local."/".$el["name"], $remote."/".$el["name"])) {
					$this->PushError("mput", "Can't copy local file \"".$local."/".$el["name"]."\" to remote \"".$remote."/".$el["name"]."\"", "Can't copy local file \"".$local."/".$el["name"]."\" to remote \"".$remote."/".$el["name"]."\"");
					$ret=false;
					if(!$continious) break;
				}
				
				
			}
			
			@$ftp->chmod($remote."/".$el["name"], $el["perms"]);
			
			//Set modified time 
			$t=$el["time"];
			if($t!==-1 and $t!==false){
				$ftp->utime($remote.'/'.$el['name'], $el["time"]);
			}
			
		}
		return $ret;
		
	}

	function mget($remote, $local=".", $continious=false, $include_only=array()) {
		
		global $__settings;
		
		if(!@file_exists($local)) {
			if(!@mkdir($local)) {
				$this->PushError("mget","Can't create local folder \"".$local."\"", "Cannot create folder \"".$local."\"");
				return FALSE;
			}
		}
		
		$list=$this->rawlist($remote, "-lA");
		
		if($list===false) {
			$this->PushError("mget","Can't read remote folder list. Can't read remote folder \"".$remote."\" contents", "Can't read remote folder \"".$remote."\" contents");
			return FALSE;
		}
		
		if(empty($list)) return true;
		
		foreach($list as $k=>$v) {
			$list[$k]=$this->_parselisting($v);
			if($list[$k]["name"]=="." or $list[$k]["name"]=="..") unset($list[$k]);
		}
		$ret=true;
		
		foreach($list as $ek => $el) {
		
			if($el['size'] == '0'){
				if($el['type'] == 'f'){
					$empty_file = @fopen($local.'/'.$el['name'], "w");
					@fclose($empty_file);
				}elseif($el['type'] == 'd'){
					mkdir($local.'/'.$el['name']);
				}
				@chmod($local.'/'.$el['name'], $el['perms']);
				
				$t=$el["time"];
				//echo 'Path :'.$local."/".$el["name"].' Date : '.$el["date"].' Strtotime : '.$t.'<br />';
				if($t!==-1 and $t!==false) @touch($local."/".$el["name"], $t);
			
				unset($list[$ek]);
				continue;
			}
			
			$extension = get_extension($el['name']);
			if(!empty($include_only) && !in_array($el['name'], $include_only) && $extension !== 'sql'){
				unset($list[$ek]);
				continue;
			}
			
			$current_file = $el["path"].$el["name"];
			//To exclude some files/folder
			if(!empty($__settings['exclude_files']) && in_array($current_file, $__settings['exclude_files'])){
				unset($list[$ek]);
				continue;
			}
			
			if($el["type"]=="d") {
				if(!$this->mget($remote."/".$el["name"], $local."/".$el["name"], $continious)) {
					$this->PushError("mget", "Can't copy remote folder \"".$remote."/".$el["name"]."\" to local \"".$local."/".$el["name"]."\"", "Can't copy remote folder \"".$remote."/".$el["name"]."\" to local \"".$local."/".$el["name"]."\"");
					$ret=false;
					if(!$continious) break;
				}
			} else {
				
				//To exclude some files if set in script's clone.php's __pre_unzip() function
				if(!empty($__settings['exclude_ext']) && in_array($extension, $__settings['exclude_ext'])){
					unset($list[$ek]);
					continue;
				}
			
				if(!$this->get($remote."/".$el["name"], $local."/".$el["name"])) {
					$this->PushError("mget", "Can't copy remote file \"".$remote."/".$el["name"]."\" to local \"".$local."/".$el["name"]."\"", "Can't copy remote file \"".$remote."/".$el["name"]."\" to local \"".$local."/".$el["name"]."\"");
					$ret=false;
					if(!$continious) break;
				}
			}
			@chmod($local."/".$el["name"], $el["perms"]);
			
			$t=$el["time"];
			//echo 'Path :'.$local."/".$el["name"].' Date : '.$el["date"].' Strtotime : '.$t.'<br />';
			if($t!==-1 and $t!==false) @touch($local."/".$el["name"], $t);
		}
		return $ret;
	}

	function mdel($remote, $continious=false) {
		$list=$this->rawlist($remote, "-la");
		if($list===false) {
			$this->PushError("mdel","Can't read remote folder list. Can't read remote folder \"".$remote."\" contents", "Can't read remote folder \"".$remote."\" contents");
			return false;
		}
	
		foreach($list as $k=>$v) {
			$list[$k]=$this->parselisting($v);
			if($list[$k]["name"]=="." or $list[$k]["name"]=="..") unset($list[$k]);
		}
		$ret=true;
	
		foreach($list as $el) {
			if($el["type"]=="d") {
				if(!$this->mdel($remote."/".$el["name"], $continious)) {
					$ret=false;
					if(!$continious) break;
				}
			} else {
				if (!$this->delete($remote."/".$el["name"])) {
					$this->PushError("mdel", "Can't delete remote file \"".$remote."/".$el["name"]."\"", "Can't delete remote file \"".$remote."/".$el["name"]."\"");
					$ret=false;
					if(!$continious) break;
				}
			}
		}
	
		if(!$this->rmdir($remote)) {
			$this->PushError("mdel", "Can't delete remote folder \"".$remote."/".$el["name"]."\"", "Can't delete remote folder \"".$remote."/".$el["name"]."\"");
			$ret=false;
		}
		return $ret;
	}

	function mmkdir($dir, $mode = 0777) {
		if(empty($dir)) return FALSE;
		if($this->is_exists($dir) or $dir == "/" ) return TRUE;
		if(!$this->mmkdir(dirname($dir), $mode)) return false;
		$r=$this->mkdir($dir, $mode);
		$this->chmod($dir,$mode);
		return $r;
	}

	function glob($pattern, $handle=NULL) {
		$path=$output=null;
		if(PHP_OS=='WIN32') $slash='\\';
		else $slash='/';
		$lastpos=strrpos($pattern,$slash);
		if(!($lastpos===false)) {
			$path=substr($pattern,0,-$lastpos-1);
			$pattern=substr($pattern,$lastpos);
		} else $path=getcwd();
		if(is_array($handle) and !empty($handle)) {
			while($dir=each($handle)) {
				if($this->glob_pattern_match($pattern,$dir))
				$output[]=$dir;
			}
		} else {
			$handle=@opendir($path);
			if($handle===false) return false;
			while($dir=readdir($handle)) {
				if($this->glob_pattern_match($pattern,$dir))
				$output[]=$dir;
			}
			closedir($handle);
		}
		if(is_array($output)) return $output;
		return false;
	}

	function glob_pattern_match($pattern,$string) {
		$out=null;
		$chunks=explode(';',$pattern);
		foreach($chunks as $pattern) {
			$escape=array('$','^','.','{','}','(',')','[',']','|');
			while(strpos($pattern,'**')!==false)
				$pattern=str_replace('**','*',$pattern);
			foreach($escape as $probe)
				$pattern=str_replace($probe,"\\$probe",$pattern);
			$pattern=str_replace('?*','*',
				str_replace('*?','*',
					str_replace('*',".*",
						str_replace('?','.{1,1}',$pattern))));
			$out[]=$pattern;
		}
		if(count($out)==1) return($this->glob_regexp("^$out[0]$",$string));
		else {
			foreach($out as $tester)
				if($this->my_regexp("^$tester$",$string)) return true;
		}
		return false;
	}

	function glob_regexp($pattern,$probe) {
		$sensitive=(PHP_OS!='WIN32');
		return ($sensitive?
			ereg($pattern,$probe):
			eregi($pattern,$probe)
		);
	}
// <!-- --------------------------------------------------------------------------------------- -->
// <!--       Private functions                                                                 -->
// <!-- --------------------------------------------------------------------------------------- -->
	function _checkCode() {
		return ($this->_code<400 and $this->_code>0);
	}

	function _list($arg="", $cmd="LIST", $fnction="_list") {
		if(!$this->_data_prepare()) return false;
		if(!$this->_exec($cmd.$arg, $fnction)) {
			$this->_data_close();
			return FALSE;
		}
		if(!$this->_checkCode()) {
			$this->_data_close();
			return FALSE;
		}
		$out="";
		if($this->_code<200) {
			$out=$this->_data_read();
			$this->_data_close();
			if(!$this->_readmsg()) return FALSE;
			if(!$this->_checkCode()) return FALSE;
			if($out === FALSE ) return FALSE;
			$out=preg_split("/[".BACKUPLY_CRLF."]+/", $out, -1, PREG_SPLIT_NO_EMPTY);
//			$this->SendMSG(implode($this->_eol_code[$this->OS_local], $out));
		}
		return $out;
	}

// <!-- --------------------------------------------------------------------------------------- -->
// <!-- Partie : gestion des erreurs                                                            -->
// <!-- --------------------------------------------------------------------------------------- -->
// Génère une erreur pour traitement externe à la classe
	function PushError($fctname,$msg,$desc=false){
		$error=array();
		$error['msg'] = '';
		//FTP Session Timeout
		if($this->_code == 421){
			$error['msg'] .= 'FTP Session Timeout!! ';
		}
		$error['time']=time();
		$error['fctname']=$fctname;
		$error['msg'] .= $msg;
		$error['desc']=$desc;		
		if($desc) $tmp=' ('.$desc.')'; else $tmp='';
		$this->SendMSG($fctname.': '.$msg.$tmp);
		array_push($this->_error_array,$error);
		return(array_push($this->error, $error['msg']));
	}
	
// Récupère une erreur externe
	function PopError(){
		if(count($this->_error_array)) return(array_pop($this->_error_array));
			else return(false);
	}
}


class ftp extends ftp_base {
	
	var $offset = 0;
	var $filesize = 0;
	var $orig_path = '';

	function ftp($verb=FALSE, $le=FALSE) {
		$this->__construct($verb, $le);
	}

	function __construct($verb=FALSE, $le=FALSE) {
		parent::__construct(false, $verb, $le);
	}

// <!-- --------------------------------------------------------------------------------------- -->
// <!--       Private functions                                                                 -->
// <!-- --------------------------------------------------------------------------------------- -->

	function _settimeout($sock) {
		if(!@stream_set_timeout($sock, $this->_timeout)) {
			$this->PushError('_settimeout','socket set send timeout');
			$this->_quit();
			return FALSE;
		}
		return TRUE;
	}

	function _connect($host, $port) {
		$this->SendMSG("Creating socket");
		$sock = @fsockopen($host, $port, $errno, $errstr, $this->_timeout);
		if (!$sock) {
			$this->PushError("_connect","Socket connect failed. ".$errstr." (".$errno.")", $errstr." (".$errno.")");
			return FALSE;
		}
		$this->_connected=true;
		return $sock;
	}

	function _readmsg($fnction="_readmsg"){
		if(!$this->_connected) {
			$this->PushError($fnction, 'Connect first');
			return FALSE;
		}
		$result=true;
		$this->_message="";
		$this->_code=0;
		$go=true;
		do {
			$tmp=@fgets($this->_ftp_control_sock, 512);
			if($tmp===false) {
				$go=$result=false;
				$this->PushError($fnction,'Read failed');
			} else {
				$this->_message.=$tmp;
				if(preg_match("/^([0-9]{3})(-(.*[".BACKUPLY_CRLF."]{1,2})+\\1)? [^".BACKUPLY_CRLF."]+[".BACKUPLY_CRLF."]{1,2}$/", $this->_message, $regs)) $go=false;
			}
		} while($go);
		if($this->LocalEcho) echo "GET < ".rtrim($this->_message, BACKUPLY_CRLF).BACKUPLY_CRLF;
		$this->_code=(int)$regs[1];
		return $result;
	}

	function _exec($cmd, $fnction="_exec") {
		if(!$this->_ready) {
			$this->PushError($fnction,'Connect first');
			return FALSE;
		}
		if($this->LocalEcho) echo "PUT > ",$cmd,BACKUPLY_CRLF;
		$status=@fputs($this->_ftp_control_sock, $cmd.BACKUPLY_CRLF);
		if($status===false) {
			$this->PushError($fnction,'socket write failed');
			return FALSE;
		}
		$this->_lastaction=time();
		if(!$this->_readmsg($fnction)) return FALSE;
		return TRUE;
	}

	function _data_prepare($mode=FTP_ASCII) {
		if(!$this->_settype($mode)) return FALSE;
		if($this->_passive) {
			if(!$this->_exec("PASV", "pasv")) {
				$this->_data_close();
				return FALSE;
			}
			if(!$this->_checkCode()) {
				$this->_data_close();
				return FALSE;
			}
			
			//$ip_port = explode(",", ereg_replace("^.+ \\(?([0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]+,[0-9]+)\\)?.*".BACKUPLY_CRLF."$", "\\1", $this->_message));
			
			$ip_port = explode(",", preg_replace("/^.+ \\(?([0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]+,[0-9]+)\\)?.*".BACKUPLY_CRLF."$/s", "\\1", $this->_message));
			
			$this->_datahost=$ip_port[0].".".$ip_port[1].".".$ip_port[2].".".$ip_port[3];
            $this->_dataport=(((int)$ip_port[4])<<8) + ((int)$ip_port[5]);
			$this->SendMSG("Connecting to ".$this->_datahost.":".$this->_dataport);
			$this->_ftp_data_sock=@fsockopen($this->_datahost, $this->_dataport, $errno, $errstr, $this->_timeout);
			if(!$this->_ftp_data_sock) {
				$this->PushError("_data_prepare","fsockopen fails. ".$errstr." (".$errno.")", $errstr." (".$errno.")");
				$this->_data_close();
				return FALSE;
			}
			else $this->_ftp_data_sock;
		} else {
			$this->SendMSG("Only passive connections available!");
			return FALSE;
		}
		return TRUE;
	}
	
	// Just so that we can connect everywhere
	function init($path){
		global $error;

		if(!preg_match('/ftp:\/\//i', $path)){
			return false;
		}
		
		$url = parse_url($path);
		
		// By default the port is 21
		if(empty($url['port'])){
			$url['port'] = 21;
		}
		
		if(!$this->SetServer($url['host'], $url['port'])) {
			$this->quit();
			$error[] = 'There was an issue Connecting to the FTP server!';
			return false;
		}
		
		if(!$this->connect()){
			$error[] = 'Unable to connect to FTP Server';
			return false;
		}
		
		if(!$this->login(rawurldecode($url['user']), rawurldecode($url['pass']))){
			$this->quit();
			$error[] = 'There was an issue logging in to FTP!';
			return false;
		}
		
		$this->Passive(TRUE);

		return true;
	}
	
	//Downloads files to local server
	function download_file_loop($source, $dest, $startpos = 0){
		global $data, $error;

		if(!$this->init($source)){
			return false;
		}

		$file_size = $data['size'];
		$url = parse_url($source);
		
		//backuply_log('Downloaded (L'.$data['restore_loop'].') : '.$startpos.' / '.$data['size']);

		if($startpos < $file_size) {
			
			$block = $this->pget($url['path'], $dest, $startpos);
			backuply_log('BLOCK : '.$block);
			
			$startpos += $block;
		
			$percentage = ($startpos / $data['size']) * 100;
			backuply_status_log('<div class="backuply-upload-progress"><span class="backuply-upload-progress-bar" style="width:'.round($percentage).'%;"></span><span class="backuply-upload-size">'.round($percentage).'%</span></div>', 'downloading', 22);
		}
		
		$GLOBALS['l_readbytes'] = filesize($dest);
		
		return;
	}

	function _data_read($mode=FTP_ASCII, $fp=NULL) {
		if(is_resource($fp)) $out=0;
		else $out="";
		if(!$this->_passive) {
			$this->SendMSG("Only passive connections available!");
			return FALSE;
		}
		while (!feof($this->_ftp_data_sock)) {
			$block=fread($this->_ftp_data_sock, $this->_ftp_buff_size);
			if($mode!=FTP_BINARY) $block=preg_replace("/\r\n|\r|\n/", $this->_eol_code[$this->OS_local], $block);
			if(is_resource($fp)){
				$out += fwrite($fp, $block, strlen($block));
			}
			else{
				$out.=$block;
			}
		}
		
		return $out;
	}

	function _pdata_read($mode=FTP_ASCII, $fp=NULL) {
		if(is_resource($fp)) $out=0;
		else $out="";
		if(!$this->_passive) {
			$this->SendMSG("Only passive connections available!");
			return FALSE;
		}
		while (!feof($this->_ftp_data_sock)) {
			
			//leave if about to hit timeout
			if(time() + 5 >= $GLOBALS['end']){
				backuply_log('FTP Download: Short on Time!');
				break;
			}
			
			$block=fread($this->_ftp_data_sock, $this->_ftp_buff_size);
			
			if(empty($block)){
				global $error;
				$error[] = 'Download failed! Not receiving any data from the Server';
				break;
			}
			
			if($mode!=FTP_BINARY) $block=preg_replace("/\r\n|\r|\n/", $this->_eol_code[$this->OS_local], $block);
			if(is_resource($fp)){
				$out += fwrite($fp, $block, strlen($block));
			}
			else{
				$out.=$block;
			}
			
		}
		
		return $out;
	}
	
	function _data_write($mode=FTP_ASCII, $fp=NULL) {
		if(is_resource($fp)) $out=0;
		else $out="";
		if(!$this->_passive) {
			$this->SendMSG("Only passive connections available!");
			return FALSE;
		}
		if(is_resource($fp)) {
			while(!feof($fp)) {
				$block=fread($fp, $this->_ftp_buff_size);
				if(!$this->_data_write_block($mode, $block)) return false;
			}
		} elseif(!$this->_data_write_block($mode, $fp)) return false;
		return TRUE;
	}

	function _data_write_block($mode, $block) {
		if($mode!=FTP_BINARY) $block=preg_replace("/\r\n|\r|\n/", $this->_eol_code[$this->OS_remote], $block);
		do {
			if(($t=@fwrite($this->_ftp_data_sock, $block))===FALSE) {
				$this->PushError("_data_write","Can't write to socket");
				return FALSE;
			}
			$block=substr($block, $t);
		} while(!empty($block));
		return true;
	}

	function _data_close() {
		@fclose($this->_ftp_data_sock);
		$this->SendMSG("Disconnected data from remote host");
		return TRUE;
	}

	function _quit($force=FALSE) {
		if($this->_connected or $force) {
			@fclose($this->_ftp_control_sock);
			$this->_connected=false;
			$this->SendMSG("Socket closed");
		}
	}
	
	// Takes the DATA rather than the LOCAL file name
	function softput($remotefile=NULL, $softdata, $rest=0) {
		$pi=pathinfo($remotefile);
		if($this->_type==FTP_ASCII or ($this->_type==BACKUPLY_FTP_AUTOASCII and in_array(strtoupper($pi["extension"]), $this->AutoAsciiExt))) $mode=FTP_ASCII;
		else $mode=FTP_BINARY;
		if(!$this->_data_prepare($mode)) {
			return FALSE;
		}
		if($this->_can_restore and $rest!=0) $this->restore($rest);
		if(!$this->_exec("STOR ".$remotefile, "put")) {
			$this->_data_close();
			return FALSE;
		}
		if(!$this->_checkCode()) {
			$this->_data_close();
			return FALSE;
		}
		$ret=$this->_data_write($mode, $softdata);
		$this->_data_close();
		if(!$this->_readmsg()) return FALSE;
		if(!$this->_checkCode()) return FALSE;
		return $ret;
	}
	
}


lib/bcloud.php000064400000321661151526424670007320 0ustar00<?php
/**
* $Id$
*
* Copyright (c) 2013, Donovan Schönknecht.  All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
*   this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright
*   notice, this list of conditions and the following disclaimer in the
*   documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* Amazon S3 is a trademark of Amazon.com, Inc. or its affiliates.
*/

/**
* Amazon S3 PHP class
*
* @link http://undesigned.org.za/2007/10/22/amazon-s3-php-class
* @version 0.5.1
*/

/*
* For the methods: uploadPart(), completeMultipartUpload(), abortMultipartUpload(), and initiateMultipartUpload() :
* Copyright (c) 2012–2022, David Anderson (https://david.dw-perspective.org.uk). All rights reserved.
*/

define('BACKUPLY_AWS_CHUNK_SIZE', 5242880); //5MB NOTE: If you increase this update it in remote_upload fn of backup_ins.php as well
define('BACKUPLY_AWS_CHUNK_COUNT_LIMIT', 10000); //10k Chunk Limit

class S3
{
	// ACL flags
	const ACL_PRIVATE = 'private';
	const ACL_PUBLIC_READ = 'public-read';
	const ACL_PUBLIC_READ_WRITE = 'public-read-write';
	const ACL_AUTHENTICATED_READ = 'authenticated-read';

	const STORAGE_CLASS_STANDARD = 'STANDARD';
	const STORAGE_CLASS_RRS = 'REDUCED_REDUNDANCY';
	const STORAGE_CLASS_STANDARD_IA = 'STANDARD_IA';

	const SSE_NONE = '';
	const SSE_AES256 = 'AES256';

	/**
	 * The AWS Access key
	 *
	 * @var string
	 * @access private
	 * @static
	 */
	private static $__accessKey = null;

	/**
	 * AWS Secret Key
	 *
	 * @var string
	 * @access private
	 * @static
	 */
	private static $__secretKey = null;

	/**
	 * SSL Client key
	 *
	 * @var string
	 * @access private
	 * @static
	 */
	private static $__sslKey = null;

	/**
	 * Default delimiter to be used, for example while getBucket().
	 * @var string
	 * @access public
	 * @static 
	 */
	public static $defDelimiter = null;

	/**
	 * AWS URI
	 *
	 * @var string
	 * @acess public
	 * @static
	 */
	public static $endpoint = 's3.amazonaws.com';

	/**
	 * AWS Region
	 *
	 * @var string
	 * @acess public
	 * @static
	 */
	public static $region = '';

	/**
	 * Proxy information
	 *
	 * @var null|array
	 * @access public
	 * @static
	 */
	public static $proxy = null;

	/**
	 * Connect using SSL?
	 *
	 * @var bool
	 * @access public
	 * @static
	 */
	public static $useSSL = true;

	/**
	 * Use SSL validation?
	 *
	 * @var bool
	 * @access public
	 * @static
	 */
	public static $useSSLValidation = true;

	/**
	 * Use SSL version
	 *
	 * @var const
	 * @access public
	 * @static
	 */
	public static $useSSLVersion = CURL_SSLVERSION_TLSv1;

	/**
	 * Use PHP exceptions?
	 *
	 * @var bool
	 * @access public
	 * @static
	 */
	public static $useExceptions = false;

	/**
	 * Time offset applied to time()
	 * @access private
	 * @static
	 */
	private static $__timeOffset = 0;

	/**
	 * SSL client key
	 *
	 * @var bool
	 * @access public
	 * @static
	 */
	public static $sslKey = null;
	
	/**
	 * SSL client certfificate
	 *
	 * @var string
	 * @acess public
	 * @static
	 */
	public static $sslCert = null;
	
	/**
	 * SSL CA cert (only required if you are having problems with your system CA cert)
	 *
	 * @var string
	 * @access public
	 * @static
	 */
	public static $sslCACert = null;
	
	/**
	 * AWS Key Pair ID
	 *
	 * @var string
	 * @access private
	 * @static
	 */
	private static $__signingKeyPairId = null;
	
	/**
	 * Key resource, freeSigningKey() must be called to clear it from memory
	 *
	 * @var bool
	 * @access private
	 * @static 
	 */
	private static $__signingKeyResource = false;

	/**
	 * CURL progress function callback 
	 *
	 * @var function
	 * @access public
	 * @static 
	 */
	public static $progressFunction = null;

	protected static $range_lower_limit = 0;
	
	protected static $range_upper_limit = 0;
	
	protected static $serverSideEncryption = '';
	
	/**
	 * AWS Signature Version
	 *
	 * @var string
	 * @acess public
	 * @static
	*/
	public static $signVer = 'v4';

	/**
	* Constructor - if you're not using the class statically
	*
	* @param string $accessKey Access key
	* @param string $secretKey Secret key
	* @param boolean $useSSL Enable SSL
	* @param string $endpoint Amazon URI
	* @return void
	*/
	public function __construct()
	{	
		// global $aws;
		
		// self::$useSSL = true;
		// self::$endpoint = $aws['endpoint'];
		// self::$region = $aws['region'];
		// self::setAuth($aws['accessKey'], $aws['secretKey']);
	}


	/**
	* Set the service endpoint
	*
	* @param string endpoint
	* @return void
	*/
	public static function setEndpoint($endpoint)
	{
		self::$endpoint = $endpoint;
		
		if(strpos($endpoint, 'digitaloceanspaces') !== FALSE){
			self::setSignatureVersion('v2');
		}

	}

	/**
	* Set the service endpoint
	*
	* @return string $endpoint
	* @static
	*/
	public static function getEndpoint()
	{
		return self::$endpoint;
	}

	/**
	* Set the service region
	*
	* @param string $region
	* @return void
	*/
	public static function setRegion($region)
	{
		self::$region = $region;
	}


	/**
	* Get the service region
	*
	* @return string $region
	* @static
	*/
	public static function getRegion()
	{
		$region = self::$region;

		// parse region from endpoint if not specific
		if (empty($region)) 
		{
			if (preg_match("/s3[.-](?:website-|dualstack\.)?(.+)\.amazonaws\.com/i", self::$endpoint, $match) !== 0 
			&& strtolower($match[1]) !== "external-1") 
			{
				$region = $match[1];
			}		
		}

		return empty($region) ? 'us-east-1' : $region;
	}


	/**
	* Set AWS access key and secret key
	*
	* @param string $accessKey Access key
	* @param string $secretKey Secret key
	* @return void
	*/
	public static function setAuth($accessKey, $secretKey)
	{
		self::$__accessKey = $accessKey;
		self::$__secretKey = $secretKey;
	}

	/**
	* Check if AWS keys have been set
	*
	* @return boolean
	*/
	public static function hasAuth() {
		return (self::$__accessKey !== null && self::$__secretKey !== null);
	}
	
	
	/**
	 * Set Server Side Encryption
	 * Example value: 'AES256'. See: https://docs.aws.amazon.com/AmazonS3/latest/dev/SSEUsingPHPSDK.html
	 *
	 * @param string|boolean $value Server side encryption standard; or false for none
 	 * @return void
	*/
	public static function setSSE($value = ''){
		self::$serverSideEncryption = $value;
	}


	/**
	* Set SSL on or off
	*
	* @param boolean $enabled SSL enabled
	* @param boolean $validate SSL certificate validation
	* @return void
	*/
	public static function setSSL($enabled, $validate = true)
	{
		self::$useSSL = $enabled;
		self::$useSSLValidation = $validate;
	}


	/**
	* Set SSL client certificates (experimental)
	*
	* @param string $sslCert SSL client certificate
	* @param string $sslKey SSL client key
	* @param string $sslCACert SSL CA cert (only required if you are having problems with your system CA cert)
	* @return void
	*/
	public static function setSSLAuth($sslCert = null, $sslKey = null, $sslCACert = null)
	{
		self::$sslCert = $sslCert;
		self::$sslKey = $sslKey;
		self::$sslCACert = $sslCACert;
	}


	/**
	* Set proxy information
	*
	* @param string $host Proxy hostname and port (localhost:1234)
	* @param string $user Proxy username
	* @param string $pass Proxy password
	* @param constant $type CURL proxy type
	* @return void
	*/
	public static function setProxy($host, $user = null, $pass = null, $type = CURLPROXY_SOCKS5)
	{
		self::$proxy = array('host' => $host, 'type' => $type, 'user' => $user, 'pass' => $pass);
	}


	/**
	* Set the error mode to exceptions
	*
	* @param boolean $enabled Enable exceptions
	* @return void
	*/
	public static function setExceptions($enabled = true)
	{
		self::$useExceptions = $enabled;
	}


	/**
	* Set AWS time correction offset (use carefully)
	*
	* This can be used when an inaccurate system time is generating
	* invalid request signatures.  It should only be used as a last
	* resort when the system time cannot be changed.
	*
	* @param string $offset Time offset (set to zero to use AWS server time)
	* @return void
	*/
	public static function setTimeCorrectionOffset($offset = 0)
	{
		if ($offset == 0)
		{
			$rest = new S3Request('HEAD');
			$rest = $rest->getResponse();
			$awstime = $rest->headers['date'];
			$systime = time();			
			$offset = $systime > $awstime ? -($systime - $awstime) : ($awstime - $systime);
		}
		self::$__timeOffset = $offset;
	}


	/**
	* Set signing key
	*
	* @param string $keyPairId AWS Key Pair ID
	* @param string $signingKey Private Key
	* @param boolean $isFile Load private key from file, set to false to load string
	* @return boolean
	*/
	public static function setSigningKey($keyPairId, $signingKey, $isFile = true)
	{
		self::$__signingKeyPairId = $keyPairId;
		if ((self::$__signingKeyResource = openssl_pkey_get_private($isFile ?
		file_get_contents($signingKey) : $signingKey)) !== false) return true;
		self::__triggerError('S3::setSigningKey(): Unable to open load private key: '.$signingKey, __FILE__, __LINE__);
		return false;
	}


	/**
	* Set Signature Version
	*
	* @param string $version of signature ('v4' or 'v2')
	* @return void
	*/
	public static function setSignatureVersion($version = 'v2')
	{
		self::$signVer = $version;
	}


	/**
	* Free signing key from memory, MUST be called if you are using setSigningKey()
	*
	* @return void
	*/
	public static function freeSigningKey()
	{
		if (self::$__signingKeyResource !== false)
			openssl_free_key(self::$__signingKeyResource);
	}

	/**
	* Set progress function
	*
	* @param function $func Progress function 
	* @return void
	*/
	public static function setProgressFunction($func = null)
	{
		self::$progressFunction = $func;
	}


	/**
	* Internal error handler
	*
	* @internal Internal error handler
	* @param string $message Error message
	* @param string $file Filename
	* @param integer $line Line number
	* @param integer $code Error code
	* @return void
	*/
	private static function __triggerError($message, $file, $line, $code = 0)
	{
		if (self::$useExceptions)
			throw new S3Exception($message, $file, $line, $code);
		else
			trigger_error($message, E_USER_WARNING);
	}


	/**
	* Get a list of buckets
	*
	* @param boolean $detailed Returns detailed bucket list when true
	* @return array | false
	*/
	public static function listBuckets($detailed = false)
	{
		$rest = new S3Request('GET', '', '', self::$endpoint);
		$rest = $rest->getResponse();
		if ($rest->error === false && $rest->code !== 200)
			$rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
		if ($rest->error !== false)
		{
			self::__triggerError(sprintf("S3::listBuckets(): [%s] %s", $rest->error['code'],
			$rest->error['message']), __FILE__, __LINE__);
			return false;
		}
		$results = array();
		if (!isset($rest->body->Buckets)) return $results;

		if ($detailed)
		{
			if (isset($rest->body->Owner, $rest->body->Owner->ID, $rest->body->Owner->DisplayName))
			$results['owner'] = array(
				'id' => (string)$rest->body->Owner->ID, 'name' => (string)$rest->body->Owner->DisplayName
			);
			$results['buckets'] = array();
			foreach ($rest->body->Buckets->Bucket as $b)
				$results['buckets'][] = array(
					'name' => (string)$b->Name, 'time' => strtotime((string)$b->CreationDate)
				);
		} else
			foreach ($rest->body->Buckets->Bucket as $b) $results[] = (string)$b->Name;

		return $results;
	}


	/**
	* Get contents for a bucket
	*
	* If maxKeys is null this method will loop through truncated result sets
	*
	* @param string $bucket Bucket name
	* @param string $prefix Prefix
	* @param string $marker Marker (last file listed)
	* @param string $maxKeys Max keys (maximum number of keys to return)
	* @param string $delimiter Delimiter
	* @param boolean $returnCommonPrefixes Set to true to return CommonPrefixes
	* @return array | false
	*/
	public static function getBucket($bucket, $prefix = null, $marker = null, $maxKeys = null, $delimiter = null, $returnCommonPrefixes = false)
	{
		$rest = new S3Request('GET', $bucket, '', self::$endpoint);
		if ($maxKeys == 0) $maxKeys = null;
		if ($prefix !== null && $prefix !== '') $rest->setParameter('prefix', $prefix);
		if ($marker !== null && $marker !== '') $rest->setParameter('marker', $marker);
		if ($maxKeys !== null && $maxKeys !== '') $rest->setParameter('max-keys', $maxKeys);
		if ($delimiter !== null && $delimiter !== '') $rest->setParameter('delimiter', $delimiter);
		else if (!empty(self::$defDelimiter)) $rest->setParameter('delimiter', self::$defDelimiter);
		$response = $rest->getResponse();
		if ($response->error === false && $response->code !== 200)
			$response->error = array('code' => $response->code, 'message' => 'Unexpected HTTP status');
		if ($response->error !== false)
		{
			self::__triggerError(sprintf("S3::getBucket(): [%s] %s",
			$response->error['code'], $response->error['message']), __FILE__, __LINE__);
			return false;
		}

		$results = array();

		$nextMarker = null;
		if (isset($response->body, $response->body->Contents))
		foreach ($response->body->Contents as $c)
		{
			$results[(string)$c->Key] = array(
				'name' => (string)$c->Key,
				'time' => strtotime((string)$c->LastModified),
				'size' => (int)$c->Size,
				'hash' => substr((string)$c->ETag, 1, -1)
			);
			$nextMarker = (string)$c->Key;
		}

		if ($returnCommonPrefixes && isset($response->body, $response->body->CommonPrefixes))
			foreach ($response->body->CommonPrefixes as $c)
				$results[(string)$c->Prefix] = array('prefix' => (string)$c->Prefix);

		if (isset($response->body, $response->body->IsTruncated) &&
		(string)$response->body->IsTruncated == 'false') return $results;

		if (isset($response->body, $response->body->NextMarker))
			$nextMarker = (string)$response->body->NextMarker;

		// Loop through truncated results if maxKeys isn't specified
		if ($maxKeys == null && $nextMarker !== null && (string)$response->body->IsTruncated == 'true')
		do
		{
			$rest = new S3Request('GET', $bucket, '', self::$endpoint);
			if ($prefix !== null && $prefix !== '') $rest->setParameter('prefix', $prefix);
			$rest->setParameter('marker', $nextMarker);
			if ($delimiter !== null && $delimiter !== '') $rest->setParameter('delimiter', $delimiter);

			if (($response = $rest->getResponse()) == false || $response->code !== 200) break;

			if (isset($response->body, $response->body->Contents))
			foreach ($response->body->Contents as $c)
			{
				$results[(string)$c->Key] = array(
					'name' => (string)$c->Key,
					'time' => strtotime((string)$c->LastModified),
					'size' => (int)$c->Size,
					'hash' => substr((string)$c->ETag, 1, -1)
				);
				$nextMarker = (string)$c->Key;
			}

			if ($returnCommonPrefixes && isset($response->body, $response->body->CommonPrefixes))
				foreach ($response->body->CommonPrefixes as $c)
					$results[(string)$c->Prefix] = array('prefix' => (string)$c->Prefix);

			if (isset($response->body, $response->body->NextMarker))
				$nextMarker = (string)$response->body->NextMarker;

		} while ($response !== false && (string)$response->body->IsTruncated == 'true');

		return $results;
	}


	/**
	* Put a bucket
	*
	* @param string $bucket Bucket name
	* @param constant $acl ACL flag
	* @param string $location Set as "EU" to create buckets hosted in Europe
	* @return boolean
	*/
	public static function putBucket($bucket, $acl = self::ACL_PRIVATE, $location = false)
	{
		$rest = new S3Request('PUT', $bucket, '', self::$endpoint);
		$rest->setAmzHeader('x-amz-acl', $acl);

		if ($location === false) $location = self::getRegion();

		if ($location !== false && $location !== "us-east-1")
		{
			$dom = new DOMDocument;
			$createBucketConfiguration = $dom->createElement('CreateBucketConfiguration');
			$locationConstraint = $dom->createElement('LocationConstraint', $location);
			$createBucketConfiguration->appendChild($locationConstraint);
			$dom->appendChild($createBucketConfiguration);
			$rest->data = $dom->saveXML();
			$rest->size = strlen($rest->data);
			$rest->setHeader('Content-Type', 'application/xml');
		}
		$rest = $rest->getResponse();

		if ($rest->error === false && $rest->code !== 200)
			$rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
		if ($rest->error !== false)
		{
			self::__triggerError(sprintf("S3::putBucket({$bucket}, {$acl}, {$location}): [%s] %s",
			$rest->error['code'], $rest->error['message']), __FILE__, __LINE__);
			return false;
		}
		return true;
	}


	/**
	* Delete an empty bucket
	*
	* @param string $bucket Bucket name
	* @return boolean
	*/
	public static function deleteBucket($bucket)
	{
		$rest = new S3Request('DELETE', $bucket, '', self::$endpoint);
		$rest = $rest->getResponse();
		if ($rest->error === false && $rest->code !== 204)
			$rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
		if ($rest->error !== false)
		{
			self::__triggerError(sprintf("S3::deleteBucket({$bucket}): [%s] %s",
			$rest->error['code'], $rest->error['message']), __FILE__, __LINE__);
			return false;
		}
		return true;
	}


	/**
	* Create input info array for putObject()
	*
	* @param string $file Input file
	* @param mixed $md5sum Use MD5 hash (supply a string if you want to use your own)
	* @return array | false
	*/
	public static function inputFile($file, $md5sum = true)
	{
		if (!file_exists($file) || !is_file($file) || !is_readable($file))
		{
			self::__triggerError('S3::inputFile(): Unable to open input file: '.$file, __FILE__, __LINE__);
			return false;
		}
		clearstatcache(false, $file);
		return array('file' => $file, 'size' => filesize($file), 'md5sum' => $md5sum !== false ?
		(is_string($md5sum) ? $md5sum : base64_encode(md5_file($file, true))) : '', 'sha256sum' => hash_file('sha256', $file));
	}


	/**
	* Create input array info for putObject() with a resource
	*
	* @param string $resource Input resource to read from
	* @param integer $bufferSize Input byte size
	* @param string $md5sum MD5 hash to send (optional)
	* @return array | false
	*/
	public static function inputResource(&$resource, $bufferSize = false, $md5sum = '')
	{
		if (!is_resource($resource) || (int)$bufferSize < 0)
		{
			self::__triggerError('S3::inputResource(): Invalid resource or buffer size', __FILE__, __LINE__);
			return false;
		}

		// Try to figure out the bytesize
		if ($bufferSize === false)
		{
			if (fseek($resource, 0, SEEK_END) < 0 || ($bufferSize = ftell($resource)) === false)
			{
				self::__triggerError('S3::inputResource(): Unable to obtain resource size', __FILE__, __LINE__);
				return false;
			}
			fseek($resource, 0);
		}

		$input = array('size' => $bufferSize, 'md5sum' => $md5sum);
		$input['fp'] =& $resource;
		return $input;
	}
	
	/**
	 * Initiate a multi-part upload (http://docs.amazonwebservices.com/AmazonS3/latest/API/mpUploadInitiate.html)
	 *
	 * @param string $bucket Bucket name
	 * @param string $uri Object URI
	 * @param string $acl ACL constant
	 * @param array $metaHeaders Array of x-amz-meta-* headers
	 * @param array $requestHeaders Array of request headers or content type as a string
	 * @param string $storageClass Storage class constant
	 *
	 * @return string | false
	 */
	public static function initiateMultipartUpload($bucket, $uri, $acl = self::ACL_PRIVATE, $metaHeaders = array(), $requestHeaders = array(), $storageClass = self::STORAGE_CLASS_STANDARD){
		
		$rest = new S3Request('POST', $bucket, $uri, self::$endpoint);
		$rest->setParameter('uploads','');

		// Custom request headers (Content-Type, Content-Disposition, Content-Encoding)
		if (is_array($requestHeaders))
			foreach ($requestHeaders as $h => $v) $rest->setHeader($h, $v);

		// Set storage class
		if ($storageClass !== self::STORAGE_CLASS_STANDARD) // Storage class
			$rest->setAmzHeader('x-amz-storage-class', $storageClass);

		if (self::$serverSideEncryption !== self::SSE_NONE) // Server-side encryption
			$rest->setAmzHeader('x-amz-server-side-encryption', self::$serverSideEncryption);	

		// Set ACL headers
		$rest->setAmzHeader('x-amz-acl', $acl);
		foreach ($metaHeaders as $h => $v) $rest->setAmzHeader('x-amz-meta-'.$h, $v);

		// Carry out the HTTP operation
		$rest->getResponse();

		if (false === $rest->response->error && 200 !== $rest->response->code) {
			$rest->response->error = array('code' => $rest->response->code, 'message' => 'Unexpected HTTP status');
		}

		if(false !== $rest->response->error){
			self::__triggerError(sprintf("S3::initiateMultipartUpload(): [%s] %s",
			$rest->response->error['code'], $rest->response->error['message']), __FILE__, __LINE__);
			return false;
		} elseif (isset($rest->response->body)) {
			// DreamObjects already returns a SimpleXMLElement here. Not sure how that works.
			if (is_a($rest->response->body, 'SimpleXMLElement')) {
				$body = $rest->response->body;
			} else {
				$body = new SimpleXMLElement($rest->response->body);
			}
			return (string) $body->UploadId;
		}

		// It is a programming error if we reach this line
		return false;

	}
	
	/**
	 * Upload a part of a multi-part set (http://docs.amazonwebservices.com/AmazonS3/latest/API/mpUploadUploadPart.html)
	 * The chunk is read into memory, so make sure that you have enough (or patch this function to work another way!)
	 *
	 * @param string $bucket Bucket name
	 * @param string $uri Object URI
	 * @param string $uploadId uploadId returned previously from initiateMultipartUpload
	 * @param integer $partNumber sequential part number to upload
	 * @param string $filePath file to upload content from
	 * @param integer $partSize number of bytes in each part (though final part may have fewer) - pass the same value each time (for this particular upload) - default 5Mb (which is Amazon's minimum)
	 * @return string (ETag) | false
	 */
	public static function uploadPart($bucket, $uri, $uploadId, $data, $partNumber, $partSize = BACKUPLY_AWS_CHUNK_SIZE) {
		//backuply_log('Part Number ----->>>>' . $partNumber);
		$rest = new S3Request('PUT', $bucket, $uri, self::$endpoint);
		$rest->setParameter('partNumber', (int) $partNumber);
		$rest->setParameter('uploadId', $uploadId);

		$rest->setHeader('Content-Type', 'application/octet-stream');
		$rest->data = $data;

 		$rest->setHeader('Content-MD5', base64_encode(md5($rest->data, true)));
		$rest->size = strlen($rest->data);

		$rest = $rest->getResponse();

		if(false === $rest->error && 200 !== $rest->code){
			$rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
		}

		if(false !== $rest->error){
			self::__triggerError(sprintf("S3::uploadPart(): [%s] %s",
			$rest->error['code'], $rest->error['message']), __FILE__, __LINE__);
			$GLOBALS['error'][] = $rest->error['message'];
			return false;
		}
		
		return $rest->headers['hash'];
	}
	
	/**
	 * Complete a multi-part upload (http://docs.amazonwebservices.com/AmazonS3/latest/API/mpUploadComplete.html)
	 *
	 * @param string $bucket Bucket name
	 * @param string $uri Object URI
	 * @param string $uploadId uploadId returned previously from initiateMultipartUpload
	 * @param array $parts an ordered list of eTags of previously uploaded parts from uploadPart
	 * @return boolean
	 */
	public static function completeMultipartUpload($bucket, $uri, $uploadId, $parts) {
		$rest = new S3Request('POST', $bucket, $uri, self::$endpoint);
		$rest->setParameter('uploadId', $uploadId);

		$xml = "<CompleteMultipartUpload>\n";
		$partno = 1;
		foreach ($parts as $etag) {
			$xml .= "<Part><PartNumber>$partno</PartNumber><ETag>$etag</ETag></Part>\n";
			$partno++;
		}
		$xml .= "</CompleteMultipartUpload>";

		$rest->data = $xml;
		$rest->size = strlen($rest->data);
		$rest->setHeader('Content-Type', 'application/xml');

		$rest = $rest->getResponse();

		if(false === $rest->error && 200 !== $rest->code){
			$rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
		}

		if(false !== $rest->error){
			// Special case: when the error means "you've already done that". Turn it into success. See in: https://trello.com/c/6jJoiCG5
			if ('InternalError' == $rest->error['code'] && 'This multipart completion is already in progress' == $rest->error['message']) {
				return true;
			}
			self::__triggerError(sprintf("S3::completeMultipartUpload(): [%s] %s",
			$rest->error['code'], $rest->error['message']), __FILE__, __LINE__);

			return false;
		}

		return true;

	}
	
	/**
	 * Abort a multi-part upload (http://docs.amazonwebservices.com/AmazonS3/latest/API/mpUploadAbort.html)
	 *
	 * @param string $bucket Bucket name
	 * @param string $uri Object URI
	 * @param string $uploadId uploadId returned previously from initiateMultipartUpload
	 * @return boolean
	 */
	// TODO: From this line
	public static function abortMultipartUpload ($bucket, $uri, $uploadId) {
		
		$rest = new S3Request('DELETE', $bucket, $uri, self::$endpoint);
		$rest->setParameter('uploadId', $uploadId);
		$rest = $rest->getResponse();
		if(false === $rest->error && 204 !== $rest->code){
			$rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
		}

		if (false !== $rest->error) {
			self::__triggerError(sprintf("S3::abortMultipartUpload(): [%s] %s",
			$rest->error['code'], $rest->error['message']), __FILE__, __LINE__);
			return false;
		}
		return true;
	}
	


	/**
	* Put an object
	*
	* @param mixed $input Input data
	* @param string $bucket Bucket name
	* @param string $uri Object URI
	* @param constant $acl ACL constant
	* @param array $metaHeaders Array of x-amz-meta-* headers
	* @param array $requestHeaders Array of request headers or content type as a string
	* @param constant $storageClass Storage class constant
	* @param constant $serverSideEncryption Server-side encryption
	* @return boolean
	*/
	public static function putObject($input, $bucket, $uri, $acl = self::ACL_PRIVATE, $metaHeaders = array(), $requestHeaders = array(), $storageClass = self::STORAGE_CLASS_STANDARD, $serverSideEncryption = self::SSE_NONE)
	{
		if ($input === false) return false;
		$rest = new S3Request('PUT', $bucket, $uri, self::$endpoint);

		if (!is_array($input)) $input = array(
			'data' => $input, 'size' => strlen($input),
			'md5sum' => base64_encode(md5($input, true)),
			'sha256sum' => hash('sha256', $input)
		);

		// Data
		if (isset($input['fp']))
			$rest->fp =& $input['fp'];
		elseif (isset($input['file']))
			$rest->fp = @fopen($input['file'], 'rb');
		elseif (isset($input['data']))
			$rest->data = $input['data'];

		// Content-Length (required)
		if (isset($input['size']) && $input['size'] >= 0)
			$rest->size = $input['size'];
		else {
			if (isset($input['file'])) {
				clearstatcache(false, $input['file']);
				$rest->size = filesize($input['file']);
			}
			elseif (isset($input['data']))
				$rest->size = strlen($input['data']);
		}

		// Custom request headers (Content-Type, Content-Disposition, Content-Encoding)
		if (is_array($requestHeaders))
			foreach ($requestHeaders as $h => $v)
				strpos($h, 'x-amz-') === 0 ? $rest->setAmzHeader($h, $v) : $rest->setHeader($h, $v);
		elseif (is_string($requestHeaders)) // Support for legacy contentType parameter
			$input['type'] = $requestHeaders;

		// Content-Type
		if (!isset($input['type']))
		{
			if (isset($requestHeaders['Content-Type']))
				$input['type'] =& $requestHeaders['Content-Type'];
			elseif (isset($input['file']))
				$input['type'] = self::__getMIMEType($input['file']);
			else
				$input['type'] = 'application/octet-stream';
		}

		if ($storageClass !== self::STORAGE_CLASS_STANDARD) // Storage class
			$rest->setAmzHeader('x-amz-storage-class', $storageClass);

		if (self::$serverSideEncryption !== self::SSE_NONE) // Server-side encryption
			$rest->setAmzHeader('x-amz-server-side-encryption', self::$serverSideEncryption);

		// We need to post with Content-Length and Content-Type, MD5 is optional
		if ($rest->size >= 0 && ($rest->fp !== false || $rest->data !== false))
		{
			$rest->setHeader('Content-Type', $input['type']);
			if (isset($input['md5sum'])) $rest->setHeader('Content-MD5', $input['md5sum']);

			if (isset($input['sha256sum'])) $rest->setAmzHeader('x-amz-content-sha256', $input['sha256sum']);

			$rest->setAmzHeader('x-amz-acl', $acl);
			foreach ($metaHeaders as $h => $v) $rest->setAmzHeader('x-amz-meta-'.$h, $v);
			$rest->getResponse();
		} else
			$rest->response->error = array('code' => 0, 'message' => 'Missing input parameters');

		if ($rest->response->error === false && $rest->response->code !== 200)
			$rest->response->error = array('code' => $rest->response->code, 'message' => 'Unexpected HTTP status');
		if ($rest->response->error !== false)
		{
			self::__triggerError(sprintf("S3::putObject(): [%s] %s",
			$rest->response->error['code'], $rest->response->error['message']), __FILE__, __LINE__);
			return false;
		}
		return true;
	}


	/**
	* Put an object from a file (legacy function)
	*
	* @param string $file Input file path
	* @param string $bucket Bucket name
	* @param string $uri Object URI
	* @param constant $acl ACL constant
	* @param array $metaHeaders Array of x-amz-meta-* headers
	* @param string $contentType Content type
	* @return boolean
	*/
	public static function putObjectFile($file, $bucket, $uri, $acl = self::ACL_PRIVATE, $metaHeaders = array(), $contentType = null)
	{
		return self::putObject(self::inputFile($file), $bucket, $uri, $acl, $metaHeaders, $contentType);
	}


	/**
	* Put an object from a string (legacy function)
	*
	* @param string $string Input data
	* @param string $bucket Bucket name
	* @param string $uri Object URI
	* @param constant $acl ACL constant
	* @param array $metaHeaders Array of x-amz-meta-* headers
	* @param string $contentType Content type
	* @return boolean
	*/
	public static function putObjectString($string, $bucket, $uri, $acl = self::ACL_PRIVATE, $metaHeaders = array(), $contentType = 'text/plain')
	{
		return self::putObject($string, $bucket, $uri, $acl, $metaHeaders, $contentType);
	}


	/**
	* Get an object
	*
	* @param string $bucket Bucket name
	* @param string $uri Object URI
	* @param mixed $saveTo Filename or resource to write to
	* @return mixed
	*/
	public static function getObject($bucket, $uri, $saveTo = false, $partNumber = 1, $chunk = 1048576)
	{
		$rest = new S3Request('GET', $bucket, $uri, self::$endpoint);
		if ($saveTo !== false)
		{
			if (is_resource($saveTo))
				$rest->fp =& $saveTo;
			else
				if (($rest->fp = @fopen($saveTo, 'ab')) !== false){
					$f_size = fstat($rest->fp)['size'];
					$u_limit = $f_size + $chunk - 1;
					
					$rest->setHeader('Range', 'bytes='.$f_size.'-'. $u_limit);
					$rest->setHeader('partNumber', $partNumber);
					$rest->file = realpath($saveTo);
				}else
					$rest->response->error = array('code' => 0, 'message' => 'Unable to open save file for writing: '.$saveTo);
		} else{
			$rest->setHeader('Range', 'bytes='.self::$range_lower_limit.'-'. self::$range_upper_limit);
		}
		if ($rest->response->error === false) $rest->getResponse();

		if ($rest->response->error === false && $rest->response->code !== 200 && $rest->response->code !== 206){
			$rest->response->error = array('code' => $rest->response->code, 'message' => 'Unexpected HTTP status');
		}
		
		if ($rest->response->error !== false)
		{
			self::__triggerError(sprintf("S3::getObject({$bucket}, {$uri}): [%s] %s",
			$rest->response->error['code'], $rest->response->error['message']), __FILE__, __LINE__);
			return false;
		}
		return $rest->response;
	}


	/**
	* Get object information
	*
	* @param string $bucket Bucket name
	* @param string $uri Object URI
	* @param boolean $returnInfo Return response information
	* @return mixed | false
	*/
	public static function getObjectInfo($bucket, $uri, $returnInfo = true)
	{
		$rest = new S3Request('HEAD', $bucket, $uri, self::$endpoint);
		$rest = $rest->getResponse();
		if ($rest->error === false && ($rest->code !== 200 && $rest->code !== 404))
			$rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
		if ($rest->error !== false)
		{
			self::__triggerError(sprintf("S3::getObjectInfo({$bucket}, {$uri}): [%s] %s",
			$rest->error['code'], $rest->error['message']), __FILE__, __LINE__);
			return false;
		}
		return $rest->code == 200 ? $returnInfo ? $rest->headers : true : false;
	}


	/**
	* Copy an object
	*
	* @param string $srcBucket Source bucket name
	* @param string $srcUri Source object URI
	* @param string $bucket Destination bucket name
	* @param string $uri Destination object URI
	* @param constant $acl ACL constant
	* @param array $metaHeaders Optional array of x-amz-meta-* headers
	* @param array $requestHeaders Optional array of request headers (content type, disposition, etc.)
	* @param constant $storageClass Storage class constant
	* @return mixed | false
	*/
	public static function copyObject($srcBucket, $srcUri, $bucket, $uri, $acl = self::ACL_PRIVATE, $metaHeaders = array(), $requestHeaders = array(), $storageClass = self::STORAGE_CLASS_STANDARD)
	{
		$rest = new S3Request('PUT', $bucket, $uri, self::$endpoint);
		$rest->setHeader('Content-Length', 0);
		foreach ($requestHeaders as $h => $v)
				strpos($h, 'x-amz-') === 0 ? $rest->setAmzHeader($h, $v) : $rest->setHeader($h, $v);
		foreach ($metaHeaders as $h => $v) $rest->setAmzHeader('x-amz-meta-'.$h, $v);
		if ($storageClass !== self::STORAGE_CLASS_STANDARD) // Storage class
			$rest->setAmzHeader('x-amz-storage-class', $storageClass);
		$rest->setAmzHeader('x-amz-acl', $acl);
		$rest->setAmzHeader('x-amz-copy-source', sprintf('/%s/%s', $srcBucket, rawurlencode($srcUri)));
		if (sizeof($requestHeaders) > 0 || sizeof($metaHeaders) > 0)
			$rest->setAmzHeader('x-amz-metadata-directive', 'REPLACE');

		$rest = $rest->getResponse();
		if ($rest->error === false && $rest->code !== 200)
			$rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
		if ($rest->error !== false)
		{
			self::__triggerError(sprintf("S3::copyObject({$srcBucket}, {$srcUri}, {$bucket}, {$uri}): [%s] %s",
			$rest->error['code'], $rest->error['message']), __FILE__, __LINE__);
			return false;
		}
		return isset($rest->body->LastModified, $rest->body->ETag) ? array(
			'time' => strtotime((string)$rest->body->LastModified),
			'hash' => substr((string)$rest->body->ETag, 1, -1)
		) : false;
	}


	/**
	* Set up a bucket redirection
	*
	* @param string $bucket Bucket name
	* @param string $location Target host name
	* @return boolean
	*/
	public static function setBucketRedirect($bucket = NULL, $location = NULL)
	{
		$rest = new S3Request('PUT', $bucket, '', self::$endpoint);

		if( empty($bucket) || empty($location) ) {
			self::__triggerError("S3::setBucketRedirect({$bucket}, {$location}): Empty parameter.", __FILE__, __LINE__);
			return false;
		}

		$dom = new DOMDocument;
		$websiteConfiguration = $dom->createElement('WebsiteConfiguration');
		$redirectAllRequestsTo = $dom->createElement('RedirectAllRequestsTo');
		$hostName = $dom->createElement('HostName', $location);
		$redirectAllRequestsTo->appendChild($hostName);
		$websiteConfiguration->appendChild($redirectAllRequestsTo);
		$dom->appendChild($websiteConfiguration);
		$rest->setParameter('website', null);
		$rest->data = $dom->saveXML();
		$rest->size = strlen($rest->data);
		$rest->setHeader('Content-Type', 'application/xml');
		$rest = $rest->getResponse();

		if ($rest->error === false && $rest->code !== 200)
			$rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
		if ($rest->error !== false)
		{
			self::__triggerError(sprintf("S3::setBucketRedirect({$bucket}, {$location}): [%s] %s",
			$rest->error['code'], $rest->error['message']), __FILE__, __LINE__);
			return false;
		}
		return true;
	}


	/**
	* Set logging for a bucket
	*
	* @param string $bucket Bucket name
	* @param string $targetBucket Target bucket (where logs are stored)
	* @param string $targetPrefix Log prefix (e,g; domain.com-)
	* @return boolean
	*/
	public static function setBucketLogging($bucket, $targetBucket, $targetPrefix = null)
	{
		// The S3 log delivery group has to be added to the target bucket's ACP
		if ($targetBucket !== null && ($acp = self::getAccessControlPolicy($targetBucket, '')) !== false)
		{
			// Only add permissions to the target bucket when they do not exist
			$aclWriteSet = false;
			$aclReadSet = false;
			foreach ($acp['acl'] as $acl)
			if ($acl['type'] == 'Group' && $acl['uri'] == 'http://acs.amazonaws.com/groups/s3/LogDelivery')
			{
				if ($acl['permission'] == 'WRITE') $aclWriteSet = true;
				elseif ($acl['permission'] == 'READ_ACP') $aclReadSet = true;
			}
			if (!$aclWriteSet) $acp['acl'][] = array(
				'type' => 'Group', 'uri' => 'http://acs.amazonaws.com/groups/s3/LogDelivery', 'permission' => 'WRITE'
			);
			if (!$aclReadSet) $acp['acl'][] = array(
				'type' => 'Group', 'uri' => 'http://acs.amazonaws.com/groups/s3/LogDelivery', 'permission' => 'READ_ACP'
			);
			if (!$aclReadSet || !$aclWriteSet) self::setAccessControlPolicy($targetBucket, '', $acp);
		}

		$dom = new DOMDocument;
		$bucketLoggingStatus = $dom->createElement('BucketLoggingStatus');
		$bucketLoggingStatus->setAttribute('xmlns', 'http://s3.amazonaws.com/doc/2006-03-01/');
		if ($targetBucket !== null)
		{
			if ($targetPrefix == null) $targetPrefix = $bucket . '-';
			$loggingEnabled = $dom->createElement('LoggingEnabled');
			$loggingEnabled->appendChild($dom->createElement('TargetBucket', $targetBucket));
			$loggingEnabled->appendChild($dom->createElement('TargetPrefix', $targetPrefix));
			// TODO: Add TargetGrants?
			$bucketLoggingStatus->appendChild($loggingEnabled);
		}
		$dom->appendChild($bucketLoggingStatus);

		$rest = new S3Request('PUT', $bucket, '', self::$endpoint);
		$rest->setParameter('logging', null);
		$rest->data = $dom->saveXML();
		$rest->size = strlen($rest->data);
		$rest->setHeader('Content-Type', 'application/xml');
		$rest = $rest->getResponse();
		if ($rest->error === false && $rest->code !== 200)
			$rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
		if ($rest->error !== false)
		{
			self::__triggerError(sprintf("S3::setBucketLogging({$bucket}, {$targetBucket}): [%s] %s",
			$rest->error['code'], $rest->error['message']), __FILE__, __LINE__);
			return false;
		}
		return true;
	}


	/**
	* Get logging status for a bucket
	*
	* This will return false if logging is not enabled.
	* Note: To enable logging, you also need to grant write access to the log group
	*
	* @param string $bucket Bucket name
	* @return array | false
	*/
	public static function getBucketLogging($bucket)
	{
		$rest = new S3Request('GET', $bucket, '', self::$endpoint);
		$rest->setParameter('logging', null);
		$rest = $rest->getResponse();
		if ($rest->error === false && $rest->code !== 200)
			$rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
		if ($rest->error !== false)
		{
			self::__triggerError(sprintf("S3::getBucketLogging({$bucket}): [%s] %s",
			$rest->error['code'], $rest->error['message']), __FILE__, __LINE__);
			return false;
		}
		if (!isset($rest->body->LoggingEnabled)) return false; // No logging
		return array(
			'targetBucket' => (string)$rest->body->LoggingEnabled->TargetBucket,
			'targetPrefix' => (string)$rest->body->LoggingEnabled->TargetPrefix,
		);
	}


	/**
	* Disable bucket logging
	*
	* @param string $bucket Bucket name
	* @return boolean
	*/
	public static function disableBucketLogging($bucket)
	{
		return self::setBucketLogging($bucket, null);
	}


	/**
	* Get a bucket's location
	*
	* @param string $bucket Bucket name
	* @return string | false
	*/
	public static function getBucketLocation($bucket)
	{
		$rest = new S3Request('GET', $bucket, '', self::$endpoint);
		$rest->setParameter('location', null);
		$rest = $rest->getResponse();
		if ($rest->error === false && $rest->code !== 200)
			$rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
		if ($rest->error !== false)
		{
			self::__triggerError(sprintf("S3::getBucketLocation({$bucket}): [%s] %s",
			$rest->error['code'], $rest->error['message']), __FILE__, __LINE__);
			return false;
		}
		return (isset($rest->body[0]) && (string)$rest->body[0] !== '') ? (string)$rest->body[0] : 'US';
	}


	/**
	* Set object or bucket Access Control Policy
	*
	* @param string $bucket Bucket name
	* @param string $uri Object URI
	* @param array $acp Access Control Policy Data (same as the data returned from getAccessControlPolicy)
	* @return boolean
	*/
	public static function setAccessControlPolicy($bucket, $uri = '', $acp = array())
	{
		$dom = new DOMDocument;
		$dom->formatOutput = true;
		$accessControlPolicy = $dom->createElement('AccessControlPolicy');
		$accessControlList = $dom->createElement('AccessControlList');

		// It seems the owner has to be passed along too
		$owner = $dom->createElement('Owner');
		$owner->appendChild($dom->createElement('ID', $acp['owner']['id']));
		$owner->appendChild($dom->createElement('DisplayName', $acp['owner']['name']));
		$accessControlPolicy->appendChild($owner);

		foreach ($acp['acl'] as $g)
		{
			$grant = $dom->createElement('Grant');
			$grantee = $dom->createElement('Grantee');
			$grantee->setAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance');
			if (isset($g['id']))
			{ // CanonicalUser (DisplayName is omitted)
				$grantee->setAttribute('xsi:type', 'CanonicalUser');
				$grantee->appendChild($dom->createElement('ID', $g['id']));
			}
			elseif (isset($g['email']))
			{ // AmazonCustomerByEmail
				$grantee->setAttribute('xsi:type', 'AmazonCustomerByEmail');
				$grantee->appendChild($dom->createElement('EmailAddress', $g['email']));
			}
			elseif ($g['type'] == 'Group')
			{ // Group
				$grantee->setAttribute('xsi:type', 'Group');
				$grantee->appendChild($dom->createElement('URI', $g['uri']));
			}
			$grant->appendChild($grantee);
			$grant->appendChild($dom->createElement('Permission', $g['permission']));
			$accessControlList->appendChild($grant);
		}

		$accessControlPolicy->appendChild($accessControlList);
		$dom->appendChild($accessControlPolicy);

		$rest = new S3Request('PUT', $bucket, $uri, self::$endpoint);
		$rest->setParameter('acl', null);
		$rest->data = $dom->saveXML();
		$rest->size = strlen($rest->data);
		$rest->setHeader('Content-Type', 'application/xml');
		$rest = $rest->getResponse();
		if ($rest->error === false && $rest->code !== 200)
			$rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
		if ($rest->error !== false)
		{
			self::__triggerError(sprintf("S3::setAccessControlPolicy({$bucket}, {$uri}): [%s] %s",
			$rest->error['code'], $rest->error['message']), __FILE__, __LINE__);
			return false;
		}
		return true;
	}


	/**
	* Get object or bucket Access Control Policy
	*
	* @param string $bucket Bucket name
	* @param string $uri Object URI
	* @return mixed | false
	*/
	public static function getAccessControlPolicy($bucket, $uri = '')
	{
		$rest = new S3Request('GET', $bucket, $uri, self::$endpoint);
		$rest->setParameter('acl', null);
		$rest = $rest->getResponse();
		if ($rest->error === false && $rest->code !== 200)
			$rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
		if ($rest->error !== false)
		{
			self::__triggerError(sprintf("S3::getAccessControlPolicy({$bucket}, {$uri}): [%s] %s",
			$rest->error['code'], $rest->error['message']), __FILE__, __LINE__);
			return false;
		}

		$acp = array();
		if (isset($rest->body->Owner, $rest->body->Owner->ID, $rest->body->Owner->DisplayName))
			$acp['owner'] = array(
				'id' => (string)$rest->body->Owner->ID, 'name' => (string)$rest->body->Owner->DisplayName
			);

		if (isset($rest->body->AccessControlList))
		{
			$acp['acl'] = array();
			foreach ($rest->body->AccessControlList->Grant as $grant)
			{
				foreach ($grant->Grantee as $grantee)
				{
					if (isset($grantee->ID, $grantee->DisplayName)) // CanonicalUser
						$acp['acl'][] = array(
							'type' => 'CanonicalUser',
							'id' => (string)$grantee->ID,
							'name' => (string)$grantee->DisplayName,
							'permission' => (string)$grant->Permission
						);
					elseif (isset($grantee->EmailAddress)) // AmazonCustomerByEmail
						$acp['acl'][] = array(
							'type' => 'AmazonCustomerByEmail',
							'email' => (string)$grantee->EmailAddress,
							'permission' => (string)$grant->Permission
						);
					elseif (isset($grantee->URI)) // Group
						$acp['acl'][] = array(
							'type' => 'Group',
							'uri' => (string)$grantee->URI,
							'permission' => (string)$grant->Permission
						);
					else continue;
				}
			}
		}
		return $acp;
	}


	/**
	* Delete an object
	*
	* @param string $bucket Bucket name
	* @param string $uri Object URI
	* @return boolean
	*/
	public static function deleteObject($bucket, $uri)
	{
		$rest = new S3Request('DELETE', $bucket, $uri, self::$endpoint);
		$rest = $rest->getResponse();
		if ($rest->error === false && $rest->code !== 204)
			$rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
		if ($rest->error !== false)
		{
			self::__triggerError(sprintf("S3::deleteObject(): [%s] %s",
			$rest->error['code'], $rest->error['message']), __FILE__, __LINE__);
			return false;
		}
		return true;
	}


	/**
	* Get a query string authenticated URL
	*
	* @param string $bucket Bucket name
	* @param string $uri Object URI
	* @param integer $lifetime Lifetime in seconds
	* @param boolean $hostBucket Use the bucket name as the hostname
	* @param boolean $https Use HTTPS ($hostBucket should be false for SSL verification)
	* @return string
	*/
	public static function getAuthenticatedURL($bucket, $uri, $lifetime, $hostBucket = false, $https = false)
	{
		$expires = self::__getTime() + $lifetime;
		$uri = str_replace(array('%2F', '%2B'), array('/', '+'), rawurlencode($uri));
		return sprintf(($https ? 'https' : 'http').'://%s/%s?AWSAccessKeyId=%s&Expires=%u&Signature=%s',
		// $hostBucket ? $bucket : $bucket.'.s3.amazonaws.com', $uri, self::$__accessKey, $expires,
		$hostBucket ? $bucket : self::$endpoint.'/'.$bucket, $uri, self::$__accessKey, $expires,
		urlencode(self::__getHash("GET\n\n\n{$expires}\n/{$bucket}/{$uri}")));
	}


	/**
	* Get a CloudFront signed policy URL
	*
	* @param array $policy Policy
	* @return string
	*/
	public static function getSignedPolicyURL($policy)
	{
		$data = json_encode($policy);
		$signature = '';
		if (!openssl_sign($data, $signature, self::$__signingKeyResource)) return false;

		$encoded = str_replace(array('+', '='), array('-', '_', '~'), base64_encode($data));
		$signature = str_replace(array('+', '='), array('-', '_', '~'), base64_encode($signature));

		$url = $policy['Statement'][0]['Resource'] . '?';
		foreach (array('Policy' => $encoded, 'Signature' => $signature, 'Key-Pair-Id' => self::$__signingKeyPairId) as $k => $v)
			$url .= $k.'='.str_replace('%2F', '/', rawurlencode($v)).'&';
		return substr($url, 0, -1);
	}


	/**
	* Get a CloudFront canned policy URL
	*
	* @param string $url URL to sign
	* @param integer $lifetime URL lifetime
	* @return string
	*/
	public static function getSignedCannedURL($url, $lifetime)
	{
		return self::getSignedPolicyURL(array(
			'Statement' => array(
				array('Resource' => $url, 'Condition' => array(
					'DateLessThan' => array('AWS:EpochTime' => self::__getTime() + $lifetime)
				))
			)
		));
	}


	/**
	* Get upload POST parameters for form uploads
	*
	* @param string $bucket Bucket name
	* @param string $uriPrefix Object URI prefix
	* @param constant $acl ACL constant
	* @param integer $lifetime Lifetime in seconds
	* @param integer $maxFileSize Maximum filesize in bytes (default 5MB)
	* @param string $successRedirect Redirect URL or 200 / 201 status code
	* @param array $amzHeaders Array of x-amz-meta-* headers
	* @param array $headers Array of request headers or content type as a string
	* @param boolean $flashVars Includes additional "Filename" variable posted by Flash
	* @return object
	*/
	public static function getHttpUploadPostParams($bucket, $uriPrefix = '', $acl = self::ACL_PRIVATE, $lifetime = 3600,
	$maxFileSize = 5242880, $successRedirect = "201", $amzHeaders = array(), $headers = array(), $flashVars = false)
	{
		// Create policy object
		$policy = new stdClass;
		$policy->expiration = gmdate('Y-m-d\TH:i:s\Z', (self::__getTime() + $lifetime));
		$policy->conditions = array();
		$obj = new stdClass; $obj->bucket = $bucket; array_push($policy->conditions, $obj);
		$obj = new stdClass; $obj->acl = $acl; array_push($policy->conditions, $obj);

		$obj = new stdClass; // 200 for non-redirect uploads
		if (is_numeric($successRedirect) && in_array((int)$successRedirect, array(200, 201)))
			$obj->success_action_status = (string)$successRedirect;
		else // URL
			$obj->success_action_redirect = $successRedirect;
		array_push($policy->conditions, $obj);

		if ($acl !== self::ACL_PUBLIC_READ)
			array_push($policy->conditions, array('eq', '$acl', $acl));

		array_push($policy->conditions, array('starts-with', '$key', $uriPrefix));
		if ($flashVars) array_push($policy->conditions, array('starts-with', '$Filename', ''));
		foreach (array_keys($headers) as $headerKey)
			array_push($policy->conditions, array('starts-with', '$'.$headerKey, ''));
		foreach ($amzHeaders as $headerKey => $headerVal)
		{
			$obj = new stdClass;
			$obj->{$headerKey} = (string)$headerVal;
			array_push($policy->conditions, $obj);
		}
		array_push($policy->conditions, array('content-length-range', 0, $maxFileSize));
		$policy = base64_encode(str_replace('\/', '/', json_encode($policy)));

		// Create parameters
		$params = new stdClass;
		$params->AWSAccessKeyId = self::$__accessKey;
		$params->key = $uriPrefix.'${filename}';
		$params->acl = $acl;
		$params->policy = $policy; unset($policy);
		$params->signature = self::__getHash($params->policy);
		if (is_numeric($successRedirect) && in_array((int)$successRedirect, array(200, 201)))
			$params->success_action_status = (string)$successRedirect;
		else
			$params->success_action_redirect = $successRedirect;
		foreach ($headers as $headerKey => $headerVal) $params->{$headerKey} = (string)$headerVal;
		foreach ($amzHeaders as $headerKey => $headerVal) $params->{$headerKey} = (string)$headerVal;
		return $params;
	}


	/**
	* Create a CloudFront distribution
	*
	* @param string $bucket Bucket name
	* @param boolean $enabled Enabled (true/false)
	* @param array $cnames Array containing CNAME aliases
	* @param string $comment Use the bucket name as the hostname
	* @param string $defaultRootObject Default root object
	* @param string $originAccessIdentity Origin access identity
	* @param array $trustedSigners Array of trusted signers
	* @return array | false
	*/
	public static function createDistribution($bucket, $enabled = true, $cnames = array(), $comment = null, $defaultRootObject = null, $originAccessIdentity = null, $trustedSigners = array())
	{
		if (!extension_loaded('openssl'))
		{
			self::__triggerError(sprintf("S3::createDistribution({$bucket}, ".(int)$enabled.", [], '$comment'): %s",
			"CloudFront functionality requires SSL"), __FILE__, __LINE__);
			return false;
		}
		$useSSL = self::$useSSL;

		self::$useSSL = true; // CloudFront requires SSL
		$rest = new S3Request('POST', '', '2010-11-01/distribution', 'cloudfront.amazonaws.com');
		$rest->data = self::__getCloudFrontDistributionConfigXML(
			$bucket.'.s3.amazonaws.com',
			$enabled,
			(string)$comment,
			(string)microtime(true),
			$cnames,
			$defaultRootObject,
			$originAccessIdentity,
			$trustedSigners
		);

		$rest->size = strlen($rest->data);
		$rest->setHeader('Content-Type', 'application/xml');
		$rest = self::__getCloudFrontResponse($rest);

		self::$useSSL = $useSSL;

		if ($rest->error === false && $rest->code !== 201)
			$rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
		if ($rest->error !== false)
		{
			self::__triggerError(sprintf("S3::createDistribution({$bucket}, ".(int)$enabled.", [], '$comment'): [%s] %s",
			$rest->error['code'], $rest->error['message']), __FILE__, __LINE__);
			return false;
		} elseif ($rest->body instanceof SimpleXMLElement)
			return self::__parseCloudFrontDistributionConfig($rest->body);
		return false;
	}


	/**
	* Get CloudFront distribution info
	*
	* @param string $distributionId Distribution ID from listDistributions()
	* @return array | false
	*/
	public static function getDistribution($distributionId)
	{
		if (!extension_loaded('openssl'))
		{
			self::__triggerError(sprintf("S3::getDistribution($distributionId): %s",
			"CloudFront functionality requires SSL"), __FILE__, __LINE__);
			return false;
		}
		$useSSL = self::$useSSL;

		self::$useSSL = true; // CloudFront requires SSL
		$rest = new S3Request('GET', '', '2010-11-01/distribution/'.$distributionId, 'cloudfront.amazonaws.com');
		$rest = self::__getCloudFrontResponse($rest);

		self::$useSSL = $useSSL;

		if ($rest->error === false && $rest->code !== 200)
			$rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
		if ($rest->error !== false)
		{
			self::__triggerError(sprintf("S3::getDistribution($distributionId): [%s] %s",
			$rest->error['code'], $rest->error['message']), __FILE__, __LINE__);
			return false;
		}
		elseif ($rest->body instanceof SimpleXMLElement)
		{
			$dist = self::__parseCloudFrontDistributionConfig($rest->body);
			$dist['hash'] = $rest->headers['hash'];
			$dist['id'] = $distributionId;
			return $dist;
		}
		return false;
	}


	/**
	* Update a CloudFront distribution
	*
	* @param array $dist Distribution array info identical to output of getDistribution()
	* @return array | false
	*/
	public static function updateDistribution($dist)
	{
		if (!extension_loaded('openssl'))
		{
			self::__triggerError(sprintf("S3::updateDistribution({$dist['id']}): %s",
			"CloudFront functionality requires SSL"), __FILE__, __LINE__);
			return false;
		}

		$useSSL = self::$useSSL;

		self::$useSSL = true; // CloudFront requires SSL
		$rest = new S3Request('PUT', '', '2010-11-01/distribution/'.$dist['id'].'/config', 'cloudfront.amazonaws.com');
		$rest->data = self::__getCloudFrontDistributionConfigXML(
			$dist['origin'],
			$dist['enabled'],
			$dist['comment'],
			$dist['callerReference'],
			$dist['cnames'],
			$dist['defaultRootObject'],
			$dist['originAccessIdentity'],
			$dist['trustedSigners']
		);

		$rest->size = strlen($rest->data);
		$rest->setHeader('If-Match', $dist['hash']);
		$rest = self::__getCloudFrontResponse($rest);

		self::$useSSL = $useSSL;

		if ($rest->error === false && $rest->code !== 200)
			$rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
		if ($rest->error !== false)
		{
			self::__triggerError(sprintf("S3::updateDistribution({$dist['id']}): [%s] %s",
			$rest->error['code'], $rest->error['message']), __FILE__, __LINE__);
			return false;
		} else {
			$dist = self::__parseCloudFrontDistributionConfig($rest->body);
			$dist['hash'] = $rest->headers['hash'];
			return $dist;
		}
		return false;
	}


	/**
	* Delete a CloudFront distribution
	*
	* @param array $dist Distribution array info identical to output of getDistribution()
	* @return boolean
	*/
	public static function deleteDistribution($dist)
	{
		if (!extension_loaded('openssl'))
		{
			self::__triggerError(sprintf("S3::deleteDistribution({$dist['id']}): %s",
			"CloudFront functionality requires SSL"), __FILE__, __LINE__);
			return false;
		}

		$useSSL = self::$useSSL;

		self::$useSSL = true; // CloudFront requires SSL
		$rest = new S3Request('DELETE', '', '2008-06-30/distribution/'.$dist['id'], 'cloudfront.amazonaws.com');
		$rest->setHeader('If-Match', $dist['hash']);
		$rest = self::__getCloudFrontResponse($rest);

		self::$useSSL = $useSSL;

		if ($rest->error === false && $rest->code !== 204)
			$rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
		if ($rest->error !== false)
		{
			self::__triggerError(sprintf("S3::deleteDistribution({$dist['id']}): [%s] %s",
			$rest->error['code'], $rest->error['message']), __FILE__, __LINE__);
			return false;
		}
		return true;
	}


	/**
	* Get a list of CloudFront distributions
	*
	* @return array
	*/
	public static function listDistributions()
	{
		if (!extension_loaded('openssl'))
		{
			self::__triggerError(sprintf("S3::listDistributions(): [%s] %s",
			"CloudFront functionality requires SSL"), __FILE__, __LINE__);
			return false;
		}

		$useSSL = self::$useSSL;
		self::$useSSL = true; // CloudFront requires SSL
		$rest = new S3Request('GET', '', '2010-11-01/distribution', 'cloudfront.amazonaws.com');
		$rest = self::__getCloudFrontResponse($rest);
		self::$useSSL = $useSSL;

		if ($rest->error === false && $rest->code !== 200)
			$rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
		if ($rest->error !== false)
		{
			self::__triggerError(sprintf("S3::listDistributions(): [%s] %s",
			$rest->error['code'], $rest->error['message']), __FILE__, __LINE__);
			return false;
		}
		elseif ($rest->body instanceof SimpleXMLElement && isset($rest->body->DistributionSummary))
		{
			$list = array();
			if (isset($rest->body->Marker, $rest->body->MaxItems, $rest->body->IsTruncated))
			{
				//$info['marker'] = (string)$rest->body->Marker;
				//$info['maxItems'] = (int)$rest->body->MaxItems;
				//$info['isTruncated'] = (string)$rest->body->IsTruncated == 'true' ? true : false;
			}
			foreach ($rest->body->DistributionSummary as $summary)
				$list[(string)$summary->Id] = self::__parseCloudFrontDistributionConfig($summary);

			return $list;
		}
		return array();
	}

	/**
	* List CloudFront Origin Access Identities
	*
	* @return array
	*/
	public static function listOriginAccessIdentities()
	{
		if (!extension_loaded('openssl'))
		{
			self::__triggerError(sprintf("S3::listOriginAccessIdentities(): [%s] %s",
			"CloudFront functionality requires SSL"), __FILE__, __LINE__);
			return false;
		}

		self::$useSSL = true; // CloudFront requires SSL
		$rest = new S3Request('GET', '', '2010-11-01/origin-access-identity/cloudfront', 'cloudfront.amazonaws.com');
		$rest = self::__getCloudFrontResponse($rest);
		$useSSL = self::$useSSL;

		if ($rest->error === false && $rest->code !== 200)
			$rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
		if ($rest->error !== false)
		{
			trigger_error(sprintf("S3::listOriginAccessIdentities(): [%s] %s",
			$rest->error['code'], $rest->error['message']), E_USER_WARNING);
			return false;
		}

		if (isset($rest->body->CloudFrontOriginAccessIdentitySummary))
		{
			$identities = array();
			foreach ($rest->body->CloudFrontOriginAccessIdentitySummary as $identity)
				if (isset($identity->S3CanonicalUserId))
					$identities[(string)$identity->Id] = array('id' => (string)$identity->Id, 's3CanonicalUserId' => (string)$identity->S3CanonicalUserId);
			return $identities;
		}
		return false;
	}


	/**
	* Invalidate objects in a CloudFront distribution
	*
	* Thanks to Martin Lindkvist for S3::invalidateDistribution()
	*
	* @param string $distributionId Distribution ID from listDistributions()
	* @param array $paths Array of object paths to invalidate
	* @return boolean
	*/
	public static function invalidateDistribution($distributionId, $paths)
	{
		if (!extension_loaded('openssl'))
		{
			self::__triggerError(sprintf("S3::invalidateDistribution(): [%s] %s",
			"CloudFront functionality requires SSL"), __FILE__, __LINE__);
			return false;
		}

		$useSSL = self::$useSSL;
		self::$useSSL = true; // CloudFront requires SSL
		$rest = new S3Request('POST', '', '2010-08-01/distribution/'.$distributionId.'/invalidation', 'cloudfront.amazonaws.com');
		$rest->data = self::__getCloudFrontInvalidationBatchXML($paths, (string)microtime(true));
		$rest->size = strlen($rest->data);
		$rest = self::__getCloudFrontResponse($rest);
		self::$useSSL = $useSSL;

		if ($rest->error === false && $rest->code !== 201)
			$rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
		if ($rest->error !== false)
		{
			trigger_error(sprintf("S3::invalidate('{$distributionId}',{$paths}): [%s] %s",
			$rest->error['code'], $rest->error['message']), E_USER_WARNING);
			return false;
		}
		return true;
	}


	/**
	* Get a InvalidationBatch DOMDocument
	*
	* @internal Used to create XML in invalidateDistribution()
	* @param array $paths Paths to objects to invalidateDistribution
	* @param int $callerReference
	* @return string
	*/
	private static function __getCloudFrontInvalidationBatchXML($paths, $callerReference = '0')
	{
		$dom = new DOMDocument('1.0', 'UTF-8');
		$dom->formatOutput = true;
		$invalidationBatch = $dom->createElement('InvalidationBatch');
		foreach ($paths as $path)
			$invalidationBatch->appendChild($dom->createElement('Path', $path));

		$invalidationBatch->appendChild($dom->createElement('CallerReference', $callerReference));
		$dom->appendChild($invalidationBatch);
		return $dom->saveXML();
	}


	/**
	* List your invalidation batches for invalidateDistribution() in a CloudFront distribution
	*
	* http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/ListInvalidation.html
	* returned array looks like this:
	*	Array
	*	(
	*		[I31TWB0CN9V6XD] => InProgress
	*		[IT3TFE31M0IHZ] => Completed
	*		[I12HK7MPO1UQDA] => Completed
	*		[I1IA7R6JKTC3L2] => Completed
	*	)
	*
	* @param string $distributionId Distribution ID from listDistributions()
	* @return array
	*/
	public static function getDistributionInvalidationList($distributionId)
	{
		if (!extension_loaded('openssl'))
		{
			self::__triggerError(sprintf("S3::getDistributionInvalidationList(): [%s] %s",
			"CloudFront functionality requires SSL"), __FILE__, __LINE__);
			return false;
		}

		$useSSL = self::$useSSL;
		self::$useSSL = true; // CloudFront requires SSL
		$rest = new S3Request('GET', '', '2010-11-01/distribution/'.$distributionId.'/invalidation', 'cloudfront.amazonaws.com');
		$rest = self::__getCloudFrontResponse($rest);
		self::$useSSL = $useSSL;

		if ($rest->error === false && $rest->code !== 200)
			$rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
		if ($rest->error !== false)
		{
			trigger_error(sprintf("S3::getDistributionInvalidationList('{$distributionId}'): [%s]",
			$rest->error['code'], $rest->error['message']), E_USER_WARNING);
			return false;
		}
		elseif ($rest->body instanceof SimpleXMLElement && isset($rest->body->InvalidationSummary))
		{
			$list = array();
			foreach ($rest->body->InvalidationSummary as $summary)
				$list[(string)$summary->Id] = (string)$summary->Status;

			return $list;
		}
		return array();
	}


	/**
	* Get a DistributionConfig DOMDocument
	*
	* http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/index.html?PutConfig.html
	*
	* @internal Used to create XML in createDistribution() and updateDistribution()
	* @param string $bucket S3 Origin bucket
	* @param boolean $enabled Enabled (true/false)
	* @param string $comment Comment to append
	* @param string $callerReference Caller reference
	* @param array $cnames Array of CNAME aliases
	* @param string $defaultRootObject Default root object
	* @param string $originAccessIdentity Origin access identity
	* @param array $trustedSigners Array of trusted signers
	* @return string
	*/
	private static function __getCloudFrontDistributionConfigXML($bucket, $enabled, $comment, $callerReference = '0', $cnames = array(), $defaultRootObject = null, $originAccessIdentity = null, $trustedSigners = array())
	{
		$dom = new DOMDocument('1.0', 'UTF-8');
		$dom->formatOutput = true;
		$distributionConfig = $dom->createElement('DistributionConfig');
		$distributionConfig->setAttribute('xmlns', 'http://cloudfront.amazonaws.com/doc/2010-11-01/');

		$origin = $dom->createElement('S3Origin');
		$origin->appendChild($dom->createElement('DNSName', $bucket));
		if ($originAccessIdentity !== null) $origin->appendChild($dom->createElement('OriginAccessIdentity', $originAccessIdentity));
		$distributionConfig->appendChild($origin);

		if ($defaultRootObject !== null) $distributionConfig->appendChild($dom->createElement('DefaultRootObject', $defaultRootObject));

		$distributionConfig->appendChild($dom->createElement('CallerReference', $callerReference));
		foreach ($cnames as $cname)
			$distributionConfig->appendChild($dom->createElement('CNAME', $cname));
		if ($comment !== '') $distributionConfig->appendChild($dom->createElement('Comment', $comment));
		$distributionConfig->appendChild($dom->createElement('Enabled', $enabled ? 'true' : 'false'));

		if (!empty($trustedSigners))
		{
			$trusted = $dom->createElement('TrustedSigners');
			foreach ($trustedSigners as $id => $type)
				$trusted->appendChild($id !== '' ? $dom->createElement($type, $id) : $dom->createElement($type));
			$distributionConfig->appendChild($trusted);
		}
		$dom->appendChild($distributionConfig);
		//var_dump($dom->saveXML());
		return $dom->saveXML();
	}


	/**
	* Parse a CloudFront distribution config
	*
	* See http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/index.html?GetDistribution.html
	*
	* @internal Used to parse the CloudFront DistributionConfig node to an array
	* @param object &$node DOMNode
	* @return array
	*/
	private static function __parseCloudFrontDistributionConfig(&$node)
	{
		if (isset($node->DistributionConfig))
			return self::__parseCloudFrontDistributionConfig($node->DistributionConfig);

		$dist = array();
		if (isset($node->Id, $node->Status, $node->LastModifiedTime, $node->DomainName))
		{
			$dist['id'] = (string)$node->Id;
			$dist['status'] = (string)$node->Status;
			$dist['time'] = strtotime((string)$node->LastModifiedTime);
			$dist['domain'] = (string)$node->DomainName;
		}

		if (isset($node->CallerReference))
			$dist['callerReference'] = (string)$node->CallerReference;

		if (isset($node->Enabled))
			$dist['enabled'] = (string)$node->Enabled == 'true' ? true : false;

		if (isset($node->S3Origin))
		{
			if (isset($node->S3Origin->DNSName))
				$dist['origin'] = (string)$node->S3Origin->DNSName;

			$dist['originAccessIdentity'] = isset($node->S3Origin->OriginAccessIdentity) ?
			(string)$node->S3Origin->OriginAccessIdentity : null;
		}

		$dist['defaultRootObject'] = isset($node->DefaultRootObject) ? (string)$node->DefaultRootObject : null;

		$dist['cnames'] = array();
		if (isset($node->CNAME))
			foreach ($node->CNAME as $cname)
				$dist['cnames'][(string)$cname] = (string)$cname;

		$dist['trustedSigners'] = array();
		if (isset($node->TrustedSigners))
			foreach ($node->TrustedSigners as $signer)
			{
				if (isset($signer->Self))
					$dist['trustedSigners'][''] = 'Self';
				elseif (isset($signer->KeyPairId))
					$dist['trustedSigners'][(string)$signer->KeyPairId] = 'KeyPairId';
				elseif (isset($signer->AwsAccountNumber))
					$dist['trustedSigners'][(string)$signer->AwsAccountNumber] = 'AwsAccountNumber';
			}

		$dist['comment'] = isset($node->Comment) ? (string)$node->Comment : null;
		return $dist;
	}


	/**
	* Grab CloudFront response
	*
	* @internal Used to parse the CloudFront S3Request::getResponse() output
	* @param object &$rest S3Request instance
	* @return object
	*/
	private static function __getCloudFrontResponse(&$rest)
	{
		$rest->getResponse();
		if ($rest->response->error === false && isset($rest->response->body) &&
		is_string($rest->response->body) && substr($rest->response->body, 0, 5) == '<?xml')
		{
			$rest->response->body = simplexml_load_string($rest->response->body);
			// Grab CloudFront errors
			if (isset($rest->response->body->Error, $rest->response->body->Error->Code,
			$rest->response->body->Error->Message))
			{
				$rest->response->error = array(
					'code' => (string)$rest->response->body->Error->Code,
					'message' => (string)$rest->response->body->Error->Message
				);
				unset($rest->response->body);
			}
		}
		return $rest->response;
	}


	/**
	* Get MIME type for file
	*
	* To override the putObject() Content-Type, add it to $requestHeaders
	*
	* To use fileinfo, ensure the MAGIC environment variable is set
	*
	* @internal Used to get mime types
	* @param string &$file File path
	* @return string
	*/
	private static function __getMIMEType(&$file)
	{
		static $exts = array(
			'jpg' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'gif' => 'image/gif',
			'png' => 'image/png', 'ico' => 'image/x-icon', 'pdf' => 'application/pdf',
			'tif' => 'image/tiff', 'tiff' => 'image/tiff', 'svg' => 'image/svg+xml',
			'svgz' => 'image/svg+xml', 'swf' => 'application/x-shockwave-flash', 
			'zip' => 'application/zip', 'gz' => 'application/x-gzip',
			'tar' => 'application/x-tar', 'bz' => 'application/x-bzip',
			'bz2' => 'application/x-bzip2',  'rar' => 'application/x-rar-compressed',
			'exe' => 'application/x-msdownload', 'msi' => 'application/x-msdownload',
			'cab' => 'application/vnd.ms-cab-compressed', 'txt' => 'text/plain',
			'asc' => 'text/plain', 'htm' => 'text/html', 'html' => 'text/html',
			'css' => 'text/css', 'js' => 'text/javascript',
			'xml' => 'text/xml', 'xsl' => 'application/xsl+xml',
			'ogg' => 'application/ogg', 'mp3' => 'audio/mpeg', 'wav' => 'audio/x-wav',
			'avi' => 'video/x-msvideo', 'mpg' => 'video/mpeg', 'mpeg' => 'video/mpeg',
			'mov' => 'video/quicktime', 'flv' => 'video/x-flv', 'php' => 'text/x-php'
		);

		$ext = strtolower(pathinfo($file, PATHINFO_EXTENSION));
		if (isset($exts[$ext])) return $exts[$ext];

		// Use fileinfo if available
		if (extension_loaded('fileinfo') && isset($_ENV['MAGIC']) &&
		($finfo = finfo_open(FILEINFO_MIME, $_ENV['MAGIC'])) !== false)
		{
			if (($type = finfo_file($finfo, $file)) !== false)
			{
				// Remove the charset and grab the last content-type
				$type = explode(' ', str_replace('; charset=', ';charset=', $type));
				$type = array_pop($type);
				$type = explode(';', $type);
				$type = trim(array_shift($type));
			}
			finfo_close($finfo);
			if ($type !== false && strlen($type) > 0) return $type;
		}

		return 'application/octet-stream';
	}


	/**
	* Get the current time
	*
	* @internal Used to apply offsets to sytem time
	* @return integer
	*/
	public static function __getTime()
	{
		return time() + self::$__timeOffset;
	}


	/**
	* Generate the auth string: "AWS AccessKey:Signature"
	*
	* @internal Used by S3Request::getResponse()
	* @param string $string String to sign
	* @return string
	*/
	public static function __getSignature($string)
	{
		return 'AWS '.self::$__accessKey.':'.self::__getHash($string);
	}


	/**
	* Creates a HMAC-SHA1 hash
	*
	* This uses the hash extension if loaded
	*
	* @internal Used by __getSignature()
	* @param string $string String to sign
	* @return string
	*/
	private static function __getHash($string)
	{
		return base64_encode(extension_loaded('hash') ?
		hash_hmac('sha1', $string, self::$__secretKey, true) : pack('H*', sha1(
		(str_pad(self::$__secretKey, 64, chr(0x00)) ^ (str_repeat(chr(0x5c), 64))) .
		pack('H*', sha1((str_pad(self::$__secretKey, 64, chr(0x00)) ^
		(str_repeat(chr(0x36), 64))) . $string)))));
	}


	/**
	* Generate the headers for AWS Signature V4
	* 
	* @internal Used by S3Request::getResponse()
	* @param array $amzHeaders
	* @param array $headers
	* @param string $method
	* @param string $uri
	* @param array $parameters
	* @return array
	*/
	public static function __getSignatureV4($amzHeaders, $headers, $method, $uri, $parameters)
	{		
		$service = 's3';
		$region = S3::getRegion();

		$algorithm = 'AWS4-HMAC-SHA256';
		$combinedHeaders = array();

		$amzDateStamp = substr($amzHeaders['x-amz-date'], 0, 8);

		// CanonicalHeaders
		foreach ($headers as $k => $v)
			$combinedHeaders[strtolower($k)] = trim($v);
		foreach ($amzHeaders as $k => $v) 
			$combinedHeaders[strtolower($k)] = trim($v);
		uksort($combinedHeaders, array(self::class, '__sortMetaHeadersCmp'));

		// Convert null query string parameters to strings and sort
		$parameters = array_map('strval', $parameters); 
		uksort($parameters, array(self::class, '__sortMetaHeadersCmp'));
		$queryString = http_build_query($parameters, '', '&', PHP_QUERY_RFC3986);

		// Payload
		$amzPayload = array($method);

		$qsPos = strpos($uri, '?');
		$amzPayload[] = ($qsPos === false ? $uri : substr($uri, 0, $qsPos));

		$amzPayload[] = $queryString;
		// add header as string to requests
		foreach ($combinedHeaders as $k => $v ) 
		{
			$amzPayload[] = $k . ':' . $v;
		}
		// add a blank entry so we end up with an extra line break
		$amzPayload[] = '';
		// SignedHeaders
		$amzPayload[] = implode(';', array_keys($combinedHeaders));
		// payload hash
		$amzPayload[] = $amzHeaders['x-amz-content-sha256'];
		// request as string
		$amzPayloadStr = implode("\n", $amzPayload);

		// CredentialScope
		$credentialScope = array($amzDateStamp, $region, $service, 'aws4_request');

		// stringToSign
		$stringToSignStr = implode("\n", array($algorithm, $amzHeaders['x-amz-date'], 
		implode('/', $credentialScope), hash('sha256', $amzPayloadStr)));

		// Make Signature
		$kSecret = 'AWS4' . self::$__secretKey;
		$kDate = hash_hmac('sha256', $amzDateStamp, $kSecret, true);
		$kRegion = hash_hmac('sha256', $region, $kDate, true);
		$kService = hash_hmac('sha256', $service, $kRegion, true);
		$kSigning = hash_hmac('sha256', 'aws4_request', $kService, true);

		$signature = hash_hmac('sha256', $stringToSignStr, $kSigning);

		return $algorithm . ' ' . implode(',', array(
			'Credential=' . self::$__accessKey . '/' . implode('/', $credentialScope),
			'SignedHeaders=' . implode(';', array_keys($combinedHeaders)),
			'Signature=' . $signature,
		));
	}


	/**
	* Sort compare for meta headers
	*
	* @internal Used to sort x-amz meta headers
	* @param string $a String A
	* @param string $b String B
	* @return integer
	*/
	private static function __sortMetaHeadersCmp($a, $b)
	{
		$lenA = strlen($a);
		$lenB = strlen($b);
		$minLen = min($lenA, $lenB);
		$ncmp = strncmp($a, $b, $minLen);
		if ($lenA == $lenB) return $ncmp;
		if (0 == $ncmp) return $lenA < $lenB ? -1 : 1;
		return $ncmp;
	}
}

/**
 * S3 Request class 
 *
 * @link http://undesigned.org.za/2007/10/22/amazon-s3-php-class
 * @version 0.5.0-dev
 */
final class S3Request
{
	/**
	 * AWS URI
	 *
	 * @var string
	 * @access private
	 */
	private $endpoint;
	
	/**
	 * Verb
	 *
	 * @var string
	 * @access private
	 */
	private $verb;
	
	/**
	 * S3 bucket name
	 *
	 * @var string
	 * @access private
	 */
	private $bucket;
	
	/**
	 * Object URI
	 *
	 * @var string
	 * @access private
	 */
	private $uri;
	
	/**
	 * Final object URI
	 *
	 * @var string
	 * @access private
	 */
	private $resource = '';
	
	/**
	 * Additional request parameters
	 *
	 * @var array
	 * @access private
	 */
	private $parameters = array();
	
	/**
	 * Amazon specific request headers
	 *
	 * @var array
	 * @access private
	 */
	private $amzHeaders = array();

	/**
	 * HTTP request headers
	 *
	 * @var array
	 * @access private
	 */
	private $headers = array(
		'Host' => '', 'Date' => '', 'Content-MD5' => '', 'Content-Type' => ''
	);

	/**
	 * Use HTTP PUT?
	 *
	 * @var bool
	 * @access public
	 */
	public $fp = false;

	/**
	 * PUT file size
	 *
	 * @var int
	 * @access public
	 */
	public $size = 0;

	/**
	 * PUT post fields
	 *
	 * @var array
	 * @access public
	 */
	public $data = false;

	/**
	 * S3 request respone
	 *
	 * @var object
	 * @access public
	 */
	public $response;


	/**
	* Constructor
	*
	* @param string $verb Verb
	* @param string $bucket Bucket name
	* @param string $uri Object URI
	* @param string $endpoint AWS endpoint URI
	* @return mixed
	*/
	function __construct($verb, $bucket = '', $uri = '', $endpoint = 's3.amazonaws.com')
	{
		$this->endpoint = $endpoint;
		$this->verb = $verb;
		$this->bucket = $bucket;
		$this->uri = $uri !== '' ? '/'.str_replace('%2F', '/', rawurlencode($uri)) : '/';

		if ($this->bucket !== '')
		{
			if ($this->__dnsBucketName($this->bucket))
			{
				$this->headers['Host'] = $this->bucket.'.'.$this->endpoint;
				$this->resource = '/'.$this->bucket.$this->uri;
			}
			else
			{
				if(strpos($this->bucket, 'BAKLY') !== FALSE || strpos($this->bucket, 'BACKU') !== FALSE){
					$this->bucket = strtolower($this->bucket);
				}
				
				// Old format, deprecated by AWS - removal scheduled for September 30th, 2020
				$this->headers['Host'] = $this->endpoint;
				$this->uri = $this->uri;
				if ($this->bucket !== '') $this->uri = '/'.$this->bucket.$this->uri;
				$this->bucket = '';
				$this->resource = $this->uri;
			}
		}
		else
		{
			$this->headers['Host'] = $this->endpoint;
			$this->resource = $this->uri;
		}


		$this->headers['Date'] = gmdate('D, d M Y H:i:s T');
		$this->response = new STDClass;
		$this->response->error = false;
		$this->response->body = null;
		$this->response->headers = array();
	}


	/**
	* Set request parameter
	*
	* @param string $key Key
	* @param string $value Value
	* @return void
	*/
	public function setParameter($key, $value)
	{
		$this->parameters[$key] = $value;
	}


	/**
	* Set request header
	*
	* @param string $key Key
	* @param string $value Value
	* @return void
	*/
	public function setHeader($key, $value)
	{
		$this->headers[$key] = $value;
	}


	/**
	* Set x-amz-meta-* header
	*
	* @param string $key Key
	* @param string $value Value
	* @return void
	*/
	public function setAmzHeader($key, $value)
	{
		$this->amzHeaders[$key] = $value;
	}


	/**
	* Get the S3 response
	*
	* @return object | false
	*/
	public function getResponse()
	{
		$query = '';
		if (sizeof($this->parameters) > 0)
		{
			$query = substr($this->uri, -1) !== '?' ? '?' : '&';
			foreach ($this->parameters as $var => $value)
				if ($value == null || $value == '') $query .= $var.'&';
				else $query .= $var.'='.rawurlencode($value).'&';
			$query = substr($query, 0, -1);
			$this->uri .= $query;

			if (array_key_exists('acl', $this->parameters) ||
			array_key_exists('location', $this->parameters) ||
			array_key_exists('torrent', $this->parameters) ||
			array_key_exists('logging', $this->parameters) ||
			array_key_exists('partNumber', $this->parameters) ||
			array_key_exists('uploads', $this->parameters) ||
			array_key_exists('website', $this->parameters) ||
			array_key_exists('uploadId', $this->parameters))
				$this->resource .= $query;
		}
		$url = (S3::$useSSL ? 'https://' : 'http://') . ($this->headers['Host'] !== '' ? $this->headers['Host'] : $this->endpoint) . $this->uri;

		// Basic setup
		$curl = curl_init();
		curl_setopt($curl, CURLOPT_USERAGENT, 'S3/php');

		if (S3::$useSSL)
		{
			// Set protocol version
			curl_setopt($curl, CURLOPT_SSLVERSION, S3::$useSSLVersion);

			// SSL Validation can now be optional for those with broken OpenSSL installations
			curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
			curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);

			if (S3::$sslKey !== null) curl_setopt($curl, CURLOPT_SSLKEY, S3::$sslKey);
			if (S3::$sslCert !== null) curl_setopt($curl, CURLOPT_SSLCERT, S3::$sslCert);
			if (S3::$sslCACert !== null) curl_setopt($curl, CURLOPT_CAINFO, S3::$sslCACert);
		}

		curl_setopt($curl, CURLOPT_URL, $url);

		if (S3::$proxy != null && isset(S3::$proxy['host']))
		{
			curl_setopt($curl, CURLOPT_PROXY, S3::$proxy['host']);
			curl_setopt($curl, CURLOPT_PROXYTYPE, S3::$proxy['type']);
			if (isset(S3::$proxy['user'], S3::$proxy['pass']) && S3::$proxy['user'] != null && S3::$proxy['pass'] != null)
				curl_setopt($curl, CURLOPT_PROXYUSERPWD, sprintf('%s:%s', S3::$proxy['user'], S3::$proxy['pass']));
		}

		// Headers
		$httpHeaders = array(); 
		
		if(S3::$signVer == 'v2'){
			$amz = array();

			foreach ($this->amzHeaders as $header => $value){
				if (strlen($value) > 0){
					$httpHeaders[] = $header.': '.$value;
				}
			}

			foreach ($this->headers as $header => $value){
				if (strlen($value) > 0){
					$httpHeaders[] = $header.': '.$value;
				}
			}

			foreach ($this->amzHeaders as $header => $value){
				if (strlen($value) > 0){
					$amz[] = strtolower($header).':'.$value;
				}
			}
				
			//AMZ headers must be sorted
			if(sizeof($amz) > 0){
				usort($amz, array('self', '__sortMetaHeadersCmp'));
				$amz = "\n".implode("\n", $amz);
			}else{
				$amz = '';
			}
		}
		
		if (S3::hasAuth())
		{
			// Authorization string (CloudFront stringToSign should only contain a date)
			if ($this->headers['Host'] == 'cloudfront.amazonaws.com')
			{
				# TODO: Update CloudFront authentication
				foreach ($this->amzHeaders as $header => $value)
					if (strlen($value) > 0) $httpHeaders[] = $header.': '.$value;

				foreach ($this->headers as $header => $value)
					if (strlen($value) > 0) $httpHeaders[] = $header.': '.$value;

				$httpHeaders[] = 'Authorization: ' . S3::__getSignature($this->headers['Date']);
			}
			else
			{
				if('v2' === S3::$signVer){

					$httpHeaders[] = 'Authorization: ' . S3::__getSignature(
						$this->verb."\n".
						$this->headers['Content-MD5']."\n".
						$this->headers['Content-Type']."\n".
						$this->headers['Date'].$amz."\n".
						$this->resource
					);

				} else {
					$this->amzHeaders['x-amz-date'] = gmdate('Ymd\THis\Z');

					if (!isset($this->amzHeaders['x-amz-content-sha256'])) 
						$this->amzHeaders['x-amz-content-sha256'] = hash('sha256', $this->data);

					foreach ($this->amzHeaders as $header => $value)
						if (strlen($value) > 0) $httpHeaders[] = $header.': '.$value;

					foreach ($this->headers as $header => $value){	
						if (strlen($value) > 0){
							$httpHeaders[] = $header.': '.$value;
						} else {
							// Added for Backblaze s3 compatible as it was giving error for empty headers in the signature.
							unset($this->headers[$header]);
						}
					}

					$httpHeaders[] = 'Authorization: ' . S3::__getSignatureV4(
						$this->amzHeaders,
						$this->headers, 
						$this->verb, 
						$this->uri,
						$this->parameters
					);
				}
			}
		}

		curl_setopt($curl, CURLOPT_HTTPHEADER, $httpHeaders);
		curl_setopt($curl, CURLOPT_HEADER, false);
		curl_setopt($curl, CURLOPT_RETURNTRANSFER, false);
		curl_setopt($curl, CURLOPT_WRITEFUNCTION, array($this, '__responseWriteCallback'));
		curl_setopt($curl, CURLOPT_HEADERFUNCTION, array($this, '__responseHeaderCallback'));
		curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);

		// Request types
		switch ($this->verb)
		{
			case 'GET': break;
			case 'PUT': case 'POST': // POST only used for CloudFront
				if ($this->fp !== false)
				{
					curl_setopt($curl, CURLOPT_PUT, true);
					curl_setopt($curl, CURLOPT_INFILE, $this->fp);
					if ($this->size >= 0)
						curl_setopt($curl, CURLOPT_INFILESIZE, $this->size);
				}
				elseif ($this->data !== false)
				{
					curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $this->verb);
					curl_setopt($curl, CURLOPT_POSTFIELDS, $this->data);
				}
				else
					curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $this->verb);
			break;
			case 'HEAD':
				curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'HEAD');
				curl_setopt($curl, CURLOPT_NOBODY, true);
			break;
			case 'DELETE':
				curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'DELETE');
			break;
			default: break;
		}

		// set curl progress function callback
		if (S3::$progressFunction) {
			curl_setopt($curl, CURLOPT_NOPROGRESS, false);
			curl_setopt($curl, CURLOPT_PROGRESSFUNCTION, S3::$progressFunction);
		}

		// Execute, grab errors
		if (curl_exec($curl))
			$this->response->code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
		else
			$this->response->error = array(
				'code' => curl_errno($curl),
				'message' => curl_error($curl),
				'resource' => $this->resource
			);
		
		@curl_close($curl);

		// Parse body into XML
		if ($this->response->error === false && isset($this->response->headers['type']) &&
		$this->response->headers['type'] == 'application/xml' && isset($this->response->body))
		{
			$this->response->body = simplexml_load_string($this->response->body);

			// Grab S3 errors
			if (!in_array($this->response->code, array(200, 204, 206)) &&
			isset($this->response->body->Code, $this->response->body->Message))
			{
				$this->response->error = array(
					'code' => (string)$this->response->body->Code,
					'message' => (string)$this->response->body->Message
				);
				if (isset($this->response->body->Resource))
					$this->response->error['resource'] = (string)$this->response->body->Resource;
				unset($this->response->body);
			}
		}

		// Clean up file resources
		if ($this->fp !== false && is_resource($this->fp)) fclose($this->fp);

		return $this->response;
	}


	/**
	* CURL write callback
	*
	* @param resource $curl CURL resource
	* @param string $data Data
	* @return integer
	*/
	private function __responseWriteCallback($curl, $data)
	{
		if (in_array($this->response->code, array(200, 206, 6)) && $this->fp !== false)
			return fwrite($this->fp, $data);
		else
			$this->response->body .= $data;
		return strlen($data);
	}


	/**
	* Check DNS conformity
	*
	* @param string $bucket Bucket name
	* @return boolean
	*/
	private function __dnsBucketName($bucket)
	{
		if (strlen($bucket) > 63 || preg_match("/[^a-z0-9\.-]/", $bucket) > 0) return false;
		if (S3::$useSSL && strstr($bucket, '.') !== false) return false;
		if (strstr($bucket, '-.') !== false) return false;
		if (strstr($bucket, '..') !== false) return false;
		if (!preg_match("/^[0-9a-z]/", $bucket)) return false;
		if (!preg_match("/[0-9a-z]$/", $bucket)) return false;

		// For Minio as it provides self hosted S3 compatible storage
		$host = $this->bucket.'.'.$this->endpoint;
		if(gethostbyname($host) == $host){
			return false;
		}

		return true;
	}


	/**
	* CURL header callback
	*
	* @param resource $curl CURL resource
	* @param string $data Data
	* @return integer
	*/
	private function __responseHeaderCallback($curl, $data)
	{
		if (($strlen = strlen($data)) <= 2) return $strlen;
		if (substr($data, 0, 4) == 'HTTP')
			$this->response->code = (int)substr($data, 9, 3);
		else
		{
			$data = trim($data);
			if (strpos($data, ': ') === false) return $strlen;
			list($header, $value) = explode(': ', $data, 2);
			$header = strtolower($header);
			if ($header == 'last-modified')
				$this->response->headers['time'] = strtotime($value);
			elseif ($header == 'date')
				$this->response->headers['date'] = strtotime($value);
			elseif ($header == 'content-length')
				$this->response->headers['size'] = (int)$value;
			elseif ($header == 'content-type')
				$this->response->headers['type'] = $value;
			elseif ($header == 'etag')
				$this->response->headers['hash'] = $value[0] == '"' ? substr($value, 1, -1) : $value;
			elseif (preg_match('/^x-amz-meta-.*$/', $header))
				$this->response->headers[$header] = $value;
		}
		return $strlen;
	}
	
	/**
	* Sort compare for meta headers
	*
	* @internal Used to sort x-amz meta headers
	* @param string $a String A
	* @param string $b String B
	* @return integer
	*/
	private static function __sortMetaHeadersCmp($a, $b){
		$lenA = strlen($a);
		$lenB = strlen($b);
		$minLen = min($lenA, $lenB);
		$ncmp = strncmp($a, $b, $minLen);
		if ($lenA == $lenB) return $ncmp;
		if (0 == $ncmp) return $lenA < $lenB ? -1 : 1;
		return $ncmp;
	}

}

/**
 * S3 exception class
 *
 * @link http://undesigned.org.za/2007/10/22/amazon-s3-php-class
 * @version 0.5.0-dev
 */

class S3Exception extends Exception {
	/**
	 * Class constructor
	 *
	 * @param string $message Exception message
	 * @param string $file File in which exception was created
	 * @param string $line Line number on which exception was created
	 * @param int $code Exception code
	 */
	function __construct($message, $file, $line, $code = 0)
	{
		parent::__construct($message, $code);
		$this->file = $file;
		$this->line = $line;
	}
}

########################################################################################

class bcloud extends S3 {
	private $position = 0, $mode = '', $buffer, $upload_url, $part_no = 0, $chunk = 1048576;
	private $license = '';
	private $api_url = 'https://api.backuply.com';
	private $offset = 0;
	
	public $product_name = 'Backuply Cloud';
	public $app_dir = 'Backuply';
	public $path = '';
	public $filename = '';
	public $filesize = 0;
	public $url = [];
	public $retry = 0;
	public $context; // This is used by stream wrapper, so we are not required to touch it

	public function url_stat($path) {
		self::set_bcloud_endpoint($path); // Updating endpoint
		
		self::__getURL($path);
		return (($info = self::getObjectInfo($this->url['host'], $this->url['path'])) !== false) ?
		array('size' => $info['size'], 'mtime' => $info['time'], 'ctime' => $info['time']) : false;
	}

	public function unlink($path) {
		self::set_bcloud_endpoint($path); // Updating endpoint

		self::__getURL($path);
		return self::deleteObject($this->url['host'], $this->url['path']);
	}

	public function mkdir($path, $mode, $options) {
		self::__getURL($path);
		return self::putBucket($this->url['host'], self::ACL_PRIVATE);
	}

	public function rmdir($path) {
		self::__getURL($path);
		return self::deleteBucket($this->url['host']);
	}

	public function rename($pathFrom, $pathTo) {
		global $backuply;
		
		self::__getURL($pathFrom);
		$buc_from = $this->url['host'];
		$path_from = $this->url['path'];

		self::__getURL($pathTo);
		$buc_to = $this->url['host'];
		$path_to = $this->url['path'];

		if(self::copyObject($buc_from, $path_from, $buc_to, $path_to)){
			self::deleteObject($buc_from, $path_from);
			return true;
		}
		return false;
	}

	public function download_file_loop($src, $dest, $startpos = 0){
		global $data;
		
		self::set_bcloud_endpoint($src); // Updating the bcloud endpoint

		self::__getURL($src);
		$buc = $this->url['host'];
		$src_file = $this->url['path'];
		
		$this->chunk = 1048576;
		$this->part_no = empty($data['part_no']) ? 1 : $data['part_no'];
		backuply_log('Downloaded (L'.$data['restore_loop'].') : '.$startpos.' / '.$data['size']);
		
		while($startpos < $data['size']){
			if(time() + 5 >= $GLOBALS['end']){
				break;
			}
			
			if(($data['size'] - $startpos) < $this->chunk){
				$this->chunk = (int) $data['size'] - $startpos;
			}
			
		
			$resp = self::getObject($buc, $src_file, $dest, $this->part_no);
			
			if(!empty($error)) {
				$error[] = 'Download Failed! Not getting any data from '. self::$product_name; //TODO:: NaN dont need it here
				return false;
			}

			$startpos += $this->chunk;
			
			$this->part_no += 1;
			
			$percentage = ($startpos / $data['size']) * 100;
			
			backuply_status_log('<div class="backuply-upload-progress"><span class="backuply-upload-progress-bar" style="width:'.round($percentage).'%;"></span><span class="backuply-upload-size">'.round($percentage).'%</span></div>', 'downloading', 22);
		}
		
		$GLOBALS['part_no'] = $this->part_no;
		$GLOBALS['l_readbytes'] = filesize($dest);
		return true;
    }

	public function dir_opendir($path, $options) {
		if(strpos($path, 'bcloud_key') !== FALSE){
			return $this->add_bcloud($path);
		}

		self::set_bcloud_endpoint($path); // Updating endpoint

		self::__getURL($path);
		$slash = '';
		
		// Checking the list needs to have a slash at the end.
		if(strpos($path, 'BAKLY') !== FALSE || strpos($path, 'BACKU') !== FALSE){
			$slash = '/';
		}

		if (($contents = self::getBucket($this->url['host'], $this->url['path'] . $slash)) !== false) {
			$pathlen = strlen($this->url['path']);
			if (substr($this->url['path'], -1) == '/') $pathlen++;
			$this->buffer = array();
			foreach ($contents as $file) {
				if ($pathlen > 0) $file['name'] = substr($file['name'], $pathlen);
				$this->buffer[] = $file;
			}

			return true;
		}
		return false;
	}
	
	function add_bcloud($path){
		global $error, $bcloud_keys;

		$stream = parse_url($path);

		if(empty($stream)){
			$error[] = 'Empty URL';
			return false;
		}

		if(empty($stream['path'])){
			$error[] = 'Backuply License not found!';
			return false;
		}
		
		if(empty($stream['query'])){
			$error[] = 'Backuply Cloud key not found!';
			return false;
		}

		$backuply_cloud_key = str_replace('bcloud_key=', '', $stream['query']);
		$license = trim($stream['path'], '/');

		if(empty($stream['host'])){
			$error[] = 'Site URL not provided';
			return false;
		}

		// We need host to create folder in the Bucket
		$host = $stream['host'];
		
		$url = $this->api_url . '/cloud/token.php';
		
		$args = array(
			'timeout' => 10,
			'body' => array(
				'license' => $license,
				'url' => $host,
				'action' => 'add_location',
				'bcloud_key' => $backuply_cloud_key
			),
			'sslverify' => false
		);

		// Sending request to Backuply API
		$res = wp_remote_post($url, $args);
		
		if(empty($res) || is_wp_error($res)){
			$error[] = 'Connection to the Backuply API failed';
			return false;
		}
		
		$body = wp_remote_retrieve_body($res);
		$body = json_decode($body, 1);

		if(empty($body['success'])){
			$error[] = !empty($body['message']) ? $body['message'] : __('Failed to connect to the Backuply Cloud', 'backuply');
			return false;
		}
		
		// Handling error message.
		if(!empty($body['error'])){
			if(is_array($body['error'])){
				$error[]  = implode('<br>', $body['error']);
				return false;
			}
			
			$error[] = $body['error'];
			return false;
		}
		
		if(empty($body['data'])){
			$error[] = __('Failed to generate Backuply Cloud Keys', 'backuply');
		}

		$bcloud_keys = $body['data'];

		return true;
	}

	public function dir_readdir() {
		return (isset($this->buffer[$this->position])) ? $this->buffer[$this->position++]['name'] : false;
	}

	public function dir_rewinddir() {
		$this->position = 0;
	}

	public function dir_closedir() {
		$this->position = 0;
		unset($this->buffer);
	}
	
	// Uploads File to Backuply Cloud in Multi Parts
	public function upload_append($url, $data, $file_size) {
		global $error, $backuply;

		$etags = isset($backuply['status']['proto']['etags']) ? $backuply['status']['proto']['etags'] : [];
		$etag = self::uploadPart($this->url['host'], $this->url['path'], $this->upload_url, $data, $this->part_no);

		if(!$etag){
			if($this->retry < 3){
				sleep(1);
				$this->retry = $this->retry + 1;
				backuply_log('Retrying Upload Part ' . $this->retry);
				$error = []; // We need to clean any error or else it will cause issue with uploads
				$did_upload = self::upload_append($url, $data, $file_size);
				return $did_upload;
			}

			$error[] = sprintf(__('ETAG wasn\'t returend from %s server', 'backuply'), $this->product_name);
			return false;
		}

		if($etag !== false && is_string($etag)){
			array_push($etags, $etag);
		}
		
		$backuply['status']['proto']['etags'] = $etags;
		
		if(empty($etags)){
			$error[] = sprintf(__('File upload failed! As we didn\'t recieve ETAG in the response from %s.', 'backuply'), $this->product_name);
			return false;
		}
		
		return true;
	}

	public function stream_close() {
		global $error, $backuply;
		
		if(isset($backuply['status']['incomplete_upload'])) {
			return;
		}
		
		if(!preg_match('/w|a/is', $this->mode)){
			return true;
		}
		
		if(empty($this->upload_url)){
			$this->upload_url = $backuply['status']['init_data'];
		}
		
		if(!empty($this->buffer)){
			$D = $this->buffer;
			$this->buffer = '';
			
			//Call upload append function to write the data from Local tar file to One Drive
			$retcode = $this->upload_append($this->upload_url, $D, $this->filesize);
			$GLOBALS['start_pos'] += strlen($D);
			$backuply['status']['proto']['part_no'] = $this->part_no + 1;
			$percentage = ($GLOBALS['start_pos'] / $this->filesize) * 100;

			backuply_status_log('<div class="backuply-upload-progress"><span class="backuply-upload-progress-bar" style="width:'.round($percentage).'%;"></span><span class="backuply-upload-size">'.round($percentage).'%</span></div>', 'uploading', 78);
		
		}
		
		if(!self::completeMultipartUpload($this->url['host'], $this->url['path'], $this->upload_url, $backuply['status']['proto']['etags'])){
			$error[] = __('Something went wrong! Unable to complete Upload.', 'backuply');
			return false;
		}
		
		backuply_status_log('<div class="backuply-upload-progress"><span class="backuply-upload-progress-bar" style="width:100%;"></span><span class="backuply-upload-size">100%</span></div>', 'uploading', 90);
		
		return true;
	}

	public function stream_stat() {
		if (is_object($this->buffer) && isset($this->buffer->headers))
			return array(
				'size' => $this->buffer->headers['size'],
				'mtime' => $this->buffer->headers['time'],
				'ctime' => $this->buffer->headers['time']
			);
		elseif (($info = self::getObjectInfo($this->url['host'], $this->url['path'])) !== false)
			return array('size' => $info['size'], 'mtime' => $info['time'], 'ctime' => $info['time']);
		return false;
	}

	/*public function stream_flush() {
		$this->position = 0;
		return true;
	}*/

	public function stream_open($path, $mode, $options, &$opened_path) {
		global $error, $backuply;

		if (!in_array($mode, array('r', 'rb', 'w', 'wb', 'a' , 'ab'))) return false; // Mode not supported
		$this->mode = substr($mode, 0, 1);

		if($this->mode == 'a'){
			$this->mode = 'w';
		} else if ($this->mode == 'ab') {
			$this->mode = 'wb';
		}
		
		self::set_bcloud_endpoint($path); // Updating endpoint

		self::__getURL($path);
		$this->position = 0;

		// Sets Server Side Encryption for AWS
		if(isset($backuply['status']['aws_sse'])){
			S3::setSSE('AES256');
		}

		$this->path = $this->url['path'];
		$pathinfo = pathinfo($this->path);
		$this->filename = $pathinfo['basename'];
		$this->filesize = $backuply['status']['proto_file_size'];
		
		if(strpos($this->mode, 'r') !== FALSE){
			$file_stats = $this->url_stat($path);
			$this->filesize = isset($file_stats['size']) ? $file_stats['size'] : 0;
			
			if(empty($this->filesize)){
				return false;
			}	
		}

		//If The File Creates More than 1 Chunk	
		if(empty($backuply['status']['init_data'])){
			$this->upload_url = self::initiateMultipartUpload($this->url['host'], $this->url['path']);

			if(empty($this->upload_url)){
				$error[] = 'Upload failed! Unable to initiate upload to ' . $this->product_name;
				backuply_die('upload_error');
			}

			$backuply['status']['init_data'] = $this->upload_url;
		} else {
			$this->upload_url = $backuply['status']['init_data'];
		}

		return true;
	}

	public function stream_read($count) {

		self::$range_upper_limit = (self::$range_lower_limit + $count) - 1;

		if(self::$range_upper_limit >= $this->filesize){
			self::$range_upper_limit = $this->filesize - 1;
		}

		if ($this->mode == 'r') {
			if (($this->buffer = self::getObject($this->url['host'], $this->url['path'])) !== false) {
				if (is_object($this->buffer->body)) $this->buffer->body = (string)$this->buffer->body;
			} else return false;
		}
	
		$this->position += strlen($this->buffer->body);
		self::$range_lower_limit = $this->position + 1;

		return $this->buffer->body;
	}

	public function stream_write($data) {
		global $error, $backuply;
		
		$this->buffer .= $data;
		$data_size = strlen($data);
		$this->part_no = empty($backuply['status']['proto']['part_no']) ? 1 : $backuply['status']['proto']['part_no'];
		//backuply_log('Part Number :' .$this->part_no);
		
		if(empty($this->upload_url)){
			$this->upload_url = $backuply['status']['init_data'];
		}

		if(strlen($this->buffer) >= BACKUPLY_AWS_CHUNK_SIZE){
			
			$D = $this->buffer;
			$this->buffer = '';
			
			//Call upload append function to write the data from Local tar file to One Drive
			$retcode = $this->upload_append($this->upload_url, $D, $this->filesize);
			$GLOBALS['start_pos'] += strlen($D);
			$backuply['status']['proto']['part_no'] = $this->part_no + 1;
			$percentage = ($GLOBALS['start_pos'] / $this->filesize) * 100;

			backuply_status_log('<div class="backuply-upload-progress"><span class="backuply-upload-progress-bar" style="width:'.round($percentage).'%;"></span><span class="backuply-upload-size">'.round($percentage).'%</span></div>', 'uploading', 78);
		
		}
		
		return $data_size;
	}

	public function stream_tell() {
		return $this->position;
	}

	public function stream_eof() {
		return self::$range_lower_limit >= $this->filesize;
	}
	
	public function stream_metadata($path, $option, $value) {
		return false;
	}

	public function stream_seek($offset, $whence) {
		switch ($whence) {
			case SEEK_SET:
				if ($offset < strlen($this->buffer->body) && $offset >= 0) {
					$this->position = $offset;
					return true;
				} else return false;
				break;

			case SEEK_CUR:
				if ($offset >= 0) {
					$this->position += $offset;
					return true;
				} else return false;
				break;

			case SEEK_END:
				$bytes = strlen($this->buffer->body);
				if ($bytes + $offset >= 0) {
					$this->position = $bytes + $offset;
					return true;
				} else return false;
				break;

			default: return false;
		}
	}

	protected function __getURL($path) {
		$this->url = parse_url($path);
		if (!isset($this->url['scheme']) || ($this->url['scheme'] !== 'aws' && $this->url['scheme'] !== 'caws' && $this->url['scheme'] !== 'bcloud')) return $this->url;
		if (isset($this->url['user'], $this->url['pass'])) self::setAuth(rawurldecode($this->url['user']), rawurldecode($this->url['pass']));
		    $expdata = explode("/",$this->url['path']);
		    self::setEndpoint($expdata[1]);
		    self::setRegion($expdata[2]);
		    $expdata[1] = $expdata[2] = '';
			$path = trim(implode("/",$expdata),'/');
			$this->url['path'] = !empty($path) ? "{$path}" : '';
	}

	protected function __translateMode($mode) {
		$acl = self::ACL_PRIVATE;
		if (($mode & 0x0020) || ($mode & 0x0004))
			$acl = self::ACL_PUBLIC_READ;
		// You probably don't want to enable public write access
		if (($mode & 0x0010) || ($mode & 0x0008) || ($mode & 0x0002) || ($mode & 0x0001))
			$acl = self::ACL_PUBLIC_READ; //$acl = self::ACL_PUBLIC_READ_WRITE;
		return $acl;
	}
	
	// Get the access key to initiate
	function get_bcloud_access_key($path){
		global $backuply, $error;

		if(function_exists('get_trainsient')){
			$bcloud_data = get_transient('bcloud_data');
		}

		if(!empty($bcloud_data)){
			return $bcloud_data;
		}
		
		$parsed_url = parse_url($path);
		$bcloud_key = explode('/', $parsed_url['path']);
		$bcloud_key = $bcloud_key[3];
		$action = 'restore';

		if(!empty($this->mode) && (strpos($this->mode, 'w') !== FALSE && function_exists('site_url'))){
			$action = 'backup';
		}

		$url = $this->api_url . '/cloud/token.php';
		$args = array(
			'license' => $parsed_url['host'],
			'bcloud_key' => $bcloud_key,
			'action' => $action,
			'url' => function_exists('site_url') ? site_url() : ''
		);

		$res = self::make_http_req($url, $args);

		if(empty($res)){
			return false;
		}

		$body = json_decode($res, 1);

		// We need to show quota error only if its a write mode
		if(!empty($body['error']['quota_err']) && !empty($this->mode) && strpos($this->mode, 'w') === FALSE){
			$body['error'] = '';
		}

		// Handling error message
		if(!empty($body['error'])){
			if(is_array($body['error'])){
				$error['bcloud_error']  = implode('<br>', $body['error']);
				if(function_exists('backuply_die')){
					backuply_die('bcloud_error');
				} else {
					backuply_bcloud_die('bcloud_error');
				}
			}
			
			$error['bcloud_error'] = $body['error'];
			if(function_exists('backuply_die')){
				backuply_die('bcloud_error');
			} else {
				backuply_bcloud_die('bcloud_error');
			}
		}

		if(empty($body['success'])){
			$error['bcloud_error'] = $body['message'];
			if(function_exists('backuply_die')){
				backuply_die('bcloud_error');
			} else {
				backuply_bcloud_die('bcloud_error');
			}
		}
		
		$keys = [];

		if(function_exists('sanitize_text_field')){
			$keys = map_deep($body['data'], 'sanitize_text_field');
		}else{
			$keys = $body['data'];
		}

		// Updating the used quota.
		if(function_exists('update_option') && !empty($keys['used_quota']) && is_numeric($keys['used_quota'])){
			$cloud_locs = get_option('backuply_remote_backup_locs', []);

			if(!empty($cloud_locs)){
				foreach($cloud_locs as $key => $locs){
					if($locs['protocol'] === 'bcloud'){
						$cloud_locs[$key]['backup_quota'] = (int) $keys['used_quota'];
					}
				}
			}

			update_option('backuply_remote_backup_locs', $cloud_locs);
		}

		if(!empty($keys['access_key']) && function_exists('set_transient')){
			set_transient('bcloud_data', $keys, 3600);
		}

		return !empty($keys) ? $keys : false;

	}

	// Updates the endpoint
	function set_bcloud_endpoint(&$path){
		
		global $error;
		
		if(strpos($path, 's3.backuply.com') === FALSE){
			return;
		}
		
		if(!empty($error['bcloud_error'])){
			return;
		}

		$access_key = self::get_bcloud_access_key($path);
		$parsed_path = parse_url($path);
		$endpoint = explode('/', $parsed_path['path']);
		
		if(!empty($access_key) && !empty($access_key['endpoint'])){
			$url = str_replace($endpoint[1], $access_key['endpoint'], $path);
		}

		// Updating the backup_dir while restoring with the updated endpoint.
		if(function_exists('untar_archive')){
			global $data;
			
			$data['backup_dir'] = str_replace($endpoint[1], $access_key['endpoint'], $data['backup_dir']);
		}

		$path = !empty($url) ? $url : $path;
		
		return;
	}
	
	function make_http_req($url, $args){

		$curl = curl_init();
		curl_setopt($curl, CURLOPT_URL, $url);
		curl_setopt($curl, CURLOPT_POSTFIELDS, $args);
		curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
		curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);

		$res = curl_exec($curl);

		if(empty($res)){
			$error = curl_error($curl);
		}
		
		if(!empty($error)){
			return false;
		}

		return $res;
	}
	
	function download_direct($path){
		self::set_bcloud_endpoint($path); // Updating endpoint
		self::__getURL($path);
		
		$this->url['host'] = str_replace('BAKLY', 'bakly', $this->url['host']);
		$url = self::getAuthenticatedURL($this->url['host'], $this->url['path'], 3600, false, true);
		
		return $url;
	}
	
	function get_quota($location){
		$parsed_url = parse_url($location);
		$url = $this->api_url . '/cloud/token.php';
		
		$bcloud_key = explode('/', $parsed_url['path']);
		$bcloud_key = $bcloud_key[3];

		$args = array(
			'license' => $parsed_url['host'],
			'bcloud_key' => $bcloud_key,
			'action' => 'update_quota',
			'url' => site_url()
		);

		$res = self::make_http_req($url, $args);

		$res = json_decode($res, true);

		if(empty($res['success'])){
			return false;
		}

		if(empty($res['data']) || !isset($res['data']['size'])){
			return false;
		}
		
		return ['total' => '', 'used' => $res['data']['size']];
	}

}
	
function backuply_bcloud_die($message){
	global $error;
	
	if(!empty($error)){
		backuply_log(serialize($error));
	}
	
	backuply_log(serialize($message));
}lib/Curl/Decoder.php000064400000001601151526424700010301 0ustar00<?php

namespace Curl;

class Decoder
{
    /**
     * Decode JSON
     *
     * @access public
     * @param  $json
     * @param  $assoc
     * @param  $depth
     * @param  $options
     */
    public static function decodeJson()
    {
        $args = func_get_args();
        $response = call_user_func_array('json_decode', $args);
        if ($response === null) {
            $response = $args['0'];
        }
        return $response;
    }

    /**
     * Decode XML
     *
     * @access public
     * @param  $data
     * @param  $class_name
     * @param  $options
     * @param  $ns
     * @param  $is_prefix
     */
    public static function decodeXml()
    {
        $args = func_get_args();
        $response = @call_user_func_array('simplexml_load_string', $args);
        if ($response === false) {
            $response = $args['0'];
        }
        return $response;
    }
}
lib/Curl/Encoder.php000064400000001251151526424700010314 0ustar00<?php

namespace Curl;

class Encoder
{
    /**
     * Encode JSON
     *
     * Wrap json_encode() to throw error when the value being encoded fails.
     *
     * @access public
     * @param  $value
     * @param  $options
     * @param  $depth
     *
     * @return string
     * @throws \ErrorException
     */
    public static function encodeJson()
    {
        $args = func_get_args();
        $value = call_user_func_array('json_encode', $args);
        if (json_last_error() !== JSON_ERROR_NONE) {
            $error_message = 'json_encode error: ' . json_last_error_msg();
            throw new \ErrorException($error_message);
        }
        return $value;
    }
}
lib/Curl/Url.php000064400000026624151526424700007512 0ustar00<?php

namespace Curl;

include_once __dir__ . '/StringUtil.php';

use Curl\StringUtil;

class Url
{
    private $baseUrl = null;
    private $relativeUrl = null;

    public function __construct($base_url, $relative_url = null)
    {
        $this->baseUrl = $base_url;
        $this->relativeUrl = $relative_url;
    }

    public function __toString()
    {
        return $this->absolutizeUrl();
    }

    /**
     * Remove dot segments.
     *
     * Interpret and remove the special "." and ".." path segments from a referenced path.
     */
    public static function removeDotSegments($input)
    {
        // 1.  The input buffer is initialized with the now-appended path
        //     components and the output buffer is initialized to the empty
        //     string.
        $output = '';

        // 2.  While the input buffer is not empty, loop as follows:
        while (!empty($input)) {
            // A.  If the input buffer begins with a prefix of "../" or "./",
            //     then remove that prefix from the input buffer; otherwise,
            if (StringUtil::startsWith($input, '../')) {
                $input = substr($input, 3);
            } elseif (StringUtil::startsWith($input, './')) {
                $input = substr($input, 2);

            // B.  if the input buffer begins with a prefix of "/./" or "/.",
            //     where "." is a complete path segment, then replace that
            //     prefix with "/" in the input buffer; otherwise,
            } elseif (StringUtil::startsWith($input, '/./')) {
                $input = substr($input, 2);
            } elseif ($input === '/.') {
                $input = '/';

            // C.  if the input buffer begins with a prefix of "/../" or "/..",
            //     where ".." is a complete path segment, then replace that
            //     prefix with "/" in the input buffer and remove the last
            //     segment and its preceding "/" (if any) from the output
            //     buffer; otherwise,
            } elseif (StringUtil::startsWith($input, '/../')) {
                $input = substr($input, 3);
                $output = substr_replace($output, '', StringUtil::reversePosition($output, '/'));
            } elseif ($input === '/..') {
                $input = '/';
                $output = substr_replace($output, '', StringUtil::reversePosition($output, '/'));

            // D.  if the input buffer consists only of "." or "..", then remove
            //     that from the input buffer; otherwise,
            } elseif ($input === '.' || $input === '..') {
                $input = '';

            // E.  move the first path segment in the input buffer to the end of
            //     the output buffer, including the initial "/" character (if
            //     any) and any subsequent characters up to, but not including,
            //     the next "/" character or the end of the input buffer.
            } elseif (!(($pos = StringUtil::position($input, '/', 1)) === false)) {
                $output .= substr($input, 0, $pos);
                $input = substr_replace($input, '', 0, $pos);
            } else {
                $output .= $input;
                $input = '';
            }
        }

        // 3.  Finally, the output buffer is returned as the result of
        //     remove_dot_segments.
        return $output . $input;
    }

    /**
     * Absolutize url.
     *
     * Combine the base and relative url into an absolute url.
     */
    private function absolutizeUrl()
    {
        $b = $this->parseUrl($this->baseUrl);
        if (!isset($b['path'])) {
            $b['path'] = '/';
        }
        if ($this->relativeUrl === null) {
            return $this->unparseUrl($b);
        }
        $r = $this->parseUrl($this->relativeUrl);
        $r['authorized'] = isset($r['scheme']) || isset($r['host']) || isset($r['port'])
            || isset($r['user']) || isset($r['pass']);
        $target = [];
        if (isset($r['scheme'])) {
            $target['scheme'] = $r['scheme'];
            $target['host'] = isset($r['host']) ? $r['host'] : null;
            $target['port'] = isset($r['port']) ? $r['port'] : null;
            $target['user'] = isset($r['user']) ? $r['user'] : null;
            $target['pass'] = isset($r['pass']) ? $r['pass'] : null;
            $target['path'] = isset($r['path']) ? self::removeDotSegments($r['path']) : null;
            $target['query'] = isset($r['query']) ? $r['query'] : null;
        } else {
            $target['scheme'] = isset($b['scheme']) ? $b['scheme'] : null;
            if ($r['authorized']) {
                $target['host'] = isset($r['host']) ? $r['host'] : null;
                $target['port'] = isset($r['port']) ? $r['port'] : null;
                $target['user'] = isset($r['user']) ? $r['user'] : null;
                $target['pass'] = isset($r['pass']) ? $r['pass'] : null;
                $target['path'] = isset($r['path']) ? self::removeDotSegments($r['path']) : null;
                $target['query'] = isset($r['query']) ? $r['query'] : null;
            } else {
                $target['host'] = isset($b['host']) ? $b['host'] : null;
                $target['port'] = isset($b['port']) ? $b['port'] : null;
                $target['user'] = isset($b['user']) ? $b['user'] : null;
                $target['pass'] = isset($b['pass']) ? $b['pass'] : null;
                if (!isset($r['path']) || $r['path'] === '') {
                    $target['path'] = $b['path'];
                    $target['query'] = isset($r['query']) ? $r['query'] : (isset($b['query']) ? $b['query'] : null);
                } else {
                    if (StringUtil::startsWith($r['path'], '/')) {
                        $target['path'] = self::removeDotSegments($r['path']);
                    } else {
                        $base = StringUtil::characterReversePosition($b['path'], '/', true);
                        if ($base === false) {
                            $base = '';
                        }
                        $target['path'] = self::removeDotSegments($base . '/' . $r['path']);
                    }
                    $target['query'] = isset($r['query']) ? $r['query'] : null;
                }
            }
        }
        if ($this->relativeUrl === '') {
            $target['fragment'] = isset($b['fragment']) ? $b['fragment'] : null;
        } else {
            $target['fragment'] = isset($r['fragment']) ? $r['fragment'] : null;
        }
        $absolutized_url = $this->unparseUrl($target);
        return $absolutized_url;
    }

    /**
     * Parse url.
     *
     * Parse url into components of a URI as specified by RFC 3986.
     */
    private function parseUrl($url)
    {
        // RFC 3986 - Parsing a URI Reference with a Regular Expression.
        //       ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
        //        12            3  4          5       6  7        8 9
        //
        // "http://www.ics.uci.edu/pub/ietf/uri/#Related"
        // $1 = http: (scheme)
        // $2 = http (scheme)
        // $3 = //www.ics.uci.edu (ignore)
        // $4 = www.ics.uci.edu (authority)
        // $5 = /pub/ietf/uri/ (path)
        // $6 = <undefined> (ignore)
        // $7 = <undefined> (query)
        // $8 = #Related (ignore)
        // $9 = Related (fragment)
        preg_match('/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/', $url, $output_array);

        $parts = array();
        if (isset($output_array['1']) && $output_array['1'] !== '') {
            $parts['scheme'] = $output_array['1'];
        }
        if (isset($output_array['2']) && $output_array['2'] !== '') {
            $parts['scheme'] = $output_array['2'];
        }
        if (isset($output_array['4']) && $output_array['4'] !== '') {
            // authority   = [ userinfo "@" ] host [ ":" port ]
            $parts['host'] = $output_array['4'];
            if (strpos($parts['host'], ':') !== false) {
                $host_parts = explode(':', $output_array['4']);
                $parts['port'] = array_pop($host_parts);
                $parts['host'] = implode(':', $host_parts);
                if (strpos($parts['host'], '@') !== false) {
                    $host_parts = explode('@', $parts['host']);
                    $parts['host'] = array_pop($host_parts);
                    $parts['user'] = implode('@', $host_parts);
                    if (strpos($parts['user'], ':') !== false) {
                        $user_parts = explode(':', $parts['user'], 2);
                        $parts['user'] = array_shift($user_parts);
                        $parts['pass'] = implode(':', $user_parts);
                    }
                }
            }
        }
        if (isset($output_array['5']) && $output_array['5'] !== '') {
            $parts['path'] = $this->percentEncodeChars($output_array['5']);
        }
        if (isset($output_array['7']) && $output_array['7'] !== '') {
            $parts['query'] = $output_array['7'];
        }
        if (isset($output_array['9']) && $output_array['9'] !== '') {
            $parts['fragment'] = $output_array['9'];
        }
        return $parts;
    }

    /**
     * Percent-encode characters.
     *
     * Percent-encode characters to represent a data octet in a component when
     * that octet's corresponding character is outside the allowed set.
     */
    private function percentEncodeChars($chars)
    {
        // ALPHA         = A-Z / a-z
        $alpha = 'A-Za-z';

        // DIGIT         = 0-9
        $digit = '0-9';

        // unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
        $unreserved = $alpha . $digit . preg_quote('-._~');

        // sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
        //               / "*" / "+" / "," / ";" / "=" / "#"
        $sub_delims = preg_quote('!$&\'()*+,;=#');

        // HEXDIG         =  DIGIT / "A" / "B" / "C" / "D" / "E" / "F"
        $hexdig = $digit . 'A-F';
        // "The uppercase hexadecimal digits 'A' through 'F' are equivalent to
        // the lowercase digits 'a' through 'f', respectively."
        $hexdig .= 'a-f';

        $pattern = '/(?:[^' . $unreserved . $sub_delims . preg_quote(':@%/?', '/') . ']++|%(?![' . $hexdig . ']{2}))/';
        $percent_encoded_chars = preg_replace_callback(
            $pattern,
            function ($matches) {
                return rawurlencode($matches[0]);
            },
            $chars
        );
        return $percent_encoded_chars;
    }

    /**
     * Unparse url.
     *
     * Combine url components into a url.
     */
    private function unparseUrl($parsed_url)
    {
        $scheme   = isset($parsed_url['scheme'])   ?       $parsed_url['scheme'] . '://' : '';
        $user     = isset($parsed_url['user'])     ?       $parsed_url['user']           : '';
        $pass     = isset($parsed_url['pass'])     ? ':' . $parsed_url['pass']           : '';
        $pass     = ($user || $pass)               ?       $pass . '@'                   : '';
        $host     = isset($parsed_url['host'])     ?       $parsed_url['host']           : '';
        $port     = isset($parsed_url['port'])     ? ':' . $parsed_url['port']           : '';
        $path     = isset($parsed_url['path'])     ?       $parsed_url['path']           : '';
        $query    = isset($parsed_url['query'])    ? '?' . $parsed_url['query']          : '';
        $fragment = isset($parsed_url['fragment']) ? '#' . $parsed_url['fragment']       : '';
        $unparsed_url =  $scheme . $user . $pass . $host . $port . $path . $query . $fragment;
        return $unparsed_url;
    }
}
lib/Curl/MultiCurl.php000064400000072646151526424700010675 0ustar00<?php

namespace Curl;

include_once __DIR__ . '/ArrayUtil.php';

use Curl\ArrayUtil;

class MultiCurl
{
    public $baseUrl = null;
    public $multiCurl;

    private $curls = [];
    private $activeCurls = [];
    private $isStarted = false;
    private $concurrency = 25;
    private $nextCurlId = 0;

    private $rateLimit = null;
    private $rateLimitEnabled = false;
    private $rateLimitReached = false;
    private $maxRequests = null;
    private $interval = null;
    private $intervalSeconds = null;
    private $unit = null;
    private $currentStartTime = null;
    private $currentRequestCount = 0;

    private $beforeSendCallback = null;
    private $successCallback = null;
    private $errorCallback = null;
    private $completeCallback = null;

    private $retry = null;

    private $cookies = [];
    private $headers = [];
    private $options = [];
    private $proxies = null;

    private $jsonDecoder = null;
    private $xmlDecoder = null;

    /**
     * Construct
     *
     * @access public
     * @param  $base_url
     */
    public function __construct($base_url = null)
    {
        $this->multiCurl = curl_multi_init();
        $this->headers = new CaseInsensitiveArray();
        $this->setUrl($base_url);
    }

    /**
     * Add Delete
     *
     * @access public
     * @param  $url
     * @param  $query_parameters
     * @param  $data
     *
     * @return object
     */
    public function addDelete($url, $query_parameters = [], $data = [])
    {
        if (is_array($url)) {
            $data = $query_parameters;
            $query_parameters = $url;
            $url = $this->baseUrl;
        }
        $curl = new Curl();
        $this->queueHandle($curl);
        $curl->setUrl($url, $query_parameters);
        $curl->setOpt(CURLOPT_CUSTOMREQUEST, 'DELETE');
        $curl->setOpt(CURLOPT_POSTFIELDS, $curl->buildPostData($data));
        return $curl;
    }

    /**
     * Add Download
     *
     * @access public
     * @param  $url
     * @param  $mixed_filename
     *
     * @return object
     */
    public function addDownload($url, $mixed_filename)
    {
        $curl = new Curl();
        $this->queueHandle($curl);
        $curl->setUrl($url);

        // Use tmpfile() or php://temp to avoid "Too many open files" error.
        if (is_callable($mixed_filename)) {
            $curl->downloadCompleteCallback = $mixed_filename;
            $curl->downloadFileName = null;
            $curl->fileHandle = tmpfile();
        } else {
            $filename = $mixed_filename;

            // Use a temporary file when downloading. Not using a temporary file can cause an error when an existing
            // file has already fully completed downloading and a new download is started with the same destination save
            // path. The download request will include header "Range: bytes=$filesize-" which is syntactically valid,
            // but unsatisfiable.
            $download_filename = $filename . '.pccdownload';
            $this->downloadFileName = $download_filename;

            // Attempt to resume download only when a temporary download file exists and is not empty.
            if (is_file($download_filename) && $filesize = filesize($download_filename)) {
                $first_byte_position = $filesize;
                $range = $first_byte_position . '-';
                $curl->setRange($range);
                $curl->fileHandle = fopen($download_filename, 'ab');

                // Move the downloaded temporary file to the destination save path.
                $curl->downloadCompleteCallback = function ($instance, $fh) use ($download_filename, $filename) {
                    // Close the open file handle before renaming the file.
                    if (is_resource($fh)) {
                        fclose($fh);
                    }

                    rename($download_filename, $filename);
                };
            } else {
                $curl->fileHandle = fopen('php://temp', 'wb');
                $curl->downloadCompleteCallback = function ($instance, $fh) use ($filename) {
                    file_put_contents($filename, stream_get_contents($fh));
                };
            }
        }

        $curl->setFile($curl->fileHandle);
        $curl->setOpt(CURLOPT_CUSTOMREQUEST, 'GET');
        $curl->setOpt(CURLOPT_HTTPGET, true);
        return $curl;
    }

    /**
     * Add Get
     *
     * @access public
     * @param  $url
     * @param  $data
     *
     * @return object
     */
    public function addGet($url, $data = [])
    {
        if (is_array($url)) {
            $data = $url;
            $url = $this->baseUrl;
        }
        $curl = new Curl();
        $this->queueHandle($curl);
        $curl->setUrl($url, $data);
        $curl->setOpt(CURLOPT_CUSTOMREQUEST, 'GET');
        $curl->setOpt(CURLOPT_HTTPGET, true);
        return $curl;
    }

    /**
     * Add Head
     *
     * @access public
     * @param  $url
     * @param  $data
     *
     * @return object
     */
    public function addHead($url, $data = [])
    {
        if (is_array($url)) {
            $data = $url;
            $url = $this->baseUrl;
        }
        $curl = new Curl();
        $this->queueHandle($curl);
        $curl->setUrl($url, $data);
        $curl->setOpt(CURLOPT_CUSTOMREQUEST, 'HEAD');
        $curl->setOpt(CURLOPT_NOBODY, true);
        return $curl;
    }

    /**
     * Add Options
     *
     * @access public
     * @param  $url
     * @param  $data
     *
     * @return object
     */
    public function addOptions($url, $data = [])
    {
        if (is_array($url)) {
            $data = $url;
            $url = $this->baseUrl;
        }
        $curl = new Curl();
        $this->queueHandle($curl);
        $curl->setUrl($url, $data);
        $curl->removeHeader('Content-Length');
        $curl->setOpt(CURLOPT_CUSTOMREQUEST, 'OPTIONS');
        return $curl;
    }

    /**
     * Add Patch
     *
     * @access public
     * @param  $url
     * @param  $data
     *
     * @return object
     */
    public function addPatch($url, $data = [])
    {
        if (is_array($url)) {
            $data = $url;
            $url = $this->baseUrl;
        }

        $curl = new Curl();

        if (is_array($data) && empty($data)) {
            $curl->removeHeader('Content-Length');
        }

        $this->queueHandle($curl);
        $curl->setUrl($url);
        $curl->setOpt(CURLOPT_CUSTOMREQUEST, 'PATCH');
        $curl->setOpt(CURLOPT_POSTFIELDS, $curl->buildPostData($data));
        return $curl;
    }

    /**
     * Add Post
     *
     * @access public
     * @param  $url
     * @param  $data
     * @param  $follow_303_with_post
     *     If true, will cause 303 redirections to be followed using GET requests (default: false).
     *     Note: Redirections are only followed if the CURLOPT_FOLLOWLOCATION option is set to true.
     *
     * @return object
     */
    public function addPost($url, $data = '', $follow_303_with_post = false)
    {
        if (is_array($url)) {
            $follow_303_with_post = (bool)$data;
            $data = $url;
            $url = $this->baseUrl;
        }

        $curl = new Curl();
        $this->queueHandle($curl);

        if (is_array($data) && empty($data)) {
            $curl->removeHeader('Content-Length');
        }

        $curl->setUrl($url);

        /*
         * For post-redirect-get requests, the CURLOPT_CUSTOMREQUEST option must not
         * be set, otherwise cURL will perform POST requests for redirections.
         */
        if (!$follow_303_with_post) {
            $curl->setOpt(CURLOPT_CUSTOMREQUEST, 'POST');
        }

        $curl->setOpt(CURLOPT_POST, true);
        $curl->setOpt(CURLOPT_POSTFIELDS, $curl->buildPostData($data));
        return $curl;
    }

    /**
     * Add Put
     *
     * @access public
     * @param  $url
     * @param  $data
     *
     * @return object
     */
    public function addPut($url, $data = [])
    {
        if (is_array($url)) {
            $data = $url;
            $url = $this->baseUrl;
        }
        $curl = new Curl();
        $this->queueHandle($curl);
        $curl->setUrl($url);
        $curl->setOpt(CURLOPT_CUSTOMREQUEST, 'PUT');
        $put_data = $curl->buildPostData($data);
        if (is_string($put_data)) {
            $curl->setHeader('Content-Length', strlen($put_data));
        }
        $curl->setOpt(CURLOPT_POSTFIELDS, $put_data);
        return $curl;
    }

    /**
     * Add Search
     *
     * @access public
     * @param  $url
     * @param  $data
     *
     * @return object
     */
    public function addSearch($url, $data = [])
    {
        if (is_array($url)) {
            $data = $url;
            $url = $this->baseUrl;
        }
        $curl = new Curl();
        $this->queueHandle($curl);
        $curl->setUrl($url);
        $curl->setOpt(CURLOPT_CUSTOMREQUEST, 'SEARCH');
        $put_data = $curl->buildPostData($data);
        if (is_string($put_data)) {
            $curl->setHeader('Content-Length', strlen($put_data));
        }
        $curl->setOpt(CURLOPT_POSTFIELDS, $put_data);
        return $curl;
    }

    /**
     * Add Curl
     *
     * Add a Curl instance to the handle queue.
     *
     * @access public
     * @param  $curl
     *
     * @return object
     */
    public function addCurl(Curl $curl)
    {
        $this->queueHandle($curl);
        return $curl;
    }

    /**
     * Before Send
     *
     * @access public
     * @param  $callback
     */
    public function beforeSend($callback)
    {
        $this->beforeSendCallback = $callback;
    }

    /**
     * Close
     *
     * @access public
     */
    public function close()
    {
        foreach ($this->curls as $curl) {
            $curl->close();
        }

        if (is_resource($this->multiCurl)) {
            curl_multi_close($this->multiCurl);
        }
    }

    /**
     * Complete
     *
     * @access public
     * @param  $callback
     */
    public function complete($callback)
    {
        $this->completeCallback = $callback;
    }

    /**
     * Error
     *
     * @access public
     * @param  $callback
     */
    public function error($callback)
    {
        $this->errorCallback = $callback;
    }

    /**
     * Get Opt
     *
     * @access public
     * @param  $option
     *
     * @return mixed
     */
    public function getOpt($option)
    {
        return isset($this->options[$option]) ? $this->options[$option] : null;
    }

    /**
     * Set Basic Authentication
     *
     * @access public
     * @param  $username
     * @param  $password
     */
    public function setBasicAuthentication($username, $password = '')
    {
        $this->setOpt(CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
        $this->setOpt(CURLOPT_USERPWD, $username . ':' . $password);
    }

    /**
     * Set Concurrency
     *
     * @access public
     * @param  $concurrency
     */
    public function setConcurrency($concurrency)
    {
        $this->concurrency = $concurrency;
    }

    /**
     * Set Digest Authentication
     *
     * @access public
     * @param  $username
     * @param  $password
     */
    public function setDigestAuthentication($username, $password = '')
    {
        $this->setOpt(CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
        $this->setOpt(CURLOPT_USERPWD, $username . ':' . $password);
    }

    /**
     * Set Cookie
     *
     * @access public
     * @param  $key
     * @param  $value
     */
    public function setCookie($key, $value)
    {
        $this->cookies[$key] = $value;
    }

    /**
     * Set Cookies
     *
     * @access public
     * @param  $cookies
     */
    public function setCookies($cookies)
    {
        foreach ($cookies as $key => $value) {
            $this->cookies[$key] = $value;
        }
    }

    /**
     * Set Port
     *
     * @access public
     * @param  $port
     */
    public function setPort($port)
    {
        $this->setOpt(CURLOPT_PORT, intval($port));
    }

    /**
     * Set Connect Timeout
     *
     * @access public
     * @param  $seconds
     */
    public function setConnectTimeout($seconds)
    {
        $this->setOpt(CURLOPT_CONNECTTIMEOUT, $seconds);
    }

    /**
     * Set Cookie String
     *
     * @access public
     * @param  $string
     */
    public function setCookieString($string)
    {
        $this->setOpt(CURLOPT_COOKIE, $string);
    }

    /**
     * Set Cookie File
     *
     * @access public
     * @param  $cookie_file
     */
    public function setCookieFile($cookie_file)
    {
        $this->setOpt(CURLOPT_COOKIEFILE, $cookie_file);
    }

    /**
     * Set Cookie Jar
     *
     * @access public
     * @param  $cookie_jar
     */
    public function setCookieJar($cookie_jar)
    {
        $this->setOpt(CURLOPT_COOKIEJAR, $cookie_jar);
    }

    /**
     * Set File
     *
     * @access public
     * @param  $file
     */
    public function setFile($file)
    {
        $this->setOpt(CURLOPT_FILE, $file);
    }

    /**
     * Set Header
     *
     * Add extra header to include in the request.
     *
     * @access public
     * @param  $key
     * @param  $value
     */
    public function setHeader($key, $value)
    {
        $this->headers[$key] = $value;
        $this->updateHeaders();
    }

    /**
     * Set Headers
     *
     * Add extra headers to include in the request.
     *
     * @access public
     * @param  $headers
     */
    public function setHeaders($headers)
    {
        if (ArrayUtil::isArrayAssoc($headers)) {
            foreach ($headers as $key => $value) {
                $key = trim($key);
                $value = trim($value);
                $this->headers[$key] = $value;
            }
        } else {
            foreach ($headers as $header) {
                list($key, $value) = explode(':', $header, 2);
                $key = trim($key);
                $value = trim($value);
                $this->headers[$key] = $value;
            }
        }

        $this->updateHeaders();
    }

    /**
     * Set JSON Decoder
     *
     * @access public
     * @param  $mixed boolean|callable
     */
    public function setJsonDecoder($mixed)
    {
        if ($mixed === false) {
            $this->jsonDecoder = false;
        } elseif (is_callable($mixed)) {
            $this->jsonDecoder = $mixed;
        }
    }

    /**
     * Set XML Decoder
     *
     * @access public
     * @param  $mixed boolean|callable
     */
    public function setXmlDecoder($mixed)
    {
        if ($mixed === false) {
            $this->xmlDecoder = false;
        } elseif (is_callable($mixed)) {
            $this->xmlDecoder = $mixed;
        }
    }

    /**
     * Set Proxy
     *
     * Set an HTTP proxy to tunnel requests through.
     *
     * @access public
     * @param  $proxy - The HTTP proxy to tunnel requests through. May include port number.
     * @param  $port - The port number of the proxy to connect to. This port number can also be set in $proxy.
     * @param  $username - The username to use for the connection to the proxy.
     * @param  $password - The password to use for the connection to the proxy.
     */
    public function setProxy($proxy, $port = null, $username = null, $password = null)
    {
        $this->setOpt(CURLOPT_PROXY, $proxy);
        if ($port !== null) {
            $this->setOpt(CURLOPT_PROXYPORT, $port);
        }
        if ($username !== null && $password !== null) {
            $this->setOpt(CURLOPT_PROXYUSERPWD, $username . ':' . $password);
        }
    }

    /**
     * Set Proxies
     *
     * Set proxies to tunnel requests through. When set, a random proxy will be
     * used for the request.
     *
     * @access public
     * @param  $proxies array - A list of HTTP proxies to tunnel requests
     *     through. May include port number.
     */
    public function setProxies($proxies)
    {
        $this->proxies = $proxies;
    }

    /**
     * Set Proxy Auth
     *
     * Set the HTTP authentication method(s) to use for the proxy connection.
     *
     * @access public
     * @param  $auth
     */
    public function setProxyAuth($auth)
    {
        $this->setOpt(CURLOPT_PROXYAUTH, $auth);
    }

    /**
     * Set Proxy Type
     *
     * Set the proxy protocol type.
     *
     * @access public
     * @param  $type
     */
    public function setProxyType($type)
    {
        $this->setOpt(CURLOPT_PROXYTYPE, $type);
    }

    /**
     * Set Proxy Tunnel
     *
     * Set the proxy to tunnel through HTTP proxy.
     *
     * @access public
     * @param  $tunnel boolean
     */
    public function setProxyTunnel($tunnel = true)
    {
        $this->setOpt(CURLOPT_HTTPPROXYTUNNEL, $tunnel);
    }

    /**
     * Unset Proxy
     *
     * Disable use of the proxy.
     *
     * @access public
     */
    public function unsetProxy()
    {
        $this->setOpt(CURLOPT_PROXY, null);
    }

    /**
     * Set Opt
     *
     * @access public
     * @param  $option
     * @param  $value
     */
    public function setOpt($option, $value)
    {
        $this->options[$option] = $value;
    }

    /**
     * Set Opts
     *
     * @access public
     * @param  $options
     */
    public function setOpts($options)
    {
        foreach ($options as $option => $value) {
            $this->setOpt($option, $value);
        }
    }

    /**
     * Set Range
     *
     * @access public
     * @param  $range
     */
    public function setRange($range)
    {
        $this->setOpt(CURLOPT_RANGE, $range);
    }

    /**
     * Set Rate Limit
     *
     * @access public
     * @param  $rate_limit string (e.g. "60/1m").
     * @throws \UnexpectedValueException
     */
    public function setRateLimit($rate_limit)
    {
        $rate_limit_pattern =
            '/' .       // delimiter
            '^' .       // assert start
            '(\d+)' .   // digit(s)
            '\/' .      // slash
            '(\d+)?' .  // digit(s), optional
            '(s|m|h)' . // unit, s for seconds, m for minutes, h for hours
            '$' .       // assert end
            '/' .       // delimiter
            'i' .       // case-insensitive matches
            '';
        if (!preg_match($rate_limit_pattern, $rate_limit, $matches)) {
            throw new \UnexpectedValueException(
                'rate limit must be formatted as $max_requests/$interval(s|m|h) ' .
                '(e.g. "60/1m" for a maximum of 60 requests per 1 minute)'
            );
        }

        $max_requests = (int)$matches['1'];
        if ($matches['2'] === '') {
            $interval = 1;
        } else {
            $interval = (int)$matches['2'];
        }
        $unit = strtolower($matches['3']);

        // Convert interval to seconds based on unit.
        if ($unit === 's') {
            $interval_seconds = $interval * 1;
        } elseif ($unit === 'm') {
            $interval_seconds = $interval * 60;
        } elseif ($unit === 'h') {
            $interval_seconds = $interval * 3600;
        }

        $this->rateLimit = $max_requests . '/' . $interval . $unit;
        $this->rateLimitEnabled = true;
        $this->maxRequests = $max_requests;
        $this->interval = $interval;
        $this->intervalSeconds = $interval_seconds;
        $this->unit = $unit;
    }

    /**
     * Set Referer
     *
     * @access public
     * @param  $referer
     */
    public function setReferer($referer)
    {
        $this->setReferrer($referer);
    }

    /**
     * Set Referrer
     *
     * @access public
     * @param  $referrer
     */
    public function setReferrer($referrer)
    {
        $this->setOpt(CURLOPT_REFERER, $referrer);
    }

    /**
     * Set Retry
     *
     * Number of retries to attempt or decider callable.
     *
     * When using a number of retries to attempt, the maximum number of attempts
     * for the request is $maximum_number_of_retries + 1.
     *
     * When using a callable decider, the request will be retried until the
     * function returns a value which evaluates to false.
     *
     * @access public
     * @param  $mixed
     */
    public function setRetry($mixed)
    {
        $this->retry = $mixed;
    }

    /**
     * Set Timeout
     *
     * @access public
     * @param  $seconds
     */
    public function setTimeout($seconds)
    {
        $this->setOpt(CURLOPT_TIMEOUT, $seconds);
    }

    /**
     * Disable Timeout
     *
     * @access public
     */
    public function disableTimeout()
    {
        $this->setTimeout(null);
    }

    /**
     * Set Url
     *
     * @access public
     * @param  $url
     */
    public function setUrl($url)
    {
        $this->baseUrl = $url;
    }

    /**
     * Set User Agent
     *
     * @access public
     * @param  $user_agent
     */
    public function setUserAgent($user_agent)
    {
        $this->setOpt(CURLOPT_USERAGENT, $user_agent);
    }

    /**
     * Set Interface
     *
     * The name of the outgoing network interface to use.
     * This can be an interface name, an IP address or a host name.
     *
     * @access public
     * @param  $interface
     */
    public function setInterface($interface)
    {
        $this->setOpt(CURLOPT_INTERFACE, $interface);
    }

    /**
     * Start
     *
     * @access public
     * @throws \ErrorException
     */
    public function start()
    {
        if ($this->isStarted) {
            return;
        }

        $this->isStarted = true;
        $this->currentStartTime = microtime(true);
        $this->currentRequestCount = 0;

        do {
            while (count($this->curls) &&
                count($this->activeCurls) < $this->concurrency &&
                (!$this->rateLimitEnabled || $this->hasRequestQuota())
            ) {
                $this->initHandle();
            }

            if ($this->rateLimitEnabled && !count($this->activeCurls) && !$this->hasRequestQuota()) {
                $this->waitUntilRequestQuotaAvailable();
            }

            // Wait for activity on any curl_multi connection when curl_multi_select (libcurl) fails to correctly block.
            // https://bugs.php.net/bug.php?id=63411
            if (curl_multi_select($this->multiCurl) === -1) {
                usleep(100000);
            }

            curl_multi_exec($this->multiCurl, $active);

            while (($info_array = curl_multi_info_read($this->multiCurl)) !== false) {
                if ($info_array['msg'] === CURLMSG_DONE) {
                    foreach ($this->activeCurls as $key => $curl) {
                        if ($curl->curl === $info_array['handle']) {
                            // Set the error code for multi handles using the "result" key in the array returned by
                            // curl_multi_info_read(). Using curl_errno() on a multi handle will incorrectly return 0
                            // for errors.
                            $curl->curlErrorCode = $info_array['result'];
                            $curl->exec($curl->curl);

                            if ($curl->attemptRetry()) {
                                // Remove completed handle before adding again in order to retry request.
                                curl_multi_remove_handle($this->multiCurl, $curl->curl);

                                $curlm_error_code = curl_multi_add_handle($this->multiCurl, $curl->curl);
                                if ($curlm_error_code !== CURLM_OK) {
                                    throw new \ErrorException(
                                        'cURL multi add handle error: ' . curl_multi_strerror($curlm_error_code)
                                    );
                                }
                            } else {
                                $curl->execDone();

                                // Remove completed instance from active curls.
                                unset($this->activeCurls[$key]);

                                // Remove handle of the completed instance.
                                curl_multi_remove_handle($this->multiCurl, $curl->curl);

                                // Clean up completed instance.
                                $curl->close();
                            }

                            break;
                        }
                    }
                }
            }
        } while ($active || count($this->activeCurls) || count($this->curls));

        $this->isStarted = false;
    }

    /**
     * Success
     *
     * @access public
     * @param  $callback
     */
    public function success($callback)
    {
        $this->successCallback = $callback;
    }

    /**
     * Unset Header
     *
     * Remove extra header previously set using Curl::setHeader().
     *
     * @access public
     * @param  $key
     */
    public function unsetHeader($key)
    {
        unset($this->headers[$key]);
    }

    /**
     * Remove Header
     *
     * Remove an internal header from the request.
     * Using `curl -H "Host:" ...' is equivalent to $curl->removeHeader('Host');.
     *
     * @access public
     * @param  $key
     */
    public function removeHeader($key)
    {
        $this->setHeader($key, '');
    }

    /**
     * Verbose
     *
     * @access public
     * @param  bool $on
     * @param  resource $output
     */
    public function verbose($on = true, $output = STDERR)
    {
        // Turn off CURLINFO_HEADER_OUT for verbose to work. This has the side
        // effect of causing Curl::requestHeaders to be empty.
        if ($on) {
            $this->setOpt(CURLINFO_HEADER_OUT, false);
        }
        $this->setOpt(CURLOPT_VERBOSE, $on);
        $this->setOpt(CURLOPT_STDERR, $output);
    }

    /**
     * Destruct
     *
     * @access public
     */
    public function __destruct()
    {
        $this->close();
    }

    /**
     * Update Headers
     *
     * @access private
     */
    private function updateHeaders()
    {
        foreach ($this->curls as $curl) {
            $curl->setHeaders($this->headers);
        }
    }

    /**
     * Queue Handle
     *
     * @access private
     * @param  $curl
     */
    private function queueHandle($curl)
    {
        // Use sequential ids to allow for ordered post processing.
        $curl->id = $this->nextCurlId++;
        $curl->childOfMultiCurl = true;
        $this->curls[$curl->id] = $curl;

        $curl->setHeaders($this->headers);
    }

    /**
     * Init Handle
     *
     * @access private
     * @param  $curl
     * @throws \ErrorException
     */
    private function initHandle()
    {
        $curl = array_shift($this->curls);
        if ($curl === null) {
            return;
        }

        // Add instance to list of active curls.
        $this->currentRequestCount += 1;
        $this->activeCurls[$curl->id] = $curl;

        // Set callbacks if not already individually set.
        if ($curl->beforeSendCallback === null) {
            $curl->beforeSend($this->beforeSendCallback);
        }
        if ($curl->successCallback === null) {
            $curl->success($this->successCallback);
        }
        if ($curl->errorCallback === null) {
            $curl->error($this->errorCallback);
        }
        if ($curl->completeCallback === null) {
            $curl->complete($this->completeCallback);
        }

        // Set decoders if not already individually set.
        if ($curl->jsonDecoder === null) {
            $curl->setJsonDecoder($this->jsonDecoder);
        }
        if ($curl->xmlDecoder === null) {
            $curl->setXmlDecoder($this->xmlDecoder);
        }

        $curl->setOpts($this->options);
        $curl->setRetry($this->retry);
        $curl->setCookies($this->cookies);

        // Use a random proxy for the curl instance when proxies have been set
        // and the curl instance doesn't already have a proxy set.
        if (is_array($this->proxies) && $curl->getOpt(CURLOPT_PROXY) === null) {
            $random_proxy = ArrayUtil::arrayRandom($this->proxies);
            $curl->setProxy($random_proxy);
        }

        $curlm_error_code = curl_multi_add_handle($this->multiCurl, $curl->curl);
        if ($curlm_error_code !== CURLM_OK) {
            throw new \ErrorException('cURL multi add handle error: ' . curl_multi_strerror($curlm_error_code));
        }

        $curl->call($curl->beforeSendCallback);
    }

    /**
     * Has Request Quota
     *
     * Checks if there is any available quota to make additional requests while
     * rate limiting is enabled.
     *
     * @access private
     */
    private function hasRequestQuota()
    {
        // Calculate if there's request quota since ratelimiting is enabled.
        if ($this->rateLimitEnabled) {
            // Determine if the limit of requests per interval has been reached.
            if ($this->currentRequestCount >= $this->maxRequests) {
                $elapsed_seconds = microtime(true) - $this->currentStartTime;
                if ($elapsed_seconds <= $this->intervalSeconds) {
                    $this->rateLimitReached = true;
                    return false;
                } elseif ($this->rateLimitReached) {
                    $this->rateLimitReached = false;
                    $this->currentStartTime = microtime(true);
                    $this->currentRequestCount = 0;
                }
            }

            return true;
        } else {
            return true;
        }
    }

    /**
     * Wait Until Request Quota Available
     *
     * Waits until there is available request quota available based on the rate limit.
     *
     * @access private
     */
    private function waitUntilRequestQuotaAvailable()
    {
        $sleep_until = $this->currentStartTime + $this->intervalSeconds;
        $sleep_seconds = $sleep_until - microtime(true);

        // Avoid using time_sleep_until() as it appears to be less precise and not sleep long enough.
        usleep($sleep_seconds * 1000000);

        $this->currentStartTime = microtime(true);
        $this->currentRequestCount = 0;
    }
}
lib/Curl/CaseInsensitiveArray.php000064400000013062151526424700013033 0ustar00<?php

namespace Curl;

class CaseInsensitiveArray implements \ArrayAccess, \Countable, \Iterator
{

    /**
     * @var mixed[] Data storage with lowercase keys.
     * @see offsetSet()
     * @see offsetExists()
     * @see offsetUnset()
     * @see offsetGet()
     * @see count()
     * @see current()
     * @see next()
     * @see key()
     */
    private $data = [];

    /**
     * @var string[] Case-sensitive keys.
     * @see offsetSet()
     * @see offsetUnset()
     * @see key()
     */
    private $keys = [];

    /**
     * Construct
     *
     * Allow creating an empty array or converting an existing array to a
     * case-insensitive array. Caution: Data may be lost when converting
     * case-sensitive arrays to case-insensitive arrays.
     *
     * @param mixed[] $initial (optional) Existing array to convert.
     *
     * @return CaseInsensitiveArray
     *
     * @access public
     */
    public function __construct(array $initial = null)
    {
        if ($initial !== null) {
            foreach ($initial as $key => $value) {
                $this->offsetSet($key, $value);
            }
        }
    }

    /**
     * Offset Set
     *
     * Set data at a specified offset. Converts the offset to lowercase, and
     * stores the case-sensitive offset and the data at the lowercase indexes in
     * $this->keys and @this->data.
     *
     * @see https://secure.php.net/manual/en/arrayaccess.offsetset.php
     *
     * @param string $offset The offset to store the data at (case-insensitive).
     * @param mixed $value The data to store at the specified offset.
     *
     * @return void
     *
     * @access public
     */
    #[\ReturnTypeWillChange]
    public function offsetSet($offset, $value)
    {
        if ($offset === null) {
            $this->data[] = $value;
        } else {
            $offsetlower = strtolower($offset);
            $this->data[$offsetlower] = $value;
            $this->keys[$offsetlower] = $offset;
        }
    }

    /**
     * Offset Exists
     *
     * Checks if the offset exists in data storage. The index is looked up with
     * the lowercase version of the provided offset.
     *
     * @see https://secure.php.net/manual/en/arrayaccess.offsetexists.php
     *
     * @param string $offset Offset to check
     *
     * @return bool If the offset exists.
     *
     * @access public
     */
    #[\ReturnTypeWillChange]
    public function offsetExists($offset)
    {
        return (bool) array_key_exists(strtolower($offset), $this->data);
    }

    /**
     * Offset Unset
     *
     * Unsets the specified offset. Converts the provided offset to lowercase,
     * and unsets the case-sensitive key, as well as the stored data.
     *
     * @see https://secure.php.net/manual/en/arrayaccess.offsetunset.php
     *
     * @param string $offset The offset to unset.
     *
     * @return void
     *
     * @access public
     */
    #[\ReturnTypeWillChange]
    public function offsetUnset($offset)
    {
        $offsetlower = strtolower($offset);
        unset($this->data[$offsetlower]);
        unset($this->keys[$offsetlower]);
    }

    /**
     * Offset Get
     *
     * Return the stored data at the provided offset. The offset is converted to
     * lowercase and the lookup is done on the data store directly.
     *
     * @see https://secure.php.net/manual/en/arrayaccess.offsetget.php
     *
     * @param string $offset Offset to lookup.
     *
     * @return mixed The data stored at the offset.
     *
     * @access public
     */
    #[\ReturnTypeWillChange]
    public function offsetGet($offset)
    {
        $offsetlower = strtolower($offset);
        return isset($this->data[$offsetlower]) ? $this->data[$offsetlower] : null;
    }

    /**
     * Count
     *
     * @see https://secure.php.net/manual/en/countable.count.php
     *
     * @param void
     *
     * @return int The number of elements stored in the array.
     *
     * @access public
     */
    #[\ReturnTypeWillChange]
    public function count()
    {
        return (int) count($this->data);
    }

    /**
     * Current
     *
     * @see https://secure.php.net/manual/en/iterator.current.php
     *
     * @param void
     *
     * @return mixed Data at the current position.
     *
     * @access public
     */
    #[\ReturnTypeWillChange]
    public function current()
    {
        return current($this->data);
    }

    /**
     * Next
     *
     * @see https://secure.php.net/manual/en/iterator.next.php
     *
     * @param void
     *
     * @return void
     *
     * @access public
     */
    #[\ReturnTypeWillChange]
    public function next()
    {
        next($this->data);
    }

    /**
     * Key
     *
     * @see https://secure.php.net/manual/en/iterator.key.php
     *
     * @param void
     *
     * @return mixed Case-sensitive key at current position.
     *
     * @access public
     */
    #[\ReturnTypeWillChange]
    public function key()
    {
        $key = key($this->data);
        return isset($this->keys[$key]) ? $this->keys[$key] : $key;
    }

    /**
     * Valid
     *
     * @see https://secure.php.net/manual/en/iterator.valid.php
     *
     * @return bool If the current position is valid.
     *
     * @access public
     */
    #[\ReturnTypeWillChange]
    public function valid()
    {
        return (bool) (key($this->data) !== null);
    }

    /**
     * Rewind
     *
     * @see https://secure.php.net/manual/en/iterator.rewind.php
     *
     * @param void
     *
     * @return void
     *
     * @access public
     */
    #[\ReturnTypeWillChange]
    public function rewind()
    {
        reset($this->data);
    }
}
lib/Curl/StringUtil.php000064400000003204151526424700011041 0ustar00<?php

namespace Curl;

class StringUtil
{
    public static function characterReversePosition($haystack, $needle, $part = false)
    {
        if (function_exists('\mb_strrchr')) {
            return \mb_strrchr($haystack, $needle, $part);
        } else {
            return \strrchr($haystack, $needle);
        }
    }

    public static function length($string)
    {
        if (function_exists('\mb_strlen')) {
            return \mb_strlen($string);
        } else {
            return \strlen($string);
        }
    }

    public static function position($haystack, $needle, $offset = 0)
    {
        if (function_exists('\mb_strpos')) {
            return \mb_strpos($haystack, $needle, $offset);
        } else {
            return \strpos($haystack, $needle, $offset);
        }
    }

    public static function reversePosition($haystack, $needle, $offset = 0)
    {
        if (function_exists('\mb_strrpos')) {
            return \mb_strrpos($haystack, $needle, $offset);
        } else {
            return \strrpos($haystack, $needle, $offset);
        }
    }

    /**
     * Return true when $haystack starts with $needle.
     *
     * @access public
     * @param  $haystack
     * @param  $needle
     *
     * @return bool
     */
    public static function startsWith($haystack, $needle)
    {
        return self::substring($haystack, 0, self::length($needle)) === $needle;
    }

    public static function substring($string, $start, $length)
    {
        if (function_exists('\mb_substr')) {
            return \mb_substr($string, $start, $length);
        } else {
            return \substr($string, $start, $length);
        }
    }
}
lib/Curl/ArrayUtil.php000064400000007054151526424700010660 0ustar00<?php

namespace Curl;

include_once __DIR__ . '/CaseInsensitiveArray.php';


use Curl\CaseInsensitiveArray;

class ArrayUtil
{
    /**
     * Is Array Assoc
     *
     * @access public
     * @param  $array
     *
     * @return boolean
     */
    public static function isArrayAssoc($array)
    {
        return (
            $array instanceof CaseInsensitiveArray ||
            (bool)count(array_filter(array_keys($array), 'is_string'))
        );
    }

    /**
     * Is Array Assoc
     *
     * @deprecated Use ArrayUtil::isArrayAssoc().
     * @access public
     * @param  $array
     *
     * @return boolean
     */
    public static function is_array_assoc($array)
    {
        return static::isArrayAssoc($array);
    }

    /**
     * Is Array Multidim
     *
     * @access public
     * @param  $array
     *
     * @return boolean
     */
    public static function isArrayMultidim($array)
    {
        if (!is_array($array)) {
            return false;
        }

        return (bool)count(array_filter($array, 'is_array'));
    }

    /**
     * Is Array Multidim
     *
     * @deprecated Use ArrayUtil::isArrayMultidim().
     * @access public
     * @param  $array
     *
     * @return boolean
     */
    public static function is_array_multidim($array)
    {
        return static::isArrayMultidim($array);
    }

    /**
     * Array Flatten Multidim
     *
     * @access public
     * @param  $array
     * @param  $prefix
     *
     * @return array
     */
    public static function arrayFlattenMultidim($array, $prefix = false)
    {
        $return = [];
        if (is_array($array) || is_object($array)) {
            if (empty($array)) {
                $return[$prefix] = '';
            } else {
                foreach ($array as $key => $value) {
                    if (is_scalar($value)) {
                        if ($prefix) {
                            $return[$prefix . '[' . $key . ']'] = $value;
                        } else {
                            $return[$key] = $value;
                        }
                    } else {
                        if ($value instanceof \CURLFile) {
                            $return[$key] = $value;
                        } else {
                            $return = array_merge(
                                $return,
                                self::arrayFlattenMultidim(
                                    $value,
                                    $prefix ? $prefix . '[' . $key . ']' : $key
                                )
                            );
                        }
                    }
                }
            }
        } elseif ($array === null) {
            $return[$prefix] = $array;
        }
        return $return;
    }

    /**
     * Array Flatten Multidim
     *
     * @deprecated Use ArrayUtil::arrayFlattenMultidim().
     * @access public
     * @param  $array
     * @param  $prefix
     *
     * @return array
     */
    public static function array_flatten_multidim($array, $prefix = false)
    {
        return static::arrayFlattenMultidim($array, $prefix);
    }

    /**
     * Array Random
     *
     * @access public
     * @param  $array
     *
     * @return mixed
     */
    public static function arrayRandom($array)
    {
        return $array[mt_rand(0, count($array) - 1)];
    }

    /**
     * Array Random
     *
     * @deprecated Use ArrayUtil::arrayRandom().
     * @access public
     * @param  $array
     *
     * @return mixed
     */
    public static function array_random($array)
    {
        return static::arrayRandom($array);
    }
}
lib/Curl/Curl.php000064400000143565151526424700007661 0ustar00<?php

namespace Curl;

include_once __DIR__ . '/ArrayUtil.php';
include_once __DIR__ . '/Decoder.php';
include_once __DIR__ . '/Url.php';

use Curl\ArrayUtil;
use Curl\Decoder;
use Curl\Url;

#[\AllowDynamicProperties]
class Curl
{
    const VERSION = '8.9.0';
    const DEFAULT_TIMEOUT = 30;

    public $curl;
    public $id = null;

    public $error = false;
    public $errorCode = 0;
    public $errorMessage = null;

    public $curlError = false;
    public $curlErrorCode = 0;
    public $curlErrorMessage = null;

    public $httpError = false;
    public $httpStatusCode = 0;
    public $httpErrorMessage = null;

    public $url = null;
    public $requestHeaders = null;
    public $responseHeaders = null;
    public $rawResponseHeaders = '';
    public $responseCookies = [];
    public $response = null;
    public $rawResponse = null;

    public $beforeSendCallback = null;
    public $downloadCompleteCallback = null;
    public $successCallback = null;
    public $errorCallback = null;
    public $completeCallback = null;
    public $fileHandle = null;
    public $downloadFileName = null;

    public $attempts = 0;
    public $retries = 0;
    public $childOfMultiCurl = false;
    public $remainingRetries = 0;
    public $retryDecider = null;

    public $jsonDecoder = null;
    public $xmlDecoder = null;

    private $cookies = array();
    private $headers = array();
    private $options = array();

    private $jsonDecoderArgs = [];
    private $jsonPattern = '/^(?:application|text)\/(?:[a-z]+(?:[\.-][0-9a-z]+){0,}[\+\.]|x-)?json(?:-[a-z]+)?/i';
    private $xmlDecoderArgs = [];
    private $xmlPattern = '~^(?:text/|application/(?:atom\+|rss\+|soap\+)?)xml~i';
    private $defaultDecoder = null;

    public static $RFC2616 = [
        // RFC 2616: "any CHAR except CTLs or separators".
        // CHAR           = <any US-ASCII character (octets 0 - 127)>
        // CTL            = <any US-ASCII control character
        //                  (octets 0 - 31) and DEL (127)>
        // separators     = "(" | ")" | "<" | ">" | "@"
        //                | "," | ";" | ":" | "\" | <">
        //                | "/" | "[" | "]" | "?" | "="
        //                | "{" | "}" | SP | HT
        // SP             = <US-ASCII SP, space (32)>
        // HT             = <US-ASCII HT, horizontal-tab (9)>
        // <">            = <US-ASCII double-quote mark (34)>
        '!', '#', '$', '%', '&', "'", '*', '+', '-', '.', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B',
        'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
        'Y', 'Z', '^', '_', '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q',
        'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '|', '~',
    ];
    public static $RFC6265 = [
        // RFC 6265: "US-ASCII characters excluding CTLs, whitespace DQUOTE, comma, semicolon, and backslash".
        // %x21
        '!',
        // %x23-2B
        '#', '$', '%', '&', "'", '(', ')', '*', '+',
        // %x2D-3A
        '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':',
        // %x3C-5B
        '<', '=', '>', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q',
        'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[',
        // %x5D-7E
        ']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r',
        's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~',
    ];

    private static $deferredProperties = array(
        'effectiveUrl',
        'rfc2616',
        'rfc6265',
        'totalTime',
    );

    /**
     * Construct
     *
     * @access public
     * @param  $base_url
     * @throws \ErrorException
     */
    public function __construct($base_url = null)
    {
        if (!extension_loaded('curl')) {
            throw new \ErrorException('cURL library is not loaded');
        }

        $this->curl = curl_init();
        $this->initialize($base_url);
    }

    /**
     * Before Send
     *
     * @access public
     * @param  $callback
     */
    public function beforeSend($callback)
    {
        $this->beforeSendCallback = $callback;
    }

    /**
     * Build Post Data
     *
     * @access public
     * @param  $data
     *
     * @return array|string
     * @throws \ErrorException
     */
    public function buildPostData($data)
    {
        $binary_data = false;

        // Return JSON-encoded string when the request's content-type is JSON and the data is serializable.
        if (isset($this->headers['Content-Type']) &&
            preg_match($this->jsonPattern, $this->headers['Content-Type']) &&
            (
                is_array($data) ||
                (
                    is_object($data) &&
                    interface_exists('JsonSerializable', false) &&
                    $data instanceof \JsonSerializable
                )
            )) {
            $data = \Curl\Encoder::encodeJson($data);
        } elseif (is_array($data)) {
            // Manually build a single-dimensional array from a multi-dimensional array as using curl_setopt($ch,
            // CURLOPT_POSTFIELDS, $data) doesn't correctly handle multi-dimensional arrays when files are
            // referenced.
            if (ArrayUtil::isArrayMultidim($data)) {
                $data = ArrayUtil::arrayFlattenMultidim($data);
            }

            // Modify array values to ensure any referenced files are properly handled depending on the support of
            // the @filename API or CURLFile usage. This also fixes the warning "curl_setopt(): The usage of the
            // @filename API for file uploading is deprecated. Please use the CURLFile class instead". Ignore
            // non-file values prefixed with the @ character.
            foreach ($data as $key => $value) {
                if (is_string($value) && strpos($value, '@') === 0 && is_file(substr($value, 1))) {
                    $binary_data = true;
                    if (class_exists('CURLFile')) {
                        $data[$key] = new \CURLFile(substr($value, 1));
                    }
                } elseif ($value instanceof \CURLFile) {
                    $binary_data = true;
                }
            }
        }

        if (!$binary_data &&
            (is_array($data) || is_object($data)) &&
            (
                !isset($this->headers['Content-Type']) ||
                !preg_match('/^multipart\/form-data/', $this->headers['Content-Type'])
            )) {
            $data = http_build_query($data, '', '&');
        }

        return $data;
    }

    /**
     * Call
     *
     * @access public
     */
    public function call()
    {
        $args = func_get_args();
        $function = array_shift($args);
        if (is_callable($function)) {
            array_unshift($args, $this);
            call_user_func_array($function, $args);
        }
    }

    /**
     * Close
     *
     * @access public
     */
    public function close()
    {
        if (is_resource($this->curl)) {
            curl_close($this->curl);
        }
        $this->options = null;
        $this->jsonDecoder = null;
        $this->jsonDecoderArgs = null;
        $this->xmlDecoder = null;
        $this->xmlDecoderArgs = null;
        $this->defaultDecoder = null;
    }

    /**
     * Complete
     *
     * @access public
     * @param  $callback
     */
    public function complete($callback)
    {
        $this->completeCallback = $callback;
    }

    /**
     * Progress
     *
     * @access public
     * @param  $callback
     */
    public function progress($callback)
    {
        $this->setOpt(CURLOPT_PROGRESSFUNCTION, $callback);
        $this->setOpt(CURLOPT_NOPROGRESS, false);
    }

    /**
     * Delete
     *
     * @access public
     * @param  $url
     * @param  $query_parameters
     * @param  $data
     *
     * @return mixed Returns the value provided by exec.
     */
    public function delete($url, $query_parameters = [], $data = [])
    {
        if (is_array($url)) {
            $data = $query_parameters;
            $query_parameters = $url;
            $url = (string)$this->url;
        }

        $this->setUrl($url, $query_parameters);
        $this->setOpt(CURLOPT_CUSTOMREQUEST, 'DELETE');

        // Avoid including a content-length header in DELETE requests unless there is a message body. The following
        // would include "Content-Length: 0" in the request header:
        //   curl_setopt($ch, CURLOPT_POSTFIELDS, []);
        // RFC 2616 4.3 Message Body:
        //   The presence of a message-body in a request is signaled by the
        //   inclusion of a Content-Length or Transfer-Encoding header field in
        //   the request's message-headers.
        if (!empty($data)) {
            $this->setOpt(CURLOPT_POSTFIELDS, $this->buildPostData($data));
        }
        return $this->exec();
    }

    /**
     * Download
     *
     * @access public
     * @param  $url
     * @param  $mixed_filename
     *
     * @return boolean
     */
    public function download($url, $mixed_filename)
    {
        // Use tmpfile() or php://temp to avoid "Too many open files" error.
        if (is_callable($mixed_filename)) {
            $this->downloadCompleteCallback = $mixed_filename;
            $this->downloadFileName = null;
            $this->fileHandle = tmpfile();
        } else {
            $filename = $mixed_filename;

            // Use a temporary file when downloading. Not using a temporary file can cause an error when an existing
            // file has already fully completed downloading and a new download is started with the same destination save
            // path. The download request will include header "Range: bytes=$filesize-" which is syntactically valid,
            // but unsatisfiable.
            $download_filename = $filename . '.pccdownload';
            $this->downloadFileName = $download_filename;

            // Attempt to resume download only when a temporary download file exists and is not empty.
            if (is_file($download_filename) && $filesize = filesize($download_filename)) {
                $first_byte_position = $filesize;
                $range = $first_byte_position . '-';
                $this->setRange($range);
                $this->fileHandle = fopen($download_filename, 'ab');
            } else {
                $this->fileHandle = fopen($download_filename, 'wb');
            }

            // Move the downloaded temporary file to the destination save path.
            $this->downloadCompleteCallback = function ($instance, $fh) use ($download_filename, $filename) {
                // Close the open file handle before renaming the file.
                if (is_resource($fh)) {
                    fclose($fh);
                }

                rename($download_filename, $filename);
            };
        }

        $this->setFile($this->fileHandle);
        $this->get($url);

        return ! $this->error;
    }

    /**
     * Error
     *
     * @access public
     * @param  $callback
     */
    public function error($callback)
    {
        $this->errorCallback = $callback;
    }

    /**
     * Exec
     *
     * @access public
     * @param  $ch
     *
     * @return mixed Returns the value provided by parseResponse.
     */
    public function exec($ch = null)
    {
        $this->attempts += 1;

        if ($this->jsonDecoder === null) {
            $this->setDefaultJsonDecoder();
        }
        if ($this->xmlDecoder === null) {
            $this->setDefaultXmlDecoder();
        }

        if ($ch === null) {
            $this->responseCookies = [];
            $this->call($this->beforeSendCallback);
            $this->rawResponse = curl_exec($this->curl);
            $this->curlErrorCode = curl_errno($this->curl);
            $this->curlErrorMessage = curl_error($this->curl);
        } else {
            $this->rawResponse = curl_multi_getcontent($ch);
            $this->curlErrorMessage = curl_error($ch);
        }
        $this->curlError = $this->curlErrorCode !== 0;

        // Transfer the header callback data and release the temporary store to avoid memory leak.
        $this->rawResponseHeaders = $this->headerCallbackData->rawResponseHeaders;
        $this->responseCookies = $this->headerCallbackData->responseCookies;
        $this->headerCallbackData->rawResponseHeaders = '';
        $this->headerCallbackData->responseCookies = array();

        // Include additional error code information in error message when possible.
        if ($this->curlError && function_exists('curl_strerror')) {
            $this->curlErrorMessage =
                curl_strerror($this->curlErrorCode) . (
                    empty($this->curlErrorMessage) ? '' : ': ' . $this->curlErrorMessage
                );
        }

        $this->httpStatusCode = $this->getInfo(CURLINFO_HTTP_CODE);
        $this->httpError = in_array(floor($this->httpStatusCode / 100), array(4, 5));
        $this->error = $this->curlError || $this->httpError;
        $this->errorCode = $this->error ? ($this->curlError ? $this->curlErrorCode : $this->httpStatusCode) : 0;

        // NOTE: CURLINFO_HEADER_OUT set to true is required for requestHeaders
        // to not be empty (e.g. $curl->setOpt(CURLINFO_HEADER_OUT, true);).
        if ($this->getOpt(CURLINFO_HEADER_OUT) === true) {
            $this->requestHeaders = $this->parseRequestHeaders($this->getInfo(CURLINFO_HEADER_OUT));
        }
        $this->responseHeaders = $this->parseResponseHeaders($this->rawResponseHeaders);
        $this->response = $this->parseResponse($this->responseHeaders, $this->rawResponse);

        $this->httpErrorMessage = '';
        if ($this->error) {
            if (isset($this->responseHeaders['Status-Line'])) {
                $this->httpErrorMessage = $this->responseHeaders['Status-Line'];
            }
        }
        $this->errorMessage = $this->curlError ? $this->curlErrorMessage : $this->httpErrorMessage;

        // Reset select deferred properties so that they may be recalculated.
        unset($this->effectiveUrl);
        unset($this->totalTime);

        // Reset content-length header possibly set from a PUT or SEARCH request.
        $this->unsetHeader('Content-Length');

        // Reset nobody setting possibly set from a HEAD request.
        $this->setOpt(CURLOPT_NOBODY, false);

        // Allow multicurl to attempt retry as needed.
        if ($this->isChildOfMultiCurl()) {
            return;
        }

        if ($this->attemptRetry()) {
            return $this->exec($ch);
        }

        $this->execDone();

        return $this->response;
    }

    public function execDone()
    {
        if ($this->error) {
            $this->call($this->errorCallback);
        } else {
            $this->call($this->successCallback);
        }

        $this->call($this->completeCallback);

        // Close open file handles and reset the curl instance.
        if ($this->fileHandle !== null) {
            $this->downloadComplete($this->fileHandle);
        }
    }

    /**
     * Get
     *
     * @access public
     * @param  $url
     * @param  $data
     *
     * @return mixed Returns the value provided by exec.
     */
    public function get($url, $data = [])
    {
        if (is_array($url)) {
            $data = $url;
            $url = (string)$this->url;
        }
        $this->setUrl($url, $data);
        $this->setOpt(CURLOPT_CUSTOMREQUEST, 'GET');
        $this->setOpt(CURLOPT_HTTPGET, true);

        return $this->exec();
    }

    /**
     * Get Info
     *
     * @access public
     * @param  $opt
     *
     * @return mixed
     */
    public function getInfo($opt = null)
    {
        $args = [];
        $args[] = $this->curl;

        if (func_num_args()) {
            $args[] = $opt;
        }

        return call_user_func_array('curl_getinfo', $args);
    }

    /**
     * Get Opt
     *
     * @access public
     * @param  $option
     *
     * @return mixed
     */
    public function getOpt($option)
    {
        return isset($this->options[$option]) ? $this->options[$option] : null;
    }

    /**
     * Head
     *
     * @access public
     * @param  $url
     * @param  $data
     *
     * @return mixed Returns the value provided by exec.
     */
    public function head($url, $data = [])
    {
        if (is_array($url)) {
            $data = $url;
            $url = (string)$this->url;
        }
        $this->setUrl($url, $data);
        $this->setOpt(CURLOPT_CUSTOMREQUEST, 'HEAD');
        $this->setOpt(CURLOPT_NOBODY, true);
        return $this->exec();
    }

    /**
     * Options
     *
     * @access public
     * @param  $url
     * @param  $data
     *
     * @return mixed Returns the value provided by exec.
     */
    public function options($url, $data = [])
    {
        if (is_array($url)) {
            $data = $url;
            $url = (string)$this->url;
        }
        $this->setUrl($url, $data);
        $this->setOpt(CURLOPT_CUSTOMREQUEST, 'OPTIONS');
        return $this->exec();
    }

    /**
     * Patch
     *
     * @access public
     * @param  $url
     * @param  $data
     *
     * @return mixed Returns the value provided by exec.
     */
    public function patch($url, $data = [])
    {
        if (is_array($url)) {
            $data = $url;
            $url = (string)$this->url;
        }

        if (is_array($data) && empty($data)) {
            $this->removeHeader('Content-Length');
        }

        $this->setUrl($url);
        $this->setOpt(CURLOPT_CUSTOMREQUEST, 'PATCH');
        $this->setOpt(CURLOPT_POSTFIELDS, $this->buildPostData($data));
        return $this->exec();
    }

    /**
     * Post
     *
     * @access public
     * @param  $url
     * @param  $data
     * @param  $follow_303_with_post
     *     If true, will cause 303 redirections to be followed using a POST request (default: false).
     *     Notes:
     *       - Redirections are only followed if the CURLOPT_FOLLOWLOCATION option is set to true.
     *       - According to the HTTP specs (see [1]), a 303 redirection should be followed using
     *         the GET method. 301 and 302 must not.
     *       - In order to force a 303 redirection to be performed using the same method, the
     *         underlying cURL object must be set in a special state (the CURLOPT_CURSTOMREQUEST
     *         option must be set to the method to use after the redirection). Due to a limitation
     *         of the cURL extension of PHP < 5.5.11 ([2], [3]) and of HHVM, it is not possible
     *         to reset this option. Using these PHP engines, it is therefore impossible to
     *         restore this behavior on an existing php-curl-class Curl object.
     *
     * @return mixed Returns the value provided by exec.
     *
     * [1] https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.2
     * [2] https://github.com/php/php-src/pull/531
     * [3] http://php.net/ChangeLog-5.php#5.5.11
     */
    public function post($url, $data = '', $follow_303_with_post = false)
    {
        if (is_array($url)) {
            $follow_303_with_post = (bool)$data;
            $data = $url;
            $url = (string)$this->url;
        }

        $this->setUrl($url);

        if ($follow_303_with_post) {
            $this->setOpt(CURLOPT_CUSTOMREQUEST, 'POST');
        } else {
            if (isset($this->options[CURLOPT_CUSTOMREQUEST])) {
                if ((version_compare(PHP_VERSION, '5.5.11') < 0) || defined('HHVM_VERSION')) {
                    trigger_error(
                        'Due to technical limitations of PHP <= 5.5.11 and HHVM, it is not possible to '
                        . 'perform a post-redirect-get request using a php-curl-class Curl object that '
                        . 'has already been used to perform other types of requests. Either use a new '
                        . 'php-curl-class Curl object or upgrade your PHP engine.',
                        E_USER_ERROR
                    );
                } else {
                    $this->setOpt(CURLOPT_CUSTOMREQUEST, null);
                }
            }
        }

        $this->setOpt(CURLOPT_POST, true);
        $this->setOpt(CURLOPT_POSTFIELDS, $this->buildPostData($data));
        return $this->exec();
    }

    /**
     * Put
     *
     * @access public
     * @param  $url
     * @param  $data
     *
     * @return mixed Returns the value provided by exec.
     */
    public function put($url, $data = [])
    {
        if (is_array($url)) {
            $data = $url;
            $url = (string)$this->url;
        }
        $this->setUrl($url);
        $this->setOpt(CURLOPT_CUSTOMREQUEST, 'PUT');
        $put_data = $this->buildPostData($data);
        if (empty($this->options[CURLOPT_INFILE]) && empty($this->options[CURLOPT_INFILESIZE])) {
            if (is_string($put_data)) {
                $this->setHeader('Content-Length', strlen($put_data));
            }
        }
        if (!empty($put_data)) {
            $this->setOpt(CURLOPT_POSTFIELDS, $put_data);
        }
        return $this->exec();
    }

    /**
     * Search
     *
     * @access public
     * @param  $url
     * @param  $data
     *
     * @return mixed Returns the value provided by exec.
     */
    public function search($url, $data = [])
    {
        if (is_array($url)) {
            $data = $url;
            $url = (string)$this->url;
        }
        $this->setUrl($url);
        $this->setOpt(CURLOPT_CUSTOMREQUEST, 'SEARCH');
        $put_data = $this->buildPostData($data);
        if (empty($this->options[CURLOPT_INFILE]) && empty($this->options[CURLOPT_INFILESIZE])) {
            if (is_string($put_data)) {
                $this->setHeader('Content-Length', strlen($put_data));
            }
        }
        if (!empty($put_data)) {
            $this->setOpt(CURLOPT_POSTFIELDS, $put_data);
        }
        return $this->exec();
    }

    /**
     * Set Basic Authentication
     *
     * @access public
     * @param  $username
     * @param  $password
     */
    public function setBasicAuthentication($username, $password = '')
    {
        $this->setOpt(CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
        $this->setOpt(CURLOPT_USERPWD, $username . ':' . $password);
    }

    /**
     * Set Digest Authentication
     *
     * @access public
     * @param  $username
     * @param  $password
     */
    public function setDigestAuthentication($username, $password = '')
    {
        $this->setOpt(CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
        $this->setOpt(CURLOPT_USERPWD, $username . ':' . $password);
    }

    /**
     * Set Cookie
     *
     * @access public
     * @param  $key
     * @param  $value
     */
    public function setCookie($key, $value)
    {
        $this->setEncodedCookie($key, $value);
        $this->buildCookies();
    }

    /**
     * Set Cookies
     *
     * @access public
     * @param  $cookies
     */
    public function setCookies($cookies)
    {
        foreach ($cookies as $key => $value) {
            $this->setEncodedCookie($key, $value);
        }
        $this->buildCookies();
    }

    /**
     * Get Cookie
     *
     * @access public
     * @param  $key
     *
     * @return mixed
     */
    public function getCookie($key)
    {
        return $this->getResponseCookie($key);
    }

    /**
     * Get Response Cookie
     *
     * @access public
     * @param  $key
     *
     * @return mixed
     */
    public function getResponseCookie($key)
    {
        return isset($this->responseCookies[$key]) ? $this->responseCookies[$key] : null;
    }

    /**
     * Set Max Filesize
     *
     * @access public
     * @param  $bytes
     */
    public function setMaxFilesize($bytes)
    {
        // Make compatible with PHP version both before and after 5.5.0. PHP 5.5.0 added the cURL resource as the first
        // argument to the CURLOPT_PROGRESSFUNCTION callback.
        $gte_v550 = version_compare(PHP_VERSION, '5.5.0') >= 0;
        if ($gte_v550) {
            $callback = function ($resource, $download_size, $downloaded, $upload_size, $uploaded) use ($bytes) {
                // Abort the transfer when $downloaded bytes exceeds maximum $bytes by returning a non-zero value.
                return $downloaded > $bytes ? 1 : 0;
            };
        } else {
            $callback = function ($download_size, $downloaded, $upload_size, $uploaded) use ($bytes) {
                return $downloaded > $bytes ? 1 : 0;
            };
        }

        $this->progress($callback);
    }

    /**
     * Set Port
     *
     * @access public
     * @param  $port
     */
    public function setPort($port)
    {
        $this->setOpt(CURLOPT_PORT, intval($port));
    }

    /**
     * Set Connect Timeout
     *
     * @access public
     * @param  $seconds
     */
    public function setConnectTimeout($seconds)
    {
        $this->setOpt(CURLOPT_CONNECTTIMEOUT, $seconds);
    }

    /**
     * Set Cookie String
     *
     * @access public
     * @param  $string
     *
     * @return bool
     */
    public function setCookieString($string)
    {
        return $this->setOpt(CURLOPT_COOKIE, $string);
    }

    /**
     * Set Cookie File
     *
     * @access public
     * @param  $cookie_file
     *
     * @return boolean
     */
    public function setCookieFile($cookie_file)
    {
        return $this->setOpt(CURLOPT_COOKIEFILE, $cookie_file);
    }

    /**
     * Set Cookie Jar
     *
     * @access public
     * @param  $cookie_jar
     *
     * @return boolean
     */
    public function setCookieJar($cookie_jar)
    {
        return $this->setOpt(CURLOPT_COOKIEJAR, $cookie_jar);
    }

    /**
     * Set Default JSON Decoder
     *
     * @access public
     * @param  $assoc
     * @param  $depth
     * @param  $options
     */
    public function setDefaultJsonDecoder()
    {
        $this->jsonDecoder = '\Curl\Decoder::decodeJson';
        $this->jsonDecoderArgs = func_get_args();
    }

    /**
     * Set Default XML Decoder
     *
     * @access public
     * @param  $class_name
     * @param  $options
     * @param  $ns
     * @param  $is_prefix
     */
    public function setDefaultXmlDecoder()
    {
        $this->xmlDecoder = '\Curl\Decoder::decodeXml';
        $this->xmlDecoderArgs = func_get_args();
    }

    /**
     * Set Default Decoder
     *
     * @access public
     * @param  $mixed boolean|callable|string
     */
    public function setDefaultDecoder($mixed = 'json')
    {
        if ($mixed === false) {
            $this->defaultDecoder = false;
        } elseif (is_callable($mixed)) {
            $this->defaultDecoder = $mixed;
        } else {
            if ($mixed === 'json') {
                $this->defaultDecoder = '\Curl\Decoder::decodeJson';
            } elseif ($mixed === 'xml') {
                $this->defaultDecoder = '\Curl\Decoder::decodeXml';
            }
        }
    }

    /**
     * Set Default Timeout
     *
     * @access public
     */
    public function setDefaultTimeout()
    {
        $this->setTimeout(self::DEFAULT_TIMEOUT);
    }

    /**
     * Set Default User Agent
     *
     * @access public
     */
    public function setDefaultUserAgent()
    {
        $user_agent = 'PHP-Curl-Class/' . self::VERSION;
        $user_agent .= ' PHP/' . PHP_VERSION;
        $curl_version = curl_version();
        $user_agent .= ' curl/' . $curl_version['version'];
        $this->setUserAgent($user_agent);
    }

    /**
     * Set File
     *
     * @access public
     * @param  $file
     */
    public function setFile($file)
    {
        $this->setOpt(CURLOPT_FILE, $file);
    }

    /**
     * Set Header
     *
     * Add extra header to include in the request.
     *
     * @access public
     * @param  $key
     * @param  $value
     */
    public function setHeader($key, $value)
    {
        $this->headers[$key] = $value;
        $headers = [];
        foreach ($this->headers as $key => $value) {
            $headers[] = $key . ': ' . $value;
        }
        $this->setOpt(CURLOPT_HTTPHEADER, $headers);
    }

    /**
     * Set Headers
     *
     * Add extra headers to include in the request.
     *
     * @access public
     * @param  $headers
     */
    public function setHeaders($headers)
    {
        if (ArrayUtil::isArrayAssoc($headers)) {
            foreach ($headers as $key => $value) {
                $key = trim($key);
                $value = trim($value);
                $this->headers[$key] = $value;
            }
        } else {
            foreach ($headers as $header) {
                list($key, $value) = explode(':', $header, 2);
                $key = trim($key);
                $value = trim($value);
                $this->headers[$key] = $value;
            }
        }

        $headers = [];
        foreach ($this->headers as $key => $value) {
            $headers[] = $key . ': ' . $value;
        }

        $this->setOpt(CURLOPT_HTTPHEADER, $headers);
    }

    /**
     * Set JSON Decoder
     *
     * @access public
     * @param  $mixed boolean|callable
     */
    public function setJsonDecoder($mixed)
    {
        if ($mixed === false || is_callable($mixed)) {
            $this->jsonDecoder = $mixed;
            $this->jsonDecoderArgs = [];
        }
    }

    /**
     * Set XML Decoder
     *
     * @access public
     * @param  $mixed boolean|callable
     */
    public function setXmlDecoder($mixed)
    {
        if ($mixed === false || is_callable($mixed)) {
            $this->xmlDecoder = $mixed;
            $this->xmlDecoderArgs = [];
        }
    }

    /**
     * Set Opt
     *
     * @access public
     * @param  $option
     * @param  $value
     *
     * @return boolean
     */
    public function setOpt($option, $value)
    {
        $required_options = [
            CURLOPT_RETURNTRANSFER => 'CURLOPT_RETURNTRANSFER',
        ];

        if (in_array($option, array_keys($required_options), true) && $value !== true) {
            trigger_error($required_options[$option] . ' is a required option', E_USER_WARNING);
        }

        $success = curl_setopt($this->curl, $option, $value);
        if ($success) {
            $this->options[$option] = $value;
        }
        return $success;
    }

    /**
     * Set Opts
     *
     * @access public
     * @param  $options
     *
     * @return boolean
     *   Returns true if all options were successfully set. If an option could not be successfully set, false is
     *   immediately returned, ignoring any future options in the options array. Similar to curl_setopt_array().
     */
    public function setOpts($options)
    {
        foreach ($options as $option => $value) {
            if (!$this->setOpt($option, $value)) {
                return false;
            }
        }
        return true;
    }

    /**
     * Set Proxy
     *
     * Set an HTTP proxy to tunnel requests through.
     *
     * @access public
     * @param  $proxy - The HTTP proxy to tunnel requests through. May include port number.
     * @param  $port - The port number of the proxy to connect to. This port number can also be set in $proxy.
     * @param  $username - The username to use for the connection to the proxy.
     * @param  $password - The password to use for the connection to the proxy.
     */
    public function setProxy($proxy, $port = null, $username = null, $password = null)
    {
        $this->setOpt(CURLOPT_PROXY, $proxy);
        if ($port !== null) {
            $this->setOpt(CURLOPT_PROXYPORT, $port);
        }
        if ($username !== null && $password !== null) {
            $this->setOpt(CURLOPT_PROXYUSERPWD, $username . ':' . $password);
        }
    }

    /**
     * Set Proxy Auth
     *
     * Set the HTTP authentication method(s) to use for the proxy connection.
     *
     * @access public
     * @param  $auth
     */
    public function setProxyAuth($auth)
    {
        $this->setOpt(CURLOPT_PROXYAUTH, $auth);
    }

    /**
     * Set Proxy Type
     *
     * Set the proxy protocol type.
     *
     * @access public
     * @param  $type
     */
    public function setProxyType($type)
    {
        $this->setOpt(CURLOPT_PROXYTYPE, $type);
    }

    /**
     * Set Proxy Tunnel
     *
     * Set the proxy to tunnel through HTTP proxy.
     *
     * @access public
     * @param  $tunnel boolean
     */
    public function setProxyTunnel($tunnel = true)
    {
        $this->setOpt(CURLOPT_HTTPPROXYTUNNEL, $tunnel);
    }

    /**
     * Unset Proxy
     *
     * Disable use of the proxy.
     *
     * @access public
     */
    public function unsetProxy()
    {
        $this->setOpt(CURLOPT_PROXY, null);
    }

    /**
     * Set Range
     *
     * @access public
     * @param  $range
     */
    public function setRange($range)
    {
        $this->setOpt(CURLOPT_RANGE, $range);
    }

    /**
     * Set Referer
     *
     * @access public
     * @param  $referer
     */
    public function setReferer($referer)
    {
        $this->setReferrer($referer);
    }

    /**
     * Set Referrer
     *
     * @access public
     * @param  $referrer
     */
    public function setReferrer($referrer)
    {
        $this->setOpt(CURLOPT_REFERER, $referrer);
    }

    /**
     * Set Retry
     *
     * Number of retries to attempt or decider callable.
     *
     * When using a number of retries to attempt, the maximum number of attempts
     * for the request is $maximum_number_of_retries + 1.
     *
     * When using a callable decider, the request will be retried until the
     * function returns a value which evaluates to false.
     *
     * @access public
     * @param  $mixed
     */
    public function setRetry($mixed)
    {
        if (is_callable($mixed)) {
            $this->retryDecider = $mixed;
        } elseif (is_int($mixed)) {
            $maximum_number_of_retries = $mixed;
            $this->remainingRetries = $maximum_number_of_retries;
        }
    }

    /**
     * Set Timeout
     *
     * @access public
     * @param  $seconds
     */
    public function setTimeout($seconds)
    {
        $this->setOpt(CURLOPT_TIMEOUT, $seconds);
    }

    /**
     * Disable Timeout
     *
     * @access public
     */
    public function disableTimeout()
    {
        $this->setTimeout(null);
    }

    /**
     * Set Url
     *
     * @access public
     * @param  $url
     * @param  $mixed_data
     */
    public function setUrl($url, $mixed_data = '')
    {
        $built_url = $this->buildUrl($url, $mixed_data);

        if ($this->url === null) {
            $this->url = (string)new Url($built_url);
        } else {
            $this->url = (string)new Url($this->url, $built_url);
        }

        $this->setOpt(CURLOPT_URL, $this->url);
    }

    /**
     * Set User Agent
     *
     * @access public
     * @param  $user_agent
     */
    public function setUserAgent($user_agent)
    {
        $this->setOpt(CURLOPT_USERAGENT, $user_agent);
    }

    /**
     * Set Interface
     *
     * The name of the outgoing network interface to use.
     * This can be an interface name, an IP address or a host name.
     *
     * @access public
     * @param  $interface
     */
    public function setInterface($interface)
    {
        $this->setOpt(CURLOPT_INTERFACE, $interface);
    }

    /**
     * Attempt Retry
     *
     * @access public
     */
    public function attemptRetry()
    {
        $attempt_retry = false;
        if ($this->error) {
            if ($this->retryDecider === null) {
                $attempt_retry = $this->remainingRetries >= 1;
            } else {
                $attempt_retry = call_user_func($this->retryDecider, $this);
            }
            if ($attempt_retry) {
                $this->retries += 1;
                if ($this->remainingRetries) {
                    $this->remainingRetries -= 1;
                }
            }
        }
        return $attempt_retry;
    }

    /**
     * Success
     *
     * @access public
     * @param  $callback
     */
    public function success($callback)
    {
        $this->successCallback = $callback;
    }

    /**
     * Unset Header
     *
     * Remove extra header previously set using Curl::setHeader().
     *
     * @access public
     * @param  $key
     */
    public function unsetHeader($key)
    {
        unset($this->headers[$key]);
        $headers = [];
        foreach ($this->headers as $key => $value) {
            $headers[] = $key . ': ' . $value;
        }
        $this->setOpt(CURLOPT_HTTPHEADER, $headers);
    }

    /**
     * Remove Header
     *
     * Remove an internal header from the request.
     * Using `curl -H "Host:" ...' is equivalent to $curl->removeHeader('Host');.
     *
     * @access public
     * @param  $key
     */
    public function removeHeader($key)
    {
        $this->setHeader($key, '');
    }

    /**
     * Verbose
     *
     * @access public
     * @param  bool $on
     * @param  resource $output
     */
    public function verbose($on = true, $output = 'STDERR')
    {
        if ($output === 'STDERR') {
            if (!defined('STDERR')) {
                define('STDERR', fopen('php://stderr', 'wb'));
            }
            $output = STDERR;
        }

        // Turn off CURLINFO_HEADER_OUT for verbose to work. This has the side
        // effect of causing Curl::requestHeaders to be empty.
        if ($on) {
            $this->setOpt(CURLINFO_HEADER_OUT, false);
        }
        $this->setOpt(CURLOPT_VERBOSE, $on);
        $this->setOpt(CURLOPT_STDERR, $output);
    }

    /**
     * Reset
     *
     * @access public
     */
    public function reset()
    {
        if (function_exists('curl_reset') && is_resource($this->curl)) {
            curl_reset($this->curl);
        } else {
            $this->curl = curl_init();
        }

        $this->initialize();
    }

    public function getCurl()
    {
        return $this->curl;
    }

    public function getId()
    {
        return $this->id;
    }

    public function isError()
    {
        return $this->error;
    }

    public function getErrorCode()
    {
        return $this->errorCode;
    }

    public function getErrorMessage()
    {
        return $this->errorMessage;
    }

    public function isCurlError()
    {
        return $this->curlError;
    }

    public function getCurlErrorCode()
    {
        return $this->curlErrorCode;
    }

    public function getCurlErrorMessage()
    {
        return $this->curlErrorMessage;
    }

    public function isHttpError()
    {
        return $this->httpError;
    }

    public function getHttpStatusCode()
    {
        return $this->httpStatusCode;
    }

    public function getHttpErrorMessage()
    {
        return $this->httpErrorMessage;
    }

    public function getUrl()
    {
        return $this->url;
    }

    public function getRequestHeaders()
    {
        return $this->requestHeaders;
    }

    public function getResponseHeaders()
    {
        return $this->responseHeaders;
    }

    public function getRawResponseHeaders()
    {
        return $this->rawResponseHeaders;
    }

    public function getResponseCookies()
    {
        return $this->responseCookies;
    }

    public function getResponse()
    {
        return $this->response;
    }

    public function getRawResponse()
    {
        return $this->rawResponse;
    }

    public function getBeforeSendCallback()
    {
        return $this->beforeSendCallback;
    }

    public function getDownloadCompleteCallback()
    {
        return $this->downloadCompleteCallback;
    }

    public function getDownloadFileName()
    {
        return $this->downloadFileName;
    }

    public function getSuccessCallback()
    {
        return $this->successCallback;
    }

    public function getErrorCallback()
    {
        return $this->errorCallback;
    }

    public function getCompleteCallback()
    {
        return $this->completeCallback;
    }

    public function getFileHandle()
    {
        return $this->fileHandle;
    }

    public function getAttempts()
    {
        return $this->attempts;
    }

    public function getRetries()
    {
        return $this->retries;
    }

    public function isChildOfMultiCurl()
    {
        return $this->childOfMultiCurl;
    }

    public function getRemainingRetries()
    {
        return $this->remainingRetries;
    }

    public function getRetryDecider()
    {
        return $this->retryDecider;
    }

    public function getJsonDecoder()
    {
        return $this->jsonDecoder;
    }

    public function getXmlDecoder()
    {
        return $this->xmlDecoder;
    }

    /**
     * Destruct
     *
     * @access public
     */
    public function __destruct()
    {
        $this->close();
    }

    public function __get($name)
    {
        $return = null;
        if (in_array($name, self::$deferredProperties) && is_callable(array($this, $getter = '__get_' . $name))) {
            $return = $this->$name = $this->$getter();
        }
        return $return;
    }

    /**
     * Get Effective Url
     *
     * @access private
     */
    private function __get_effectiveUrl()
    {
        return $this->getInfo(CURLINFO_EFFECTIVE_URL);
    }

    /**
     * Get RFC 2616
     *
     * @access private
     */
    private function __get_rfc2616()
    {
        return array_fill_keys(self::$RFC2616, true);
    }

    /**
     * Get RFC 6265
     *
     * @access private
     */
    private function __get_rfc6265()
    {
        return array_fill_keys(self::$RFC6265, true);
    }

    /**
     * Get Total Time
     *
     * @access private
     */
    private function __get_totalTime()
    {
        return $this->getInfo(CURLINFO_TOTAL_TIME);
    }

    /**
     * Build Cookies
     *
     * @access private
     */
    private function buildCookies()
    {
        // Avoid using http_build_query() as unnecessary encoding is performed.
        // http_build_query($this->cookies, '', '; ');
        $this->setOpt(CURLOPT_COOKIE, implode('; ', array_map(function ($k, $v) {
            return $k . '=' . $v;
        }, array_keys($this->cookies), array_values($this->cookies))));
    }

    /**
     * Build Url
     *
     * @access private
     * @param  $url
     * @param  $mixed_data
     *
     * @return string
     */
    private function buildUrl($url, $mixed_data = '')
    {
        $query_string = '';
        if (!empty($mixed_data)) {
            $query_mark = strpos($url, '?') > 0 ? '&' : '?';
            if (is_string($mixed_data)) {
                $query_string .= $query_mark . $mixed_data;
            } elseif (is_array($mixed_data)) {
                $query_string .= $query_mark . http_build_query($mixed_data, '', '&');
            }
        }
        return $url . $query_string;
    }

    /**
     * Download Complete
     *
     * @access private
     * @param  $fh
     */
    private function downloadComplete($fh)
    {
        if ($this->error && is_file((string) $this->downloadFileName)) {
            @unlink($this->downloadFileName);
        } elseif (!$this->error && $this->downloadCompleteCallback) {
            rewind($fh);
            $this->call($this->downloadCompleteCallback, $fh);
            $this->downloadCompleteCallback = null;
        }

        if (is_resource($fh)) {
            fclose($fh);
        }

        // Fix "PHP Notice: Use of undefined constant STDOUT" when reading the
        // PHP script from stdin. Using null causes "Warning: curl_setopt():
        // supplied argument is not a valid File-Handle resource".
        if (!defined('STDOUT')) {
            define('STDOUT', fopen('php://stdout', 'w'));
        }

        // Reset CURLOPT_FILE with STDOUT to avoid: "curl_exec(): CURLOPT_FILE
        // resource has gone away, resetting to default".
        $this->setFile(STDOUT);

        // Reset CURLOPT_RETURNTRANSFER to tell cURL to return subsequent
        // responses as the return value of curl_exec(). Without this,
        // curl_exec() will revert to returning boolean values.
        $this->setOpt(CURLOPT_RETURNTRANSFER, true);
    }

    /**
     * Parse Headers
     *
     * @access private
     * @param  $raw_headers
     *
     * @return array
     */
    private function parseHeaders($raw_headers)
    {
        $raw_headers = preg_split('/\r\n/', $raw_headers, -1, PREG_SPLIT_NO_EMPTY);
        $http_headers = new CaseInsensitiveArray();

        $raw_headers_count = count($raw_headers);
        for ($i = 1; $i < $raw_headers_count; $i++) {
            if (strpos($raw_headers[$i], ':') !== false) {
                list($key, $value) = explode(':', $raw_headers[$i], 2);
                $key = trim($key);
                $value = trim($value);
                // Use isset() as array_key_exists() and ArrayAccess are not compatible.
                if (isset($http_headers[$key])) {
                    $http_headers[$key] .= ',' . $value;
                } else {
                    $http_headers[$key] = $value;
                }
            }
        }

        return array(isset($raw_headers['0']) ? $raw_headers['0'] : '', $http_headers);
    }

    /**
     * Parse Request Headers
     *
     * @access private
     * @param  $raw_headers
     *
     * @return \Curl\CaseInsensitiveArray
     */
    private function parseRequestHeaders($raw_headers)
    {
        $request_headers = new CaseInsensitiveArray();
        list($first_line, $headers) = $this->parseHeaders($raw_headers);
        $request_headers['Request-Line'] = $first_line;
        foreach ($headers as $key => $value) {
            $request_headers[$key] = $value;
        }
        return $request_headers;
    }

    /**
     * Parse Response
     *
     * @access private
     * @param  $response_headers
     * @param  $raw_response
     *
     * @return mixed
     *   If the response content-type is json:
     *     Returns the json decoder's return value: A stdClass object when the default json decoder is used.
     *   If the response content-type is xml:
     *     Returns the xml decoder's return value: A SimpleXMLElement object when the default xml decoder is used.
     *   If the response content-type is something else:
     *     Returns the original raw response unless a default decoder has been set.
     *   If the response content-type cannot be determined:
     *     Returns the original raw response.
     */
    private function parseResponse($response_headers, $raw_response)
    {
        $response = $raw_response;
        if (isset($response_headers['Content-Type'])) {
            if (preg_match($this->jsonPattern, $response_headers['Content-Type'])) {
                if ($this->jsonDecoder) {
                    $args = $this->jsonDecoderArgs;
                    array_unshift($args, $response);
                    $response = call_user_func_array($this->jsonDecoder, $args);
                }
            } elseif (preg_match($this->xmlPattern, $response_headers['Content-Type'])) {
                if ($this->xmlDecoder) {
                    $args = $this->xmlDecoderArgs;
                    array_unshift($args, $response);
                    $response = call_user_func_array($this->xmlDecoder, $args);
                }
            } else {
                if ($this->defaultDecoder) {
                    $response = call_user_func($this->defaultDecoder, $response);
                }
            }
        }

        return $response;
    }

    /**
     * Parse Response Headers
     *
     * @access private
     * @param  $raw_response_headers
     *
     * @return \Curl\CaseInsensitiveArray
     */
    private function parseResponseHeaders($raw_response_headers)
    {
        $response_header_array = explode("\r\n\r\n", $raw_response_headers);
        $response_header  = '';
        for ($i = count($response_header_array) - 1; $i >= 0; $i--) {
            if (stripos($response_header_array[$i], 'HTTP/') === 0) {
                $response_header = $response_header_array[$i];
                break;
            }
        }

        $response_headers = new CaseInsensitiveArray();
        list($first_line, $headers) = $this->parseHeaders($response_header);
        $response_headers['Status-Line'] = $first_line;
        foreach ($headers as $key => $value) {
            $response_headers[$key] = $value;
        }
        return $response_headers;
    }

    /**
     * Set Encoded Cookie
     *
     * @access private
     * @param  $key
     * @param  $value
     */
    private function setEncodedCookie($key, $value)
    {
        $name_chars = [];
        foreach (str_split($key) as $name_char) {
            if (isset($this->rfc2616[$name_char])) {
                $name_chars[] = $name_char;
            } else {
                $name_chars[] = rawurlencode($name_char);
            }
        }

        $value_chars = [];
        foreach (str_split($value) as $value_char) {
            if (isset($this->rfc6265[$value_char])) {
                $value_chars[] = $value_char;
            } else {
                $value_chars[] = rawurlencode($value_char);
            }
        }

        $this->cookies[implode('', $name_chars)] = implode('', $value_chars);
    }

    /**
     * Initialize
     *
     * @access private
     * @param  $base_url
     */
    private function initialize($base_url = null)
    {
        $this->id = uniqid('', true);
        $this->setDefaultUserAgent();
        $this->setDefaultTimeout();
        $this->setOpt(CURLINFO_HEADER_OUT, true);

        // Create a placeholder to temporarily store the header callback data.
        $header_callback_data = new \stdClass();
        $header_callback_data->rawResponseHeaders = '';
        $header_callback_data->responseCookies = array();
        $this->headerCallbackData = $header_callback_data;
        $this->setOpt(CURLOPT_HEADERFUNCTION, createHeaderCallback($header_callback_data));

        $this->setOpt(CURLOPT_RETURNTRANSFER, true);
        $this->headers = new CaseInsensitiveArray();
        $this->setUrl($base_url);
    }
}

/**
 * Create Header Callback
 *
 * Gather headers and parse cookies as response headers are received. Keep this function separate from the class so that
 * unset($curl) automatically calls __destruct() as expected. Otherwise, manually calling $curl->close() will be
 * necessary to prevent a memory leak.
 *
 * @param  $header_callback_data
 *
 * @return callable
 */
function createHeaderCallback($header_callback_data) {
    return function ($ch, $header) use ($header_callback_data) {
        if (preg_match('/^Set-Cookie:\s*([^=]+)=([^;]+)/mi', $header, $cookie) === 1) {
            $header_callback_data->responseCookies[$cookie[1]] = trim($cookie[2], " \n\r\t\0\x0B");
        }
        $header_callback_data->rawResponseHeaders .= $header;
        return strlen($header);
    };
}
readme.txt000064400000055776151526424700006574 0ustar00=== Backuply - Backup, Restore, Migrate and Clone ===
Contributors: softaculous, backuply
Tags: backup, restore, database backup, cloud backup, wordpress backup, migration, cloning, backuply, local backup, amazon s3, database, google drive, gdrive, dropbox, FTP, SCP, SFTP, onedrive, WebDAV
Requires at least: 4.7
Tested up to: 6.9
Requires PHP: 5.5
Stable tag: 1.5.2
License: LGPL v2.1
License URI: http://www.gnu.org/licenses/lgpl-2.1.html

Backup, restores, and migration with Backuply are fairly simple with a wide range of storage options from Local Backups, FTP to cloud options like AWS S3, Dropbox, Google Drive, SFTP, FTPS, WebDav.

== Description ==

Backuply is a WordPress backup plugin that helps you backup your WordPress website, saving you from loss of data because of server crashes, hacks, dodgy updates, or bad plugins.

Backuply comes with Local Backups and Secure Cloud backups with easy integrations with FTP, FTPS, SFTP, WebDAV, Google Drive, Microsoft OneDrive, Dropbox, Amazon S3 and easy One-click restoration.

Your website is your asset and it needs to constantly be protected from various security issues, server issues, hacking, etc. While you take all precautionary steps to protect your website, backups are the best form of security. With Backuply, you can be confident that your data is protected and is always available for restore during any disaster. Backuply creates full backups of your website and you can restore it to the same or a new WordPress website with the click of a button.

Our backup and website cloning technology have been in use for more than a decade and we have now ported it to WordPress.

You can find our official documentation at [https://backuply.com/docs](https://backuply.com/docs). We are also active in our community support forums on wordpress.org if you are one of our free users. Our Premium Support Ticket System is at [https://softaculous.deskuss.com/open.php?topicId=17](https://softaculous.deskuss.com/open.php?topicId=17)

[Home Page](https://backuply.com "Backuply Homepage") | [Support](https://softaculous.deskuss.com/open.php?topicId=17 "Backuply Support") | [Documents](http://backuply.com/docs "Documents")

== Features ==
* **Local Backups:** Backup your complete website locally on your server with just one click.
* **FTP:** Easily backup and restore your backup using FTP.
* **Backup to Google Drive**
* **One-Click Restore:** Restore your website files and databases with a one-click restore.
* **Migration:** Stress-free migration to any domain or host.
* **Database Backups:** Backup your website's database only.

== Premium Features ==
* **Automatic Backups:** Choose to back up your website at regular intervals like Daily, Weekly, or Monthly. You can also customize the interval.
* **One-click Restore:** With Backuply, restoring your website is simple. Just click on the restore button next to the backup you want to restore from. Your entire backup will be downloaded and the changes will be applied to the website.
* **Selective Backup:** You have the option to choose from whether only files or database backups or full backups should be performed.
* **Website Migration:** You can easily migrate your website by restoring from one of the Cloud Backup options on the new website.
* **Website Cloning:** If you would like to clone your website for any purpose, Backuply can do that for you. Backuply will restore the data but replace the URLs and information as per the existing website. In this way, you can create multiple clones.
* **Backup to FTPS:** You can back up your site to an FTPS i.e. FTP over SSL / TLS.
* **Backup to SFTP:** Supports the SFTP protocol.
* **Backup to Dropbox**
* **Backup to Microsoft One Drive**
* **Backup to Amazon S3**
* **Backup to WebDAV**
* **Backup to S3 Compatible Storages:** Added support for DigitalOcean Spaces, Linode Object Storage, Vultr Object Storage, and Cloudflare R2.
* **Support for WP-CLI:** You can use Backuply through WP-CLI
* **Professional Support:** Get professional support and more features to make backup your website with [Backuply](https://backuply.com/pricing)


== Backups ==
Backup is a way of copying your data or files to a secure place, which can be used to restore your website in case of data loss. Backups are vital in securing the data that you have published or written. Backups with Backuply are easy and secure with support for multiple options of storage like local storage using FTP or using third-party services like Google Drive, Dropbox, Microsoft OneDrive, AWS S3 and WebDAV.
To make it even easier we support Automatic Backups with a customizable backup schedule.


== Restores == 
Restoring is just a One-Click process using Backuply. If the selected backup is available then Backuply will restore your backups safely. Restoring a backup will roll back your site in the exact same state as it was when the backup was created.


== Migration ==
Backuply creates a tar file of your whole WordPress install with the Database, so you can migrate your site to any host or location where WordPress can be installed. All you need to do is create a Backup of your WordPress install on a remote location, and that's it, It can be synced on any WordPress install with ease so you just need to restore the synced backup on the new location for Migration to happen.


== Frequently Asked Questions ==

Do you have questions related to Backuply? Use the following links :

1. [Docs](https://backuply.com/docs)
3. [Help Desk](https://backuply.deskuss.com)
2. [Support Forum](http://wordpress.org/support/plugin/backuply)

== How to install Backuply ==
Go To your WordPress install -> Plugins -> Add New Button -> In Search Box search For Backuply -> Click on Install.

== Screenshots ==

1. **Dashboard** manual backup and info.
2. **Settings** set backup settings like backup location, backup options and email to notify.
3. **Backup Locations** add remote locations to backup and restore from.
4. **Backup History** manage all your backups.
5. **Restore Process** easy to understand restore progress.
6. **Add Backup Location** with a fairly simple form to add a backup location.
7. **Backup Process** easy to understand backup progress.

== Changelog ==

= 1.5.2 (26th February 2026) =
* [Improvement] Backup history is now sorted based on time, with recent backups at the top.
* [Improvement] Backup history now includes pagination, displaying 20 backups per page.
* [Bug-Fix] On backup database connection was not closing after usage, which cause issue for a user, this has been fixed.
* [Task] .htaccess file has been excluded from restoration, it causes issue if environment of the server changes.
* [Task] Adding Cache burst in case where backup requests were hitting Cloudflare cache.

= 1.5.1 (14th November 2025) =
* [Bug-Fix] Backups could get stuck when certain special characters were present in file names.
* [Bug-Fix] An issue with uploading backups to Backuply Cloud and AWS has been resolved.
* [Bug-Fix] On some servers, the status logs stopped updating during backups because the server flagged the update requests as a loop. This issue has been addressed.

= 1.5.0 (30th September 2025) =
* [Bug-Fix Pro] Custom cron key was getting updated on every update which was breaking Auto Backups for the users who were using Custom cron, this has been fixed.
* [Bug-Fix] There was an issue with restore from custom locations, this has been fixed.

= 1.4.9 (17th September 2025) =
* [Improvement Pro] Now you can use any S3 Compatible storage with Backuply.
* [Bug Fix] Improved variable sanitization.

= 1.4.8 (2nd September 2025) =
* [Bug-Fix] There was an issue with migration, when WP_HOME and WP_SITEURL constants were set in the wp-config.php of the backup.
* [Task] All .log files will be excluded form backups.
* [Task] Minor refactor of the code.

= 1.4.7 (23rd July 2025) =
* [Bug-Fix Pro] For some cases, upload to OneDrive was getting stuck because OneDrive's servers were either breaking the request abruptly or not responding. This has been fixed.
* [Bug-Fix] In certain cases, the info file and version file were not getting added to the backup; this has been fixed.
* [Bug-Fix] Size of a file uploaded through FTP was showing wrong when the backup size was more than 2GB; this has been fixed.
* [Task]  Backuply now handles UTC-based time zones as well. Earlier, it used to handle just the city-based based timezones of WordPress General settings.

= 1.4.6 (17th June 2025) =
* [Bug-Fix] There was issue with restore on sites where Cyrillic characters were getting used, this has been fixed.
* [Bug-Fix] In some specific case, backups were getting corrupt, due to some files were getting updated while the backup was happening so some default exclusions have been added.
* [Task] Backuply will add LiteSpeed noabort rule in the htaccess file on install. LiteSpeed's default config was causing issue with backups for some users.

= 1.4.5 (April 30th 2025) =
* [Task] Tested with WordPress 6.8.
* [Task] Added Environment info in the support tab for easier debugging.
* [Task] Cleanup of WP Cron after uninstall.

= 1.4.4 (April 7th 2025) =
* [Improvement] Backup upload speed has been improved, so now uploads will be faster.
* [Improvement] Cleanup after restore has been made better.
* [Security Improvements] Made some files at restore more random.
* [Bug-Fix] On restore failure, email notification was not getting sent, this has been fixed.
* [Bug-Fix] If the backup file tar.gz was not there on the remote storage and a attempt to restore was made then the restore was stuck in download loop, this has been fixed.

= 1.4.3 (February 10th 2025) =
* [Bug-Fix] There was an issue which was causing downloaded file to be of size 0, this has been fixed.

= 1.4.2 (January 17th 2025) =
* [Bug-Fix] For some users the download file was returning different file name, this has been fixed.
* [Improvement] Restore was getting blocked in case where htaccess rules had some blocking rule, this has been handled.

= 1.4.1 (November 29th 2024) =
* [Improvement] The backup logs were overwhelming the browsers of some users, we have improved that by just logging the required info which reduces the backup logs.

= 1.4.0 (November 19th 2024) =
* [Task] Made some internal code changes.

= 1.3.9 (November 18th 2024) =
* [Task] Improved some internal codes and tested the same.

= 1.3.8 (November 4th 2024) =
* [Task] Tested with WordPress 6.7
* [Bug-Fix] Settings page was getting killed when some data was not integer.
* [Bug-Fix] functions.php was loading later than few of the registered hooks, which was causing issue to some users this has been fixed.

= 1.3.7 (October 21th 2024) =
* [Improvement] Added retries in Backuply cloud upload.

= 1.3.6 (September 24th 2024) =
* [Improvement] Error reporting has been improved.
* [Task] Improved license handling.

= 1.3.5 (September 13th 2024) =
* [Security-Fix] A security issue reported by bart[WordFence], has been fixed.
* [Improvement] Serialization fix has been improved, its now atleast 100 times faster now.

= 1.3.4 (September 6th 2024) =
* [Improvement] Restores are now faster.
* [Bug-Fix] There was an issue with serialization fix, that has been fixed.
* [Bug-Fix] On some servers backup request was getting blocked as WordPress's default User Agent add url too in it which some servers and firewalls sees to be suspicious, this has been fixed.

= 1.3.3 (July 27th 2024) =
* [Improvement] Restore timeouts have been improved to handle restores easily on the slow servers.
* [Improvement] Downloads of local backpup will be handled directly by the browser now.
* [Task] Tested with WordPress 6.6.
* [Bug-Fix] There was an issue adding Backuply Cloud, if the user has reached quota limit, that has been fixed.

= 1.3.2 (June 19th 2024) =
* [Improvement] Restores work better now, will go in maintenance mode when restoring database to prevent noise from WordPress or plugin functionalities, which could break the restore sometimes.
* [Improvement] We have refactored Google Drive lib and it will improve the speed of download when restoring by around 10%.
* [Improvement] Backups will sync just after they are uploaded, using Backuply's upload module.
* [Bug-Fix] PHP warnings on backup_ins.php has been fixed.
* [Bug-Fix] PHP warnings when deletion of backups has been fixed.

= 1.3.1 (May 09th 2024) =
* [Bug-Fix] There was a issue with restore for some user, where Backuply was unable to unzip, that has been fixed.
* [Bug-Fix] There was an issue with migration in case when the wp-config.php file was not writable, that has been fixed.
* [Bug-Fix] sanitize_file_name function was adding a _ in the file names which was preventing downloads for some domains, which has been fixed.
* [Bug-Fix] Some PHP warnings has been fixed.

= 1.3.0 (April 16th 2024) =
* [Bug-Fix] There was issue downloading Backups for some users that has been fixed.
* [Bug-Fix] There was an issue connecting to Database when the database was being served over a socket, that has been fixed.
* [Bug-Fix] There was issue in using Custom Cron for Bcloud users that has been fixed.
* [Bug-Fix] For some of the OneDrive users there was a error when trying to add the Backup location, that has been fixed.

= 1.2.9 (March 26th 2024) =
* [Bug-Fix] There was an issue with download for some user because of their WordPress not supporting tar or gz mime types, this has been fixed.
* [Bug-Fix] There was an issue when syncing a backup uploaded manually which originally belonged to backup location other than Local Folder, would not show in the Backup History, that has been fixed.
* [Task] Tested with WordPress 6.5.

= 1.2.8 (March 13 2024) =
* [Improvement] We have made improvements to make Backup Downloads better.

= 1.2.7 (February 16 2024) =
* [Bug-Fix] Version 1.2.5 got included in the plugin package, this release is to fix that.

= 1.2.6 (February  08 2024) =
* [Security-Fix] In some cases it was possible to fill up the logs and has been fixed. Reported by Villu Orav (WordFence)
* [Bug-Fix] There was issue while restoring which has been fixed.
* [Bug-Fix] There was an issue uploading backup file, in which in the name of uploaded backup a _(underscore) was getting added due to a WordPress sanitization function which have been fixed.

= 1.2.5 (February 01 2024) =
* [Bug-Fix] There was an issue uploading backup on Safari Browser that has been fixed.

= 1.2.4 (January 25 2024) =
* [Feature] Option to upload backup files to the user server, directly form the plugin.
* [Improvement] A suggestion made by Bence Szalai to add limit on admin access on Exclude list folder.
* [Improvement] Made the settings of Custom Auto Backups simpler.
* [Bug-Fix] There was an issue with deletion in Backup rotation which has been fixed.

= 1.2.3 (January 18 2024) =
* [Feature] Option to add notes to every manual backups.
* [Bug-Fix] The /backuply/backups folder was getting filled with tmp files or the backup files in case of faliure, which has been fixed, by adding a daily Cron to clean it.
* [Bug-Fix] Backuply Cloud storage was not getting updated on deletion or Creation of backups, it has been fixed.
* [Bug-Fix] cPgaurd was blocking restores, this has been fixed.
* [Bug-Fix] There was an issue while auto backup where security check was failing which has been fixed.
* [Tweak] Backup Rotation was happening before creation of Backup, which is risky, this has been changed to delete after successful backup.

= 1.2.2 (December 15 2023) =
* [Security-fix] There was a privilege check failure which has been fixed.

= 1.2.1 (December 07 2023) =
* [Structural Change] We have made some structural changes, now Backuply Free will be required for the Pro version to work.
* [Improvement] Now you can check quota of backup locations like OneDrive, Dropbox, and Google Drive.
* [Bug-Fix] There was issue with updation of Backuply Cloud quota which has been fixed.
* [Bug-Fix] There was issue while restoring using SFTP and FTPS which has been fixed.
* [Bug-Fix] There were some warnings on the settings page which has been fixed.
* [Bug-Fix] There was an issue related to deletion of Backuply Cloud backups when storage limt reached, which has been fixed.

= 1.2.0 (November 06 2023) =
* [Improvement] While restoring the permission of the root folder wont be updated.
* [Improvement] Logs have been improved to, while restoring all fatal error will be logged in Backuply logs.
* [Bug-Fix] There was a conflict with a few SMTP plugins, which has been fixed.
* [Bug-Fix] There was issue unsetting Email notification field which has been fixed.
* [Bug-Fix] On some servers the restore was failing as it was not able to create files, that has been fixed.
* [Task] Tested with WordPress 6.4.

= 1.1.9 (October 05 2023) =
* [Tweak] Now the timezone of the Backup will be the timezone of the WordPress.
* [Tweak] Memory limit fatal error will be logged in Backuply backup progress.
* [Bug-Fix] There was a function incompatibility issue when creating Backup to FTP.
* [Bug-Fix] There was a issue in FTPS when uploading the file, which has been fixed.
* [Bug-Fix] There was an issue with migration of website when migrating from  / to /example, which has been fixed.

= 1.1.8 (August 24 2023) =
* [Bug-Fix] There was issue while restoring, some users were getting error of unable to unzip, that has been fixed.
* [Tweak] Nag timings where updated.
* [Tweak] Database backups created after version 1.1.7 will delete old tables progressively while restoring, instead of deleting them all at once. This is to reduce the chance of breaking the site if something goes wrong during the restore process..

= 1.1.7 (July, 25 2023) =
* [Feature] Option to download Backuply Cloud backups.
* [Bug-Fix] There was an issue for some users while restoring, with a fatal error of duplicate entry in database restore, which has been fixed.
* [Tweak] The chunk size of Google Drive while restore has been increased to improve the speed of download.

= 1.1.6 (July, 05 2023) =
* [Bug-Fix] There was an issue while restoring of backup not able to unzip that has been fixed.
* [Bug-Fix] There was an issue while downloading backup through Backuply while restoring, that has been fixed.

= 1.1.5 (June, 29 2023) =
* [Bug-Fix] There was issue with Auto Backups for Trial users that has been fixed.
* [Bug-Fix] There was an issue while connecting to Backuply through the trial promo.

= 1.1.4 (June, 24 2023) =
* [Feature] Backuply Cloud now provides 10GB of default space which was set as 1 GB previously.
* [Bug-Fix] The quota of Backuply Cloud was not showing properly.
* [Bug-Fix] On restore a info file was not getting delete after completion of restore that has been fixed.

= 1.1.3 (June, 13 2023) =
* [Feature] Now use Backuply Cloud as your Backup location to keep your website safe.
* [Bug-Fix] There was an issue with Gdrive, backup was getting stuck.
* [Bug-Fix] A user faced a fatal error while listing backups that has been fixed.

= 1.1.2 (April, 3 2023) =
* [Bug-Fix] For some user backup was completing but not creating backup of all directories when backup of Database and Directories was selected that has been fixed.
* [Bug-Fix] Backup was failing at 100% when creating backup to Google Drive that has been fixed.
* [Bug-Fix] There was an issue while deleting local backups thats has been fixed.

= 1.1.1 (March, 31 2023) =
* [Bug-Fix] There was an issue with Backup and restore on sites with broken SSL that has been fixed.
* [Task] Tested with WordPress 6.2.

= 1.1.0 (February, 13 2023) =
* [Feature] Added Support for Wasabi S3 Compatible Object Storage.
* [Feature] Local backups created in Backuply version 1.1.0 and above can be synced.
* [Tweak] To initiate backup we were dependent on WP CRON, which was causing issue for some of our users, as WP Cron was getting stuck. So now manual backup dosen't uses WP CRON, WP CRON in backuply is only used by Automatic Backups.

= 1.0.9 (December, 24 2022) =
* [Security-Improvement] Removed all app keys.
* [Security-Improvement] Made restore logs even more secure with more randomness

= 1.0.8 (December, 22 2022) =
* [Security-Fix] Added index.html file and web.config to improve the protection of the backup folder.
* [Security-Fix] Made the backup folder have random strings to make the name be unpredictible.
* [Bug-Fix] There was an issue while creating database backup for some users that has been fixed.
* [Bug-Fix] There was issue loading last logs for some uses, that has been fixed.
* [Bug-Fix] For some user while downloading the Local Backup the progress bar was not updating that has been fixed.
* [Removed] Installing Backuply Pro from the Free version as per the WordPress guidelines.

= 1.0.7 (December, 19 2022) =
* [Security-Fix] The Google Drive App Secret key of Backuply was committed in the code. This is fixed. We have issued a new secret as well !
 
= 1.0.6 (December, 12 2022) = 
* [Bug-Fix] There was an issue while saving the additional file in settings page that has been fixed.
* [Bug-Fix] Issues related to PHP 8.1 and 8.0 compatibility have been fixed.
* [Bug-Fix] There was an issue while creating backuply config for some users that has been fixed.
* [Bug-Fix] When selecting check all files in Additional file option, all databases were getting selected to in exclude database, that has been fixed.
* [Bug-Fix] When selecting auto backup time the auto backup options weren't visible for some users that has been fixed.
* [Bug-Fix] For some users the backup was getting stuck at 17% sometimes that has been fixed.

= 1.0.5 (November 15, 2022) = 
* [Feature] Added support for WP-CLI, you can perform backup, restore, and sync right from your terminal.
* [Task] We have improved the promotion nags, so it doesn't cause inconvenience to our users.
* [Bug-Fix] There was a PHP warning being shown while syncing or downloading from Dropbox that has been fixed.
* [Bug-Fix] There was an issue while deleting GDrive backups that has been fixed.

= 1.0.4 (October 14, 2022) =
* [Feature] Added support for S3 Compatible backup locations like DigitalOcean Spaces, Linode Object Storage, Vultr Object Storage, and Cloudflare R2.
* [Feature] Added support for Server Side Encryption for AWS.
* [Task] Google Drive is now available for all users.
* [Bug-Fix] Part Number while downloading for restore in AWS had an issue. That has been fixed.
* [Bug-Fix] For some user restore was getting stuck at repairing database status, that has been fixed.

= 1.0.3 (September 20, 2022) =
* [Improvement] Added Backup Download progress
* [Task] The Backuply nag will now appear after 7 days instead of 1 day.
* [Bug-Fix] The last backup time was shown from 1970 when no backup was created. This has been fixed.
* [Bug-Fix] Backup on Google was failing for some users. This has been fixed.
* [Bug-Fix] On failure, in some cases the partial backup file was not cleaned. This has been fixed.
* [Bug-Fix] At times, the backup nag was not getting dismissed. This has been fixed.

= 1.0.2 (August 18, 2022) =
* Exclude Files, Directories or Database tables from a backup
* Logs for every backup
* Minor bug fixes

= 1.0.1 (July 22, 2022) =
* Added Last Logs of Backups and Restore

= 1.0.0 (July 21, 2022) =
* Released Plugin